diff --git a/.gitignore b/.gitignore
index 763301fc0025d020fbc9fb3a0781097e8e036d9c..64f046d19ab591744d17a9c5fce52f885d1b91c0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 dist/
-node_modules/
\ No newline at end of file
+node_modules/
+coverage/
\ No newline at end of file
diff --git a/README.md b/README.md
index af7d0f4616c320228078742d846ada9272642aa1..78f5d90c250f106ac09396ecb63120121381c825 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,353 @@
-in package.json, change name of project
-src -> index.ts -> add all exported methods
-src/__tests__/ -> add unit test file
\ No newline at end of file
+# viz-layout
+
+---
+
+## Description
+
+The viz-layout is a layout to draw metabolic pathways vertically. To use the layout, a network with nodes and directed links is required. User can provide an object describing the network style. If defined in the network style, height and width of nodes can be taken into account. The layout change the position of nodes, and can add some classes for nodes and links.  
+
+The layout is designed to be applied to directed bipartite graphs, where metabolite nodes are only connected to reaction nodes. Reactions can be reversible, but for each reversible reaction, all links must be declared for one direction. To reverse the direction of a reaction, the source and target of the links are swapped. Additionally, metabolite nodes can be marked as side compounds, with common examples being water and ATP. A step of the layout will duplicate them and place them after the other nodes.
+
+The y-axis is inverted compared to the usual Cartesian convention (where smaller y values are lower on the graph). It was designed for systems like SVG where smaller y values are positioned at the top of the screen. Therefore, the initial reactants, placed at the start of the reaction sequence, will have smaller y values, positioning them at the top of the diagram. The products of the reaction will have larger y values, placing them lower.
+
+---
+
+## Table of Contents
+
+- [Getting Started](#getting-started)
+  - [Create a Typescript Project](#create-a-typescript-project)
+  - [Install via npm](#install-via-npm)
+  - [Typescript Configuration](#typescript-configuration)
+- [Usage](#usage)
+- [Types](#types)
+  - [Types for Network](#types-for-network)
+    - [Network](#network)
+    - [Node](#node)
+    - [Link](#link)
+  - [Types for Style](#types-for-style)
+    - [GraphStyleProperties](#graphstyleproperties)
+    - [NodeStyle](#nodestyle)
+  - [Types for Parameters](#types-for-parameters)
+- [Layout](#layout)
+  - [layoutOnNetwork( )](#layoutonnetwork)
+    - [Step of the Layout](#step-of-the-layout)
+        - [Base Layout](#base-layout)
+        - [Management of Side Compounds](#management-of-side-compounds)
+        - [Management of Reversible Reaction](#management-of-reversible-reaction)
+        - [Management of Directed Cycles](#management-of-directed-cycles)
+        - [Management of Main Chains](#management-of-main-chains)
+        - [Shifting Coordinates](#shifting-coordinates)
+
+---
+
+## Getting started
+
+#### Create a typescript project
+
+1. **Initialize a new project**
+
+   First, create a new directory for your project and initialize it with `npm`:
+
+   ```bash
+   mkdir my-project
+   cd my-project
+   npm init -y
+   ```
+
+2. **Install TypeScript**
+
+    You'll need to install TypeScript as a development dependency in your project:
+
+    ```bash
+    npm install --save-dev typescript
+    ```
+
+3. **Set up the TypeScript configuration**
+
+    TypeScript requires a `tsconfig.json` file (at the root of the project) to specify how your TypeScript code should be compiled. You can generate a default configuration file by running:
+
+    ```bash
+    npx tsc --init
+    ```
+
+   
+
+4. **Create your source files**
+
+    Inside your project, create a `src` directory and a `index.ts` file for your TypeScript code:
+
+    ```bash
+    mkdir src
+    touch src/index.ts
+    ```
+
+
+#### Install via npm
+
+The viz-layout package is currently only available on the MetaboHUB forge. To install it, you need to configure an `.npmrc` file (at the root of the project) to specify the retrieval path.
+
+```.npmrc
+@metabohub:registry=https://forgemia.inra.fr/api/v4/packages/npm/
+```
+
+Then you can install the package:
+
+```
+npm install @metabohub/viz-layout
+```
+
+#### Typescript configuration
+
+
+Once the installation step is completed, you need to declare the module. To do this, add the following line in the `env.d.ts` file (at the root of the project):
+
+```ts 
+declare module "@metabohub/viz-layout";
+```
+
+---
+## Usage
+
+
+```typescript
+// Imports
+import type { Network , Node, Link, GraphStyleProperties, NodeStyle} from "@metabohub/viz-layout/src/types/TypeVizCore";
+import { algorithmOnNetwork } from "@metabohub/viz-layout"
+
+// Creation of network
+const nodes : {[key:string]:Node} = {
+	A: {
+		id: 'A',
+		x: 50,
+		y: 50,
+        classes: ["metabolite"],
+        metadata :{
+            isSideCompound : false
+        }
+	},
+	B: {
+		id: 'B',
+		x: 100,
+		y: 100,
+        classes: ["reaction"],
+        metadata : {
+            isReversible : true
+        }
+	}
+}
+const links : Link[] = [
+	{
+		source: nodes.A,
+		target: nodes.B,
+		id: 'A->B'
+	}
+]
+const network:Network = { id: 'network', nodes: nodes, links: links };
+
+
+// Creation of network styles
+const nodeStyle : NodeStyle = {
+            metabolite: {
+                height: 50,
+                width: 50
+            },
+            reaction: {
+                height: 100,
+                width: 100
+            }
+        };
+const networkStyle :GraphStyleProperties ={ nodeStyles: nodeStyle };
+
+// Choosing parameters
+const parameters = defaultParameters;
+parameters.doReactionReversible = false;
+parameters.pathType = PathType.ALL_LONGEST
+
+// Application of layout
+const newNetwork = await layoutOnNetwork(network, networkStyle, parameters);
+```
+
+---
+
+## Types 
+
+### Types for network
+
+##### Network
+
+| Attribut | Type | Description |
+| -------- | ---- | ----------- |
+| id | `string` | Network's id |
+| nodes | `{[key: string] Node}` | Object that contains nodes |
+| links | `Array<Link>` | List that contains links |
+
+
+##### Node
+
+| Attribut | Type | Description |
+| -------- | ---- | ----------- |
+| id | `string` | Node's id |
+| x | `number` | X node's position |
+| y | `number` | Y node's position |
+| classes | `Array<string>` | Node's classes to manage style |
+| metadata | `{[key: string]: string \| number \| {[key: string]: string \| number} \| Array<string> \| boolean}` | Node's metadata |
+
+
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-triangle-fill" viewBox="0 0 16 16">
+  <path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5m.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2"/>
+</svg> 
+The id of the node has to be the same that the key associated with the node in 'nodes' in the network ! Morever, the string for id must follow one of the formats listed below: <br />
+
+- any string of alphabetic (`[a-zA-Z\200-\377]`) characters, underscores (`'_'`) or digits(`[0-9]`), not beginning with a digit
+- a numeral [`-`]?(`.`[`0`-`9`]⁺ `|` [`0`-`9`]⁺(`.`[`0`-`9`]*)? )
+- any double-quoted string (`"..."`) possibly containing escaped quotes (`\"`)
+- an HTML string (`<...>`)
+
+<br />
+
+
+The classes of a node can contain at least either `metabolite` or `reaction`.
+
+Metadata can contains those elements :
+| Key | Type | Description |
+| -------- | ---- | ----------- |
+| isSideCompound | `booleen` | Node is declared as a side compound |
+| isReversible | `booleen` | Node is declared as a reversible |
+
+If `isSideCompound` is not set, the step to manage side compounds won't do anything. A class `duplicate` will be added to side compounds nodes that have been duplicated.
+If `isReversible` is not set and reaction node doesn't contains a class "reaction", the step to manage reaction reversible won't do anything : there is no reaction that are reversible.
+
+
+##### Link
+
+| Attribut | Type | Description |
+| -------- | ---- | ----------- |
+| id | string | Link's id |
+| source | Node | Source node of the link |
+| target | Node | Target node of the link |
+| classes | Array<string> | Link's classes to manage style |
+
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-triangle-fill" viewBox="0 0 16 16">
+  <path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5m.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2"/>
+</svg> The source and target need to be pointer to a node present in the network (see usage) ! 
+
+In order to have a bipartite graph, links should associate a metabolite node with a reaction node.
+A class `reversible` will be added by the layout for links associated with a reversible reaction if the step to manage reversible reaction is done. 
+
+### Types for style
+
+#### GraphStyleProperties
+
+| Attribut | Type | Description |
+| -------- | ---- | ----------- |
+| nodeStyles | { [key: string]: NodeStyle } | Object that contains nodes classes name associated to their style |
+
+The keys of nodeStyles need to be the same that classes of nodes to associate the style to nodes.
+
+#### NodeStyle
+
+| Attribut | Type | Description |
+| -------- | ---- | ----------- |
+| height | number | Node's height |
+| width | number | Node's width |
+
+
+### Types for parameters
+
+To initialize parameters, use the `defaultParameters` variable from the package. You can then modify the desired parameters as needed (see usage). See "Step of the layout" for a better understanding of some parameters.
+
+| Parameter                | Type        | Default       | Description                                                                                      |
+|--------------------------|-------------|---------------|--------------------------------------------------------------------------------------------------|
+| doDuplicateSideCompounds  | `boolean`     | true          | Whether to duplicate side compounds                                                            |
+| doPutAsideSideCompounds   | `boolean`     | true          | Whether to remove (temporarily) side compounds                                              |
+| doReactionReversible      | `boolean`     | true          | Whether to handle reversible reactions         |
+| doMainChain               | `boolean`     | true          | Whether to find and clusterized main chain                                       |
+| pathType                  | `PathType`    | ALL_LONGEST   | Defines the path type for the main chain step: LONGEST, ALL_LONGEST, or ALL.      |
+| doCycle                   | `boolean`     | true          | Whether to process directed cycles                                                          |
+| shiftCoord                | `boolean`     | false          | Whether to get top left corner coordinates of nodes (if false, center of nodes is returned)     |
+
+---
+
+## Layout
+
+
+`layoutOnNetwork(network, networkStyle, parameters)` is a asynchronous function.
+
+##### Input
+
+| Arguments | Type | default | Description | Optional |
+| ----- | ---- | ------- | ----------- | -------- |
+| network | `Network` | *no default* | Network object that contains nodes and links of the network | No |
+| networkStyle | `GraphStyleProperties` | { } | Network style object that contains classes and style associated with nodes | Yes |
+| parameters | `Parameters` | defaultParameters | Parameters of the step of layout | Yes |
+
+To change parameters, you need to get defaultParameters and then modify the accessible attributs.
+
+##### Output
+
+ Type | Description 
+ ---- | ----------- 
+ `Promise<Network>` | network with modified node positions, and some added classes  
+
+
+#### Step of the layout
+
+##### Base Layout
+
+The base layout used in the algorithm is a Sugiyama layout. It is implemented by the viz.js library (https://github.com/mdaines/viz-js), a JS wrapper of GraphViz (https://graphviz.org/documentation/). It correspond to the dot layout of GraphViz.
+
+<small>E. R. GANSNER, E. KOUTSOFIOS, S. C. NORTH et K.-P. VO, “A technique for drawing directed graphs”, IEEE Transactions on Software Engineering, t. 19, no 3, p. 214-230, 1993.</small>
+
+  
+##### Management of side compounds
+
+Nodes declared as side compounds are duplicated if `doDuplicateSideCompounds = true`.
+Nodes declared as side compounds are removed from the network object if `doPutAsideSideCompounds = true`. They can be temporary suppressed so that they are placed depending on the positions of the other nodes at the end.
+
+At the end of the layout, side compounds are reinserted in the network if `doPutAsideSideCompounds = true` (if they have been removed in the first place), and if `doDuplicateSideCompounds = true`. If side compounds are suppressed whitout having been duplicated, there is no method implemented to reinsert them.
+
+| `doDuplicateSideCompounds` | `doPutAsideSideCompounds` | Reinsertion of side compounds ? |
+|---|---|---|
+| true | true | true |
+| false | false | false |
+| true | false | false |
+| false | true | false |
+
+
+
+##### Management of reversible reaction
+
+The step is done if `doReactionReversible = true`. 
+
+For the step to have an effect, reaction nodes that represent a reversible reaction need to have the class `reaction` in their classes, and `metadata.isReversible = true`. 
+
+This step choose for each reversible reaction a direction that will maintien the continuity of a sequence of reaction in the drawing. Links associated with those reactions get a class `reversible`.
+
+##### Management of directed cycles
+
+The step is done if `doCycle = true`.
+
+Directed cycles of more that 3 nodes are found. They are placed in circle as much as possible. When several directed cycles have common nodes, all the nodes won't necessarily be placed in circle. Those will be placed by a force layout (of D3 library : https://d3js.org/).
+
+If `doReactionReversible = true`, different directed cycles can be found as both direction of reversible reaction are taken into account, else only the direction declared in the network is used.
+
+
+##### Management of main chains
+
+The step is done if `doMainChain = true`.
+
+Some nodes that represent "main chain" are grouped in a cluster subgraph in the viz.js library (Sugiyama layout). It can help the resulting drawing or not. You can test with or without the step.
+
+Main chain are defined as merge of path in the network. Start nodes are declared in the algorithm, then the network is convert into a DAG (no directed cycle). Longest path will be found from the start nodes. If several paths have common nodes, they can be merged. A merge of path represent a main chain.
+
+Several versions of this step are implemented :
+    - `LONGEST` : when longest paths are searched from a start node, if several are found, only one will be keeped
+    - `ALL_LONGEST` : when longest paths are searched from a start node, all the longest are keeped
+    - `ALL` : when longest paths are searched from a start node, all paths between start node and terminal node of longest paths are keeped
+
+`ALL_LONGEST` is the default version, to change it you need to change the parameter pathType with the defined type `PathType` (ex : `parameters.pathType = PathType.ALL`).
+
+
+##### Shifting coordinates
+
+If `shiftCoord = true`, the node's coordinates represent its top-left corner; otherwise, they represent the node's center. When shifting the coordinates, the adjustment is made so that positioning the node by its top-left corner keeps it centered in its original location. Specifically, the coordinates are shifted by half the node's height and width. To define a node's `height` and `width`, refer to `networkStyle`. This is useful when rendering networks in SVG format.
\ No newline at end of file
diff --git a/coverage/clover.xml b/coverage/clover.xml
deleted file mode 100644
index d1e7b6ca8019943c81b2ee72dce7056fa9a0a7b2..0000000000000000000000000000000000000000
--- a/coverage/clover.xml
+++ /dev/null
@@ -1,770 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<coverage generated="1726757481290" clover="3.2.0">
-  <project timestamp="1726757481290" name="All files">
-    <metrics statements="728" coveredstatements="211" conditionals="412" coveredconditionals="58" methods="167" coveredmethods="26" elements="1307" coveredelements="295" complexity="0" loc="728" ncloc="728" packages="2" files="10" classes="10"/>
-    <package name="composables">
-      <metrics statements="697" coveredstatements="180" conditionals="400" coveredconditionals="46" methods="161" coveredmethods="20"/>
-      <file name="AlgorithmBFS.ts" path="/home/elora/Documents/viz-layout/src/composables/AlgorithmBFS.ts">
-        <metrics statements="28" coveredstatements="4" conditionals="13" coveredconditionals="0" methods="4" coveredmethods="0"/>
-        <line num="6" count="1" type="stmt"/>
-        <line num="7" count="1" type="stmt"/>
-        <line num="28" count="1" type="stmt"/>
-        <line num="29" count="0" type="stmt"/>
-        <line num="30" count="0" type="stmt"/>
-        <line num="32" count="0" type="stmt"/>
-        <line num="33" count="0" type="stmt"/>
-        <line num="35" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="36" count="0" type="stmt"/>
-        <line num="37" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="38" count="0" type="stmt"/>
-        <line num="39" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="40" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="41" count="0" type="stmt"/>
-        <line num="48" count="0" type="stmt"/>
-        <line num="65" count="1" type="stmt"/>
-        <line num="67" count="0" type="stmt"/>
-        <line num="68" count="0" type="stmt"/>
-        <line num="71" count="0" type="stmt"/>
-        <line num="75" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="76" count="0" type="stmt"/>
-        <line num="78" count="0" type="stmt"/>
-        <line num="82" count="0" type="stmt"/>
-        <line num="84" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="85" count="0" type="stmt"/>
-        <line num="86" count="0" type="stmt"/>
-        <line num="90" count="0" type="stmt"/>
-        <line num="92" count="0" type="stmt"/>
-      </file>
-      <file name="CalculateRelationCycle.ts" path="/home/elora/Documents/viz-layout/src/composables/CalculateRelationCycle.ts">
-        <metrics statements="153" coveredstatements="15" conditionals="99" coveredconditionals="0" methods="40" coveredmethods="0"/>
-        <line num="4" count="1" type="stmt"/>
-        <line num="5" count="1" type="stmt"/>
-        <line num="10" count="1" type="stmt"/>
-        <line num="94" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="95" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="96" count="0" type="stmt"/>
-        <line num="97" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="98" count="0" type="stmt"/>
-        <line num="100" count="0" type="stmt"/>
-        <line num="102" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="103" count="0" type="stmt"/>
-        <line num="104" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="105" count="0" type="stmt"/>
-        <line num="106" count="0" type="stmt"/>
-        <line num="107" count="0" type="stmt"/>
-        <line num="110" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="112" count="0" type="stmt"/>
-        <line num="113" count="0" type="stmt"/>
-        <line num="114" count="0" type="stmt"/>
-        <line num="117" count="0" type="stmt"/>
-        <line num="118" count="0" type="stmt"/>
-        <line num="119" count="0" type="stmt"/>
-        <line num="122" count="0" type="stmt"/>
-        <line num="125" count="0" type="stmt"/>
-        <line num="138" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="139" count="0" type="stmt"/>
-        <line num="140" count="0" type="stmt"/>
-        <line num="141" count="0" type="stmt"/>
-        <line num="142" count="0" type="stmt"/>
-        <line num="143" count="0" type="stmt"/>
-        <line num="144" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="145" count="0" type="stmt"/>
-        <line num="146" count="0" type="stmt"/>
-        <line num="147" count="0" type="stmt"/>
-        <line num="148" count="0" type="stmt"/>
-        <line num="151" count="0" type="stmt"/>
-        <line num="153" count="0" type="stmt"/>
-        <line num="165" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="166" count="0" type="stmt"/>
-        <line num="167" count="0" type="stmt"/>
-        <line num="168" count="0" type="stmt"/>
-        <line num="169" count="0" type="stmt"/>
-        <line num="170" count="0" type="stmt"/>
-        <line num="171" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="172" count="0" type="stmt"/>
-        <line num="173" count="0" type="stmt"/>
-        <line num="174" count="0" type="stmt"/>
-        <line num="175" count="0" type="stmt"/>
-        <line num="178" count="0" type="stmt"/>
-        <line num="181" count="0" type="stmt"/>
-        <line num="194" count="1" type="stmt"/>
-        <line num="195" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="196" count="0" type="stmt"/>
-        <line num="197" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="198" count="0" type="stmt"/>
-        <line num="199" count="0" type="stmt"/>
-        <line num="200" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="201" count="0" type="stmt"/>
-        <line num="203" count="0" type="stmt"/>
-        <line num="206" count="0" type="stmt"/>
-        <line num="220" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="221" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="222" count="0" type="stmt"/>
-        <line num="223" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="224" count="0" type="stmt"/>
-        <line num="225" count="0" type="stmt"/>
-        <line num="226" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="228" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="229" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="230" count="0" type="stmt"/>
-        <line num="233" count="0" type="stmt"/>
-        <line num="237" count="0" type="stmt"/>
-        <line num="240" count="0" type="stmt"/>
-        <line num="254" count="1" type="stmt"/>
-        <line num="255" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="256" count="0" type="stmt"/>
-        <line num="257" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="258" count="0" type="stmt"/>
-        <line num="259" count="0" type="stmt"/>
-        <line num="260" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="262" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="263" count="0" type="stmt"/>
-        <line num="265" count="0" type="stmt"/>
-        <line num="268" count="0" type="stmt"/>
-        <line num="271" count="0" type="stmt"/>
-        <line num="291" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="293" count="0" type="stmt"/>
-        <line num="298" count="0" type="cond" truecount="0" falsecount="6"/>
-        <line num="299" count="0" type="stmt"/>
-        <line num="300" count="0" type="stmt"/>
-        <line num="302" count="0" type="stmt"/>
-        <line num="306" count="0" type="cond" truecount="0" falsecount="6"/>
-        <line num="307" count="0" type="stmt"/>
-        <line num="308" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="310" count="0" type="stmt"/>
-        <line num="313" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="314" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="316" count="0" type="stmt"/>
-        <line num="317" count="0" type="stmt"/>
-        <line num="330" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="331" count="0" type="stmt"/>
-        <line num="334" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="336" count="0" type="stmt"/>
-        <line num="337" count="0" type="stmt"/>
-        <line num="338" count="0" type="stmt"/>
-        <line num="339" count="0" type="stmt"/>
-        <line num="342" count="0" type="stmt"/>
-        <line num="343" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="344" count="0" type="stmt"/>
-        <line num="347" count="0" type="stmt"/>
-        <line num="350" count="0" type="stmt"/>
-        <line num="364" count="0" type="stmt"/>
-        <line num="365" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="368" count="0" type="stmt"/>
-        <line num="369" count="0" type="stmt"/>
-        <line num="371" count="0" type="stmt"/>
-        <line num="375" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="376" count="0" type="stmt"/>
-        <line num="377" count="0" type="stmt"/>
-        <line num="378" count="0" type="stmt"/>
-        <line num="381" count="0" type="stmt"/>
-        <line num="382" count="0" type="stmt"/>
-        <line num="383" count="0" type="stmt"/>
-        <line num="387" count="0" type="stmt"/>
-        <line num="389" count="0" type="stmt"/>
-        <line num="391" count="0" type="stmt"/>
-        <line num="392" count="0" type="stmt"/>
-        <line num="396" count="0" type="stmt"/>
-        <line num="398" count="0" type="stmt"/>
-        <line num="414" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="416" count="0" type="stmt"/>
-        <line num="417" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="421" count="0" type="stmt"/>
-        <line num="422" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="434" count="1" type="stmt"/>
-        <line num="435" count="0" type="stmt"/>
-        <line num="436" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="437" count="0" type="stmt"/>
-        <line num="457" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="459" count="0" type="stmt"/>
-        <line num="460" count="0" type="stmt"/>
-        <line num="461" count="0" type="stmt"/>
-        <line num="462" count="0" type="stmt"/>
-        <line num="473" count="1" type="stmt"/>
-        <line num="475" count="0" type="stmt"/>
-        <line num="476" count="0" type="stmt"/>
-        <line num="477" count="0" type="stmt"/>
-        <line num="478" count="0" type="stmt"/>
-        <line num="493" count="1" type="stmt"/>
-        <line num="494" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="495" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="496" count="0" type="stmt"/>
-        <line num="498" count="0" type="stmt"/>
-      </file>
-      <file name="CalculateSize.ts" path="/home/elora/Documents/viz-layout/src/composables/CalculateSize.ts">
-        <metrics statements="133" coveredstatements="18" conditionals="58" coveredconditionals="0" methods="29" coveredmethods="0"/>
-        <line num="5" count="1" type="stmt"/>
-        <line num="10" count="1" type="stmt"/>
-        <line num="83" count="1" type="stmt"/>
-        <line num="84" count="1" type="stmt"/>
-        <line num="93" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="94" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="95" count="0" type="stmt"/>
-        <line num="104" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="105" count="0" type="stmt"/>
-        <line num="114" count="1" type="stmt"/>
-        <line num="115" count="0" type="stmt"/>
-        <line num="116" count="0" type="stmt"/>
-        <line num="117" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="118" count="0" type="stmt"/>
-        <line num="119" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="120" count="0" type="stmt"/>
-        <line num="121" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="122" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="127" count="0" type="stmt"/>
-        <line num="137" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="138" count="0" type="stmt"/>
-        <line num="139" count="0" type="stmt"/>
-        <line num="140" count="0" type="stmt"/>
-        <line num="141" count="0" type="stmt"/>
-        <line num="142" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="143" count="0" type="stmt"/>
-        <line num="144" count="0" type="stmt"/>
-        <line num="145" count="0" type="stmt"/>
-        <line num="146" count="0" type="stmt"/>
-        <line num="150" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="151" count="0" type="stmt"/>
-        <line num="154" count="0" type="stmt"/>
-        <line num="167" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="168" count="0" type="stmt"/>
-        <line num="169" count="0" type="stmt"/>
-        <line num="170" count="0" type="stmt"/>
-        <line num="171" count="0" type="stmt"/>
-        <line num="183" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="184" count="0" type="stmt"/>
-        <line num="185" count="0" type="stmt"/>
-        <line num="186" count="0" type="stmt"/>
-        <line num="187" count="0" type="stmt"/>
-        <line num="195" count="1" type="stmt"/>
-        <line num="204" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="205" count="0" type="stmt"/>
-        <line num="206" count="0" type="stmt"/>
-        <line num="207" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="208" count="0" type="stmt"/>
-        <line num="209" count="0" type="stmt"/>
-        <line num="210" count="0" type="stmt"/>
-        <line num="211" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="212" count="0" type="stmt"/>
-        <line num="216" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="217" count="0" type="stmt"/>
-        <line num="219" count="0" type="stmt"/>
-        <line num="230" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="231" count="0" type="stmt"/>
-        <line num="232" count="0" type="stmt"/>
-        <line num="233" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="234" count="0" type="stmt"/>
-        <line num="235" count="0" type="stmt"/>
-        <line num="236" count="0" type="stmt"/>
-        <line num="237" count="0" type="stmt"/>
-        <line num="241" count="0" type="stmt"/>
-        <line num="243" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="245" count="0" type="stmt"/>
-        <line num="248" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="249" count="0" type="stmt"/>
-        <line num="253" count="0" type="stmt"/>
-        <line num="266" count="1" type="stmt"/>
-        <line num="269" count="0" type="stmt"/>
-        <line num="270" count="0" type="stmt"/>
-        <line num="273" count="0" type="stmt"/>
-        <line num="274" count="0" type="stmt"/>
-        <line num="276" count="0" type="stmt"/>
-        <line num="277" count="0" type="stmt"/>
-        <line num="279" count="0" type="stmt"/>
-        <line num="280" count="0" type="stmt"/>
-        <line num="282" count="0" type="stmt"/>
-        <line num="283" count="0" type="stmt"/>
-        <line num="286" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="289" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="290" count="0" type="stmt"/>
-        <line num="292" count="0" type="stmt"/>
-        <line num="293" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="294" count="0" type="stmt"/>
-        <line num="295" count="0" type="stmt"/>
-        <line num="299" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="300" count="0" type="stmt"/>
-        <line num="302" count="0" type="stmt"/>
-        <line num="303" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="304" count="0" type="stmt"/>
-        <line num="305" count="0" type="stmt"/>
-        <line num="309" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="310" count="0" type="stmt"/>
-        <line num="312" count="0" type="stmt"/>
-        <line num="313" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="314" count="0" type="stmt"/>
-        <line num="315" count="0" type="stmt"/>
-        <line num="319" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="320" count="0" type="stmt"/>
-        <line num="322" count="0" type="stmt"/>
-        <line num="323" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="324" count="0" type="stmt"/>
-        <line num="325" count="0" type="stmt"/>
-        <line num="329" count="0" type="stmt"/>
-        <line num="347" count="1" type="stmt"/>
-        <line num="348" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="349" count="0" type="stmt"/>
-        <line num="350" count="0" type="stmt"/>
-        <line num="354" count="0" type="stmt"/>
-        <line num="365" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="367" count="0" type="stmt"/>
-        <line num="368" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="369" count="0" type="stmt"/>
-        <line num="370" count="0" type="stmt"/>
-        <line num="372" count="0" type="stmt"/>
-        <line num="373" count="0" type="stmt"/>
-        <line num="374" count="0" type="stmt"/>
-        <line num="375" count="0" type="stmt"/>
-        <line num="377" count="0" type="stmt"/>
-        <line num="392" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="393" count="0" type="stmt"/>
-        <line num="394" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="395" count="0" type="stmt"/>
-        <line num="396" count="0" type="stmt"/>
-        <line num="397" count="0" type="stmt"/>
-        <line num="409" count="1" type="stmt"/>
-        <line num="410" count="0" type="stmt"/>
-        <line num="411" count="0" type="stmt"/>
-        <line num="421" count="1" type="stmt"/>
-        <line num="422" count="0" type="stmt"/>
-        <line num="423" count="0" type="stmt"/>
-      </file>
-      <file name="CalculateStartNodes.ts" path="/home/elora/Documents/viz-layout/src/composables/CalculateStartNodes.ts">
-        <metrics statements="48" coveredstatements="5" conditionals="25" coveredconditionals="0" methods="17" coveredmethods="0"/>
-        <line num="2" count="1" type="stmt"/>
-        <line num="7" count="1" type="stmt"/>
-        <line num="48" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="51" count="0" type="stmt"/>
-        <line num="54" count="0" type="stmt"/>
-        <line num="55" count="0" type="stmt"/>
-        <line num="56" count="0" type="stmt"/>
-        <line num="57" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="58" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="59" count="0" type="stmt"/>
-        <line num="60" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="61" count="0" type="stmt"/>
-        <line num="66" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="69" count="0" type="stmt"/>
-        <line num="70" count="0" type="stmt"/>
-        <line num="74" count="0" type="stmt"/>
-        <line num="75" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="76" count="0" type="stmt"/>
-        <line num="77" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="78" count="0" type="stmt"/>
-        <line num="79" count="0" type="stmt"/>
-        <line num="98" count="1" type="stmt"/>
-        <line num="101" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="102" count="0" type="stmt"/>
-        <line num="105" count="0" type="stmt"/>
-        <line num="106" count="0" type="stmt"/>
-        <line num="107" count="0" type="stmt"/>
-        <line num="111" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="112" count="0" type="stmt"/>
-        <line num="117" count="0" type="stmt"/>
-        <line num="118" count="0" type="stmt"/>
-        <line num="120" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="121" count="0" type="stmt"/>
-        <line num="122" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="123" count="0" type="stmt"/>
-        <line num="124" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="125" count="0" type="stmt"/>
-        <line num="129" count="0" type="stmt"/>
-        <line num="140" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="149" count="0" type="stmt"/>
-        <line num="158" count="0" type="stmt"/>
-        <line num="167" count="0" type="stmt"/>
-        <line num="176" count="1" type="stmt"/>
-        <line num="177" count="0" type="stmt"/>
-        <line num="178" count="0" type="stmt"/>
-        <line num="179" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="180" count="0" type="stmt"/>
-        <line num="183" count="0" type="stmt"/>
-      </file>
-      <file name="ConvertFromNetwork.ts" path="/home/elora/Documents/viz-layout/src/composables/ConvertFromNetwork.ts">
-        <metrics statements="135" coveredstatements="13" conditionals="96" coveredconditionals="0" methods="31" coveredmethods="0"/>
-        <line num="3" count="1" type="stmt"/>
-        <line num="10" count="1" type="stmt"/>
-        <line num="11" count="1" type="stmt"/>
-        <line num="12" count="1" type="stmt"/>
-        <line num="13" count="1" type="stmt"/>
-        <line num="19" count="1" type="stmt"/>
-        <line num="82" count="1" type="stmt"/>
-        <line num="85" count="0" type="stmt"/>
-        <line num="87" count="0" type="stmt"/>
-        <line num="88" count="0" type="stmt"/>
-        <line num="92" count="0" type="stmt"/>
-        <line num="98" count="0" type="stmt"/>
-        <line num="106" count="0" type="stmt"/>
-        <line num="112" count="0" type="stmt"/>
-        <line num="121" count="1" type="stmt"/>
-        <line num="122" count="0" type="stmt"/>
-        <line num="123" count="0" type="stmt"/>
-        <line num="124" count="0" type="stmt"/>
-        <line num="129" count="0" type="stmt"/>
-        <line num="138" count="1" type="stmt"/>
-        <line num="139" count="0" type="stmt"/>
-        <line num="140" count="0" type="stmt"/>
-        <line num="141" count="0" type="stmt"/>
-        <line num="142" count="0" type="stmt"/>
-        <line num="151" count="1" type="stmt"/>
-        <line num="152" count="0" type="stmt"/>
-        <line num="153" count="0" type="stmt"/>
-        <line num="154" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="155" count="0" type="stmt"/>
-        <line num="158" count="0" type="stmt"/>
-        <line num="159" count="0" type="stmt"/>
-        <line num="160" count="0" type="stmt"/>
-        <line num="161" count="0" type="stmt"/>
-        <line num="163" count="0" type="stmt"/>
-        <line num="262" count="1" type="cond" truecount="0" falsecount="4"/>
-        <line num="263" count="0" type="stmt"/>
-        <line num="264" count="0" type="stmt"/>
-        <line num="265" count="0" type="stmt"/>
-        <line num="275" count="1" type="cond" truecount="0" falsecount="4"/>
-        <line num="277" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="278" count="0" type="stmt"/>
-        <line num="279" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="280" count="0" type="stmt"/>
-        <line num="284" count="0" type="stmt"/>
-        <line num="293" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="294" count="0" type="stmt"/>
-        <line num="295" count="0" type="stmt"/>
-        <line num="297" count="0" type="stmt"/>
-        <line num="298" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="299" count="0" type="stmt"/>
-        <line num="305" count="0" type="stmt"/>
-        <line num="306" count="0" type="stmt"/>
-        <line num="307" count="0" type="stmt"/>
-        <line num="308" count="0" type="stmt"/>
-        <line num="309" count="0" type="stmt"/>
-        <line num="311" count="0" type="stmt"/>
-        <line num="312" count="0" type="cond" truecount="0" falsecount="6"/>
-        <line num="313" count="0" type="stmt"/>
-        <line num="322" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="323" count="0" type="stmt"/>
-        <line num="324" count="0" type="stmt"/>
-        <line num="326" count="0" type="stmt"/>
-        <line num="331" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="332" count="0" type="stmt"/>
-        <line num="333" count="0" type="stmt"/>
-        <line num="334" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="335" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="336" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="337" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="338" count="0" type="cond" truecount="0" falsecount="6"/>
-        <line num="339" count="0" type="stmt"/>
-        <line num="340" count="0" type="stmt"/>
-        <line num="341" count="0" type="stmt"/>
-        <line num="343" count="0" type="stmt"/>
-        <line num="347" count="0" type="stmt"/>
-        <line num="349" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="350" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="351" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="352" count="0" type="stmt"/>
-        <line num="353" count="0" type="stmt"/>
-        <line num="354" count="0" type="stmt"/>
-        <line num="355" count="0" type="stmt"/>
-        <line num="357" count="0" type="stmt"/>
-        <line num="359" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="360" count="0" type="stmt"/>
-        <line num="361" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="362" count="0" type="stmt"/>
-        <line num="364" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="365" count="0" type="stmt"/>
-        <line num="368" count="0" type="stmt"/>
-        <line num="382" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="383" count="0" type="stmt"/>
-        <line num="385" count="0" type="stmt"/>
-        <line num="386" count="0" type="stmt"/>
-        <line num="387" count="0" type="stmt"/>
-        <line num="388" count="0" type="stmt"/>
-        <line num="390" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="391" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="392" count="0" type="stmt"/>
-        <line num="393" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="394" count="0" type="stmt"/>
-        <line num="398" count="0" type="stmt"/>
-        <line num="400" count="0" type="stmt"/>
-        <line num="413" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="415" count="0" type="stmt"/>
-        <line num="417" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="419" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="420" count="0" type="stmt"/>
-        <line num="421" count="0" type="stmt"/>
-        <line num="426" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="427" count="0" type="stmt"/>
-        <line num="428" count="0" type="stmt"/>
-        <line num="429" count="0" type="stmt"/>
-        <line num="434" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="435" count="0" type="stmt"/>
-        <line num="436" count="0" type="stmt"/>
-        <line num="442" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="443" count="0" type="stmt"/>
-        <line num="444" count="0" type="stmt"/>
-        <line num="445" count="0" type="stmt"/>
-        <line num="449" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="450" count="0" type="stmt"/>
-        <line num="451" count="0" type="stmt"/>
-        <line num="456" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="457" count="0" type="stmt"/>
-        <line num="458" count="0" type="stmt"/>
-        <line num="463" count="0" type="stmt"/>
-        <line num="475" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="476" count="0" type="stmt"/>
-        <line num="478" count="0" type="stmt"/>
-        <line num="479" count="0" type="stmt"/>
-        <line num="480" count="0" type="stmt"/>
-        <line num="482" count="0" type="stmt"/>
-        <line num="483" count="0" type="stmt"/>
-        <line num="484" count="0" type="stmt"/>
-      </file>
-      <file name="GetSetAttributsNodes.ts" path="/home/elora/Documents/viz-layout/src/composables/GetSetAttributsNodes.ts">
-        <metrics statements="51" coveredstatements="17" conditionals="26" coveredconditionals="0" methods="12" coveredmethods="0"/>
-        <line num="2" count="1" type="stmt"/>
-        <line num="65" count="1" type="stmt"/>
-        <line num="73" count="1" type="stmt"/>
-        <line num="74" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="83" count="1" type="stmt"/>
-        <line num="84" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="85" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="86" count="0" type="stmt"/>
-        <line num="95" count="1" type="stmt"/>
-        <line num="103" count="1" type="stmt"/>
-        <line num="104" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="105" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="113" count="1" type="stmt"/>
-        <line num="114" count="1" type="stmt"/>
-        <line num="115" count="1" type="stmt"/>
-        <line num="122" count="1" type="stmt"/>
-        <line num="123" count="0" type="stmt"/>
-        <line num="124" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="125" count="0" type="stmt"/>
-        <line num="137" count="1" type="stmt"/>
-        <line num="138" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="139" count="0" type="stmt"/>
-        <line num="141" count="0" type="stmt"/>
-        <line num="150" count="1" type="stmt"/>
-        <line num="151" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="152" count="0" type="stmt"/>
-        <line num="154" count="0" type="stmt"/>
-        <line num="155" count="0" type="stmt"/>
-        <line num="164" count="1" type="stmt"/>
-        <line num="165" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="166" count="0" type="stmt"/>
-        <line num="168" count="0" type="stmt"/>
-        <line num="169" count="0" type="stmt"/>
-        <line num="179" count="1" type="stmt"/>
-        <line num="180" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="181" count="0" type="stmt"/>
-        <line num="183" count="0" type="stmt"/>
-        <line num="195" count="1" type="stmt"/>
-        <line num="196" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="197" count="0" type="stmt"/>
-        <line num="199" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="208" count="1" type="stmt"/>
-        <line num="209" count="0" type="cond" truecount="0" falsecount="2"/>
-        <line num="224" count="1" type="stmt"/>
-        <line num="225" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="226" count="0" type="stmt"/>
-        <line num="229" count="0" type="stmt"/>
-        <line num="230" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="231" count="0" type="stmt"/>
-        <line num="232" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="234" count="0" type="stmt"/>
-      </file>
-      <file name="LayoutReversibleReactions.ts" path="/home/elora/Documents/viz-layout/src/composables/LayoutReversibleReactions.ts">
-        <metrics statements="109" coveredstatements="105" conditionals="51" coveredconditionals="46" methods="20" coveredmethods="20"/>
-        <line num="6" count="1" type="stmt"/>
-        <line num="11" count="1" type="stmt"/>
-        <line num="12" count="1" type="stmt"/>
-        <line num="13" count="1" type="stmt"/>
-        <line num="76" count="1" type="stmt"/>
-        <line num="78" count="2" type="stmt"/>
-        <line num="80" count="2" type="stmt"/>
-        <line num="81" count="2" type="stmt"/>
-        <line num="83" count="2" type="stmt"/>
-        <line num="85" count="10" type="stmt"/>
-        <line num="87" count="10" type="stmt"/>
-        <line num="88" count="10" type="cond" truecount="1" falsecount="0"/>
-        <line num="90" count="6" type="stmt"/>
-        <line num="94" count="6" type="stmt"/>
-        <line num="96" count="6" type="cond" truecount="2" falsecount="0"/>
-        <line num="97" count="2" type="stmt"/>
-        <line num="99" count="4" type="stmt"/>
-        <line num="102" count="6" type="stmt"/>
-        <line num="105" count="6" type="cond" truecount="3" falsecount="0"/>
-        <line num="106" count="2" type="stmt"/>
-        <line num="109" count="6" type="cond" truecount="2" falsecount="0"/>
-        <line num="110" count="2" type="stmt"/>
-        <line num="111" count="2" type="stmt"/>
-        <line num="113" count="4" type="stmt"/>
-        <line num="114" count="4" type="stmt"/>
-        <line num="120" count="2" type="stmt"/>
-        <line num="121" count="6" type="stmt"/>
-        <line num="125" count="0" type="stmt"/>
-        <line num="139" count="10" type="cond" truecount="4" falsecount="0"/>
-        <line num="140" count="2" type="stmt"/>
-        <line num="141" count="8" type="cond" truecount="4" falsecount="0"/>
-        <line num="142" count="4" type="stmt"/>
-        <line num="144" count="4" type="stmt"/>
-        <line num="156" count="6" type="stmt"/>
-        <line num="157" count="6" type="stmt"/>
-        <line num="159" count="6" type="stmt"/>
-        <line num="160" count="6" type="stmt"/>
-        <line num="163" count="6" type="cond" truecount="0" falsecount="1"/>
-        <line num="164" count="0" type="stmt"/>
-        <line num="167" count="6" type="cond" truecount="1" falsecount="0"/>
-        <line num="168" count="1" type="stmt"/>
-        <line num="170" count="6" type="stmt"/>
-        <line num="172" count="6" type="stmt"/>
-        <line num="174" count="0" type="stmt"/>
-        <line num="187" count="6" type="cond" truecount="1" falsecount="0"/>
-        <line num="188" count="6" type="stmt"/>
-        <line num="189" count="6" type="cond" truecount="1" falsecount="1"/>
-        <line num="192" count="6" type="cond" truecount="4" falsecount="0"/>
-        <line num="193" count="3" type="stmt"/>
-        <line num="195" count="3" type="stmt"/>
-        <line num="213" count="6" type="stmt"/>
-        <line num="219" count="6" type="stmt"/>
-        <line num="233" count="6" type="cond" truecount="2" falsecount="1"/>
-        <line num="234" count="0" type="stmt"/>
-        <line num="236" count="6" type="stmt"/>
-        <line num="242" count="6" type="stmt"/>
-        <line num="243" count="6" type="stmt"/>
-        <line num="270" count="1" type="stmt"/>
-        <line num="271" count="1" type="stmt"/>
-        <line num="275" count="1" type="stmt"/>
-        <line num="276" count="1" type="stmt"/>
-        <line num="278" count="1" type="stmt"/>
-        <line num="280" count="1" type="stmt"/>
-        <line num="282" count="1" type="stmt"/>
-        <line num="291" count="1" type="cond" truecount="0" falsecount="1"/>
-        <line num="292" count="8" type="stmt"/>
-        <line num="293" count="8" type="stmt"/>
-        <line num="294" count="8" type="stmt"/>
-        <line num="296" count="8" type="stmt"/>
-        <line num="297" count="27" type="stmt"/>
-        <line num="298" count="27" type="cond" truecount="1" falsecount="0"/>
-        <line num="300" count="26" type="cond" truecount="3" falsecount="0"/>
-        <line num="301" count="7" type="stmt"/>
-        <line num="302" count="7" type="cond" truecount="1" falsecount="0"/>
-        <line num="305" count="6" type="stmt"/>
-        <line num="308" count="6" type="cond" truecount="2" falsecount="0"/>
-        <line num="309" count="4" type="cond" truecount="3" falsecount="0"/>
-        <line num="310" count="1" type="stmt"/>
-        <line num="313" count="3" type="stmt"/>
-        <line num="314" count="2" type="cond" truecount="3" falsecount="0"/>
-        <line num="315" count="1" type="stmt"/>
-        <line num="319" count="4" type="stmt"/>
-        <line num="320" count="4" type="cond" truecount="3" falsecount="0"/>
-        <line num="321" count="4" type="stmt"/>
-        <line num="326" count="4" type="stmt"/>
-        <line num="328" count="4" type="stmt"/>
-        <line num="329" count="4" type="cond" truecount="1" falsecount="0"/>
-        <line num="330" count="2" type="stmt"/>
-        <line num="331" count="2" type="stmt"/>
-        <line num="333" count="2" type="stmt"/>
-        <line num="343" count="1" type="stmt"/>
-        <line num="344" count="4" type="stmt"/>
-        <line num="347" count="4" type="stmt"/>
-        <line num="348" count="17" type="cond" truecount="1" falsecount="0"/>
-        <line num="350" count="4" type="stmt"/>
-        <line num="351" count="4" type="stmt"/>
-        <line num="353" count="4" type="stmt"/>
-        <line num="354" count="4" type="stmt"/>
-        <line num="356" count="4" type="stmt"/>
-        <line num="372" count="4" type="stmt"/>
-        <line num="374" count="4" type="stmt"/>
-        <line num="376" count="4" type="stmt"/>
-        <line num="378" count="4" type="stmt"/>
-        <line num="391" count="12" type="cond" truecount="2" falsecount="0"/>
-        <line num="392" count="12" type="stmt"/>
-        <line num="393" count="3" type="stmt"/>
-        <line num="394" count="4" type="cond" truecount="1" falsecount="0"/>
-        <line num="399" count="2" type="stmt"/>
-        <line num="401" count="2" type="stmt"/>
-      </file>
-      <file name="SubgraphForViz.ts" path="/home/elora/Documents/viz-layout/src/composables/SubgraphForViz.ts">
-        <metrics statements="40" coveredstatements="3" conditionals="32" coveredconditionals="0" methods="8" coveredmethods="0"/>
-        <line num="2" count="1" type="stmt"/>
-        <line num="33" count="1" type="cond" truecount="0" falsecount="2"/>
-        <line num="34" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="37" count="0" type="stmt"/>
-        <line num="39" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="40" count="0" type="stmt"/>
-        <line num="44" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="45" count="0" type="stmt"/>
-        <line num="47" count="0" type="stmt"/>
-        <line num="49" count="0" type="cond" truecount="0" falsecount="6"/>
-        <line num="53" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="54" count="0" type="stmt"/>
-        <line num="55" count="0" type="stmt"/>
-        <line num="56" count="0" type="cond" truecount="0" falsecount="3"/>
-        <line num="57" count="0" type="stmt"/>
-        <line num="58" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="59" count="0" type="stmt"/>
-        <line num="61" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="62" count="0" type="stmt"/>
-        <line num="69" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="70" count="0" type="stmt"/>
-        <line num="72" count="0" type="stmt"/>
-        <line num="74" count="0" type="stmt"/>
-        <line num="87" count="0" type="stmt"/>
-        <line num="88" count="0" type="stmt"/>
-        <line num="90" count="0" type="stmt"/>
-        <line num="92" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="95" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="96" count="0" type="stmt"/>
-        <line num="98" count="0" type="cond" truecount="0" falsecount="1"/>
-        <line num="100" count="0" type="stmt"/>
-        <line num="103" count="0" type="stmt"/>
-        <line num="106" count="0" type="stmt"/>
-        <line num="116" count="1" type="stmt"/>
-        <line num="118" count="0" type="cond" truecount="0" falsecount="4"/>
-        <line num="119" count="0" type="stmt"/>
-        <line num="120" count="0" type="stmt"/>
-        <line num="121" count="0" type="stmt"/>
-        <line num="123" count="0" type="stmt"/>
-        <line num="125" count="0" type="stmt"/>
-      </file>
-    </package>
-    <package name="types">
-      <metrics statements="31" coveredstatements="31" conditionals="12" coveredconditionals="12" methods="6" coveredmethods="6"/>
-      <file name="EnumArgs.ts" path="/home/elora/Documents/viz-layout/src/types/EnumArgs.ts">
-        <metrics statements="26" coveredstatements="26" conditionals="10" coveredconditionals="10" methods="5" coveredmethods="5"/>
-        <line num="1" count="1" type="cond" truecount="2" falsecount="0"/>
-        <line num="2" count="1" type="stmt"/>
-        <line num="3" count="1" type="stmt"/>
-        <line num="4" count="1" type="stmt"/>
-        <line num="5" count="1" type="stmt"/>
-        <line num="6" count="1" type="stmt"/>
-        <line num="7" count="1" type="stmt"/>
-        <line num="10" count="1" type="cond" truecount="2" falsecount="0"/>
-        <line num="11" count="1" type="stmt"/>
-        <line num="12" count="1" type="stmt"/>
-        <line num="13" count="1" type="stmt"/>
-        <line num="16" count="1" type="cond" truecount="2" falsecount="0"/>
-        <line num="17" count="1" type="stmt"/>
-        <line num="18" count="1" type="stmt"/>
-        <line num="19" count="1" type="stmt"/>
-        <line num="22" count="1" type="cond" truecount="2" falsecount="0"/>
-        <line num="23" count="1" type="stmt"/>
-        <line num="24" count="1" type="stmt"/>
-        <line num="25" count="1" type="stmt"/>
-        <line num="26" count="1" type="stmt"/>
-        <line num="27" count="1" type="stmt"/>
-        <line num="28" count="1" type="stmt"/>
-        <line num="29" count="1" type="stmt"/>
-        <line num="32" count="1" type="cond" truecount="2" falsecount="0"/>
-        <line num="33" count="1" type="stmt"/>
-        <line num="34" count="1" type="stmt"/>
-      </file>
-      <file name="Subgraph.ts" path="/home/elora/Documents/viz-layout/src/types/Subgraph.ts">
-        <metrics statements="5" coveredstatements="5" conditionals="2" coveredconditionals="2" methods="1" coveredmethods="1"/>
-        <line num="10" count="1" type="cond" truecount="2" falsecount="0"/>
-        <line num="11" count="1" type="stmt"/>
-        <line num="12" count="1" type="stmt"/>
-        <line num="13" count="1" type="stmt"/>
-        <line num="14" count="1" type="stmt"/>
-      </file>
-    </package>
-  </project>
-</coverage>
diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json
deleted file mode 100644
index fb15e58691ac141c3730708ad874a9039b7ba3ec..0000000000000000000000000000000000000000
--- a/coverage/coverage-final.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{"/home/elora/Documents/viz-layout/src/composables/AlgorithmBFS.ts": {"path":"/home/elora/Documents/viz-layout/src/composables/AlgorithmBFS.ts","statementMap":{"0":{"start":{"line":28,"column":0},"end":{"line":28,"column":16}},"1":{"start":{"line":65,"column":0},"end":{"line":65,"column":22}},"2":{"start":{"line":6,"column":0},"end":{"line":6,"column":54}},"3":{"start":{"line":7,"column":0},"end":{"line":7,"column":63}},"4":{"start":{"line":29,"column":38},"end":{"line":29,"column":47}},"5":{"start":{"line":30,"column":37},"end":{"line":30,"column":45}},"6":{"start":{"line":32,"column":4},"end":{"line":46,"column":5}},"7":{"start":{"line":33,"column":28},"end":{"line":33,"column":51}},"8":{"start":{"line":35,"column":8},"end":{"line":45,"column":9}},"9":{"start":{"line":36,"column":12},"end":{"line":36,"column":42}},"10":{"start":{"line":37,"column":29},"end":{"line":37,"column":57}},"11":{"start":{"line":38,"column":12},"end":{"line":44,"column":15}},"12":{"start":{"line":39,"column":16},"end":{"line":43,"column":17}},"13":{"start":{"line":40,"column":20},"end":{"line":42,"column":21}},"14":{"start":{"line":41,"column":24},"end":{"line":41,"column":51}},"15":{"start":{"line":48,"column":4},"end":{"line":48,"column":36}},"16":{"start":{"line":67,"column":4},"end":{"line":93,"column":5}},"17":{"start":{"line":68,"column":36},"end":{"line":68,"column":38}},"18":{"start":{"line":71,"column":18},"end":{"line":71,"column":50}},"19":{"start":{"line":75,"column":8},"end":{"line":79,"column":9}},"20":{"start":{"line":76,"column":12},"end":{"line":76,"column":35}},"21":{"start":{"line":78,"column":12},"end":{"line":78,"column":65}},"22":{"start":{"line":82,"column":8},"end":{"line":88,"column":null}},"23":{"start":{"line":84,"column":12},"end":{"line":87,"column":13}},"24":{"start":{"line":85,"column":26},"end":{"line":85,"column":55}},"25":{"start":{"line":86,"column":16},"end":{"line":86,"column":58}},"26":{"start":{"line":90,"column":8},"end":{"line":90,"column":null}},"27":{"start":{"line":92,"column":8},"end":{"line":92,"column":20}}},"fnMap":{"0":{"name":"BFS","decl":{"start":{"line":28,"column":16},"end":{"line":28,"column":19}},"loc":{"start":{"line":28,"column":98},"end":{"line":49,"column":1}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":38,"column":29},"end":{"line":38,"column":34}},"loc":{"start":{"line":38,"column":37},"end":{"line":44,"column":13}}},"2":{"name":"BFSWithSources","decl":{"start":{"line":65,"column":22},"end":{"line":65,"column":36}},"loc":{"start":{"line":65,"column":90},"end":{"line":94,"column":null}}},"3":{"name":"(anonymous_11)","decl":{"start":{"line":82,"column":29},"end":{"line":82,"column":35}},"loc":{"start":{"line":82,"column":37},"end":{"line":88,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":35,"column":8},"end":{"line":45,"column":9}},"type":"if","locations":[{"start":{"line":35,"column":8},"end":{"line":45,"column":9}}]},"1":{"loc":{"start":{"line":35,"column":12},"end":{"line":35,"column":57}},"type":"binary-expr","locations":[{"start":{"line":35,"column":12},"end":{"line":35,"column":23}},{"start":{"line":35,"column":27},"end":{"line":35,"column":57}}]},"2":{"loc":{"start":{"line":37,"column":29},"end":{"line":37,"column":57}},"type":"binary-expr","locations":[{"start":{"line":37,"column":29},"end":{"line":37,"column":51}},{"start":{"line":37,"column":55},"end":{"line":37,"column":57}}]},"3":{"loc":{"start":{"line":39,"column":16},"end":{"line":43,"column":17}},"type":"if","locations":[{"start":{"line":39,"column":16},"end":{"line":43,"column":17}}]},"4":{"loc":{"start":{"line":40,"column":20},"end":{"line":42,"column":21}},"type":"if","locations":[{"start":{"line":40,"column":20},"end":{"line":42,"column":21}}]},"5":{"loc":{"start":{"line":40,"column":25},"end":{"line":40,"column":89}},"type":"binary-expr","locations":[{"start":{"line":40,"column":26},"end":{"line":40,"column":38}},{"start":{"line":40,"column":42},"end":{"line":40,"column":71}},{"start":{"line":40,"column":76},"end":{"line":40,"column":89}}]},"6":{"loc":{"start":{"line":75,"column":8},"end":{"line":79,"column":9}},"type":"if","locations":[{"start":{"line":75,"column":8},"end":{"line":79,"column":9}},{"start":{"line":77,"column":15},"end":{"line":79,"column":9}}]},"7":{"loc":{"start":{"line":84,"column":12},"end":{"line":87,"column":13}},"type":"if","locations":[{"start":{"line":84,"column":12},"end":{"line":87,"column":13}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0],"4":[0],"5":[0,0,0],"6":[0,0],"7":[0]}}
-,"/home/elora/Documents/viz-layout/src/composables/CalculateRelationCycle.ts": {"path":"/home/elora/Documents/viz-layout/src/composables/CalculateRelationCycle.ts","statementMap":{"0":{"start":{"line":94,"column":0},"end":{"line":94,"column":16}},"1":{"start":{"line":138,"column":0},"end":{"line":138,"column":16}},"2":{"start":{"line":165,"column":0},"end":{"line":165,"column":16}},"3":{"start":{"line":194,"column":0},"end":{"line":194,"column":16}},"4":{"start":{"line":220,"column":0},"end":{"line":220,"column":16}},"5":{"start":{"line":254,"column":0},"end":{"line":254,"column":16}},"6":{"start":{"line":291,"column":0},"end":{"line":291,"column":16}},"7":{"start":{"line":330,"column":0},"end":{"line":330,"column":16}},"8":{"start":{"line":434,"column":0},"end":{"line":434,"column":16}},"9":{"start":{"line":457,"column":0},"end":{"line":457,"column":16}},"10":{"start":{"line":473,"column":0},"end":{"line":473,"column":16}},"11":{"start":{"line":493,"column":0},"end":{"line":493,"column":16}},"12":{"start":{"line":4,"column":0},"end":{"line":4,"column":45}},"13":{"start":{"line":5,"column":0},"end":{"line":5,"column":49}},"14":{"start":{"line":10,"column":0},"end":{"line":10,"column":49}},"15":{"start":{"line":95,"column":4},"end":{"line":126,"column":5}},"16":{"start":{"line":96,"column":25},"end":{"line":96,"column":79}},"17":{"start":{"line":97,"column":8},"end":{"line":123,"column":9}},"18":{"start":{"line":98,"column":42},"end":{"line":98,"column":79}},"19":{"start":{"line":100,"column":24},"end":{"line":100,"column":82}},"20":{"start":{"line":102,"column":12},"end":{"line":109,"column":13}},"21":{"start":{"line":103,"column":16},"end":{"line":108,"column":19}},"22":{"start":{"line":104,"column":20},"end":{"line":104,"column":158}},"23":{"start":{"line":104,"column":103},"end":{"line":104,"column":158}},"24":{"start":{"line":105,"column":34},"end":{"line":105,"column":80}},"25":{"start":{"line":106,"column":34},"end":{"line":106,"column":80}},"26":{"start":{"line":107,"column":20},"end":{"line":107,"column":45}},"27":{"start":{"line":110,"column":12},"end":{"line":120,"column":13}},"28":{"start":{"line":112,"column":43},"end":{"line":112,"column":93}},"29":{"start":{"line":113,"column":37},"end":{"line":113,"column":83}},"30":{"start":{"line":114,"column":16},"end":{"line":114,"column":36}},"31":{"start":{"line":117,"column":44},"end":{"line":117,"column":93}},"32":{"start":{"line":118,"column":36},"end":{"line":118,"column":83}},"33":{"start":{"line":119,"column":16},"end":{"line":119,"column":35}},"34":{"start":{"line":122,"column":12},"end":{"line":122,"column":22}},"35":{"start":{"line":125,"column":8},"end":{"line":125,"column":62}},"36":{"start":{"line":139,"column":24},"end":{"line":152,"column":6}},"37":{"start":{"line":140,"column":27},"end":{"line":143,"column":64}},"38":{"start":{"line":141,"column":28},"end":{"line":141,"column":51}},"39":{"start":{"line":142,"column":25},"end":{"line":142,"column":39}},"40":{"start":{"line":143,"column":26},"end":{"line":143,"column":63}},"41":{"start":{"line":144,"column":12},"end":{"line":150,"column":13}},"42":{"start":{"line":145,"column":16},"end":{"line":149,"column":19}},"43":{"start":{"line":146,"column":34},"end":{"line":146,"column":68}},"44":{"start":{"line":147,"column":34},"end":{"line":147,"column":68}},"45":{"start":{"line":148,"column":20},"end":{"line":148,"column":45}},"46":{"start":{"line":151,"column":8},"end":{"line":151,"column":28}},"47":{"start":{"line":153,"column":4},"end":{"line":153,"column":23}},"48":{"start":{"line":166,"column":23},"end":{"line":179,"column":6}},"49":{"start":{"line":167,"column":26},"end":{"line":170,"column":64}},"50":{"start":{"line":168,"column":28},"end":{"line":168,"column":51}},"51":{"start":{"line":169,"column":25},"end":{"line":169,"column":39}},"52":{"start":{"line":170,"column":26},"end":{"line":170,"column":63}},"53":{"start":{"line":171,"column":8},"end":{"line":177,"column":9}},"54":{"start":{"line":172,"column":12},"end":{"line":176,"column":15}},"55":{"start":{"line":173,"column":30},"end":{"line":173,"column":64}},"56":{"start":{"line":174,"column":30},"end":{"line":174,"column":64}},"57":{"start":{"line":175,"column":16},"end":{"line":175,"column":41}},"58":{"start":{"line":178,"column":8},"end":{"line":178,"column":27}},"59":{"start":{"line":181,"column":4},"end":{"line":181,"column":22}},"60":{"start":{"line":195,"column":4},"end":{"line":207,"column":5}},"61":{"start":{"line":196,"column":26},"end":{"line":196,"column":80}},"62":{"start":{"line":197,"column":8},"end":{"line":204,"column":9}},"63":{"start":{"line":198,"column":42},"end":{"line":198,"column":79}},"64":{"start":{"line":199,"column":12},"end":{"line":201,"column":37}},"65":{"start":{"line":200,"column":38},"end":{"line":200,"column":82}},"66":{"start":{"line":201,"column":32},"end":{"line":201,"column":35}},"67":{"start":{"line":203,"column":12},"end":{"line":203,"column":22}},"68":{"start":{"line":206,"column":8},"end":{"line":206,"column":62}},"69":{"start":{"line":221,"column":4},"end":{"line":241,"column":5}},"70":{"start":{"line":222,"column":26},"end":{"line":222,"column":80}},"71":{"start":{"line":223,"column":8},"end":{"line":238,"column":9}},"72":{"start":{"line":224,"column":42},"end":{"line":224,"column":79}},"73":{"start":{"line":225,"column":12},"end":{"line":235,"column":15}},"74":{"start":{"line":226,"column":45},"end":{"line":226,"column":97}},"75":{"start":{"line":228,"column":24},"end":{"line":234,"column":25}},"76":{"start":{"line":229,"column":28},"end":{"line":230,"column":null}},"77":{"start":{"line":229,"column":49},"end":{"line":229,"column":null}},"78":{"start":{"line":230,"column":33},"end":{"line":230,"column":null}},"79":{"start":{"line":233,"column":28},"end":{"line":233,"column":null}},"80":{"start":{"line":237,"column":12},"end":{"line":237,"column":22}},"81":{"start":{"line":240,"column":8},"end":{"line":240,"column":62}},"82":{"start":{"line":255,"column":4},"end":{"line":272,"column":5}},"83":{"start":{"line":256,"column":26},"end":{"line":256,"column":80}},"84":{"start":{"line":257,"column":8},"end":{"line":269,"column":9}},"85":{"start":{"line":258,"column":42},"end":{"line":258,"column":79}},"86":{"start":{"line":259,"column":12},"end":{"line":266,"column":30}},"87":{"start":{"line":260,"column":49},"end":{"line":260,"column":101}},"88":{"start":{"line":262,"column":28},"end":{"line":264,"column":29}},"89":{"start":{"line":263,"column":33},"end":{"line":263,"column":null}},"90":{"start":{"line":265,"column":28},"end":{"line":265,"column":39}},"91":{"start":{"line":268,"column":12},"end":{"line":268,"column":22}},"92":{"start":{"line":271,"column":8},"end":{"line":271,"column":62}},"93":{"start":{"line":293,"column":25},"end":{"line":293,"column":27}},"94":{"start":{"line":298,"column":4},"end":{"line":303,"column":5}},"95":{"start":{"line":299,"column":8},"end":{"line":299,"column":65}},"96":{"start":{"line":300,"column":8},"end":{"line":300,"column":27}},"97":{"start":{"line":302,"column":8},"end":{"line":302,"column":28}},"98":{"start":{"line":306,"column":4},"end":{"line":311,"column":5}},"99":{"start":{"line":307,"column":8},"end":{"line":307,"column":65}},"100":{"start":{"line":308,"column":8},"end":{"line":308,"column":55}},"101":{"start":{"line":308,"column":36},"end":{"line":308,"column":55}},"102":{"start":{"line":310,"column":8},"end":{"line":310,"column":28}},"103":{"start":{"line":313,"column":4},"end":{"line":313,"column":52}},"104":{"start":{"line":313,"column":15},"end":{"line":313,"column":52}},"105":{"start":{"line":314,"column":4},"end":{"line":314,"column":52}},"106":{"start":{"line":314,"column":15},"end":{"line":314,"column":52}},"107":{"start":{"line":316,"column":18},"end":{"line":316,"column":55}},"108":{"start":{"line":317,"column":4},"end":{"line":317,"column":19}},"109":{"start":{"line":331,"column":21},"end":{"line":331,"column":23}},"110":{"start":{"line":334,"column":4},"end":{"line":351,"column":5}},"111":{"start":{"line":336,"column":8},"end":{"line":340,"column":11}},"112":{"start":{"line":337,"column":32},"end":{"line":337,"column":83}},"113":{"start":{"line":338,"column":12},"end":{"line":338,"column":58}},"114":{"start":{"line":339,"column":12},"end":{"line":339,"column":59}},"115":{"start":{"line":342,"column":8},"end":{"line":346,"column":11}},"116":{"start":{"line":343,"column":12},"end":{"line":345,"column":13}},"117":{"start":{"line":344,"column":16},"end":{"line":344,"column":33}},"118":{"start":{"line":347,"column":8},"end":{"line":347,"column":70}},"119":{"start":{"line":350,"column":8},"end":{"line":350,"column":94}},"120":{"start":{"line":364,"column":27},"end":{"line":364,"column":29}},"121":{"start":{"line":365,"column":4},"end":{"line":399,"column":5}},"122":{"start":{"line":368,"column":23},"end":{"line":368,"column":84}},"123":{"start":{"line":369,"column":24},"end":{"line":369,"column":84}},"124":{"start":{"line":371,"column":31},"end":{"line":371,"column":33}},"125":{"start":{"line":375,"column":8},"end":{"line":384,"column":9}},"126":{"start":{"line":376,"column":12},"end":{"line":376,"column":30}},"127":{"start":{"line":377,"column":12},"end":{"line":377,"column":26}},"128":{"start":{"line":378,"column":12},"end":{"line":378,"column":86}},"129":{"start":{"line":381,"column":12},"end":{"line":381,"column":31}},"130":{"start":{"line":382,"column":12},"end":{"line":382,"column":32}},"131":{"start":{"line":383,"column":12},"end":{"line":383,"column":87}},"132":{"start":{"line":387,"column":8},"end":{"line":395,"column":11}},"133":{"start":{"line":389,"column":34},"end":{"line":389,"column":98}},"134":{"start":{"line":391,"column":12},"end":{"line":393,"column":15}},"135":{"start":{"line":392,"column":16},"end":{"line":392,"column":36}},"136":{"start":{"line":396,"column":8},"end":{"line":396,"column":70}},"137":{"start":{"line":398,"column":8},"end":{"line":398,"column":67}},"138":{"start":{"line":414,"column":4},"end":{"line":424,"column":5}},"139":{"start":{"line":416,"column":8},"end":{"line":418,"column":11}},"140":{"start":{"line":417,"column":12},"end":{"line":417,"column":204}},"141":{"start":{"line":421,"column":8},"end":{"line":423,"column":11}},"142":{"start":{"line":422,"column":12},"end":{"line":422,"column":204}},"143":{"start":{"line":435,"column":4},"end":{"line":437,"column":81}},"144":{"start":{"line":436,"column":8},"end":{"line":436,"column":72}},"145":{"start":{"line":437,"column":20},"end":{"line":437,"column":78}},"146":{"start":{"line":459,"column":26},"end":{"line":459,"column":107}},"147":{"start":{"line":460,"column":30},"end":{"line":460,"column":79}},"148":{"start":{"line":460,"column":71},"end":{"line":460,"column":78}},"149":{"start":{"line":461,"column":26},"end":{"line":461,"column":91}},"150":{"start":{"line":462,"column":4},"end":{"line":462,"column":57}},"151":{"start":{"line":475,"column":26},"end":{"line":475,"column":92}},"152":{"start":{"line":476,"column":30},"end":{"line":476,"column":58}},"153":{"start":{"line":477,"column":26},"end":{"line":477,"column":91}},"154":{"start":{"line":478,"column":4},"end":{"line":478,"column":57}},"155":{"start":{"line":494,"column":4},"end":{"line":494,"column":145}},"156":{"start":{"line":494,"column":97},"end":{"line":494,"column":145}},"157":{"start":{"line":495,"column":4},"end":{"line":499,"column":5}},"158":{"start":{"line":496,"column":12},"end":{"line":496,"column":86}},"159":{"start":{"line":498,"column":8},"end":{"line":498,"column":25}}},"fnMap":{"0":{"name":"neighborsGroupCycle","decl":{"start":{"line":94,"column":16},"end":{"line":94,"column":35}},"loc":{"start":{"line":94,"column":138},"end":{"line":127,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":103,"column":27},"end":{"line":103,"column":28}},"loc":{"start":{"line":103,"column":48},"end":{"line":108,"column":17}}},"2":{"name":"parentNodeNotInCycle","decl":{"start":{"line":138,"column":16},"end":{"line":138,"column":36}},"loc":{"start":{"line":138,"column":109},"end":{"line":154,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":139,"column":38},"end":{"line":139,"column":39}},"loc":{"start":{"line":139,"column":55},"end":{"line":152,"column":5}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":141,"column":20},"end":{"line":141,"column":24}},"loc":{"start":{"line":141,"column":28},"end":{"line":141,"column":51}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":142,"column":17},"end":{"line":142,"column":21}},"loc":{"start":{"line":142,"column":25},"end":{"line":142,"column":39}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":143,"column":20},"end":{"line":143,"column":22}},"loc":{"start":{"line":143,"column":26},"end":{"line":143,"column":63}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":145,"column":49},"end":{"line":145,"column":50}},"loc":{"start":{"line":145,"column":62},"end":{"line":149,"column":17}}},"8":{"name":"childNodeNotInCycle","decl":{"start":{"line":165,"column":16},"end":{"line":165,"column":35}},"loc":{"start":{"line":165,"column":108},"end":{"line":182,"column":1}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":166,"column":37},"end":{"line":166,"column":38}},"loc":{"start":{"line":166,"column":54},"end":{"line":179,"column":5}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":168,"column":20},"end":{"line":168,"column":24}},"loc":{"start":{"line":168,"column":28},"end":{"line":168,"column":51}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":169,"column":17},"end":{"line":169,"column":21}},"loc":{"start":{"line":169,"column":25},"end":{"line":169,"column":39}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":170,"column":20},"end":{"line":170,"column":22}},"loc":{"start":{"line":170,"column":26},"end":{"line":170,"column":63}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":172,"column":43},"end":{"line":172,"column":44}},"loc":{"start":{"line":172,"column":56},"end":{"line":176,"column":13}}},"14":{"name":"getNodesIDPlacedInGroupCycle","decl":{"start":{"line":194,"column":16},"end":{"line":194,"column":44}},"loc":{"start":{"line":194,"column":96},"end":{"line":208,"column":1}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":200,"column":24},"end":{"line":200,"column":25}},"loc":{"start":{"line":200,"column":38},"end":{"line":200,"column":82}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":201,"column":21},"end":{"line":201,"column":22}},"loc":{"start":{"line":201,"column":32},"end":{"line":201,"column":35}}},"17":{"name":"getNodesPlacedInGroupCycleAsArray","decl":{"start":{"line":220,"column":16},"end":{"line":220,"column":49}},"loc":{"start":{"line":220,"column":131},"end":{"line":242,"column":1}}},"18":{"name":"(anonymous_18)","decl":{"start":{"line":226,"column":28},"end":{"line":226,"column":29}},"loc":{"start":{"line":226,"column":42},"end":{"line":226,"column":98}}},"19":{"name":"(anonymous_19)","decl":{"start":{"line":227,"column":25},"end":{"line":227,"column":26}},"loc":{"start":{"line":227,"column":41},"end":{"line":235,"column":13}}},"20":{"name":"getNodesPlacedInGroupCycleAsObject","decl":{"start":{"line":254,"column":16},"end":{"line":254,"column":50}},"loc":{"start":{"line":254,"column":102},"end":{"line":273,"column":1}}},"21":{"name":"(anonymous_21)","decl":{"start":{"line":260,"column":32},"end":{"line":260,"column":33}},"loc":{"start":{"line":260,"column":46},"end":{"line":260,"column":102}}},"22":{"name":"(anonymous_22)","decl":{"start":{"line":261,"column":60},"end":{"line":261,"column":61}},"loc":{"start":{"line":261,"column":74},"end":{"line":266,"column":25}}},"23":{"name":"cycleMetanodeLink","decl":{"start":{"line":291,"column":16},"end":{"line":291,"column":33}},"loc":{"start":{"line":291,"column":69},"end":{"line":318,"column":1}}},"24":{"name":"sortLinksWithAllGroupCycle","decl":{"start":{"line":330,"column":16},"end":{"line":330,"column":42}},"loc":{"start":{"line":330,"column":100},"end":{"line":352,"column":1}}},"25":{"name":"(anonymous_25)","decl":{"start":{"line":336,"column":71},"end":{"line":336,"column":72}},"loc":{"start":{"line":336,"column":86},"end":{"line":340,"column":9}}},"26":{"name":"(anonymous_26)","decl":{"start":{"line":342,"column":61},"end":{"line":342,"column":62}},"loc":{"start":{"line":342,"column":70},"end":{"line":346,"column":9}}},"27":{"name":"sortLinksWithGroupCycle","decl":{"start":{"line":363,"column":9},"end":{"line":363,"column":32}},"loc":{"start":{"line":363,"column":82},"end":{"line":400,"column":1}}},"28":{"name":"(anonymous_28)","decl":{"start":{"line":387,"column":26},"end":{"line":387,"column":27}},"loc":{"start":{"line":387,"column":37},"end":{"line":395,"column":9}}},"29":{"name":"(anonymous_29)","decl":{"start":{"line":391,"column":34},"end":{"line":391,"column":35}},"loc":{"start":{"line":391,"column":46},"end":{"line":393,"column":13}}},"30":{"name":"getLinksNodeGroupCycle","decl":{"start":{"line":413,"column":9},"end":{"line":413,"column":31}},"loc":{"start":{"line":413,"column":124},"end":{"line":425,"column":1}}},"31":{"name":"(anonymous_31)","decl":{"start":{"line":416,"column":67},"end":{"line":416,"column":68}},"loc":{"start":{"line":416,"column":76},"end":{"line":418,"column":9}}},"32":{"name":"(anonymous_32)","decl":{"start":{"line":421,"column":67},"end":{"line":421,"column":68}},"loc":{"start":{"line":421,"column":76},"end":{"line":423,"column":9}}},"33":{"name":"getLinksForListNodes","decl":{"start":{"line":434,"column":16},"end":{"line":434,"column":36}},"loc":{"start":{"line":434,"column":76},"end":{"line":438,"column":1}}},"34":{"name":"(anonymous_34)","decl":{"start":{"line":435,"column":32},"end":{"line":435,"column":36}},"loc":{"start":{"line":436,"column":8},"end":{"line":436,"column":72}}},"35":{"name":"(anonymous_35)","decl":{"start":{"line":437,"column":10},"end":{"line":437,"column":14}},"loc":{"start":{"line":437,"column":17},"end":{"line":437,"column":79}}},"36":{"name":"getListNodeLinksForCycleGroupAsArray","decl":{"start":{"line":457,"column":16},"end":{"line":457,"column":52}},"loc":{"start":{"line":457,"column":136},"end":{"line":463,"column":1}}},"37":{"name":"(anonymous_37)","decl":{"start":{"line":460,"column":65},"end":{"line":460,"column":69}},"loc":{"start":{"line":460,"column":71},"end":{"line":460,"column":78}}},"38":{"name":"getListNodeLinksForCycleGroupAsObject","decl":{"start":{"line":473,"column":16},"end":{"line":473,"column":53}},"loc":{"start":{"line":473,"column":107},"end":{"line":479,"column":1}}},"39":{"name":"parentCycle","decl":{"start":{"line":493,"column":16},"end":{"line":493,"column":27}},"loc":{"start":{"line":493,"column":76},"end":{"line":500,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":94,"column":120},"end":{"line":94,"column":138}},"type":"default-arg","locations":[{"start":{"line":94,"column":134},"end":{"line":94,"column":138}}]},"1":{"loc":{"start":{"line":95,"column":4},"end":{"line":126,"column":5}},"type":"if","locations":[{"start":{"line":95,"column":4},"end":{"line":126,"column":5}},{"start":{"line":124,"column":9},"end":{"line":126,"column":5}}]},"2":{"loc":{"start":{"line":95,"column":8},"end":{"line":95,"column":108}},"type":"binary-expr","locations":[{"start":{"line":95,"column":8},"end":{"line":95,"column":48}},{"start":{"line":95,"column":52},"end":{"line":95,"column":108}}]},"3":{"loc":{"start":{"line":97,"column":8},"end":{"line":123,"column":9}},"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":123,"column":9}},{"start":{"line":121,"column":13},"end":{"line":123,"column":9}}]},"4":{"loc":{"start":{"line":102,"column":12},"end":{"line":109,"column":13}},"type":"if","locations":[{"start":{"line":102,"column":12},"end":{"line":109,"column":13}}]},"5":{"loc":{"start":{"line":104,"column":20},"end":{"line":104,"column":158}},"type":"if","locations":[{"start":{"line":104,"column":20},"end":{"line":104,"column":158}}]},"6":{"loc":{"start":{"line":104,"column":23},"end":{"line":104,"column":101}},"type":"binary-expr","locations":[{"start":{"line":104,"column":23},"end":{"line":104,"column":60}},{"start":{"line":104,"column":64},"end":{"line":104,"column":101}}]},"7":{"loc":{"start":{"line":110,"column":12},"end":{"line":120,"column":13}},"type":"if","locations":[{"start":{"line":110,"column":12},"end":{"line":120,"column":13}},{"start":{"line":115,"column":19},"end":{"line":120,"column":13}}]},"8":{"loc":{"start":{"line":138,"column":91},"end":{"line":138,"column":109}},"type":"default-arg","locations":[{"start":{"line":138,"column":104},"end":{"line":138,"column":109}}]},"9":{"loc":{"start":{"line":144,"column":12},"end":{"line":150,"column":13}},"type":"if","locations":[{"start":{"line":144,"column":12},"end":{"line":150,"column":13}}]},"10":{"loc":{"start":{"line":165,"column":90},"end":{"line":165,"column":108}},"type":"default-arg","locations":[{"start":{"line":165,"column":103},"end":{"line":165,"column":108}}]},"11":{"loc":{"start":{"line":171,"column":8},"end":{"line":177,"column":9}},"type":"if","locations":[{"start":{"line":171,"column":8},"end":{"line":177,"column":9}}]},"12":{"loc":{"start":{"line":195,"column":4},"end":{"line":207,"column":5}},"type":"if","locations":[{"start":{"line":195,"column":4},"end":{"line":207,"column":5}},{"start":{"line":205,"column":9},"end":{"line":207,"column":5}}]},"13":{"loc":{"start":{"line":195,"column":8},"end":{"line":195,"column":108}},"type":"binary-expr","locations":[{"start":{"line":195,"column":8},"end":{"line":195,"column":48}},{"start":{"line":195,"column":52},"end":{"line":195,"column":108}}]},"14":{"loc":{"start":{"line":197,"column":8},"end":{"line":204,"column":9}},"type":"if","locations":[{"start":{"line":197,"column":8},"end":{"line":204,"column":9}},{"start":{"line":202,"column":13},"end":{"line":204,"column":9}}]},"15":{"loc":{"start":{"line":200,"column":38},"end":{"line":200,"column":82}},"type":"binary-expr","locations":[{"start":{"line":200,"column":38},"end":{"line":200,"column":58}},{"start":{"line":200,"column":62},"end":{"line":200,"column":82}}]},"16":{"loc":{"start":{"line":220,"column":102},"end":{"line":220,"column":131}},"type":"default-arg","locations":[{"start":{"line":220,"column":126},"end":{"line":220,"column":131}}]},"17":{"loc":{"start":{"line":221,"column":4},"end":{"line":241,"column":5}},"type":"if","locations":[{"start":{"line":221,"column":4},"end":{"line":241,"column":5}},{"start":{"line":239,"column":9},"end":{"line":241,"column":5}}]},"18":{"loc":{"start":{"line":221,"column":8},"end":{"line":221,"column":108}},"type":"binary-expr","locations":[{"start":{"line":221,"column":8},"end":{"line":221,"column":48}},{"start":{"line":221,"column":52},"end":{"line":221,"column":108}}]},"19":{"loc":{"start":{"line":223,"column":8},"end":{"line":238,"column":9}},"type":"if","locations":[{"start":{"line":223,"column":8},"end":{"line":238,"column":9}},{"start":{"line":236,"column":13},"end":{"line":238,"column":9}}]},"20":{"loc":{"start":{"line":226,"column":52},"end":{"line":226,"column":96}},"type":"binary-expr","locations":[{"start":{"line":226,"column":52},"end":{"line":226,"column":72}},{"start":{"line":226,"column":76},"end":{"line":226,"column":96}}]},"21":{"loc":{"start":{"line":228,"column":24},"end":{"line":234,"column":25}},"type":"if","locations":[{"start":{"line":228,"column":24},"end":{"line":234,"column":25}},{"start":{"line":232,"column":29},"end":{"line":234,"column":25}}]},"22":{"loc":{"start":{"line":228,"column":28},"end":{"line":228,"column":58}},"type":"binary-expr","locations":[{"start":{"line":228,"column":28},"end":{"line":228,"column":41}},{"start":{"line":228,"column":45},"end":{"line":228,"column":58}}]},"23":{"loc":{"start":{"line":229,"column":28},"end":{"line":230,"column":null}},"type":"if","locations":[{"start":{"line":229,"column":28},"end":{"line":230,"column":null}},{"start":{"line":230,"column":33},"end":{"line":230,"column":null}}]},"24":{"loc":{"start":{"line":255,"column":4},"end":{"line":272,"column":5}},"type":"if","locations":[{"start":{"line":255,"column":4},"end":{"line":272,"column":5}},{"start":{"line":270,"column":11},"end":{"line":272,"column":5}}]},"25":{"loc":{"start":{"line":255,"column":8},"end":{"line":255,"column":108}},"type":"binary-expr","locations":[{"start":{"line":255,"column":8},"end":{"line":255,"column":48}},{"start":{"line":255,"column":52},"end":{"line":255,"column":108}}]},"26":{"loc":{"start":{"line":257,"column":8},"end":{"line":269,"column":9}},"type":"if","locations":[{"start":{"line":257,"column":8},"end":{"line":269,"column":9}},{"start":{"line":267,"column":13},"end":{"line":269,"column":9}}]},"27":{"loc":{"start":{"line":260,"column":56},"end":{"line":260,"column":100}},"type":"binary-expr","locations":[{"start":{"line":260,"column":56},"end":{"line":260,"column":76}},{"start":{"line":260,"column":80},"end":{"line":260,"column":100}}]},"28":{"loc":{"start":{"line":262,"column":28},"end":{"line":264,"column":29}},"type":"if","locations":[{"start":{"line":262,"column":28},"end":{"line":264,"column":29}}]},"29":{"loc":{"start":{"line":262,"column":32},"end":{"line":262,"column":68}},"type":"binary-expr","locations":[{"start":{"line":262,"column":32},"end":{"line":262,"column":48}},{"start":{"line":262,"column":52},"end":{"line":262,"column":68}}]},"30":{"loc":{"start":{"line":291,"column":51},"end":{"line":291,"column":69}},"type":"default-arg","locations":[{"start":{"line":291,"column":65},"end":{"line":291,"column":69}}]},"31":{"loc":{"start":{"line":298,"column":4},"end":{"line":303,"column":5}},"type":"if","locations":[{"start":{"line":298,"column":4},"end":{"line":303,"column":5}},{"start":{"line":301,"column":9},"end":{"line":303,"column":5}}]},"32":{"loc":{"start":{"line":298,"column":7},"end":{"line":298,"column":174}},"type":"binary-expr","locations":[{"start":{"line":298,"column":7},"end":{"line":298,"column":12}},{"start":{"line":298,"column":16},"end":{"line":298,"column":42}},{"start":{"line":298,"column":46},"end":{"line":298,"column":119}},{"start":{"line":298,"column":123},"end":{"line":298,"column":174}}]},"33":{"loc":{"start":{"line":306,"column":4},"end":{"line":311,"column":5}},"type":"if","locations":[{"start":{"line":306,"column":4},"end":{"line":311,"column":5}},{"start":{"line":309,"column":9},"end":{"line":311,"column":5}}]},"34":{"loc":{"start":{"line":306,"column":7},"end":{"line":306,"column":174}},"type":"binary-expr","locations":[{"start":{"line":306,"column":7},"end":{"line":306,"column":12}},{"start":{"line":306,"column":16},"end":{"line":306,"column":42}},{"start":{"line":306,"column":46},"end":{"line":306,"column":119}},{"start":{"line":306,"column":123},"end":{"line":306,"column":174}}]},"35":{"loc":{"start":{"line":308,"column":8},"end":{"line":308,"column":55}},"type":"if","locations":[{"start":{"line":308,"column":8},"end":{"line":308,"column":55}}]},"36":{"loc":{"start":{"line":313,"column":4},"end":{"line":313,"column":52}},"type":"if","locations":[{"start":{"line":313,"column":4},"end":{"line":313,"column":52}}]},"37":{"loc":{"start":{"line":314,"column":4},"end":{"line":314,"column":52}},"type":"if","locations":[{"start":{"line":314,"column":4},"end":{"line":314,"column":52}}]},"38":{"loc":{"start":{"line":330,"column":75},"end":{"line":330,"column":100}},"type":"default-arg","locations":[{"start":{"line":330,"column":95},"end":{"line":330,"column":100}}]},"39":{"loc":{"start":{"line":334,"column":4},"end":{"line":351,"column":5}},"type":"if","locations":[{"start":{"line":334,"column":4},"end":{"line":351,"column":5}},{"start":{"line":349,"column":9},"end":{"line":351,"column":5}}]},"40":{"loc":{"start":{"line":334,"column":8},"end":{"line":334,"column":64}},"type":"binary-expr","locations":[{"start":{"line":334,"column":8},"end":{"line":334,"column":19}},{"start":{"line":334,"column":24},"end":{"line":334,"column":64}}]},"41":{"loc":{"start":{"line":343,"column":12},"end":{"line":345,"column":13}},"type":"if","locations":[{"start":{"line":343,"column":12},"end":{"line":345,"column":13}}]},"42":{"loc":{"start":{"line":365,"column":4},"end":{"line":399,"column":5}},"type":"if","locations":[{"start":{"line":365,"column":4},"end":{"line":399,"column":5}},{"start":{"line":397,"column":9},"end":{"line":399,"column":5}}]},"43":{"loc":{"start":{"line":365,"column":8},"end":{"line":365,"column":106}},"type":"binary-expr","locations":[{"start":{"line":365,"column":8},"end":{"line":365,"column":48}},{"start":{"line":365,"column":52},"end":{"line":365,"column":106}}]},"44":{"loc":{"start":{"line":375,"column":8},"end":{"line":384,"column":9}},"type":"if","locations":[{"start":{"line":375,"column":8},"end":{"line":384,"column":9}},{"start":{"line":379,"column":13},"end":{"line":384,"column":9}}]},"45":{"loc":{"start":{"line":414,"column":4},"end":{"line":424,"column":5}},"type":"if","locations":[{"start":{"line":414,"column":4},"end":{"line":424,"column":5}},{"start":{"line":419,"column":9},"end":{"line":424,"column":5}}]},"46":{"loc":{"start":{"line":417,"column":19},"end":{"line":417,"column":203}},"type":"binary-expr","locations":[{"start":{"line":417,"column":19},"end":{"line":417,"column":44}},{"start":{"line":417,"column":48},"end":{"line":417,"column":74}},{"start":{"line":417,"column":78},"end":{"line":417,"column":131}},{"start":{"line":417,"column":135},"end":{"line":417,"column":203}}]},"47":{"loc":{"start":{"line":422,"column":19},"end":{"line":422,"column":203}},"type":"binary-expr","locations":[{"start":{"line":422,"column":19},"end":{"line":422,"column":44}},{"start":{"line":422,"column":48},"end":{"line":422,"column":74}},{"start":{"line":422,"column":78},"end":{"line":422,"column":131}},{"start":{"line":422,"column":135},"end":{"line":422,"column":203}}]},"48":{"loc":{"start":{"line":436,"column":8},"end":{"line":436,"column":72}},"type":"binary-expr","locations":[{"start":{"line":436,"column":8},"end":{"line":436,"column":38}},{"start":{"line":436,"column":42},"end":{"line":436,"column":72}}]},"49":{"loc":{"start":{"line":457,"column":107},"end":{"line":457,"column":136}},"type":"default-arg","locations":[{"start":{"line":457,"column":131},"end":{"line":457,"column":136}}]},"50":{"loc":{"start":{"line":494,"column":4},"end":{"line":494,"column":145}},"type":"if","locations":[{"start":{"line":494,"column":4},"end":{"line":494,"column":145}}]},"51":{"loc":{"start":{"line":494,"column":8},"end":{"line":494,"column":95}},"type":"binary-expr","locations":[{"start":{"line":494,"column":8},"end":{"line":494,"column":44}},{"start":{"line":494,"column":48},"end":{"line":494,"column":95}}]},"52":{"loc":{"start":{"line":495,"column":4},"end":{"line":499,"column":5}},"type":"if","locations":[{"start":{"line":495,"column":4},"end":{"line":499,"column":5}},{"start":{"line":497,"column":9},"end":{"line":499,"column":5}}]},"53":{"loc":{"start":{"line":495,"column":8},"end":{"line":495,"column":159}},"type":"binary-expr","locations":[{"start":{"line":495,"column":8},"end":{"line":495,"column":69}},{"start":{"line":495,"column":73},"end":{"line":495,"column":159}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0],"5":[0],"6":[0,0],"7":[0,0],"8":[0],"9":[0],"10":[0],"11":[0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0],"29":[0,0],"30":[0],"31":[0,0],"32":[0,0,0,0],"33":[0,0],"34":[0,0,0,0],"35":[0],"36":[0],"37":[0],"38":[0],"39":[0,0],"40":[0,0],"41":[0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0,0,0],"47":[0,0,0,0],"48":[0,0],"49":[0],"50":[0],"51":[0,0],"52":[0,0],"53":[0,0]}}
-,"/home/elora/Documents/viz-layout/src/composables/CalculateSize.ts": {"path":"/home/elora/Documents/viz-layout/src/composables/CalculateSize.ts","statementMap":{"0":{"start":{"line":93,"column":0},"end":{"line":93,"column":16}},"1":{"start":{"line":104,"column":0},"end":{"line":104,"column":16}},"2":{"start":{"line":114,"column":0},"end":{"line":114,"column":16}},"3":{"start":{"line":137,"column":0},"end":{"line":137,"column":22}},"4":{"start":{"line":167,"column":0},"end":{"line":167,"column":22}},"5":{"start":{"line":183,"column":0},"end":{"line":183,"column":22}},"6":{"start":{"line":204,"column":0},"end":{"line":204,"column":16}},"7":{"start":{"line":230,"column":0},"end":{"line":230,"column":16}},"8":{"start":{"line":266,"column":0},"end":{"line":266,"column":16}},"9":{"start":{"line":347,"column":0},"end":{"line":347,"column":16}},"10":{"start":{"line":392,"column":0},"end":{"line":392,"column":16}},"11":{"start":{"line":409,"column":0},"end":{"line":409,"column":16}},"12":{"start":{"line":421,"column":0},"end":{"line":421,"column":16}},"13":{"start":{"line":5,"column":0},"end":{"line":5,"column":59}},"14":{"start":{"line":10,"column":0},"end":{"line":10,"column":65}},"15":{"start":{"line":83,"column":13},"end":{"line":83,"column":36}},"16":{"start":{"line":84,"column":13},"end":{"line":84,"column":35}},"17":{"start":{"line":94,"column":4},"end":{"line":94,"column":58}},"18":{"start":{"line":94,"column":17},"end":{"line":94,"column":58}},"19":{"start":{"line":95,"column":4},"end":{"line":95,"column":49}},"20":{"start":{"line":105,"column":4},"end":{"line":105,"column":49}},"21":{"start":{"line":115,"column":22},"end":{"line":115,"column":39}},"22":{"start":{"line":116,"column":21},"end":{"line":116,"column":37}},"23":{"start":{"line":117,"column":4},"end":{"line":125,"column":5}},"24":{"start":{"line":118,"column":8},"end":{"line":124,"column":11}},"25":{"start":{"line":119,"column":12},"end":{"line":123,"column":13}},"26":{"start":{"line":120,"column":28},"end":{"line":120,"column":59}},"27":{"start":{"line":121,"column":16},"end":{"line":121,"column":59}},"28":{"start":{"line":122,"column":16},"end":{"line":122,"column":55}},"29":{"start":{"line":127,"column":4},"end":{"line":127,"column":39}},"30":{"start":{"line":137,"column":44},"end":{"line":155,"column":null}},"31":{"start":{"line":138,"column":24},"end":{"line":138,"column":25}},"32":{"start":{"line":139,"column":23},"end":{"line":139,"column":24}},"33":{"start":{"line":140,"column":19},"end":{"line":140,"column":20}},"34":{"start":{"line":141,"column":4},"end":{"line":148,"column":7}},"35":{"start":{"line":142,"column":8},"end":{"line":147,"column":9}},"36":{"start":{"line":143,"column":23},"end":{"line":143,"column":58}},"37":{"start":{"line":144,"column":12},"end":{"line":144,"column":34}},"38":{"start":{"line":145,"column":12},"end":{"line":145,"column":32}},"39":{"start":{"line":146,"column":12},"end":{"line":146,"column":17}},"40":{"start":{"line":150,"column":4},"end":{"line":152,"column":5}},"41":{"start":{"line":151,"column":8},"end":{"line":151,"column":65}},"42":{"start":{"line":154,"column":4},"end":{"line":154,"column":43}},"43":{"start":{"line":167,"column":45},"end":{"line":172,"column":null}},"44":{"start":{"line":168,"column":24},"end":{"line":168,"column":94}},"45":{"start":{"line":169,"column":20},"end":{"line":169,"column":64}},"46":{"start":{"line":170,"column":20},"end":{"line":170,"column":63}},"47":{"start":{"line":171,"column":4},"end":{"line":171,"column":32}},"48":{"start":{"line":183,"column":44},"end":{"line":188,"column":null}},"49":{"start":{"line":184,"column":24},"end":{"line":184,"column":94}},"50":{"start":{"line":185,"column":20},"end":{"line":185,"column":48}},"51":{"start":{"line":186,"column":20},"end":{"line":186,"column":46}},"52":{"start":{"line":187,"column":4},"end":{"line":187,"column":32}},"53":{"start":{"line":195,"column":29},"end":{"line":195,"column":31}},"54":{"start":{"line":205,"column":22},"end":{"line":205,"column":30}},"55":{"start":{"line":206,"column":4},"end":{"line":215,"column":7}},"56":{"start":{"line":207,"column":8},"end":{"line":214,"column":9}},"57":{"start":{"line":208,"column":30},"end":{"line":208,"column":59}},"58":{"start":{"line":209,"column":30},"end":{"line":209,"column":59}},"59":{"start":{"line":210,"column":36},"end":{"line":210,"column":64}},"60":{"start":{"line":211,"column":12},"end":{"line":213,"column":13}},"61":{"start":{"line":212,"column":16},"end":{"line":212,"column":62}},"62":{"start":{"line":216,"column":4},"end":{"line":220,"column":5}},"63":{"start":{"line":217,"column":8},"end":{"line":217,"column":19}},"64":{"start":{"line":219,"column":8},"end":{"line":219,"column":50}},"65":{"start":{"line":231,"column":32},"end":{"line":231,"column":34}},"66":{"start":{"line":232,"column":4},"end":{"line":239,"column":7}},"67":{"start":{"line":233,"column":8},"end":{"line":238,"column":9}},"68":{"start":{"line":234,"column":23},"end":{"line":234,"column":52}},"69":{"start":{"line":235,"column":23},"end":{"line":235,"column":52}},"70":{"start":{"line":236,"column":29},"end":{"line":236,"column":57}},"71":{"start":{"line":237,"column":12},"end":{"line":237,"column":37}},"72":{"start":{"line":241,"column":4},"end":{"line":241,"column":36}},"73":{"start":{"line":241,"column":29},"end":{"line":241,"column":34}},"74":{"start":{"line":243,"column":4},"end":{"line":243,"column":41}},"75":{"start":{"line":243,"column":32},"end":{"line":243,"column":41}},"76":{"start":{"line":245,"column":16},"end":{"line":245,"column":48}},"77":{"start":{"line":248,"column":4},"end":{"line":250,"column":5}},"78":{"start":{"line":249,"column":8},"end":{"line":249,"column":82}},"79":{"start":{"line":253,"column":4},"end":{"line":253,"column":49}},"80":{"start":{"line":269,"column":23},"end":{"line":269,"column":58}},"81":{"start":{"line":269,"column":50},"end":{"line":269,"column":57}},"82":{"start":{"line":270,"column":23},"end":{"line":270,"column":58}},"83":{"start":{"line":270,"column":50},"end":{"line":270,"column":57}},"84":{"start":{"line":273,"column":15},"end":{"line":273,"column":40}},"85":{"start":{"line":274,"column":22},"end":{"line":274,"column":48}},"86":{"start":{"line":276,"column":15},"end":{"line":276,"column":40}},"87":{"start":{"line":277,"column":22},"end":{"line":277,"column":48}},"88":{"start":{"line":279,"column":15},"end":{"line":279,"column":40}},"89":{"start":{"line":280,"column":22},"end":{"line":280,"column":48}},"90":{"start":{"line":282,"column":15},"end":{"line":282,"column":40}},"91":{"start":{"line":283,"column":22},"end":{"line":283,"column":48}},"92":{"start":{"line":286,"column":4},"end":{"line":327,"column":5}},"93":{"start":{"line":289,"column":8},"end":{"line":296,"column":9}},"94":{"start":{"line":290,"column":12},"end":{"line":290,"column":39}},"95":{"start":{"line":292,"column":29},"end":{"line":292,"column":46}},"96":{"start":{"line":293,"column":12},"end":{"line":293,"column":101}},"97":{"start":{"line":293,"column":62},"end":{"line":293,"column":101}},"98":{"start":{"line":294,"column":33},"end":{"line":294,"column":119}},"99":{"start":{"line":295,"column":12},"end":{"line":295,"column":47}},"100":{"start":{"line":299,"column":8},"end":{"line":306,"column":9}},"101":{"start":{"line":300,"column":12},"end":{"line":300,"column":38}},"102":{"start":{"line":302,"column":29},"end":{"line":302,"column":46}},"103":{"start":{"line":303,"column":12},"end":{"line":303,"column":101}},"104":{"start":{"line":303,"column":62},"end":{"line":303,"column":101}},"105":{"start":{"line":304,"column":33},"end":{"line":304,"column":119}},"106":{"start":{"line":305,"column":12},"end":{"line":305,"column":47}},"107":{"start":{"line":309,"column":8},"end":{"line":316,"column":9}},"108":{"start":{"line":310,"column":12},"end":{"line":310,"column":40}},"109":{"start":{"line":312,"column":29},"end":{"line":312,"column":46}},"110":{"start":{"line":313,"column":12},"end":{"line":313,"column":101}},"111":{"start":{"line":313,"column":62},"end":{"line":313,"column":101}},"112":{"start":{"line":314,"column":33},"end":{"line":314,"column":119}},"113":{"start":{"line":315,"column":12},"end":{"line":315,"column":48}},"114":{"start":{"line":319,"column":8},"end":{"line":326,"column":9}},"115":{"start":{"line":320,"column":12},"end":{"line":320,"column":39}},"116":{"start":{"line":322,"column":29},"end":{"line":322,"column":46}},"117":{"start":{"line":323,"column":12},"end":{"line":323,"column":101}},"118":{"start":{"line":323,"column":62},"end":{"line":323,"column":101}},"119":{"start":{"line":324,"column":33},"end":{"line":324,"column":119}},"120":{"start":{"line":325,"column":12},"end":{"line":325,"column":48}},"121":{"start":{"line":329,"column":4},"end":{"line":336,"column":6}},"122":{"start":{"line":348,"column":4},"end":{"line":352,"column":5}},"123":{"start":{"line":349,"column":8},"end":{"line":351,"column":11}},"124":{"start":{"line":350,"column":12},"end":{"line":350,"column":75}},"125":{"start":{"line":354,"column":4},"end":{"line":354,"column":27}},"126":{"start":{"line":365,"column":4},"end":{"line":376,"column":5}},"127":{"start":{"line":367,"column":34},"end":{"line":368,"column":125}},"128":{"start":{"line":368,"column":46},"end":{"line":368,"column":124}},"129":{"start":{"line":369,"column":32},"end":{"line":369,"column":117}},"130":{"start":{"line":369,"column":69},"end":{"line":369,"column":116}},"131":{"start":{"line":370,"column":23},"end":{"line":370,"column":69}},"132":{"start":{"line":370,"column":58},"end":{"line":370,"column":68}},"133":{"start":{"line":372,"column":36},"end":{"line":372,"column":89}},"134":{"start":{"line":373,"column":8},"end":{"line":373,"column":31}},"135":{"start":{"line":374,"column":8},"end":{"line":374,"column":33}},"136":{"start":{"line":375,"column":8},"end":{"line":375,"column":43}},"137":{"start":{"line":377,"column":4},"end":{"line":377,"column":27}},"138":{"start":{"line":393,"column":4},"end":{"line":399,"column":null}},"139":{"start":{"line":394,"column":8},"end":{"line":398,"column":9}},"140":{"start":{"line":395,"column":24},"end":{"line":395,"column":61}},"141":{"start":{"line":396,"column":12},"end":{"line":396,"column":21}},"142":{"start":{"line":397,"column":12},"end":{"line":397,"column":21}},"143":{"start":{"line":410,"column":17},"end":{"line":410,"column":45}},"144":{"start":{"line":411,"column":4},"end":{"line":411,"column":null}},"145":{"start":{"line":422,"column":17},"end":{"line":422,"column":45}},"146":{"start":{"line":423,"column":4},"end":{"line":423,"column":null}}},"fnMap":{"0":{"name":"pixelsToInches","decl":{"start":{"line":93,"column":16},"end":{"line":93,"column":30}},"loc":{"start":{"line":93,"column":63},"end":{"line":96,"column":1}}},"1":{"name":"inchesToPixels","decl":{"start":{"line":104,"column":16},"end":{"line":104,"column":30}},"loc":{"start":{"line":104,"column":63},"end":{"line":106,"column":1}}},"2":{"name":"getSizeNodePixel","decl":{"start":{"line":114,"column":16},"end":{"line":114,"column":32}},"loc":{"start":{"line":114,"column":76},"end":{"line":128,"column":1}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":118,"column":29},"end":{"line":118,"column":30}},"loc":{"start":{"line":118,"column":39},"end":{"line":124,"column":9}}},"4":{"name":"getMeanNodesSizePixel","decl":{"start":{"line":137,"column":22},"end":{"line":137,"column":43}},"loc":{"start":{"line":137,"column":43},"end":{"line":155,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":137,"column":44},"end":{"line":137,"column":56}},"loc":{"start":{"line":137,"column":124},"end":{"line":155,"column":1}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":141,"column":18},"end":{"line":141,"column":19}},"loc":{"start":{"line":141,"column":26},"end":{"line":148,"column":5}}},"7":{"name":"getSepAttributesInches","decl":{"start":{"line":167,"column":22},"end":{"line":167,"column":44}},"loc":{"start":{"line":167,"column":44},"end":{"line":172,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":167,"column":45},"end":{"line":167,"column":60}},"loc":{"start":{"line":167,"column":110},"end":{"line":172,"column":1}}},"9":{"name":"getSepAttributesPixel","decl":{"start":{"line":183,"column":22},"end":{"line":183,"column":43}},"loc":{"start":{"line":183,"column":43},"end":{"line":188,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":183,"column":44},"end":{"line":183,"column":59}},"loc":{"start":{"line":183,"column":109},"end":{"line":188,"column":1}}},"11":{"name":"minEdgeLength","decl":{"start":{"line":204,"column":16},"end":{"line":204,"column":29}},"loc":{"start":{"line":204,"column":72},"end":{"line":221,"column":1}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":206,"column":26},"end":{"line":206,"column":27}},"loc":{"start":{"line":206,"column":35},"end":{"line":215,"column":5}}},"13":{"name":"medianEdgeLength","decl":{"start":{"line":230,"column":16},"end":{"line":230,"column":32}},"loc":{"start":{"line":230,"column":79},"end":{"line":254,"column":1}}},"14":{"name":"(anonymous_21)","decl":{"start":{"line":232,"column":26},"end":{"line":232,"column":27}},"loc":{"start":{"line":232,"column":35},"end":{"line":239,"column":5}}},"15":{"name":"(anonymous_22)","decl":{"start":{"line":241,"column":19},"end":{"line":241,"column":20}},"loc":{"start":{"line":241,"column":29},"end":{"line":241,"column":34}}},"16":{"name":"rectangleSize","decl":{"start":{"line":266,"column":16},"end":{"line":266,"column":29}},"loc":{"start":{"line":266,"column":108},"end":{"line":337,"column":1}}},"17":{"name":"(anonymous_24)","decl":{"start":{"line":269,"column":43},"end":{"line":269,"column":48}},"loc":{"start":{"line":269,"column":50},"end":{"line":269,"column":57}}},"18":{"name":"(anonymous_25)","decl":{"start":{"line":270,"column":43},"end":{"line":270,"column":48}},"loc":{"start":{"line":270,"column":50},"end":{"line":270,"column":57}}},"19":{"name":"getSizeAllGroupCycles","decl":{"start":{"line":347,"column":16},"end":{"line":347,"column":37}},"loc":{"start":{"line":347,"column":69},"end":{"line":355,"column":1}}},"20":{"name":"(anonymous_27)","decl":{"start":{"line":349,"column":72},"end":{"line":349,"column":82}},"loc":{"start":{"line":349,"column":85},"end":{"line":351,"column":9}}},"21":{"name":"getSizeGroupCycles","decl":{"start":{"line":364,"column":9},"end":{"line":364,"column":27}},"loc":{"start":{"line":364,"column":79},"end":{"line":378,"column":1}}},"22":{"name":"(anonymous_29)","decl":{"start":{"line":368,"column":32},"end":{"line":368,"column":33}},"loc":{"start":{"line":368,"column":46},"end":{"line":368,"column":124}}},"23":{"name":"(anonymous_30)","decl":{"start":{"line":369,"column":54},"end":{"line":369,"column":55}},"loc":{"start":{"line":369,"column":67},"end":{"line":369,"column":116}}},"24":{"name":"(anonymous_31)","decl":{"start":{"line":370,"column":45},"end":{"line":370,"column":46}},"loc":{"start":{"line":370,"column":56},"end":{"line":370,"column":68}}},"25":{"name":"shiftAllToGetTopLeftCoord","decl":{"start":{"line":392,"column":16},"end":{"line":392,"column":41}},"loc":{"start":{"line":392,"column":110},"end":{"line":400,"column":1}}},"26":{"name":"(anonymous_33)","decl":{"start":{"line":393,"column":41},"end":{"line":393,"column":45}},"loc":{"start":{"line":393,"column":47},"end":{"line":399,"column":5}}},"27":{"name":"getTopLeftCoordFromCenter","decl":{"start":{"line":409,"column":16},"end":{"line":409,"column":41}},"loc":{"start":{"line":409,"column":78},"end":{"line":412,"column":1}}},"28":{"name":"getCenterCoordFromTopLeft","decl":{"start":{"line":421,"column":16},"end":{"line":421,"column":41}},"loc":{"start":{"line":421,"column":78},"end":{"line":424,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":93,"column":47},"end":{"line":93,"column":63}},"type":"default-arg","locations":[{"start":{"line":93,"column":61},"end":{"line":93,"column":63}}]},"1":{"loc":{"start":{"line":94,"column":4},"end":{"line":94,"column":58}},"type":"if","locations":[{"start":{"line":94,"column":4},"end":{"line":94,"column":58}}]},"2":{"loc":{"start":{"line":104,"column":47},"end":{"line":104,"column":63}},"type":"default-arg","locations":[{"start":{"line":104,"column":61},"end":{"line":104,"column":63}}]},"3":{"loc":{"start":{"line":117,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":117,"column":4},"end":{"line":125,"column":5}}]},"4":{"loc":{"start":{"line":119,"column":12},"end":{"line":123,"column":13}},"type":"if","locations":[{"start":{"line":119,"column":12},"end":{"line":123,"column":13}}]},"5":{"loc":{"start":{"line":119,"column":16},"end":{"line":119,"column":76}},"type":"binary-expr","locations":[{"start":{"line":119,"column":16},"end":{"line":119,"column":39}},{"start":{"line":119,"column":43},"end":{"line":119,"column":76}}]},"6":{"loc":{"start":{"line":121,"column":25},"end":{"line":121,"column":58}},"type":"cond-expr","locations":[{"start":{"line":121,"column":39},"end":{"line":121,"column":51}},{"start":{"line":121,"column":52},"end":{"line":121,"column":58}}]},"7":{"loc":{"start":{"line":122,"column":24},"end":{"line":122,"column":54}},"type":"cond-expr","locations":[{"start":{"line":122,"column":37},"end":{"line":122,"column":48}},{"start":{"line":122,"column":49},"end":{"line":122,"column":54}}]},"8":{"loc":{"start":{"line":137,"column":91},"end":{"line":137,"column":124}},"type":"default-arg","locations":[{"start":{"line":137,"column":120},"end":{"line":137,"column":124}}]},"9":{"loc":{"start":{"line":142,"column":8},"end":{"line":147,"column":9}},"type":"if","locations":[{"start":{"line":142,"column":8},"end":{"line":147,"column":9}}]},"10":{"loc":{"start":{"line":142,"column":12},"end":{"line":142,"column":58}},"type":"binary-expr","locations":[{"start":{"line":142,"column":12},"end":{"line":142,"column":32}},{"start":{"line":142,"column":37},"end":{"line":142,"column":58}}]},"11":{"loc":{"start":{"line":150,"column":4},"end":{"line":152,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":152,"column":5}}]},"12":{"loc":{"start":{"line":167,"column":95},"end":{"line":167,"column":110}},"type":"default-arg","locations":[{"start":{"line":167,"column":109},"end":{"line":167,"column":110}}]},"13":{"loc":{"start":{"line":183,"column":94},"end":{"line":183,"column":109}},"type":"default-arg","locations":[{"start":{"line":183,"column":108},"end":{"line":183,"column":109}}]},"14":{"loc":{"start":{"line":204,"column":47},"end":{"line":204,"column":72}},"type":"default-arg","locations":[{"start":{"line":204,"column":68},"end":{"line":204,"column":72}}]},"15":{"loc":{"start":{"line":207,"column":8},"end":{"line":214,"column":9}},"type":"if","locations":[{"start":{"line":207,"column":8},"end":{"line":214,"column":9}}]},"16":{"loc":{"start":{"line":207,"column":12},"end":{"line":207,"column":98}},"type":"binary-expr","locations":[{"start":{"line":207,"column":12},"end":{"line":207,"column":24}},{"start":{"line":207,"column":29},"end":{"line":207,"column":61}},{"start":{"line":207,"column":65},"end":{"line":207,"column":97}}]},"17":{"loc":{"start":{"line":211,"column":12},"end":{"line":213,"column":13}},"type":"if","locations":[{"start":{"line":211,"column":12},"end":{"line":213,"column":13}}]},"18":{"loc":{"start":{"line":216,"column":4},"end":{"line":220,"column":5}},"type":"if","locations":[{"start":{"line":216,"column":4},"end":{"line":220,"column":5}},{"start":{"line":218,"column":9},"end":{"line":220,"column":5}}]},"19":{"loc":{"start":{"line":230,"column":51},"end":{"line":230,"column":79}},"type":"default-arg","locations":[{"start":{"line":230,"column":75},"end":{"line":230,"column":79}}]},"20":{"loc":{"start":{"line":233,"column":8},"end":{"line":238,"column":9}},"type":"if","locations":[{"start":{"line":233,"column":8},"end":{"line":238,"column":9}}]},"21":{"loc":{"start":{"line":233,"column":12},"end":{"line":233,"column":100}},"type":"binary-expr","locations":[{"start":{"line":233,"column":12},"end":{"line":233,"column":24}},{"start":{"line":233,"column":29},"end":{"line":233,"column":62}},{"start":{"line":233,"column":66},"end":{"line":233,"column":99}}]},"22":{"loc":{"start":{"line":243,"column":4},"end":{"line":243,"column":41}},"type":"if","locations":[{"start":{"line":243,"column":4},"end":{"line":243,"column":41}}]},"23":{"loc":{"start":{"line":248,"column":4},"end":{"line":250,"column":5}},"type":"if","locations":[{"start":{"line":248,"column":4},"end":{"line":250,"column":5}}]},"24":{"loc":{"start":{"line":286,"column":4},"end":{"line":327,"column":5}},"type":"if","locations":[{"start":{"line":286,"column":4},"end":{"line":327,"column":5}}]},"25":{"loc":{"start":{"line":286,"column":8},"end":{"line":286,"column":33}},"type":"binary-expr","locations":[{"start":{"line":286,"column":8},"end":{"line":286,"column":14}},{"start":{"line":286,"column":18},"end":{"line":286,"column":33}}]},"26":{"loc":{"start":{"line":289,"column":8},"end":{"line":296,"column":9}},"type":"if","locations":[{"start":{"line":289,"column":8},"end":{"line":296,"column":9}},{"start":{"line":291,"column":15},"end":{"line":296,"column":9}}]},"27":{"loc":{"start":{"line":293,"column":12},"end":{"line":293,"column":101}},"type":"if","locations":[{"start":{"line":293,"column":12},"end":{"line":293,"column":101}}]},"28":{"loc":{"start":{"line":299,"column":8},"end":{"line":306,"column":9}},"type":"if","locations":[{"start":{"line":299,"column":8},"end":{"line":306,"column":9}},{"start":{"line":301,"column":14},"end":{"line":306,"column":9}}]},"29":{"loc":{"start":{"line":303,"column":12},"end":{"line":303,"column":101}},"type":"if","locations":[{"start":{"line":303,"column":12},"end":{"line":303,"column":101}}]},"30":{"loc":{"start":{"line":309,"column":8},"end":{"line":316,"column":9}},"type":"if","locations":[{"start":{"line":309,"column":8},"end":{"line":316,"column":9}},{"start":{"line":311,"column":15},"end":{"line":316,"column":9}}]},"31":{"loc":{"start":{"line":313,"column":12},"end":{"line":313,"column":101}},"type":"if","locations":[{"start":{"line":313,"column":12},"end":{"line":313,"column":101}}]},"32":{"loc":{"start":{"line":319,"column":8},"end":{"line":326,"column":9}},"type":"if","locations":[{"start":{"line":319,"column":8},"end":{"line":326,"column":9}},{"start":{"line":321,"column":15},"end":{"line":326,"column":9}}]},"33":{"loc":{"start":{"line":323,"column":12},"end":{"line":323,"column":101}},"type":"if","locations":[{"start":{"line":323,"column":12},"end":{"line":323,"column":101}}]},"34":{"loc":{"start":{"line":348,"column":4},"end":{"line":352,"column":5}},"type":"if","locations":[{"start":{"line":348,"column":4},"end":{"line":352,"column":5}}]},"35":{"loc":{"start":{"line":365,"column":4},"end":{"line":376,"column":5}},"type":"if","locations":[{"start":{"line":365,"column":4},"end":{"line":376,"column":5}}]},"36":{"loc":{"start":{"line":368,"column":46},"end":{"line":368,"column":124}},"type":"binary-expr","locations":[{"start":{"line":368,"column":46},"end":{"line":368,"column":66}},{"start":{"line":368,"column":70},"end":{"line":368,"column":90}},{"start":{"line":368,"column":94},"end":{"line":368,"column":107}},{"start":{"line":368,"column":111},"end":{"line":368,"column":124}}]},"37":{"loc":{"start":{"line":392,"column":85},"end":{"line":392,"column":110}},"type":"default-arg","locations":[{"start":{"line":392,"column":106},"end":{"line":392,"column":110}}]},"38":{"loc":{"start":{"line":394,"column":8},"end":{"line":398,"column":9}},"type":"if","locations":[{"start":{"line":394,"column":8},"end":{"line":398,"column":9}}]},"39":{"loc":{"start":{"line":394,"column":12},"end":{"line":394,"column":53}},"type":"binary-expr","locations":[{"start":{"line":394,"column":12},"end":{"line":394,"column":24}},{"start":{"line":394,"column":28},"end":{"line":394,"column":53}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":1,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"b":{"0":[0],"1":[0],"2":[0],"3":[0],"4":[0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0],"9":[0],"10":[0,0],"11":[0],"12":[0],"13":[0],"14":[0],"15":[0],"16":[0,0,0],"17":[0],"18":[0,0],"19":[0],"20":[0],"21":[0,0,0],"22":[0],"23":[0],"24":[0],"25":[0,0],"26":[0,0],"27":[0],"28":[0,0],"29":[0],"30":[0,0],"31":[0],"32":[0,0],"33":[0],"34":[0],"35":[0],"36":[0,0,0,0],"37":[0],"38":[0],"39":[0,0]}}
-,"/home/elora/Documents/viz-layout/src/composables/CalculateStartNodes.ts": {"path":"/home/elora/Documents/viz-layout/src/composables/CalculateStartNodes.ts","statementMap":{"0":{"start":{"line":48,"column":0},"end":{"line":48,"column":16}},"1":{"start":{"line":98,"column":0},"end":{"line":98,"column":22}},"2":{"start":{"line":176,"column":0},"end":{"line":176,"column":16}},"3":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":57}},"5":{"start":{"line":51,"column":4},"end":{"line":51,"column":49}},"6":{"start":{"line":51,"column":42},"end":{"line":51,"column":47}},"7":{"start":{"line":54,"column":36},"end":{"line":54,"column":85}},"8":{"start":{"line":54,"column":82},"end":{"line":54,"column":84}},"9":{"start":{"line":55,"column":4},"end":{"line":64,"column":7}},"10":{"start":{"line":56,"column":21},"end":{"line":56,"column":45}},"11":{"start":{"line":57,"column":8},"end":{"line":63,"column":9}},"12":{"start":{"line":58,"column":12},"end":{"line":58,"column":61}},"13":{"start":{"line":58,"column":38},"end":{"line":58,"column":61}},"14":{"start":{"line":59,"column":12},"end":{"line":59,"column":44}},"15":{"start":{"line":60,"column":12},"end":{"line":62,"column":13}},"16":{"start":{"line":61,"column":16},"end":{"line":61,"column":47}},"17":{"start":{"line":66,"column":4},"end":{"line":66,"column":25}},"18":{"start":{"line":66,"column":18},"end":{"line":66,"column":25}},"19":{"start":{"line":69,"column":4},"end":{"line":71,"column":7}},"20":{"start":{"line":70,"column":8},"end":{"line":70,"column":38}},"21":{"start":{"line":70,"column":31},"end":{"line":70,"column":36}},"22":{"start":{"line":74,"column":4},"end":{"line":82,"column":7}},"23":{"start":{"line":75,"column":8},"end":{"line":81,"column":9}},"24":{"start":{"line":76,"column":25},"end":{"line":76,"column":49}},"25":{"start":{"line":77,"column":12},"end":{"line":80,"column":13}},"26":{"start":{"line":78,"column":30},"end":{"line":78,"column":63}},"27":{"start":{"line":79,"column":16},"end":{"line":79,"column":50}},"28":{"start":{"line":101,"column":4},"end":{"line":103,"column":5}},"29":{"start":{"line":102,"column":8},"end":{"line":102,"column":49}},"30":{"start":{"line":105,"column":30},"end":{"line":105,"column":32}},"31":{"start":{"line":106,"column":32},"end":{"line":106,"column":34}},"32":{"start":{"line":107,"column":29},"end":{"line":107,"column":31}},"33":{"start":{"line":111,"column":4},"end":{"line":113,"column":5}},"34":{"start":{"line":112,"column":8},"end":{"line":112,"column":48}},"35":{"start":{"line":117,"column":4},"end":{"line":127,"column":7}},"36":{"start":{"line":117,"column":59},"end":{"line":117,"column":83}},"37":{"start":{"line":118,"column":24},"end":{"line":118,"column":29}},"38":{"start":{"line":120,"column":8},"end":{"line":126,"column":9}},"39":{"start":{"line":121,"column":12},"end":{"line":121,"column":37}},"40":{"start":{"line":122,"column":15},"end":{"line":126,"column":9}},"41":{"start":{"line":123,"column":12},"end":{"line":123,"column":39}},"42":{"start":{"line":124,"column":15},"end":{"line":126,"column":9}},"43":{"start":{"line":125,"column":12},"end":{"line":125,"column":36}},"44":{"start":{"line":129,"column":4},"end":{"line":129,"column":54}},"45":{"start":{"line":140,"column":4},"end":{"line":140,"column":43}},"46":{"start":{"line":149,"column":4},"end":{"line":149,"column":117}},"47":{"start":{"line":158,"column":4},"end":{"line":158,"column":145}},"48":{"start":{"line":167,"column":4},"end":{"line":167,"column":110}},"49":{"start":{"line":177,"column":19},"end":{"line":177,"column":36}},"50":{"start":{"line":178,"column":4},"end":{"line":182,"column":7}},"51":{"start":{"line":179,"column":8},"end":{"line":181,"column":9}},"52":{"start":{"line":180,"column":12},"end":{"line":180,"column":30}},"53":{"start":{"line":183,"column":4},"end":{"line":183,"column":18}}},"fnMap":{"0":{"name":"assignRankOrder","decl":{"start":{"line":48,"column":16},"end":{"line":48,"column":31}},"loc":{"start":{"line":48,"column":101},"end":{"line":83,"column":1}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":51,"column":18},"end":{"line":51,"column":19}},"loc":{"start":{"line":51,"column":42},"end":{"line":51,"column":47}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":54,"column":76},"end":{"line":54,"column":79}},"loc":{"start":{"line":54,"column":82},"end":{"line":54,"column":84}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":55,"column":41},"end":{"line":55,"column":42}},"loc":{"start":{"line":55,"column":50},"end":{"line":64,"column":5}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":69,"column":24},"end":{"line":69,"column":31}},"loc":{"start":{"line":69,"column":34},"end":{"line":71,"column":5}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":70,"column":21},"end":{"line":70,"column":22}},"loc":{"start":{"line":70,"column":31},"end":{"line":70,"column":36}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":74,"column":41},"end":{"line":74,"column":42}},"loc":{"start":{"line":74,"column":50},"end":{"line":82,"column":5}}},"7":{"name":"getStartNodes","decl":{"start":{"line":98,"column":22},"end":{"line":98,"column":35}},"loc":{"start":{"line":98,"column":78},"end":{"line":131,"column":null}}},"8":{"name":"(anonymous_16)","decl":{"start":{"line":117,"column":39},"end":{"line":117,"column":40}},"loc":{"start":{"line":117,"column":59},"end":{"line":117,"column":83}}},"9":{"name":"(anonymous_17)","decl":{"start":{"line":118,"column":9},"end":{"line":118,"column":10}},"loc":{"start":{"line":118,"column":24},"end":{"line":118,"column":29}}},"10":{"name":"(anonymous_18)","decl":{"start":{"line":119,"column":13},"end":{"line":119,"column":17}},"loc":{"start":{"line":119,"column":20},"end":{"line":127,"column":5}}},"11":{"name":"hasRank0","decl":{"start":{"line":139,"column":9},"end":{"line":139,"column":17}},"loc":{"start":{"line":139,"column":33},"end":{"line":141,"column":1}}},"12":{"name":"needRank","decl":{"start":{"line":148,"column":9},"end":{"line":148,"column":17}},"loc":{"start":{"line":148,"column":43},"end":{"line":150,"column":1}}},"13":{"name":"needSource","decl":{"start":{"line":157,"column":9},"end":{"line":157,"column":19}},"loc":{"start":{"line":157,"column":45},"end":{"line":159,"column":1}}},"14":{"name":"needAll","decl":{"start":{"line":166,"column":9},"end":{"line":166,"column":16}},"loc":{"start":{"line":166,"column":42},"end":{"line":168,"column":1}}},"15":{"name":"concatSources","decl":{"start":{"line":176,"column":16},"end":{"line":176,"column":29}},"loc":{"start":{"line":176,"column":77},"end":{"line":184,"column":1}}},"16":{"name":"(anonymous_24)","decl":{"start":{"line":178,"column":26},"end":{"line":178,"column":30}},"loc":{"start":{"line":178,"column":33},"end":{"line":182,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":48,"column":80},"end":{"line":48,"column":101}},"type":"default-arg","locations":[{"start":{"line":48,"column":97},"end":{"line":48,"column":101}}]},"1":{"loc":{"start":{"line":57,"column":8},"end":{"line":63,"column":9}},"type":"if","locations":[{"start":{"line":57,"column":8},"end":{"line":63,"column":9}}]},"2":{"loc":{"start":{"line":58,"column":12},"end":{"line":58,"column":61}},"type":"if","locations":[{"start":{"line":58,"column":12},"end":{"line":58,"column":61}}]},"3":{"loc":{"start":{"line":60,"column":12},"end":{"line":62,"column":13}},"type":"if","locations":[{"start":{"line":60,"column":12},"end":{"line":62,"column":13}}]},"4":{"loc":{"start":{"line":66,"column":4},"end":{"line":66,"column":25}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":66,"column":25}}]},"5":{"loc":{"start":{"line":75,"column":8},"end":{"line":81,"column":9}},"type":"if","locations":[{"start":{"line":75,"column":8},"end":{"line":81,"column":9}}]},"6":{"loc":{"start":{"line":75,"column":12},"end":{"line":75,"column":71}},"type":"binary-expr","locations":[{"start":{"line":75,"column":12},"end":{"line":75,"column":31}},{"start":{"line":75,"column":35},"end":{"line":75,"column":71}}]},"7":{"loc":{"start":{"line":77,"column":12},"end":{"line":80,"column":13}},"type":"if","locations":[{"start":{"line":77,"column":12},"end":{"line":80,"column":13}}]},"8":{"loc":{"start":{"line":101,"column":4},"end":{"line":103,"column":5}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":103,"column":5}}]},"9":{"loc":{"start":{"line":111,"column":4},"end":{"line":113,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":113,"column":5}}]},"10":{"loc":{"start":{"line":120,"column":8},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":120,"column":8},"end":{"line":126,"column":9}},{"start":{"line":122,"column":15},"end":{"line":126,"column":9}}]},"11":{"loc":{"start":{"line":120,"column":11},"end":{"line":120,"column":49}},"type":"binary-expr","locations":[{"start":{"line":120,"column":11},"end":{"line":120,"column":31}},{"start":{"line":120,"column":35},"end":{"line":120,"column":49}}]},"12":{"loc":{"start":{"line":122,"column":15},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":122,"column":15},"end":{"line":126,"column":9}},{"start":{"line":124,"column":15},"end":{"line":126,"column":9}}]},"13":{"loc":{"start":{"line":122,"column":19},"end":{"line":122,"column":72}},"type":"binary-expr","locations":[{"start":{"line":122,"column":19},"end":{"line":122,"column":41}},{"start":{"line":122,"column":45},"end":{"line":122,"column":72}}]},"14":{"loc":{"start":{"line":124,"column":15},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":124,"column":15},"end":{"line":126,"column":9}}]},"15":{"loc":{"start":{"line":140,"column":11},"end":{"line":140,"column":36}},"type":"cond-expr","locations":[{"start":{"line":140,"column":30},"end":{"line":140,"column":32}},{"start":{"line":140,"column":30},"end":{"line":140,"column":36}}]},"16":{"loc":{"start":{"line":140,"column":11},"end":{"line":140,"column":32}},"type":"binary-expr","locations":[{"start":{"line":140,"column":11},"end":{"line":140,"column":32}},{"start":{"line":140,"column":30},"end":{"line":140,"column":32}}]},"17":{"loc":{"start":{"line":179,"column":8},"end":{"line":181,"column":9}},"type":"if","locations":[{"start":{"line":179,"column":8},"end":{"line":181,"column":9}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"b":{"0":[0],"1":[0],"2":[0],"3":[0],"4":[0],"5":[0],"6":[0,0],"7":[0],"8":[0],"9":[0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0],"15":[0,0],"16":[0,0],"17":[0]}}
-,"/home/elora/Documents/viz-layout/src/composables/ConvertFromNetwork.ts": {"path":"/home/elora/Documents/viz-layout/src/composables/ConvertFromNetwork.ts","statementMap":{"0":{"start":{"line":82,"column":0},"end":{"line":82,"column":16}},"1":{"start":{"line":121,"column":0},"end":{"line":121,"column":16}},"2":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"3":{"start":{"line":151,"column":0},"end":{"line":151,"column":16}},"4":{"start":{"line":262,"column":0},"end":{"line":262,"column":16}},"5":{"start":{"line":275,"column":0},"end":{"line":275,"column":16}},"6":{"start":{"line":413,"column":0},"end":{"line":413,"column":16}},"7":{"start":{"line":3,"column":0},"end":{"line":3,"column":59}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":66}},"9":{"start":{"line":11,"column":0},"end":{"line":11,"column":67}},"10":{"start":{"line":12,"column":0},"end":{"line":12,"column":49}},"11":{"start":{"line":13,"column":0},"end":{"line":13,"column":89}},"12":{"start":{"line":19,"column":0},"end":{"line":19,"column":44}},"13":{"start":{"line":85,"column":49},"end":{"line":94,"column":null}},"14":{"start":{"line":87,"column":21},"end":{"line":87,"column":39}},"15":{"start":{"line":88,"column":8},"end":{"line":91,"column":10}},"16":{"start":{"line":92,"column":8},"end":{"line":92,"column":19}},"17":{"start":{"line":98,"column":37},"end":{"line":103,"column":7}},"18":{"start":{"line":98,"column":63},"end":{"line":102,"column":null}},"19":{"start":{"line":106,"column":41},"end":{"line":109,"column":null}},"20":{"start":{"line":112,"column":4},"end":{"line":112,"column":25}},"21":{"start":{"line":122,"column":28},"end":{"line":123,"column":45}},"22":{"start":{"line":122,"column":70},"end":{"line":122,"column":85}},"23":{"start":{"line":123,"column":20},"end":{"line":123,"column":44}},"24":{"start":{"line":124,"column":28},"end":{"line":128,"column":7}},"25":{"start":{"line":124,"column":55},"end":{"line":128,"column":6}},"26":{"start":{"line":129,"column":4},"end":{"line":129,"column":62}},"27":{"start":{"line":139,"column":18},"end":{"line":139,"column":29}},"28":{"start":{"line":140,"column":46},"end":{"line":140,"column":74}},"29":{"start":{"line":141,"column":4},"end":{"line":141,"column":41}},"30":{"start":{"line":142,"column":4},"end":{"line":142,"column":17}},"31":{"start":{"line":152,"column":46},"end":{"line":152,"column":48}},"32":{"start":{"line":153,"column":4},"end":{"line":157,"column":null}},"33":{"start":{"line":154,"column":8},"end":{"line":156,"column":9}},"34":{"start":{"line":155,"column":12},"end":{"line":155,"column":31}},"35":{"start":{"line":158,"column":4},"end":{"line":162,"column":7}},"36":{"start":{"line":159,"column":21},"end":{"line":159,"column":35}},"37":{"start":{"line":160,"column":21},"end":{"line":160,"column":35}},"38":{"start":{"line":161,"column":8},"end":{"line":161,"column":39}},"39":{"start":{"line":163,"column":4},"end":{"line":163,"column":21}},"40":{"start":{"line":263,"column":19},"end":{"line":263,"column":90}},"41":{"start":{"line":264,"column":20},"end":{"line":264,"column":43}},"42":{"start":{"line":265,"column":4},"end":{"line":265,"column":21}},"43":{"start":{"line":277,"column":4},"end":{"line":281,"column":5}},"44":{"start":{"line":278,"column":8},"end":{"line":278,"column":79}},"45":{"start":{"line":279,"column":10},"end":{"line":281,"column":5}},"46":{"start":{"line":280,"column":8},"end":{"line":280,"column":89}},"47":{"start":{"line":284,"column":25},"end":{"line":290,"column":null}},"48":{"start":{"line":293,"column":4},"end":{"line":302,"column":5}},"49":{"start":{"line":294,"column":8},"end":{"line":301,"column":11}},"50":{"start":{"line":295,"column":34},"end":{"line":295,"column":58}},"51":{"start":{"line":297,"column":26},"end":{"line":297,"column":79}},"52":{"start":{"line":298,"column":12},"end":{"line":300,"column":13}},"53":{"start":{"line":298,"column":74},"end":{"line":298,"column":100}},"54":{"start":{"line":299,"column":16},"end":{"line":299,"column":45}},"55":{"start":{"line":305,"column":27},"end":{"line":305,"column":29}},"56":{"start":{"line":306,"column":25},"end":{"line":306,"column":80}},"57":{"start":{"line":307,"column":4},"end":{"line":307,"column":38}},"58":{"start":{"line":308,"column":4},"end":{"line":308,"column":51}},"59":{"start":{"line":309,"column":4},"end":{"line":318,"column":7}},"60":{"start":{"line":311,"column":26},"end":{"line":311,"column":55}},"61":{"start":{"line":312,"column":8},"end":{"line":317,"column":9}},"62":{"start":{"line":312,"column":75},"end":{"line":312,"column":115}},"63":{"start":{"line":313,"column":12},"end":{"line":316,"column":15}},"64":{"start":{"line":322,"column":4},"end":{"line":328,"column":5}},"65":{"start":{"line":323,"column":26},"end":{"line":323,"column":66}},"66":{"start":{"line":324,"column":8},"end":{"line":327,"column":11}},"67":{"start":{"line":324,"column":46},"end":{"line":324,"column":99}},"68":{"start":{"line":326,"column":16},"end":{"line":326,"column":90}},"69":{"start":{"line":331,"column":4},"end":{"line":367,"column":5}},"70":{"start":{"line":332,"column":25},"end":{"line":332,"column":65}},"71":{"start":{"line":333,"column":8},"end":{"line":366,"column":11}},"72":{"start":{"line":334,"column":27},"end":{"line":334,"column":35}},"73":{"start":{"line":335,"column":27},"end":{"line":335,"column":35}},"74":{"start":{"line":336,"column":28},"end":{"line":336,"column":37}},"75":{"start":{"line":337,"column":28},"end":{"line":337,"column":37}},"76":{"start":{"line":338,"column":12},"end":{"line":344,"column":13}},"77":{"start":{"line":339,"column":30},"end":{"line":339,"column":46}},"78":{"start":{"line":340,"column":30},"end":{"line":340,"column":46}},"79":{"start":{"line":341,"column":16},"end":{"line":341,"column":37}},"80":{"start":{"line":343,"column":16},"end":{"line":343,"column":71}},"81":{"start":{"line":347,"column":43},"end":{"line":347,"column":59}},"82":{"start":{"line":349,"column":30},"end":{"line":349,"column":48}},"83":{"start":{"line":350,"column":29},"end":{"line":350,"column":46}},"84":{"start":{"line":351,"column":12},"end":{"line":358,"column":13}},"85":{"start":{"line":352,"column":29},"end":{"line":352,"column":56}},"86":{"start":{"line":353,"column":28},"end":{"line":353,"column":54}},"87":{"start":{"line":354,"column":16},"end":{"line":354,"column":41}},"88":{"start":{"line":355,"column":16},"end":{"line":355,"column":39}},"89":{"start":{"line":357,"column":16},"end":{"line":357,"column":71}},"90":{"start":{"line":359,"column":12},"end":{"line":363,"column":13}},"91":{"start":{"line":360,"column":16},"end":{"line":360,"column":56}},"92":{"start":{"line":361,"column":18},"end":{"line":363,"column":13}},"93":{"start":{"line":362,"column":16},"end":{"line":362,"column":91}},"94":{"start":{"line":364,"column":12},"end":{"line":364,"column":51}},"95":{"start":{"line":364,"column":33},"end":{"line":364,"column":51}},"96":{"start":{"line":365,"column":12},"end":{"line":365,"column":79}},"97":{"start":{"line":368,"column":4},"end":{"line":368,"column":20}},"98":{"start":{"line":382,"column":4},"end":{"line":401,"column":5}},"99":{"start":{"line":383,"column":39},"end":{"line":383,"column":41}},"100":{"start":{"line":385,"column":24},"end":{"line":385,"column":75}},"101":{"start":{"line":386,"column":8},"end":{"line":386,"column":58}},"102":{"start":{"line":387,"column":8},"end":{"line":387,"column":56}},"103":{"start":{"line":388,"column":8},"end":{"line":388,"column":34}},"104":{"start":{"line":390,"column":8},"end":{"line":397,"column":9}},"105":{"start":{"line":391,"column":12},"end":{"line":396,"column":13}},"106":{"start":{"line":392,"column":32},"end":{"line":392,"column":76}},"107":{"start":{"line":393,"column":16},"end":{"line":395,"column":17}},"108":{"start":{"line":394,"column":20},"end":{"line":394,"column":50}},"109":{"start":{"line":398,"column":8},"end":{"line":398,"column":52}},"110":{"start":{"line":400,"column":8},"end":{"line":400,"column":25}},"111":{"start":{"line":415,"column":18},"end":{"line":415,"column":111}},"112":{"start":{"line":417,"column":4},"end":{"line":461,"column":5}},"113":{"start":{"line":419,"column":8},"end":{"line":423,"column":9}},"114":{"start":{"line":420,"column":12},"end":{"line":422,"column":15}},"115":{"start":{"line":421,"column":16},"end":{"line":421,"column":64}},"116":{"start":{"line":426,"column":8},"end":{"line":431,"column":9}},"117":{"start":{"line":427,"column":12},"end":{"line":430,"column":15}},"118":{"start":{"line":428,"column":38},"end":{"line":428,"column":87}},"119":{"start":{"line":429,"column":16},"end":{"line":429,"column":64}},"120":{"start":{"line":434,"column":8},"end":{"line":438,"column":9}},"121":{"start":{"line":435,"column":12},"end":{"line":437,"column":15}},"122":{"start":{"line":436,"column":16},"end":{"line":436,"column":61}},"123":{"start":{"line":442,"column":8},"end":{"line":447,"column":9}},"124":{"start":{"line":443,"column":12},"end":{"line":446,"column":15}},"125":{"start":{"line":444,"column":38},"end":{"line":444,"column":87}},"126":{"start":{"line":445,"column":16},"end":{"line":445,"column":64}},"127":{"start":{"line":449,"column":8},"end":{"line":453,"column":9}},"128":{"start":{"line":450,"column":12},"end":{"line":452,"column":15}},"129":{"start":{"line":451,"column":16},"end":{"line":451,"column":61}},"130":{"start":{"line":456,"column":8},"end":{"line":460,"column":9}},"131":{"start":{"line":457,"column":12},"end":{"line":459,"column":15}},"132":{"start":{"line":458,"column":16},"end":{"line":458,"column":64}},"133":{"start":{"line":463,"column":4},"end":{"line":463,"column":25}},"134":{"start":{"line":475,"column":4},"end":{"line":477,"column":5}},"135":{"start":{"line":476,"column":8},"end":{"line":476,"column":20}},"136":{"start":{"line":478,"column":14},"end":{"line":478,"column":17}},"137":{"start":{"line":479,"column":4},"end":{"line":481,"column":5}},"138":{"start":{"line":480,"column":8},"end":{"line":480,"column":40}},"139":{"start":{"line":482,"column":4},"end":{"line":482,"column":27}},"140":{"start":{"line":483,"column":4},"end":{"line":483,"column":15}},"141":{"start":{"line":484,"column":4},"end":{"line":484,"column":15}}},"fnMap":{"0":{"name":"networktoNetworkLayout","decl":{"start":{"line":82,"column":16},"end":{"line":82,"column":38}},"loc":{"start":{"line":82,"column":55},"end":{"line":113,"column":3}}},"1":{"name":"(anonymous_14)","decl":{"start":{"line":86,"column":6},"end":{"line":86,"column":7}},"loc":{"start":{"line":86,"column":19},"end":{"line":93,"column":7}}},"2":{"name":"(anonymous_15)","decl":{"start":{"line":98,"column":55},"end":{"line":98,"column":59}},"loc":{"start":{"line":98,"column":63},"end":{"line":102,"column":null}}},"3":{"name":"networkToSerialized","decl":{"start":{"line":121,"column":16},"end":{"line":121,"column":35}},"loc":{"start":{"line":121,"column":52},"end":{"line":130,"column":1}}},"4":{"name":"(anonymous_17)","decl":{"start":{"line":122,"column":61},"end":{"line":122,"column":65}},"loc":{"start":{"line":122,"column":70},"end":{"line":122,"column":85}}},"5":{"name":"(anonymous_18)","decl":{"start":{"line":123,"column":10},"end":{"line":123,"column":11}},"loc":{"start":{"line":123,"column":20},"end":{"line":123,"column":44}}},"6":{"name":"(anonymous_19)","decl":{"start":{"line":124,"column":46},"end":{"line":124,"column":50}},"loc":{"start":{"line":124,"column":55},"end":{"line":128,"column":6}}},"7":{"name":"networkToGDSGraph","decl":{"start":{"line":138,"column":22},"end":{"line":138,"column":39}},"loc":{"start":{"line":138,"column":56},"end":{"line":143,"column":null}}},"8":{"name":"networkToAdjacentObject","decl":{"start":{"line":151,"column":16},"end":{"line":151,"column":39}},"loc":{"start":{"line":151,"column":55},"end":{"line":164,"column":1}}},"9":{"name":"(anonymous_23)","decl":{"start":{"line":153,"column":39},"end":{"line":153,"column":43}},"loc":{"start":{"line":153,"column":45},"end":{"line":157,"column":5}}},"10":{"name":"(anonymous_24)","decl":{"start":{"line":158,"column":26},"end":{"line":158,"column":30}},"loc":{"start":{"line":158,"column":32},"end":{"line":162,"column":5}}},"11":{"name":"networkToDOT","decl":{"start":{"line":262,"column":16},"end":{"line":262,"column":28}},"loc":{"start":{"line":262,"column":171},"end":{"line":266,"column":1}}},"12":{"name":"networkToViz","decl":{"start":{"line":275,"column":16},"end":{"line":275,"column":28}},"loc":{"start":{"line":275,"column":171},"end":{"line":369,"column":1}}},"13":{"name":"(anonymous_27)","decl":{"start":{"line":295,"column":14},"end":{"line":295,"column":15}},"loc":{"start":{"line":295,"column":34},"end":{"line":295,"column":58}}},"14":{"name":"(anonymous_28)","decl":{"start":{"line":296,"column":17},"end":{"line":296,"column":18}},"loc":{"start":{"line":296,"column":32},"end":{"line":301,"column":9}}},"15":{"name":"(anonymous_29)","decl":{"start":{"line":298,"column":66},"end":{"line":298,"column":70}},"loc":{"start":{"line":298,"column":74},"end":{"line":298,"column":100}}},"16":{"name":"(anonymous_30)","decl":{"start":{"line":309,"column":18},"end":{"line":309,"column":19}},"loc":{"start":{"line":309,"column":26},"end":{"line":318,"column":5}}},"17":{"name":"(anonymous_31)","decl":{"start":{"line":312,"column":67},"end":{"line":312,"column":71}},"loc":{"start":{"line":312,"column":75},"end":{"line":312,"column":115}}},"18":{"name":"(anonymous_32)","decl":{"start":{"line":324,"column":36},"end":{"line":324,"column":37}},"loc":{"start":{"line":324,"column":46},"end":{"line":324,"column":99}}},"19":{"name":"(anonymous_33)","decl":{"start":{"line":325,"column":21},"end":{"line":325,"column":22}},"loc":{"start":{"line":325,"column":39},"end":{"line":327,"column":9}}},"20":{"name":"(anonymous_34)","decl":{"start":{"line":333,"column":39},"end":{"line":333,"column":40}},"loc":{"start":{"line":333,"column":48},"end":{"line":345,"column":9}}},"21":{"name":"(anonymous_35)","decl":{"start":{"line":346,"column":17},"end":{"line":346,"column":18}},"loc":{"start":{"line":346,"column":32},"end":{"line":366,"column":9}}},"22":{"name":"nodeForViz","decl":{"start":{"line":380,"column":9},"end":{"line":380,"column":19}},"loc":{"start":{"line":380,"column":114},"end":{"line":402,"column":1}}},"23":{"name":"graphVizToDot","decl":{"start":{"line":413,"column":16},"end":{"line":413,"column":29}},"loc":{"start":{"line":413,"column":72},"end":{"line":464,"column":1}}},"24":{"name":"(anonymous_38)","decl":{"start":{"line":420,"column":39},"end":{"line":420,"column":40}},"loc":{"start":{"line":420,"column":52},"end":{"line":422,"column":13}}},"25":{"name":"(anonymous_39)","decl":{"start":{"line":427,"column":35},"end":{"line":427,"column":36}},"loc":{"start":{"line":427,"column":44},"end":{"line":430,"column":13}}},"26":{"name":"(anonymous_40)","decl":{"start":{"line":435,"column":35},"end":{"line":435,"column":36}},"loc":{"start":{"line":435,"column":44},"end":{"line":437,"column":13}}},"27":{"name":"(anonymous_41)","decl":{"start":{"line":443,"column":35},"end":{"line":443,"column":36}},"loc":{"start":{"line":443,"column":44},"end":{"line":446,"column":13}}},"28":{"name":"(anonymous_42)","decl":{"start":{"line":450,"column":35},"end":{"line":450,"column":36}},"loc":{"start":{"line":450,"column":44},"end":{"line":452,"column":13}}},"29":{"name":"(anonymous_43)","decl":{"start":{"line":457,"column":39},"end":{"line":457,"column":40}},"loc":{"start":{"line":457,"column":52},"end":{"line":459,"column":13}}},"30":{"name":"customStringify","decl":{"start":{"line":474,"column":9},"end":{"line":474,"column":24}},"loc":{"start":{"line":474,"column":52},"end":{"line":485,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":154,"column":8},"end":{"line":156,"column":9}},"type":"if","locations":[{"start":{"line":154,"column":8},"end":{"line":156,"column":9}}]},"1":{"loc":{"start":{"line":262,"column":61},"end":{"line":262,"column":79}},"type":"default-arg","locations":[{"start":{"line":262,"column":75},"end":{"line":262,"column":79}}]},"2":{"loc":{"start":{"line":262,"column":81},"end":{"line":262,"column":102}},"type":"default-arg","locations":[{"start":{"line":262,"column":98},"end":{"line":262,"column":102}}]},"3":{"loc":{"start":{"line":262,"column":103},"end":{"line":262,"column":145}},"type":"default-arg","locations":[{"start":{"line":262,"column":136},"end":{"line":262,"column":145}}]},"4":{"loc":{"start":{"line":262,"column":146},"end":{"line":262,"column":171}},"type":"default-arg","locations":[{"start":{"line":262,"column":166},"end":{"line":262,"column":171}}]},"5":{"loc":{"start":{"line":275,"column":61},"end":{"line":275,"column":79}},"type":"default-arg","locations":[{"start":{"line":275,"column":75},"end":{"line":275,"column":79}}]},"6":{"loc":{"start":{"line":275,"column":81},"end":{"line":275,"column":102}},"type":"default-arg","locations":[{"start":{"line":275,"column":98},"end":{"line":275,"column":102}}]},"7":{"loc":{"start":{"line":275,"column":103},"end":{"line":275,"column":145}},"type":"default-arg","locations":[{"start":{"line":275,"column":136},"end":{"line":275,"column":145}}]},"8":{"loc":{"start":{"line":275,"column":146},"end":{"line":275,"column":171}},"type":"default-arg","locations":[{"start":{"line":275,"column":166},"end":{"line":275,"column":171}}]},"9":{"loc":{"start":{"line":277,"column":4},"end":{"line":281,"column":5}},"type":"if","locations":[{"start":{"line":277,"column":4},"end":{"line":281,"column":5}},{"start":{"line":279,"column":10},"end":{"line":281,"column":5}}]},"10":{"loc":{"start":{"line":277,"column":8},"end":{"line":277,"column":45}},"type":"binary-expr","locations":[{"start":{"line":277,"column":8},"end":{"line":277,"column":32}},{"start":{"line":277,"column":36},"end":{"line":277,"column":45}}]},"11":{"loc":{"start":{"line":279,"column":10},"end":{"line":281,"column":5}},"type":"if","locations":[{"start":{"line":279,"column":10},"end":{"line":281,"column":5}}]},"12":{"loc":{"start":{"line":279,"column":14},"end":{"line":279,"column":55}},"type":"binary-expr","locations":[{"start":{"line":279,"column":14},"end":{"line":279,"column":40}},{"start":{"line":279,"column":44},"end":{"line":279,"column":55}}]},"13":{"loc":{"start":{"line":293,"column":4},"end":{"line":302,"column":5}},"type":"if","locations":[{"start":{"line":293,"column":4},"end":{"line":302,"column":5}}]},"14":{"loc":{"start":{"line":298,"column":12},"end":{"line":300,"column":13}},"type":"if","locations":[{"start":{"line":298,"column":12},"end":{"line":300,"column":13}}]},"15":{"loc":{"start":{"line":298,"column":16},"end":{"line":298,"column":101}},"type":"binary-expr","locations":[{"start":{"line":298,"column":16},"end":{"line":298,"column":23}},{"start":{"line":298,"column":27},"end":{"line":298,"column":41}},{"start":{"line":298,"column":45},"end":{"line":298,"column":101}}]},"16":{"loc":{"start":{"line":312,"column":8},"end":{"line":317,"column":9}},"type":"if","locations":[{"start":{"line":312,"column":8},"end":{"line":317,"column":9}}]},"17":{"loc":{"start":{"line":312,"column":12},"end":{"line":312,"column":116}},"type":"binary-expr","locations":[{"start":{"line":312,"column":12},"end":{"line":312,"column":23}},{"start":{"line":312,"column":28},"end":{"line":312,"column":42}},{"start":{"line":312,"column":46},"end":{"line":312,"column":116}}]},"18":{"loc":{"start":{"line":312,"column":75},"end":{"line":312,"column":115}},"type":"binary-expr","locations":[{"start":{"line":312,"column":75},"end":{"line":312,"column":93}},{"start":{"line":312,"column":97},"end":{"line":312,"column":115}}]},"19":{"loc":{"start":{"line":322,"column":4},"end":{"line":328,"column":5}},"type":"if","locations":[{"start":{"line":322,"column":4},"end":{"line":328,"column":5}}]},"20":{"loc":{"start":{"line":322,"column":8},"end":{"line":322,"column":78}},"type":"binary-expr","locations":[{"start":{"line":322,"column":8},"end":{"line":322,"column":34}},{"start":{"line":322,"column":38},"end":{"line":322,"column":78}}]},"21":{"loc":{"start":{"line":331,"column":4},"end":{"line":367,"column":5}},"type":"if","locations":[{"start":{"line":331,"column":4},"end":{"line":367,"column":5}}]},"22":{"loc":{"start":{"line":331,"column":8},"end":{"line":331,"column":57}},"type":"binary-expr","locations":[{"start":{"line":331,"column":8},"end":{"line":331,"column":13}},{"start":{"line":331,"column":17},"end":{"line":331,"column":57}}]},"23":{"loc":{"start":{"line":334,"column":27},"end":{"line":334,"column":35}},"type":"cond-expr","locations":[{"start":{"line":334,"column":28},"end":{"line":334,"column":30}},{"start":{"line":334,"column":27},"end":{"line":334,"column":35}}]},"24":{"loc":{"start":{"line":334,"column":27},"end":{"line":334,"column":30}},"type":"binary-expr","locations":[{"start":{"line":334,"column":27},"end":{"line":334,"column":30}},{"start":{"line":334,"column":27},"end":{"line":334,"column":30}}]},"25":{"loc":{"start":{"line":335,"column":27},"end":{"line":335,"column":35}},"type":"cond-expr","locations":[{"start":{"line":335,"column":28},"end":{"line":335,"column":30}},{"start":{"line":335,"column":27},"end":{"line":335,"column":35}}]},"26":{"loc":{"start":{"line":335,"column":27},"end":{"line":335,"column":30}},"type":"binary-expr","locations":[{"start":{"line":335,"column":27},"end":{"line":335,"column":30}},{"start":{"line":335,"column":27},"end":{"line":335,"column":30}}]},"27":{"loc":{"start":{"line":336,"column":28},"end":{"line":336,"column":37}},"type":"cond-expr","locations":[{"start":{"line":336,"column":29},"end":{"line":336,"column":31}},{"start":{"line":336,"column":28},"end":{"line":336,"column":37}}]},"28":{"loc":{"start":{"line":336,"column":28},"end":{"line":336,"column":31}},"type":"binary-expr","locations":[{"start":{"line":336,"column":28},"end":{"line":336,"column":31}},{"start":{"line":336,"column":28},"end":{"line":336,"column":31}}]},"29":{"loc":{"start":{"line":337,"column":28},"end":{"line":337,"column":37}},"type":"cond-expr","locations":[{"start":{"line":337,"column":29},"end":{"line":337,"column":31}},{"start":{"line":337,"column":28},"end":{"line":337,"column":37}}]},"30":{"loc":{"start":{"line":337,"column":28},"end":{"line":337,"column":31}},"type":"binary-expr","locations":[{"start":{"line":337,"column":28},"end":{"line":337,"column":31}},{"start":{"line":337,"column":28},"end":{"line":337,"column":31}}]},"31":{"loc":{"start":{"line":338,"column":12},"end":{"line":344,"column":13}},"type":"if","locations":[{"start":{"line":338,"column":12},"end":{"line":344,"column":13}},{"start":{"line":342,"column":17},"end":{"line":344,"column":13}}]},"32":{"loc":{"start":{"line":338,"column":16},"end":{"line":338,"column":54}},"type":"binary-expr","locations":[{"start":{"line":338,"column":16},"end":{"line":338,"column":22}},{"start":{"line":338,"column":26},"end":{"line":338,"column":32}},{"start":{"line":338,"column":36},"end":{"line":338,"column":43}},{"start":{"line":338,"column":47},"end":{"line":338,"column":54}}]},"33":{"loc":{"start":{"line":349,"column":30},"end":{"line":349,"column":48}},"type":"cond-expr","locations":[{"start":{"line":349,"column":40},"end":{"line":349,"column":42}},{"start":{"line":349,"column":30},"end":{"line":349,"column":48}}]},"34":{"loc":{"start":{"line":349,"column":30},"end":{"line":349,"column":42}},"type":"binary-expr","locations":[{"start":{"line":349,"column":30},"end":{"line":349,"column":42}},{"start":{"line":349,"column":30},"end":{"line":349,"column":42}}]},"35":{"loc":{"start":{"line":350,"column":29},"end":{"line":350,"column":46}},"type":"cond-expr","locations":[{"start":{"line":350,"column":39},"end":{"line":350,"column":41}},{"start":{"line":350,"column":29},"end":{"line":350,"column":46}}]},"36":{"loc":{"start":{"line":350,"column":29},"end":{"line":350,"column":41}},"type":"binary-expr","locations":[{"start":{"line":350,"column":29},"end":{"line":350,"column":41}},{"start":{"line":350,"column":29},"end":{"line":350,"column":41}}]},"37":{"loc":{"start":{"line":351,"column":12},"end":{"line":358,"column":13}},"type":"if","locations":[{"start":{"line":351,"column":12},"end":{"line":358,"column":13}},{"start":{"line":356,"column":17},"end":{"line":358,"column":13}}]},"38":{"loc":{"start":{"line":351,"column":15},"end":{"line":351,"column":40}},"type":"binary-expr","locations":[{"start":{"line":351,"column":15},"end":{"line":351,"column":26}},{"start":{"line":351,"column":30},"end":{"line":351,"column":40}}]},"39":{"loc":{"start":{"line":359,"column":12},"end":{"line":363,"column":13}},"type":"if","locations":[{"start":{"line":359,"column":12},"end":{"line":363,"column":13}},{"start":{"line":361,"column":18},"end":{"line":363,"column":13}}]},"40":{"loc":{"start":{"line":359,"column":15},"end":{"line":359,"column":61}},"type":"binary-expr","locations":[{"start":{"line":359,"column":15},"end":{"line":359,"column":26}},{"start":{"line":359,"column":30},"end":{"line":359,"column":61}}]},"41":{"loc":{"start":{"line":361,"column":18},"end":{"line":363,"column":13}},"type":"if","locations":[{"start":{"line":361,"column":18},"end":{"line":363,"column":13}}]},"42":{"loc":{"start":{"line":361,"column":22},"end":{"line":361,"column":57}},"type":"binary-expr","locations":[{"start":{"line":361,"column":22},"end":{"line":361,"column":33}},{"start":{"line":361,"column":37},"end":{"line":361,"column":57}}]},"43":{"loc":{"start":{"line":364,"column":12},"end":{"line":364,"column":51}},"type":"if","locations":[{"start":{"line":364,"column":12},"end":{"line":364,"column":51}}]},"44":{"loc":{"start":{"line":382,"column":4},"end":{"line":401,"column":5}},"type":"if","locations":[{"start":{"line":382,"column":4},"end":{"line":401,"column":5}},{"start":{"line":399,"column":9},"end":{"line":401,"column":5}}]},"45":{"loc":{"start":{"line":382,"column":8},"end":{"line":382,"column":59}},"type":"binary-expr","locations":[{"start":{"line":382,"column":8},"end":{"line":382,"column":14}},{"start":{"line":382,"column":18},"end":{"line":382,"column":59}}]},"46":{"loc":{"start":{"line":390,"column":8},"end":{"line":397,"column":9}},"type":"if","locations":[{"start":{"line":390,"column":8},"end":{"line":397,"column":9}}]},"47":{"loc":{"start":{"line":391,"column":12},"end":{"line":396,"column":13}},"type":"if","locations":[{"start":{"line":391,"column":12},"end":{"line":396,"column":13}}]},"48":{"loc":{"start":{"line":391,"column":16},"end":{"line":391,"column":83}},"type":"binary-expr","locations":[{"start":{"line":391,"column":16},"end":{"line":391,"column":35}},{"start":{"line":391,"column":39},"end":{"line":391,"column":83}}]},"49":{"loc":{"start":{"line":393,"column":16},"end":{"line":395,"column":17}},"type":"if","locations":[{"start":{"line":393,"column":16},"end":{"line":395,"column":17}}]},"50":{"loc":{"start":{"line":413,"column":46},"end":{"line":413,"column":72}},"type":"default-arg","locations":[{"start":{"line":413,"column":68},"end":{"line":413,"column":72}}]},"51":{"loc":{"start":{"line":417,"column":4},"end":{"line":461,"column":5}},"type":"if","locations":[{"start":{"line":417,"column":4},"end":{"line":461,"column":5}},{"start":{"line":439,"column":11},"end":{"line":461,"column":5}}]},"52":{"loc":{"start":{"line":419,"column":8},"end":{"line":423,"column":9}},"type":"if","locations":[{"start":{"line":419,"column":8},"end":{"line":423,"column":9}}]},"53":{"loc":{"start":{"line":426,"column":8},"end":{"line":431,"column":9}},"type":"if","locations":[{"start":{"line":426,"column":8},"end":{"line":431,"column":9}}]},"54":{"loc":{"start":{"line":434,"column":8},"end":{"line":438,"column":9}},"type":"if","locations":[{"start":{"line":434,"column":8},"end":{"line":438,"column":9}}]},"55":{"loc":{"start":{"line":442,"column":8},"end":{"line":447,"column":9}},"type":"if","locations":[{"start":{"line":442,"column":8},"end":{"line":447,"column":9}}]},"56":{"loc":{"start":{"line":449,"column":8},"end":{"line":453,"column":9}},"type":"if","locations":[{"start":{"line":449,"column":8},"end":{"line":453,"column":9}}]},"57":{"loc":{"start":{"line":456,"column":8},"end":{"line":460,"column":9}},"type":"if","locations":[{"start":{"line":456,"column":8},"end":{"line":460,"column":9}}]},"58":{"loc":{"start":{"line":475,"column":4},"end":{"line":477,"column":5}},"type":"if","locations":[{"start":{"line":475,"column":4},"end":{"line":477,"column":5}}]},"59":{"loc":{"start":{"line":475,"column":8},"end":{"line":475,"column":45}},"type":"binary-expr","locations":[{"start":{"line":475,"column":8},"end":{"line":475,"column":12}},{"start":{"line":475,"column":16},"end":{"line":475,"column":45}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0},"b":{"0":[0],"1":[0],"2":[0],"3":[0],"4":[0],"5":[0],"6":[0],"7":[0],"8":[0],"9":[0,0],"10":[0,0],"11":[0],"12":[0,0],"13":[0],"14":[0],"15":[0,0,0],"16":[0],"17":[0,0,0],"18":[0,0],"19":[0],"20":[0,0],"21":[0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0,0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0],"41":[0],"42":[0,0],"43":[0],"44":[0,0],"45":[0,0],"46":[0],"47":[0],"48":[0,0],"49":[0],"50":[0],"51":[0,0],"52":[0],"53":[0],"54":[0],"55":[0],"56":[0],"57":[0],"58":[0],"59":[0,0]}}
-,"/home/elora/Documents/viz-layout/src/composables/GetSetAttributsNodes.ts": {"path":"/home/elora/Documents/viz-layout/src/composables/GetSetAttributsNodes.ts","statementMap":{"0":{"start":{"line":73,"column":0},"end":{"line":73,"column":16}},"1":{"start":{"line":83,"column":0},"end":{"line":83,"column":16}},"2":{"start":{"line":103,"column":0},"end":{"line":103,"column":16}},"3":{"start":{"line":122,"column":0},"end":{"line":122,"column":22}},"4":{"start":{"line":137,"column":0},"end":{"line":137,"column":16}},"5":{"start":{"line":150,"column":0},"end":{"line":150,"column":16}},"6":{"start":{"line":164,"column":0},"end":{"line":164,"column":16}},"7":{"start":{"line":179,"column":0},"end":{"line":179,"column":16}},"8":{"start":{"line":195,"column":0},"end":{"line":195,"column":16}},"9":{"start":{"line":208,"column":0},"end":{"line":208,"column":16}},"10":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"11":{"start":{"line":2,"column":0},"end":{"line":2,"column":49}},"12":{"start":{"line":65,"column":13},"end":{"line":65,"column":52}},"13":{"start":{"line":74,"column":4},"end":{"line":74,"column":74}},"14":{"start":{"line":84,"column":4},"end":{"line":84,"column":65}},"15":{"start":{"line":84,"column":31},"end":{"line":84,"column":65}},"16":{"start":{"line":85,"column":4},"end":{"line":85,"column":74}},"17":{"start":{"line":85,"column":40},"end":{"line":85,"column":74}},"18":{"start":{"line":86,"column":4},"end":{"line":86,"column":63}},"19":{"start":{"line":95,"column":13},"end":{"line":95,"column":40}},"20":{"start":{"line":104,"column":4},"end":{"line":104,"column":65}},"21":{"start":{"line":104,"column":31},"end":{"line":104,"column":65}},"22":{"start":{"line":105,"column":4},"end":{"line":105,"column":108}},"23":{"start":{"line":113,"column":13},"end":{"line":113,"column":42}},"24":{"start":{"line":114,"column":13},"end":{"line":114,"column":46}},"25":{"start":{"line":115,"column":13},"end":{"line":115,"column":38}},"26":{"start":{"line":123,"column":4},"end":{"line":127,"column":7}},"27":{"start":{"line":124,"column":6},"end":{"line":126,"column":7}},"28":{"start":{"line":125,"column":8},"end":{"line":125,"column":46}},"29":{"start":{"line":138,"column":4},"end":{"line":140,"column":5}},"30":{"start":{"line":139,"column":8},"end":{"line":139,"column":64}},"31":{"start":{"line":141,"column":4},"end":{"line":141,"column":63}},"32":{"start":{"line":151,"column":4},"end":{"line":153,"column":5}},"33":{"start":{"line":152,"column":8},"end":{"line":152,"column":25}},"34":{"start":{"line":154,"column":4},"end":{"line":154,"column":44}},"35":{"start":{"line":155,"column":4},"end":{"line":155,"column":16}},"36":{"start":{"line":165,"column":4},"end":{"line":167,"column":5}},"37":{"start":{"line":166,"column":8},"end":{"line":166,"column":24}},"38":{"start":{"line":168,"column":4},"end":{"line":168,"column":64}},"39":{"start":{"line":169,"column":4},"end":{"line":169,"column":16}},"40":{"start":{"line":180,"column":4},"end":{"line":182,"column":5}},"41":{"start":{"line":181,"column":8},"end":{"line":181,"column":27}},"42":{"start":{"line":183,"column":4},"end":{"line":183,"column":18}},"43":{"start":{"line":196,"column":4},"end":{"line":198,"column":5}},"44":{"start":{"line":197,"column":8},"end":{"line":197,"column":65}},"45":{"start":{"line":199,"column":4},"end":{"line":199,"column":106}},"46":{"start":{"line":209,"column":4},"end":{"line":209,"column":73}},"47":{"start":{"line":225,"column":4},"end":{"line":227,"column":5}},"48":{"start":{"line":226,"column":8},"end":{"line":226,"column":53}},"49":{"start":{"line":229,"column":24},"end":{"line":229,"column":29}},"50":{"start":{"line":230,"column":4},"end":{"line":233,"column":5}},"51":{"start":{"line":231,"column":25},"end":{"line":231,"column":81}},"52":{"start":{"line":232,"column":12},"end":{"line":232,"column":56}},"53":{"start":{"line":232,"column":43},"end":{"line":232,"column":56}},"54":{"start":{"line":234,"column":4},"end":{"line":234,"column":19}}},"fnMap":{"0":{"name":"isSideCompound","decl":{"start":{"line":73,"column":16},"end":{"line":73,"column":30}},"loc":{"start":{"line":73,"column":40},"end":{"line":75,"column":1}}},"1":{"name":"setAsSideCompound","decl":{"start":{"line":83,"column":16},"end":{"line":83,"column":33}},"loc":{"start":{"line":83,"column":63},"end":{"line":87,"column":1}}},"2":{"name":"isDuplicate","decl":{"start":{"line":103,"column":16},"end":{"line":103,"column":27}},"loc":{"start":{"line":103,"column":57},"end":{"line":106,"column":1}}},"3":{"name":"addMetadataReversibleWithClass","decl":{"start":{"line":122,"column":22},"end":{"line":122,"column":52}},"loc":{"start":{"line":122,"column":68},"end":{"line":128,"column":null}}},"4":{"name":"(anonymous_12)","decl":{"start":{"line":123,"column":41},"end":{"line":123,"column":42}},"loc":{"start":{"line":123,"column":50},"end":{"line":127,"column":5}}},"5":{"name":"addReversibleNetwork","decl":{"start":{"line":137,"column":16},"end":{"line":137,"column":36}},"loc":{"start":{"line":137,"column":66},"end":{"line":142,"column":1}}},"6":{"name":"addReversible","decl":{"start":{"line":150,"column":16},"end":{"line":150,"column":29}},"loc":{"start":{"line":150,"column":39},"end":{"line":156,"column":1}}},"7":{"name":"addLinkClassReversible","decl":{"start":{"line":164,"column":16},"end":{"line":164,"column":38}},"loc":{"start":{"line":164,"column":48},"end":{"line":170,"column":1}}},"8":{"name":"pushUniqueString","decl":{"start":{"line":179,"column":16},"end":{"line":179,"column":32}},"loc":{"start":{"line":179,"column":68},"end":{"line":184,"column":3}}},"9":{"name":"isReversible","decl":{"start":{"line":195,"column":16},"end":{"line":195,"column":28}},"loc":{"start":{"line":195,"column":58},"end":{"line":200,"column":1}}},"10":{"name":"isReaction","decl":{"start":{"line":208,"column":16},"end":{"line":208,"column":26}},"loc":{"start":{"line":208,"column":36},"end":{"line":210,"column":1}}},"11":{"name":"inCycle","decl":{"start":{"line":224,"column":16},"end":{"line":224,"column":23}},"loc":{"start":{"line":224,"column":62},"end":{"line":235,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":74,"column":19},"end":{"line":74,"column":72}},"type":"binary-expr","locations":[{"start":{"line":74,"column":19},"end":{"line":74,"column":32}},{"start":{"line":74,"column":36},"end":{"line":74,"column":72}}]},"1":{"loc":{"start":{"line":84,"column":4},"end":{"line":84,"column":65}},"type":"if","locations":[{"start":{"line":84,"column":4},"end":{"line":84,"column":65}}]},"2":{"loc":{"start":{"line":85,"column":4},"end":{"line":85,"column":74}},"type":"if","locations":[{"start":{"line":85,"column":4},"end":{"line":85,"column":74}}]},"3":{"loc":{"start":{"line":104,"column":4},"end":{"line":104,"column":65}},"type":"if","locations":[{"start":{"line":104,"column":4},"end":{"line":104,"column":65}}]},"4":{"loc":{"start":{"line":105,"column":19},"end":{"line":105,"column":106}},"type":"binary-expr","locations":[{"start":{"line":105,"column":19},"end":{"line":105,"column":48}},{"start":{"line":105,"column":52},"end":{"line":105,"column":106}}]},"5":{"loc":{"start":{"line":124,"column":6},"end":{"line":126,"column":7}},"type":"if","locations":[{"start":{"line":124,"column":6},"end":{"line":126,"column":7}}]},"6":{"loc":{"start":{"line":124,"column":9},"end":{"line":124,"column":63}},"type":"binary-expr","locations":[{"start":{"line":124,"column":9},"end":{"line":124,"column":21}},{"start":{"line":124,"column":25},"end":{"line":124,"column":63}}]},"7":{"loc":{"start":{"line":138,"column":4},"end":{"line":140,"column":5}},"type":"if","locations":[{"start":{"line":138,"column":4},"end":{"line":140,"column":5}}]},"8":{"loc":{"start":{"line":151,"column":4},"end":{"line":153,"column":5}},"type":"if","locations":[{"start":{"line":151,"column":4},"end":{"line":153,"column":5}}]},"9":{"loc":{"start":{"line":165,"column":4},"end":{"line":167,"column":5}},"type":"if","locations":[{"start":{"line":165,"column":4},"end":{"line":167,"column":5}}]},"10":{"loc":{"start":{"line":180,"column":4},"end":{"line":182,"column":5}},"type":"if","locations":[{"start":{"line":180,"column":4},"end":{"line":182,"column":5}}]},"11":{"loc":{"start":{"line":196,"column":4},"end":{"line":198,"column":5}},"type":"if","locations":[{"start":{"line":196,"column":4},"end":{"line":198,"column":5}}]},"12":{"loc":{"start":{"line":199,"column":19},"end":{"line":199,"column":104}},"type":"binary-expr","locations":[{"start":{"line":199,"column":19},"end":{"line":199,"column":49}},{"start":{"line":199,"column":53},"end":{"line":199,"column":104}}]},"13":{"loc":{"start":{"line":209,"column":19},"end":{"line":209,"column":71}},"type":"binary-expr","locations":[{"start":{"line":209,"column":19},"end":{"line":209,"column":31}},{"start":{"line":209,"column":35},"end":{"line":209,"column":71}}]},"14":{"loc":{"start":{"line":225,"column":4},"end":{"line":227,"column":5}},"type":"if","locations":[{"start":{"line":225,"column":4},"end":{"line":227,"column":5}}]},"15":{"loc":{"start":{"line":230,"column":4},"end":{"line":233,"column":5}},"type":"if","locations":[{"start":{"line":230,"column":4},"end":{"line":233,"column":5}}]},"16":{"loc":{"start":{"line":230,"column":9},"end":{"line":230,"column":107}},"type":"binary-expr","locations":[{"start":{"line":230,"column":9},"end":{"line":230,"column":45}},{"start":{"line":230,"column":49},"end":{"line":230,"column":107}}]},"17":{"loc":{"start":{"line":232,"column":12},"end":{"line":232,"column":56}},"type":"if","locations":[{"start":{"line":232,"column":12},"end":{"line":232,"column":56}}]},"18":{"loc":{"start":{"line":232,"column":16},"end":{"line":232,"column":41}},"type":"binary-expr","locations":[{"start":{"line":232,"column":16},"end":{"line":232,"column":22}},{"start":{"line":232,"column":26},"end":{"line":232,"column":41}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":1,"20":0,"21":0,"22":0,"23":1,"24":1,"25":1,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"b":{"0":[0,0],"1":[0],"2":[0],"3":[0],"4":[0,0],"5":[0],"6":[0,0],"7":[0],"8":[0],"9":[0],"10":[0],"11":[0],"12":[0,0],"13":[0,0],"14":[0],"15":[0],"16":[0,0],"17":[0],"18":[0,0]}}
-,"/home/elora/Documents/viz-layout/src/composables/LayoutReversibleReactions.ts": {"path":"/home/elora/Documents/viz-layout/src/composables/LayoutReversibleReactions.ts","statementMap":{"0":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"1":{"start":{"line":270,"column":0},"end":{"line":270,"column":22}},"2":{"start":{"line":291,"column":0},"end":{"line":291,"column":16}},"3":{"start":{"line":343,"column":0},"end":{"line":343,"column":16}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":49}},"5":{"start":{"line":11,"column":0},"end":{"line":11,"column":61}},"6":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"7":{"start":{"line":13,"column":0},"end":{"line":13,"column":122}},"8":{"start":{"line":78,"column":2},"end":{"line":126,"column":3}},"9":{"start":{"line":80,"column":4},"end":{"line":80,"column":148}},"10":{"start":{"line":81,"column":4},"end":{"line":81,"column":56}},"11":{"start":{"line":83,"column":34},"end":{"line":83,"column":36}},"12":{"start":{"line":85,"column":4},"end":{"line":118,"column":8}},"13":{"start":{"line":85,"column":61},"end":{"line":118,"column":6}},"14":{"start":{"line":87,"column":29},"end":{"line":87,"column":66}},"15":{"start":{"line":88,"column":6},"end":{"line":117,"column":7}},"16":{"start":{"line":90,"column":8},"end":{"line":90,"column":43}},"17":{"start":{"line":94,"column":52},"end":{"line":94,"column":85}},"18":{"start":{"line":96,"column":8},"end":{"line":100,"column":9}},"19":{"start":{"line":97,"column":10},"end":{"line":97,"column":40}},"20":{"start":{"line":99,"column":10},"end":{"line":99,"column":40}},"21":{"start":{"line":102,"column":8},"end":{"line":116,"column":11}},"22":{"start":{"line":105,"column":10},"end":{"line":107,"column":11}},"23":{"start":{"line":106,"column":12},"end":{"line":106,"column":70}},"24":{"start":{"line":109,"column":10},"end":{"line":115,"column":11}},"25":{"start":{"line":110,"column":27},"end":{"line":110,"column":38}},"26":{"start":{"line":111,"column":12},"end":{"line":111,"column":94}},"27":{"start":{"line":113,"column":27},"end":{"line":113,"column":38}},"28":{"start":{"line":114,"column":12},"end":{"line":114,"column":94}},"29":{"start":{"line":120,"column":4},"end":{"line":122,"column":7}},"30":{"start":{"line":121,"column":6},"end":{"line":121,"column":37}},"31":{"start":{"line":125,"column":4},"end":{"line":125,"column":16}},"32":{"start":{"line":139,"column":4},"end":{"line":145,"column":5}},"33":{"start":{"line":140,"column":6},"end":{"line":140,"column":57}},"34":{"start":{"line":141,"column":11},"end":{"line":145,"column":5}},"35":{"start":{"line":142,"column":6},"end":{"line":142,"column":58}},"36":{"start":{"line":144,"column":6},"end":{"line":144,"column":63}},"37":{"start":{"line":156,"column":4},"end":{"line":176,"column":7}},"38":{"start":{"line":156,"column":49},"end":{"line":176,"column":6}},"39":{"start":{"line":157,"column":8},"end":{"line":175,"column":9}},"40":{"start":{"line":159,"column":36},"end":{"line":159,"column":78}},"41":{"start":{"line":160,"column":26},"end":{"line":160,"column":44}},"42":{"start":{"line":163,"column":12},"end":{"line":165,"column":13}},"43":{"start":{"line":164,"column":16},"end":{"line":164,"column":71}},"44":{"start":{"line":167,"column":12},"end":{"line":169,"column":13}},"45":{"start":{"line":168,"column":14},"end":{"line":168,"column":45}},"46":{"start":{"line":170,"column":12},"end":{"line":170,"column":70}},"47":{"start":{"line":172,"column":12},"end":{"line":172,"column":37}},"48":{"start":{"line":174,"column":12},"end":{"line":174,"column":26}},"49":{"start":{"line":187,"column":38},"end":{"line":220,"column":null}},"50":{"start":{"line":188,"column":14},"end":{"line":188,"column":21}},"51":{"start":{"line":189,"column":16},"end":{"line":189,"column":79}},"52":{"start":{"line":192,"column":2},"end":{"line":196,"column":3}},"53":{"start":{"line":193,"column":4},"end":{"line":193,"column":26}},"54":{"start":{"line":195,"column":4},"end":{"line":195,"column":25}},"55":{"start":{"line":213,"column":15},"end":{"line":217,"column":null}},"56":{"start":{"line":219,"column":2},"end":{"line":219,"column":17}},"57":{"start":{"line":233,"column":2},"end":{"line":235,"column":3}},"58":{"start":{"line":234,"column":4},"end":{"line":234,"column":60}},"59":{"start":{"line":236,"column":13},"end":{"line":240,"column":null}},"60":{"start":{"line":242,"column":2},"end":{"line":242,"column":43}},"61":{"start":{"line":243,"column":2},"end":{"line":243,"column":17}},"62":{"start":{"line":271,"column":2},"end":{"line":283,"column":null}},"63":{"start":{"line":275,"column":28},"end":{"line":275,"column":30}},"64":{"start":{"line":276,"column":18},"end":{"line":276,"column":41}},"65":{"start":{"line":278,"column":2},"end":{"line":278,"column":55}},"66":{"start":{"line":280,"column":2},"end":{"line":280,"column":94}},"67":{"start":{"line":282,"column":2},"end":{"line":282,"column":25}},"68":{"start":{"line":292,"column":18},"end":{"line":292,"column":41}},"69":{"start":{"line":293,"column":39},"end":{"line":293,"column":41}},"70":{"start":{"line":294,"column":45},"end":{"line":294,"column":47}},"71":{"start":{"line":296,"column":2},"end":{"line":324,"column":3}},"72":{"start":{"line":296,"column":12},"end":{"line":296,"column":13}},"73":{"start":{"line":297,"column":17},"end":{"line":297,"column":29}},"74":{"start":{"line":298,"column":4},"end":{"line":298,"column":113}},"75":{"start":{"line":298,"column":37},"end":{"line":298,"column":113}},"76":{"start":{"line":300,"column":4},"end":{"line":323,"column":5}},"77":{"start":{"line":301,"column":29},"end":{"line":301,"column":87}},"78":{"start":{"line":302,"column":6},"end":{"line":302,"column":151}},"79":{"start":{"line":302,"column":49},"end":{"line":302,"column":151}},"80":{"start":{"line":305,"column":6},"end":{"line":305,"column":46}},"81":{"start":{"line":308,"column":6},"end":{"line":316,"column":7}},"82":{"start":{"line":309,"column":8},"end":{"line":311,"column":9}},"83":{"start":{"line":310,"column":10},"end":{"line":310,"column":94}},"84":{"start":{"line":313,"column":8},"end":{"line":313,"column":46}},"85":{"start":{"line":314,"column":12},"end":{"line":316,"column":7}},"86":{"start":{"line":315,"column":8},"end":{"line":315,"column":83}},"87":{"start":{"line":319,"column":6},"end":{"line":319,"column":72}},"88":{"start":{"line":320,"column":6},"end":{"line":322,"column":7}},"89":{"start":{"line":321,"column":8},"end":{"line":321,"column":84}},"90":{"start":{"line":326,"column":2},"end":{"line":326,"column":51}},"91":{"start":{"line":328,"column":2},"end":{"line":328,"column":null}},"92":{"start":{"line":329,"column":2},"end":{"line":332,"column":3}},"93":{"start":{"line":330,"column":32},"end":{"line":330,"column":77}},"94":{"start":{"line":331,"column":4},"end":{"line":331,"column":57}},"95":{"start":{"line":333,"column":2},"end":{"line":333,"column":22}},"96":{"start":{"line":344,"column":18},"end":{"line":344,"column":41}},"97":{"start":{"line":347,"column":2},"end":{"line":358,"column":5}},"98":{"start":{"line":348,"column":4},"end":{"line":357,"column":5}},"99":{"start":{"line":350,"column":20},"end":{"line":350,"column":22}},"100":{"start":{"line":351,"column":20},"end":{"line":351,"column":37}},"101":{"start":{"line":353,"column":6},"end":{"line":353,"column":52}},"102":{"start":{"line":354,"column":6},"end":{"line":354,"column":40}},"103":{"start":{"line":356,"column":6},"end":{"line":356,"column":36}},"104":{"start":{"line":372,"column":2},"end":{"line":372,"column":72}},"105":{"start":{"line":374,"column":2},"end":{"line":374,"column":77}},"106":{"start":{"line":376,"column":2},"end":{"line":376,"column":82}},"107":{"start":{"line":378,"column":2},"end":{"line":378,"column":25}},"108":{"start":{"line":391,"column":20},"end":{"line":391,"column":86}},"109":{"start":{"line":392,"column":2},"end":{"line":403,"column":5}},"110":{"start":{"line":393,"column":4},"end":{"line":402,"column":7}},"111":{"start":{"line":394,"column":6},"end":{"line":400,"column":7}},"112":{"start":{"line":399,"column":8},"end":{"line":399,"column":35}},"113":{"start":{"line":401,"column":6},"end":{"line":401,"column":18}}},"fnMap":{"0":{"name":"duplicateReversibleReactions","decl":{"start":{"line":76,"column":22},"end":{"line":76,"column":50}},"loc":{"start":{"line":76,"column":78},"end":{"line":127,"column":null}}},"1":{"name":"(anonymous_9)","decl":{"start":{"line":85,"column":46},"end":{"line":85,"column":53}},"loc":{"start":{"line":85,"column":61},"end":{"line":118,"column":6}}},"2":{"name":"(anonymous_10)","decl":{"start":{"line":85,"column":61},"end":{"line":85,"column":null}},"loc":{"start":{"line":85,"column":61},"end":{"line":118,"column":5}}},"3":{"name":"(anonymous_11)","decl":{"start":{"line":102,"column":83},"end":{"line":102,"column":84}},"loc":{"start":{"line":102,"column":103},"end":{"line":116,"column":9}}},"4":{"name":"(anonymous_12)","decl":{"start":{"line":120,"column":21},"end":{"line":120,"column":22}},"loc":{"start":{"line":120,"column":30},"end":{"line":122,"column":5}}},"5":{"name":"linkIsReversible","decl":{"start":{"line":138,"column":9},"end":{"line":138,"column":25}},"loc":{"start":{"line":138,"column":52},"end":{"line":146,"column":1}}},"6":{"name":"duplicateNodeReactionReversible","decl":{"start":{"line":155,"column":15},"end":{"line":155,"column":46}},"loc":{"start":{"line":155,"column":101},"end":{"line":177,"column":null}}},"7":{"name":"(anonymous_16)","decl":{"start":{"line":156,"column":23},"end":{"line":156,"column":30}},"loc":{"start":{"line":156,"column":49},"end":{"line":176,"column":6}}},"8":{"name":"(anonymous_17)","decl":{"start":{"line":156,"column":49},"end":{"line":156,"column":null}},"loc":{"start":{"line":156,"column":49},"end":{"line":176,"column":5}}},"9":{"name":"reversibleNodeReaction","decl":{"start":{"line":187,"column":15},"end":{"line":187,"column":37}},"loc":{"start":{"line":187,"column":37},"end":{"line":220,"column":null}}},"10":{"name":"(anonymous_19)","decl":{"start":{"line":187,"column":38},"end":{"line":187,"column":54}},"loc":{"start":{"line":187,"column":79},"end":{"line":220,"column":1}}},"11":{"name":"reversibleLink","decl":{"start":{"line":232,"column":9},"end":{"line":232,"column":23}},"loc":{"start":{"line":232,"column":81},"end":{"line":244,"column":1}}},"12":{"name":"chooseReversibleReaction","decl":{"start":{"line":270,"column":22},"end":{"line":270,"column":46}},"loc":{"start":{"line":270,"column":46},"end":{"line":283,"column":null}}},"13":{"name":"(anonymous_22)","decl":{"start":{"line":271,"column":2},"end":{"line":271,"column":33}},"loc":{"start":{"line":273,"column":118},"end":{"line":283,"column":1}}},"14":{"name":"keepFirstReversibleNode","decl":{"start":{"line":291,"column":16},"end":{"line":291,"column":39}},"loc":{"start":{"line":291,"column":112},"end":{"line":334,"column":1}}},"15":{"name":"renameAllIDNode","decl":{"start":{"line":343,"column":16},"end":{"line":343,"column":31}},"loc":{"start":{"line":343,"column":101},"end":{"line":379,"column":1}}},"16":{"name":"(anonymous_25)","decl":{"start":{"line":347,"column":37},"end":{"line":347,"column":39}},"loc":{"start":{"line":347,"column":42},"end":{"line":358,"column":3}}},"17":{"name":"renameAllInSubgraph","decl":{"start":{"line":390,"column":9},"end":{"line":390,"column":28}},"loc":{"start":{"line":390,"column":126},"end":{"line":404,"column":1}}},"18":{"name":"(anonymous_27)","decl":{"start":{"line":392,"column":36},"end":{"line":392,"column":37}},"loc":{"start":{"line":392,"column":55},"end":{"line":403,"column":3}}},"19":{"name":"(anonymous_28)","decl":{"start":{"line":393,"column":40},"end":{"line":393,"column":44}},"loc":{"start":{"line":393,"column":47},"end":{"line":402,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":88,"column":6},"end":{"line":117,"column":7}},"type":"if","locations":[{"start":{"line":88,"column":6},"end":{"line":117,"column":7}}]},"1":{"loc":{"start":{"line":96,"column":8},"end":{"line":100,"column":9}},"type":"if","locations":[{"start":{"line":96,"column":8},"end":{"line":100,"column":9}},{"start":{"line":98,"column":15},"end":{"line":100,"column":9}}]},"2":{"loc":{"start":{"line":105,"column":10},"end":{"line":107,"column":11}},"type":"if","locations":[{"start":{"line":105,"column":10},"end":{"line":107,"column":11}}]},"3":{"loc":{"start":{"line":105,"column":14},"end":{"line":105,"column":73}},"type":"binary-expr","locations":[{"start":{"line":105,"column":14},"end":{"line":105,"column":29}},{"start":{"line":105,"column":33},"end":{"line":105,"column":73}}]},"4":{"loc":{"start":{"line":109,"column":10},"end":{"line":115,"column":11}},"type":"if","locations":[{"start":{"line":109,"column":10},"end":{"line":115,"column":11}},{"start":{"line":112,"column":17},"end":{"line":115,"column":11}}]},"5":{"loc":{"start":{"line":139,"column":4},"end":{"line":145,"column":5}},"type":"if","locations":[{"start":{"line":139,"column":4},"end":{"line":145,"column":5}},{"start":{"line":141,"column":11},"end":{"line":145,"column":5}}]},"6":{"loc":{"start":{"line":139,"column":8},"end":{"line":139,"column":71}},"type":"binary-expr","locations":[{"start":{"line":139,"column":8},"end":{"line":139,"column":31}},{"start":{"line":139,"column":35},"end":{"line":139,"column":71}}]},"7":{"loc":{"start":{"line":141,"column":11},"end":{"line":145,"column":5}},"type":"if","locations":[{"start":{"line":141,"column":11},"end":{"line":145,"column":5}},{"start":{"line":143,"column":10},"end":{"line":145,"column":5}}]},"8":{"loc":{"start":{"line":141,"column":15},"end":{"line":141,"column":78}},"type":"binary-expr","locations":[{"start":{"line":141,"column":15},"end":{"line":141,"column":38}},{"start":{"line":141,"column":42},"end":{"line":141,"column":78}}]},"9":{"loc":{"start":{"line":163,"column":12},"end":{"line":165,"column":13}},"type":"if","locations":[{"start":{"line":163,"column":12},"end":{"line":165,"column":13}}]},"10":{"loc":{"start":{"line":167,"column":12},"end":{"line":169,"column":13}},"type":"if","locations":[{"start":{"line":167,"column":12},"end":{"line":169,"column":13}}]},"11":{"loc":{"start":{"line":187,"column":56},"end":{"line":187,"column":79}},"type":"default-arg","locations":[{"start":{"line":187,"column":73},"end":{"line":187,"column":79}}]},"12":{"loc":{"start":{"line":189,"column":16},"end":{"line":189,"column":79}},"type":"cond-expr","locations":[{"start":{"line":189,"column":38},"end":{"line":189,"column":65}},{"start":{"line":189,"column":68},"end":{"line":189,"column":79}}]},"13":{"loc":{"start":{"line":192,"column":2},"end":{"line":196,"column":3}},"type":"if","locations":[{"start":{"line":192,"column":2},"end":{"line":196,"column":3}},{"start":{"line":194,"column":7},"end":{"line":196,"column":3}}]},"14":{"loc":{"start":{"line":192,"column":6},"end":{"line":192,"column":66}},"type":"binary-expr","locations":[{"start":{"line":192,"column":6},"end":{"line":192,"column":25}},{"start":{"line":192,"column":29},"end":{"line":192,"column":66}}]},"15":{"loc":{"start":{"line":233,"column":2},"end":{"line":235,"column":3}},"type":"if","locations":[{"start":{"line":233,"column":2},"end":{"line":235,"column":3}}]},"16":{"loc":{"start":{"line":233,"column":6},"end":{"line":233,"column":58}},"type":"binary-expr","locations":[{"start":{"line":233,"column":6},"end":{"line":233,"column":30}},{"start":{"line":233,"column":34},"end":{"line":233,"column":58}}]},"17":{"loc":{"start":{"line":273,"column":2},"end":{"line":273,"column":118}},"type":"default-arg","locations":[{"start":{"line":273,"column":104},"end":{"line":273,"column":118}}]},"18":{"loc":{"start":{"line":291,"column":91},"end":{"line":291,"column":112}},"type":"default-arg","locations":[{"start":{"line":291,"column":108},"end":{"line":291,"column":112}}]},"19":{"loc":{"start":{"line":298,"column":4},"end":{"line":298,"column":113}},"type":"if","locations":[{"start":{"line":298,"column":4},"end":{"line":298,"column":113}}]},"20":{"loc":{"start":{"line":300,"column":4},"end":{"line":323,"column":5}},"type":"if","locations":[{"start":{"line":300,"column":4},"end":{"line":323,"column":5}}]},"21":{"loc":{"start":{"line":300,"column":7},"end":{"line":300,"column":105}},"type":"binary-expr","locations":[{"start":{"line":300,"column":7},"end":{"line":300,"column":43}},{"start":{"line":300,"column":47},"end":{"line":300,"column":105}}]},"22":{"loc":{"start":{"line":302,"column":6},"end":{"line":302,"column":151}},"type":"if","locations":[{"start":{"line":302,"column":6},"end":{"line":302,"column":151}}]},"23":{"loc":{"start":{"line":308,"column":6},"end":{"line":316,"column":7}},"type":"if","locations":[{"start":{"line":308,"column":6},"end":{"line":316,"column":7}},{"start":{"line":314,"column":12},"end":{"line":316,"column":7}}]},"24":{"loc":{"start":{"line":309,"column":8},"end":{"line":311,"column":9}},"type":"if","locations":[{"start":{"line":309,"column":8},"end":{"line":311,"column":9}}]},"25":{"loc":{"start":{"line":309,"column":12},"end":{"line":309,"column":127}},"type":"binary-expr","locations":[{"start":{"line":309,"column":12},"end":{"line":309,"column":58}},{"start":{"line":309,"column":63},"end":{"line":309,"column":127}}]},"26":{"loc":{"start":{"line":314,"column":12},"end":{"line":316,"column":7}},"type":"if","locations":[{"start":{"line":314,"column":12},"end":{"line":316,"column":7}}]},"27":{"loc":{"start":{"line":314,"column":16},"end":{"line":314,"column":132}},"type":"binary-expr","locations":[{"start":{"line":314,"column":16},"end":{"line":314,"column":63}},{"start":{"line":314,"column":67},"end":{"line":314,"column":132}}]},"28":{"loc":{"start":{"line":320,"column":6},"end":{"line":322,"column":7}},"type":"if","locations":[{"start":{"line":320,"column":6},"end":{"line":322,"column":7}}]},"29":{"loc":{"start":{"line":320,"column":9},"end":{"line":320,"column":128}},"type":"binary-expr","locations":[{"start":{"line":320,"column":9},"end":{"line":320,"column":55}},{"start":{"line":320,"column":60},"end":{"line":320,"column":128}}]},"30":{"loc":{"start":{"line":329,"column":2},"end":{"line":332,"column":3}},"type":"if","locations":[{"start":{"line":329,"column":2},"end":{"line":332,"column":3}}]},"31":{"loc":{"start":{"line":348,"column":4},"end":{"line":357,"column":5}},"type":"if","locations":[{"start":{"line":348,"column":4},"end":{"line":357,"column":5}}]},"32":{"loc":{"start":{"line":391,"column":20},"end":{"line":391,"column":86}},"type":"cond-expr","locations":[{"start":{"line":391,"column":52},"end":{"line":391,"column":81}},{"start":{"line":391,"column":84},"end":{"line":391,"column":86}}]},"33":{"loc":{"start":{"line":394,"column":6},"end":{"line":400,"column":7}},"type":"if","locations":[{"start":{"line":394,"column":6},"end":{"line":400,"column":7}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":2,"9":2,"10":2,"11":2,"12":2,"13":10,"14":10,"15":10,"16":6,"17":6,"18":6,"19":2,"20":4,"21":6,"22":6,"23":2,"24":6,"25":2,"26":2,"27":4,"28":4,"29":2,"30":6,"31":0,"32":10,"33":2,"34":8,"35":4,"36":4,"37":6,"38":6,"39":6,"40":6,"41":6,"42":6,"43":0,"44":6,"45":1,"46":6,"47":6,"48":0,"49":6,"50":6,"51":6,"52":6,"53":3,"54":3,"55":6,"56":6,"57":6,"58":0,"59":6,"60":6,"61":6,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":8,"69":8,"70":8,"71":8,"72":8,"73":27,"74":27,"75":1,"76":26,"77":7,"78":7,"79":1,"80":6,"81":6,"82":4,"83":1,"84":3,"85":2,"86":1,"87":4,"88":4,"89":4,"90":4,"91":4,"92":4,"93":2,"94":2,"95":2,"96":4,"97":4,"98":17,"99":4,"100":4,"101":4,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":12,"109":12,"110":3,"111":4,"112":2,"113":2},"f":{"0":2,"1":10,"2":10,"3":6,"4":6,"5":10,"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":1,"13":1,"14":8,"15":4,"16":17,"17":12,"18":3,"19":4},"b":{"0":[6],"1":[2,4],"2":[2],"3":[6,6],"4":[2,4],"5":[2,8],"6":[10,4],"7":[4,4],"8":[8,6],"9":[0],"10":[1],"11":[6],"12":[0,6],"13":[3,3],"14":[6,3],"15":[0],"16":[6,6],"17":[0],"18":[0],"19":[1],"20":[7],"21":[26,11],"22":[1],"23":[4,2],"24":[1],"25":[4,4],"26":[1],"27":[2,2],"28":[4],"29":[4,4],"30":[2],"31":[4],"32":[3,9],"33":[2]}}
-,"/home/elora/Documents/viz-layout/src/composables/SubgraphForViz.ts": {"path":"/home/elora/Documents/viz-layout/src/composables/SubgraphForViz.ts","statementMap":{"0":{"start":{"line":33,"column":0},"end":{"line":33,"column":16}},"1":{"start":{"line":116,"column":0},"end":{"line":116,"column":16}},"2":{"start":{"line":2,"column":0},"end":{"line":2,"column":50}},"3":{"start":{"line":34,"column":4},"end":{"line":34,"column":172}},"4":{"start":{"line":34,"column":113},"end":{"line":34,"column":172}},"5":{"start":{"line":37,"column":44},"end":{"line":37,"column":99}},"6":{"start":{"line":39,"column":4},"end":{"line":41,"column":5}},"7":{"start":{"line":40,"column":8},"end":{"line":40,"column":58}},"8":{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},"9":{"start":{"line":45,"column":8},"end":{"line":45,"column":33}},"10":{"start":{"line":47,"column":36},"end":{"line":50,"column":6}},"11":{"start":{"line":49,"column":45},"end":{"line":49,"column":58}},"12":{"start":{"line":53,"column":8},"end":{"line":65,"column":9}},"13":{"start":{"line":54,"column":12},"end":{"line":64,"column":15}},"14":{"start":{"line":55,"column":32},"end":{"line":55,"column":62}},"15":{"start":{"line":56,"column":16},"end":{"line":63,"column":17}},"16":{"start":{"line":57,"column":35},"end":{"line":57,"column":65}},"17":{"start":{"line":58,"column":20},"end":{"line":60,"column":21}},"18":{"start":{"line":59,"column":24},"end":{"line":59,"column":82}},"19":{"start":{"line":61,"column":20},"end":{"line":61,"column":65}},"20":{"start":{"line":61,"column":43},"end":{"line":61,"column":65}},"21":{"start":{"line":62,"column":20},"end":{"line":62,"column":95}},"22":{"start":{"line":62,"column":78},"end":{"line":62,"column":91}},"23":{"start":{"line":69,"column":4},"end":{"line":71,"column":5}},"24":{"start":{"line":70,"column":8},"end":{"line":70,"column":32}},"25":{"start":{"line":72,"column":4},"end":{"line":72,"column":40}},"26":{"start":{"line":74,"column":4},"end":{"line":74,"column":20}},"27":{"start":{"line":87,"column":18},"end":{"line":87,"column":41}},"28":{"start":{"line":88,"column":33},"end":{"line":88,"column":35}},"29":{"start":{"line":90,"column":4},"end":{"line":105,"column":7}},"30":{"start":{"line":92,"column":8},"end":{"line":92,"column":83}},"31":{"start":{"line":92,"column":38},"end":{"line":92,"column":83}},"32":{"start":{"line":95,"column":8},"end":{"line":104,"column":9}},"33":{"start":{"line":96,"column":12},"end":{"line":96,"column":80}},"34":{"start":{"line":98,"column":12},"end":{"line":101,"column":13}},"35":{"start":{"line":100,"column":16},"end":{"line":100,"column":42}},"36":{"start":{"line":103,"column":12},"end":{"line":103,"column":37}},"37":{"start":{"line":106,"column":4},"end":{"line":106,"column":25}},"38":{"start":{"line":118,"column":4},"end":{"line":126,"column":5}},"39":{"start":{"line":119,"column":28},"end":{"line":119,"column":59}},"40":{"start":{"line":120,"column":8},"end":{"line":122,"column":11}},"41":{"start":{"line":121,"column":12},"end":{"line":121,"column":43}},"42":{"start":{"line":123,"column":8},"end":{"line":123,"column":35}},"43":{"start":{"line":125,"column":8},"end":{"line":125,"column":48}}},"fnMap":{"0":{"name":"addMainChainForViz","decl":{"start":{"line":33,"column":16},"end":{"line":33,"column":34}},"loc":{"start":{"line":33,"column":148},"end":{"line":75,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":49,"column":26},"end":{"line":49,"column":27}},"loc":{"start":{"line":49,"column":45},"end":{"line":49,"column":58}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":54,"column":38},"end":{"line":54,"column":46}},"loc":{"start":{"line":54,"column":49},"end":{"line":64,"column":13}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":62,"column":59},"end":{"line":62,"column":60}},"loc":{"start":{"line":62,"column":78},"end":{"line":62,"column":91}}},"4":{"name":"changeCycleMetanodes","decl":{"start":{"line":86,"column":9},"end":{"line":86,"column":29}},"loc":{"start":{"line":86,"column":85},"end":{"line":107,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":90,"column":27},"end":{"line":90,"column":31}},"loc":{"start":{"line":90,"column":34},"end":{"line":105,"column":5}}},"6":{"name":"subgraphDot","decl":{"start":{"line":116,"column":16},"end":{"line":116,"column":27}},"loc":{"start":{"line":116,"column":49},"end":{"line":128,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":120,"column":31},"end":{"line":120,"column":32}},"loc":{"start":{"line":120,"column":40},"end":{"line":122,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":107},"end":{"line":33,"column":125}},"type":"default-arg","locations":[{"start":{"line":33,"column":121},"end":{"line":33,"column":125}}]},"1":{"loc":{"start":{"line":33,"column":126},"end":{"line":33,"column":148}},"type":"default-arg","locations":[{"start":{"line":33,"column":144},"end":{"line":33,"column":148}}]},"2":{"loc":{"start":{"line":34,"column":4},"end":{"line":34,"column":172}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":34,"column":172}}]},"3":{"loc":{"start":{"line":34,"column":9},"end":{"line":34,"column":110}},"type":"binary-expr","locations":[{"start":{"line":34,"column":9},"end":{"line":34,"column":50}},{"start":{"line":34,"column":54},"end":{"line":34,"column":110}}]},"4":{"loc":{"start":{"line":39,"column":4},"end":{"line":41,"column":5}},"type":"if","locations":[{"start":{"line":39,"column":4},"end":{"line":41,"column":5}}]},"5":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":5}}]},"6":{"loc":{"start":{"line":44,"column":8},"end":{"line":44,"column":49}},"type":"binary-expr","locations":[{"start":{"line":44,"column":8},"end":{"line":44,"column":17}},{"start":{"line":44,"column":21},"end":{"line":44,"column":49}}]},"7":{"loc":{"start":{"line":49,"column":15},"end":{"line":49,"column":66}},"type":"binary-expr","locations":[{"start":{"line":49,"column":15},"end":{"line":49,"column":60}},{"start":{"line":49,"column":64},"end":{"line":49,"column":66}}]},"8":{"loc":{"start":{"line":49,"column":15},"end":{"line":49,"column":60}},"type":"cond-expr","locations":[{"start":{"line":49,"column":20},"end":{"line":49,"column":22}},{"start":{"line":49,"column":15},"end":{"line":49,"column":60}}]},"9":{"loc":{"start":{"line":49,"column":15},"end":{"line":49,"column":22}},"type":"binary-expr","locations":[{"start":{"line":49,"column":15},"end":{"line":49,"column":22}},{"start":{"line":49,"column":15},"end":{"line":49,"column":22}}]},"10":{"loc":{"start":{"line":53,"column":8},"end":{"line":65,"column":9}},"type":"if","locations":[{"start":{"line":53,"column":8},"end":{"line":65,"column":9}}]},"11":{"loc":{"start":{"line":56,"column":16},"end":{"line":63,"column":17}},"type":"if","locations":[{"start":{"line":56,"column":16},"end":{"line":63,"column":17}}]},"12":{"loc":{"start":{"line":56,"column":20},"end":{"line":56,"column":57}},"type":"binary-expr","locations":[{"start":{"line":56,"column":20},"end":{"line":56,"column":29}},{"start":{"line":56,"column":33},"end":{"line":56,"column":57}}]},"13":{"loc":{"start":{"line":58,"column":20},"end":{"line":60,"column":21}},"type":"if","locations":[{"start":{"line":58,"column":20},"end":{"line":60,"column":21}}]},"14":{"loc":{"start":{"line":61,"column":20},"end":{"line":61,"column":65}},"type":"if","locations":[{"start":{"line":61,"column":20},"end":{"line":61,"column":65}}]},"15":{"loc":{"start":{"line":69,"column":4},"end":{"line":71,"column":5}},"type":"if","locations":[{"start":{"line":69,"column":4},"end":{"line":71,"column":5}}]},"16":{"loc":{"start":{"line":92,"column":8},"end":{"line":92,"column":83}},"type":"if","locations":[{"start":{"line":92,"column":8},"end":{"line":92,"column":83}}]},"17":{"loc":{"start":{"line":95,"column":8},"end":{"line":104,"column":9}},"type":"if","locations":[{"start":{"line":95,"column":8},"end":{"line":104,"column":9}},{"start":{"line":102,"column":13},"end":{"line":104,"column":9}}]},"18":{"loc":{"start":{"line":95,"column":12},"end":{"line":95,"column":109}},"type":"binary-expr","locations":[{"start":{"line":95,"column":12},"end":{"line":95,"column":46}},{"start":{"line":95,"column":50},"end":{"line":95,"column":109}}]},"19":{"loc":{"start":{"line":98,"column":12},"end":{"line":101,"column":13}},"type":"if","locations":[{"start":{"line":98,"column":12},"end":{"line":101,"column":13}}]},"20":{"loc":{"start":{"line":118,"column":4},"end":{"line":126,"column":5}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":126,"column":5}},{"start":{"line":124,"column":9},"end":{"line":126,"column":5}}]},"21":{"loc":{"start":{"line":118,"column":8},"end":{"line":118,"column":49}},"type":"binary-expr","locations":[{"start":{"line":118,"column":8},"end":{"line":118,"column":22}},{"start":{"line":118,"column":26},"end":{"line":118,"column":49}}]}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0],"1":[0],"2":[0],"3":[0,0],"4":[0],"5":[0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0],"11":[0],"12":[0,0],"13":[0],"14":[0],"15":[0],"16":[0],"17":[0,0],"18":[0,0],"19":[0],"20":[0,0],"21":[0,0]}}
-,"/home/elora/Documents/viz-layout/src/types/EnumArgs.ts": {"path":"/home/elora/Documents/viz-layout/src/types/EnumArgs.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":4},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":4},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":4},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":4},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"8":{"start":{"line":11,"column":4},"end":{"line":11,"column":null}},"9":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"10":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"12":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"13":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},"14":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"15":{"start":{"line":22,"column":0},"end":{"line":22,"column":null}},"16":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"17":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"18":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"19":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"20":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"21":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"22":{"start":{"line":29,"column":4},"end":{"line":29,"column":12}},"23":{"start":{"line":32,"column":0},"end":{"line":32,"column":null}},"24":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"25":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}},"loc":{"start":{"line":1,"column":26},"end":{"line":8,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":0},"end":{"line":10,"column":12}},"loc":{"start":{"line":10,"column":20},"end":{"line":14,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"loc":{"start":{"line":16,"column":20},"end":{"line":20,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":22,"column":0},"end":{"line":22,"column":12}},"loc":{"start":{"line":22,"column":16},"end":{"line":30,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":32,"column":0},"end":{"line":32,"column":12}},"loc":{"start":{"line":32,"column":19},"end":{"line":35,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1,"column":12},"end":{"line":1,"column":26}},{"start":{"line":1,"column":26},"end":{"line":1,"column":null}}]},"1":{"loc":{"start":{"line":10,"column":12},"end":{"line":10,"column":null}},"type":"binary-expr","locations":[{"start":{"line":10,"column":12},"end":{"line":10,"column":20}},{"start":{"line":10,"column":20},"end":{"line":10,"column":null}}]},"2":{"loc":{"start":{"line":16,"column":12},"end":{"line":16,"column":null}},"type":"binary-expr","locations":[{"start":{"line":16,"column":12},"end":{"line":16,"column":20}},{"start":{"line":16,"column":20},"end":{"line":16,"column":null}}]},"3":{"loc":{"start":{"line":22,"column":12},"end":{"line":22,"column":null}},"type":"binary-expr","locations":[{"start":{"line":22,"column":12},"end":{"line":22,"column":16}},{"start":{"line":22,"column":16},"end":{"line":22,"column":null}}]},"4":{"loc":{"start":{"line":32,"column":12},"end":{"line":32,"column":null}},"type":"binary-expr","locations":[{"start":{"line":32,"column":12},"end":{"line":32,"column":19}},{"start":{"line":32,"column":19},"end":{"line":32,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"f":{"0":1,"1":1,"2":1,"3":1,"4":1},"b":{"0":[1,1],"1":[1,1],"2":[1,1],"3":[1,1],"4":[1,1]}}
-,"/home/elora/Documents/viz-layout/src/types/Subgraph.ts": {"path":"/home/elora/Documents/viz-layout/src/types/Subgraph.ts","statementMap":{"0":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"1":{"start":{"line":11,"column":4},"end":{"line":11,"column":null}},"2":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"3":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"4":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":0},"end":{"line":10,"column":12}},"loc":{"start":{"line":10,"column":24},"end":{"line":15,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":12},"end":{"line":10,"column":null}},"type":"binary-expr","locations":[{"start":{"line":10,"column":12},"end":{"line":10,"column":24}},{"start":{"line":10,"column":24},"end":{"line":10,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{"0":1},"b":{"0":[1,1]}}
-}
diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css
deleted file mode 100644
index f418035b469aff23689a74c912849662f442aed4..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/base.css
+++ /dev/null
@@ -1,224 +0,0 @@
-body, html {
-  margin:0; padding: 0;
-  height: 100%;
-}
-body {
-    font-family: Helvetica Neue, Helvetica, Arial;
-    font-size: 14px;
-    color:#333;
-}
-.small { font-size: 12px; }
-*, *:after, *:before {
-  -webkit-box-sizing:border-box;
-     -moz-box-sizing:border-box;
-          box-sizing:border-box;
-  }
-h1 { font-size: 20px; margin: 0;}
-h2 { font-size: 14px; }
-pre {
-    font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
-    margin: 0;
-    padding: 0;
-    -moz-tab-size: 2;
-    -o-tab-size:  2;
-    tab-size: 2;
-}
-a { color:#0074D9; text-decoration:none; }
-a:hover { text-decoration:underline; }
-.strong { font-weight: bold; }
-.space-top1 { padding: 10px 0 0 0; }
-.pad2y { padding: 20px 0; }
-.pad1y { padding: 10px 0; }
-.pad2x { padding: 0 20px; }
-.pad2 { padding: 20px; }
-.pad1 { padding: 10px; }
-.space-left2 { padding-left:55px; }
-.space-right2 { padding-right:20px; }
-.center { text-align:center; }
-.clearfix { display:block; }
-.clearfix:after {
-  content:'';
-  display:block;
-  height:0;
-  clear:both;
-  visibility:hidden;
-  }
-.fl { float: left; }
-@media only screen and (max-width:640px) {
-  .col3 { width:100%; max-width:100%; }
-  .hide-mobile { display:none!important; }
-}
-
-.quiet {
-  color: #7f7f7f;
-  color: rgba(0,0,0,0.5);
-}
-.quiet a { opacity: 0.7; }
-
-.fraction {
-  font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
-  font-size: 10px;
-  color: #555;
-  background: #E8E8E8;
-  padding: 4px 5px;
-  border-radius: 3px;
-  vertical-align: middle;
-}
-
-div.path a:link, div.path a:visited { color: #333; }
-table.coverage {
-  border-collapse: collapse;
-  margin: 10px 0 0 0;
-  padding: 0;
-}
-
-table.coverage td {
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-}
-table.coverage td.line-count {
-    text-align: right;
-    padding: 0 5px 0 20px;
-}
-table.coverage td.line-coverage {
-    text-align: right;
-    padding-right: 10px;
-    min-width:20px;
-}
-
-table.coverage td span.cline-any {
-    display: inline-block;
-    padding: 0 5px;
-    width: 100%;
-}
-.missing-if-branch {
-    display: inline-block;
-    margin-right: 5px;
-    border-radius: 3px;
-    position: relative;
-    padding: 0 4px;
-    background: #333;
-    color: yellow;
-}
-
-.skip-if-branch {
-    display: none;
-    margin-right: 10px;
-    position: relative;
-    padding: 0 4px;
-    background: #ccc;
-    color: white;
-}
-.missing-if-branch .typ, .skip-if-branch .typ {
-    color: inherit !important;
-}
-.coverage-summary {
-  border-collapse: collapse;
-  width: 100%;
-}
-.coverage-summary tr { border-bottom: 1px solid #bbb; }
-.keyline-all { border: 1px solid #ddd; }
-.coverage-summary td, .coverage-summary th { padding: 10px; }
-.coverage-summary tbody { border: 1px solid #bbb; }
-.coverage-summary td { border-right: 1px solid #bbb; }
-.coverage-summary td:last-child { border-right: none; }
-.coverage-summary th {
-  text-align: left;
-  font-weight: normal;
-  white-space: nowrap;
-}
-.coverage-summary th.file { border-right: none !important; }
-.coverage-summary th.pct { }
-.coverage-summary th.pic,
-.coverage-summary th.abs,
-.coverage-summary td.pct,
-.coverage-summary td.abs { text-align: right; }
-.coverage-summary td.file { white-space: nowrap;  }
-.coverage-summary td.pic { min-width: 120px !important;  }
-.coverage-summary tfoot td { }
-
-.coverage-summary .sorter {
-    height: 10px;
-    width: 7px;
-    display: inline-block;
-    margin-left: 0.5em;
-    background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
-}
-.coverage-summary .sorted .sorter {
-    background-position: 0 -20px;
-}
-.coverage-summary .sorted-desc .sorter {
-    background-position: 0 -10px;
-}
-.status-line {  height: 10px; }
-/* yellow */
-.cbranch-no { background: yellow !important; color: #111; }
-/* dark red */
-.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
-.low .chart { border:1px solid #C21F39 }
-.highlighted,
-.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
-  background: #C21F39 !important;
-}
-/* medium red */
-.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
-/* light red */
-.low, .cline-no { background:#FCE1E5 }
-/* light green */
-.high, .cline-yes { background:rgb(230,245,208) }
-/* medium green */
-.cstat-yes { background:rgb(161,215,106) }
-/* dark green */
-.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
-.high .chart { border:1px solid rgb(77,146,33) }
-/* dark yellow (gold) */
-.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
-.medium .chart { border:1px solid #f9cd0b; }
-/* light yellow */
-.medium { background: #fff4c2; }
-
-.cstat-skip { background: #ddd; color: #111; }
-.fstat-skip { background: #ddd; color: #111 !important; }
-.cbranch-skip { background: #ddd !important; color: #111; }
-
-span.cline-neutral { background: #eaeaea; }
-
-.coverage-summary td.empty {
-    opacity: .5;
-    padding-top: 4px;
-    padding-bottom: 4px;
-    line-height: 1;
-    color: #888;
-}
-
-.cover-fill, .cover-empty {
-  display:inline-block;
-  height: 12px;
-}
-.chart {
-  line-height: 0;
-}
-.cover-empty {
-    background: white;
-}
-.cover-full {
-    border-right: none !important;
-}
-pre.prettyprint {
-    border: none !important;
-    padding: 0 !important;
-    margin: 0 !important;
-}
-.com { color: #999 !important; }
-.ignore-none { color: #999; font-weight: normal; }
-
-.wrapper {
-  min-height: 100%;
-  height: auto !important;
-  height: 100%;
-  margin: 0 auto -48px;
-}
-.footer, .push {
-  height: 48px;
-}
diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js
deleted file mode 100644
index cc121302316c8faaaebfd6a15f4212d99e563199..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/block-navigation.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/* eslint-disable */
-var jumpToCode = (function init() {
-    // Classes of code we would like to highlight in the file view
-    var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
-
-    // Elements to highlight in the file listing view
-    var fileListingElements = ['td.pct.low'];
-
-    // We don't want to select elements that are direct descendants of another match
-    var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
-
-    // Selecter that finds elements on the page to which we can jump
-    var selector =
-        fileListingElements.join(', ') +
-        ', ' +
-        notSelector +
-        missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
-
-    // The NodeList of matching elements
-    var missingCoverageElements = document.querySelectorAll(selector);
-
-    var currentIndex;
-
-    function toggleClass(index) {
-        missingCoverageElements
-            .item(currentIndex)
-            .classList.remove('highlighted');
-        missingCoverageElements.item(index).classList.add('highlighted');
-    }
-
-    function makeCurrent(index) {
-        toggleClass(index);
-        currentIndex = index;
-        missingCoverageElements.item(index).scrollIntoView({
-            behavior: 'smooth',
-            block: 'center',
-            inline: 'center'
-        });
-    }
-
-    function goToPrevious() {
-        var nextIndex = 0;
-        if (typeof currentIndex !== 'number' || currentIndex === 0) {
-            nextIndex = missingCoverageElements.length - 1;
-        } else if (missingCoverageElements.length > 1) {
-            nextIndex = currentIndex - 1;
-        }
-
-        makeCurrent(nextIndex);
-    }
-
-    function goToNext() {
-        var nextIndex = 0;
-
-        if (
-            typeof currentIndex === 'number' &&
-            currentIndex < missingCoverageElements.length - 1
-        ) {
-            nextIndex = currentIndex + 1;
-        }
-
-        makeCurrent(nextIndex);
-    }
-
-    return function jump(event) {
-        if (
-            document.getElementById('fileSearch') === document.activeElement &&
-            document.activeElement != null
-        ) {
-            // if we're currently focused on the search input, we don't want to navigate
-            return;
-        }
-
-        switch (event.which) {
-            case 78: // n
-            case 74: // j
-                goToNext();
-                break;
-            case 66: // b
-            case 75: // k
-            case 80: // p
-                goToPrevious();
-                break;
-        }
-    };
-})();
-window.addEventListener('keydown', jumpToCode);
diff --git a/coverage/lcov-report/composables/AlgorithmBFS.ts.html b/coverage/lcov-report/composables/AlgorithmBFS.ts.html
deleted file mode 100644
index 4c410a9d7e8d3d0b614a696f7fe72e14821d00ec..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/AlgorithmBFS.ts.html
+++ /dev/null
@@ -1,367 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/AlgorithmBFS.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> AlgorithmBFS.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">14.28% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>4/28</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>0/13</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>0/4</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">14.28% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>4/28</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Types imports
-import { StartNodesType } from "../types/EnumArgs";
-import { Network } from "@metabohub/viz-core/src/types/Network";
-&nbsp;
-// Composable imports
-import { getStartNodes } from "./CalculateStartNodes";
-import { networkToAdjacentObject } from "./ConvertFromNetwork";
-&nbsp;
-&nbsp;
-/**
- * This file contains the functions to perform Breadth-First Search (BFS) on a graph.
- * 
- * -&gt; BFS :
- *      Perform Breadth-First Search (BFS) on a graph represented by an adjacency object.
- * 
- * -&gt; BFSWithSources :
- *     Perform Breadth-First Search (BFS) on a network with multiple sources.
- */
-&nbsp;
-&nbsp;
-/**
- * Perform Breadth-First Search (BFS) on a graph represented by an adjacency object.
- * @param adjacency The adjacency object representing the graph.
- * @param source The starting node for BFS.
- * @param blockedNodes List of nodes that can't be visited (blocked)
- * @returns An array of nodes visited in BFS order.
- */
-export function <span class="fstat-no" title="function not covered" >BFS(</span>adjacency: { [key: string]: string[] }, source: string, blockedNodes?:string[]): string[] {
-    const visitedNodes: Set&lt;string&gt; = <span class="cstat-no" title="statement not covered" >new Set();</span>
-    const nodesToProcess: string[] = <span class="cstat-no" title="statement not covered" >[source];</span>
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    while (nodesToProcess.length) {</span>
-        const currentNode = <span class="cstat-no" title="statement not covered" >nodesToProcess.shift()!;</span>
-&nbsp;
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (currentNode &amp;&amp; !visitedNodes.has(currentNode)) {</span>
-<span class="cstat-no" title="statement not covered" >            visitedNodes.add(currentNode);</span>
-            const children = <span class="cstat-no" title="statement not covered" >adjacency[currentNode] || [];</span>
-<span class="cstat-no" title="statement not covered" >            children.forEach(<span class="fstat-no" title="function not covered" >child </span>=&gt; {</span>
-<span class="cstat-no" title="statement not covered" >                <span class="missing-if-branch" title="if path not taken" >I</span>if (!visitedNodes.has(child)) {</span>
-<span class="cstat-no" title="statement not covered" >                    <span class="missing-if-branch" title="if path not taken" >I</span>if ( (blockedNodes &amp;&amp; !blockedNodes.includes(child)) || !blockedNodes ){</span>
-<span class="cstat-no" title="statement not covered" >                        nodesToProcess.push(child);</span>
-                    }
-                }
-            });
-        }
-    }
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    return Array.from(visitedNodes);</span>
-}
-&nbsp;
-&nbsp;
-/**
- * Perform Breadth-First Search (BFS) on a network with multiple sources.
- * @param network The network to perform BFS on.
- * @param sources An array of source nodes or a source type.
- * Source type :
- * RANK_ONLY : sources are nodes of rank 0
- * SOURCE_ONLY : sources are topological sources of the network (nul indegree)
- * RANK_SOURCE : sources are node of rank 0, then source nodes
- * ALL : sources are all nodes
- * SOURCE_ALL : sources are topological sources, then all the others nodes
- * RANK_SOURCE_ALL : sources are node of rank 0, then topological sources, then all the other nodes
- * @returns An array of nodes visited in BFS order, a node can appear several time if it is a descendant of several sources.
- */
-export async function <span class="fstat-no" title="function not covered" >BFSWithSources(</span>network:Network, sources:Array&lt;string&gt;|StartNodesType):Promise&lt;Array&lt;string&gt;&gt;{
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    try{ </span>
-        let bfsAllSources:string[] =<span class="cstat-no" title="statement not covered" >[];</span>
-&nbsp;
-        // create graph for library from network
-        const adj=<span class="cstat-no" title="statement not covered" >networkToAdjacentObject(network);</span>
-&nbsp;
-        //get sources nodes if no list from user
-        let sources_list: Array&lt;string&gt;;
-<span class="cstat-no" title="statement not covered" >        if (Array.isArray(sources)) {</span>
-<span class="cstat-no" title="statement not covered" >            sources_list = sources;</span>
-        } else {
-<span class="cstat-no" title="statement not covered" >            sources_list = await getStartNodes(network, sources);</span>
-        }
-&nbsp;
-        // apply BFS
-<span class="cstat-no" title="statement not covered" >        sources_list.forEach(<span class="fstat-no" title="function not covered" >source=</span>&gt;{</span>
-            // bfs on source only if source not already visited
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if( !bfsAllSources.includes(source)){</span>
-                const bfs=<span class="cstat-no" title="statement not covered" >BFS(adj,source,bfsAllSources); </span>
-<span class="cstat-no" title="statement not covered" >                bfsAllSources = bfsAllSources.concat(bfs);</span>
-            }
-        })
-    
-<span class="cstat-no" title="statement not covered" >        return bfsAllSources</span>
-    }catch(error){
-<span class="cstat-no" title="statement not covered" >        throw error;</span>
-    }
-}
-&nbsp;</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/AlgorithmDFS.ts.html b/coverage/lcov-report/composables/AlgorithmDFS.ts.html
deleted file mode 100644
index 898bdfc96f1e0ff1c93fd46c5629012683e1772b..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/AlgorithmDFS.ts.html
+++ /dev/null
@@ -1,529 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/AlgorithmDFS.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> AlgorithmDFS.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">97.36% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>37/38</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">90% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>9/10</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>9/9</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>35/35</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line high'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import { Network } from '@metabohub/viz-core/src/types/Network';
-import { StartNodesType } from '../types/EnumArgs';
-&nbsp;
-// Composable imports
-import { networkToGDSGraph } from './ConvertFromNetwork';
-import { getStartNodes } from './CalculateStartNodes';
-&nbsp;
-&nbsp;
-/**
- * This file contains functions to manage Depth First Search (DFS) algorithms.
- * 
- * -&gt; DFSWithSources :
- *     Take a network and sources, return the dfs result (that is an array of string of node ID).
- * 
- * -&gt; DFSsourceDAG :
- *      Do a DFS from a source and remove the last edge of directed cycle to get a "source DAG".
- * 
- * -&gt; createGraphForDFS :
- *     Initialize a dfs object from the network.
- * 
- * -&gt; nodeDagDFS :
- *      DFS from a node and remove the edge if create a directed cycle.
- */
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Take a network and sources, return the dfs result (that is an array of string of node ID)
- * Use of graph-data-structure library.
- * @param network 
- * @param sources to use for dfs : array of node ID or a type of method to get sources automatically
- * RANK_ONLY : sources are nodes of rank 0
- * SOURCE_ONLY : sources are topological sources of the network (nul indegree)
- * RANK_SOURCE : sources are node of rank 0, then source nodes
- * ALL : sources are all nodes
- * SOURCE_ALL : sources are topological sources, then all the others nodes
- * RANK_SOURCE_ALL : sources are node of rank 0, then topological sources, then all the other nodes
- * 
- * @returns dfs result
- */
-export async function DFSWithSources(network:Network, sources:Array&lt;string&gt;|StartNodesType):Promise&lt;Array&lt;string&gt;&gt;{
-&nbsp;
-    // create graph for library from network
-    const graph=await networkToGDSGraph(network);
-&nbsp;
-    //get sources nodes if no list from user
-    let sources_list: Array&lt;string&gt;;
-    if (Array.isArray(sources)) {
-        sources_list = sources;
-    } else {
-        sources_list = await getStartNodes(network, sources);
-    }
-&nbsp;
-    // apply DFS (reverse order because DFS is a backward reading)
-    const dfs= graph.depthFirstSearch(sources_list);
-    return dfs.reverse();
-&nbsp;
-}
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Do a DFS from a source and remove the last edge of directed cycle to get a "source DAG". 
- * @param network 
- * @param sources to use as staring node for DFS
- * @returns the reverse dfs order (topological sort) and a graph object without the cycles accessible from the sources 
- */
-export async function DFSsourceDAG(network:Network, sources:Array&lt;string&gt;):Promise&lt;{dfs:Array&lt;string&gt;, graph:{[key:string]:Function} }&gt; {
-    let DFS:DFS=await createGraphForDFS(network);
-&nbsp;
-    sources.forEach(async sourceID =&gt;{
-        const nodesID:string[]=DFS.nodesID;
-        <span class="missing-if-branch" title="if path not taken" >I</span>if (nodesID.length===0) <span class="cstat-no" title="statement not covered" >return; </span>// no nodes 
-        const sourceIndex=nodesID.indexOf(sourceID);
-        // if the source exist in the network and it's not already visited : dfs from this source
-        if (sourceIndex!==-1 &amp;&amp; !DFS.visited[sourceIndex]){
-            DFS= await nodeDagDFS(DFS,sourceIndex,[]);           
-        }
-    });
-&nbsp;
-    return { dfs:DFS.dfsOrder.reverse(),graph:DFS.GDSgraph };
-}
-&nbsp;
-/**
- * Initialize a dfs object from the network
- * @param network 
- * @returns promise of initialized DFS object
- */
-async function createGraphForDFS(network:Network):Promise&lt;DFS&gt;{
-    const nbNode=Object.keys(network.nodes).length;
-    const graphGDS=await networkToGDSGraph(network);
-    return  {
-        dfsOrder: [], 
-        GDSgraph: graphGDS,
-        nodesID:graphGDS.nodes() as string[],
-        visited:Array.from({ length: nbNode }, () =&gt; false),
-    }
-}
-&nbsp;
-/**
- * DFS from a node and remove the edge if create a directed cycle
- * @param DFS dfs object with visited nodes, adjacent information ...
- * @param nodeIndex of the node ro process
- * @param currentPath the dfs path from the source to this node
- * @returns the DFS object with visited nodes, adjacent information ...
- */
-async function nodeDagDFS(DFS:DFS,nodeIndex:number,currentPath:number[]):Promise&lt;DFS&gt;{
-&nbsp;
-    // mark the node as visited
-    DFS.visited[nodeIndex] = true;
-&nbsp;
-    // add node to current path (copy of path, else pointer)
-    const path=Array.from(currentPath);
-    path.push(nodeIndex)
-&nbsp;
-    // loop through the children of the node
-    DFS.GDSgraph.adjacent(DFS.nodesID[nodeIndex]).sort().forEach(async (childID:string) =&gt; {
-&nbsp;
-        // get the index of the child
-        const childIndex = DFS.nodesID.indexOf(childID);
-        if(childIndex!==-1){
-&nbsp;
-            // if the child node had never been visited : the edge is an tree edge
-            if (!DFS.visited[childIndex]){
-&nbsp;
-                // dfs through the child node
-                DFS=await nodeDagDFS(DFS,childIndex,path);
-&nbsp;
-            } else { // if the child node had already been visited
-                // and that the node is in the current path : there is a directed cycle
-                if(path.includes(childIndex)){
-                    const parentID=DFS.nodesID[nodeIndex];
-                    DFS.GDSgraph.removeEdge(parentID,childID)
-                }
-                
-            }
-        }
-    });
-    
-    // add the node to the dfs order
-    DFS.dfsOrder.push(DFS.nodesID[nodeIndex]); 
-    
-    return DFS;
-}
-    
-&nbsp;
-&nbsp;
-&nbsp;</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-17T13:53:06.107Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/CalculateOverlaps.ts.html b/coverage/lcov-report/composables/CalculateOverlaps.ts.html
deleted file mode 100644
index 9586e2885bf123927e0c7786bd44e437b01a693b..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/CalculateOverlaps.ts.html
+++ /dev/null
@@ -1,1822 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/CalculateOverlaps.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> CalculateOverlaps.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">98.79% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>82/83</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">98.33% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>59/60</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>9/9</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">98.7% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>76/77</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line high'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a>
-<a name='L150'></a><a href='#L150'>150</a>
-<a name='L151'></a><a href='#L151'>151</a>
-<a name='L152'></a><a href='#L152'>152</a>
-<a name='L153'></a><a href='#L153'>153</a>
-<a name='L154'></a><a href='#L154'>154</a>
-<a name='L155'></a><a href='#L155'>155</a>
-<a name='L156'></a><a href='#L156'>156</a>
-<a name='L157'></a><a href='#L157'>157</a>
-<a name='L158'></a><a href='#L158'>158</a>
-<a name='L159'></a><a href='#L159'>159</a>
-<a name='L160'></a><a href='#L160'>160</a>
-<a name='L161'></a><a href='#L161'>161</a>
-<a name='L162'></a><a href='#L162'>162</a>
-<a name='L163'></a><a href='#L163'>163</a>
-<a name='L164'></a><a href='#L164'>164</a>
-<a name='L165'></a><a href='#L165'>165</a>
-<a name='L166'></a><a href='#L166'>166</a>
-<a name='L167'></a><a href='#L167'>167</a>
-<a name='L168'></a><a href='#L168'>168</a>
-<a name='L169'></a><a href='#L169'>169</a>
-<a name='L170'></a><a href='#L170'>170</a>
-<a name='L171'></a><a href='#L171'>171</a>
-<a name='L172'></a><a href='#L172'>172</a>
-<a name='L173'></a><a href='#L173'>173</a>
-<a name='L174'></a><a href='#L174'>174</a>
-<a name='L175'></a><a href='#L175'>175</a>
-<a name='L176'></a><a href='#L176'>176</a>
-<a name='L177'></a><a href='#L177'>177</a>
-<a name='L178'></a><a href='#L178'>178</a>
-<a name='L179'></a><a href='#L179'>179</a>
-<a name='L180'></a><a href='#L180'>180</a>
-<a name='L181'></a><a href='#L181'>181</a>
-<a name='L182'></a><a href='#L182'>182</a>
-<a name='L183'></a><a href='#L183'>183</a>
-<a name='L184'></a><a href='#L184'>184</a>
-<a name='L185'></a><a href='#L185'>185</a>
-<a name='L186'></a><a href='#L186'>186</a>
-<a name='L187'></a><a href='#L187'>187</a>
-<a name='L188'></a><a href='#L188'>188</a>
-<a name='L189'></a><a href='#L189'>189</a>
-<a name='L190'></a><a href='#L190'>190</a>
-<a name='L191'></a><a href='#L191'>191</a>
-<a name='L192'></a><a href='#L192'>192</a>
-<a name='L193'></a><a href='#L193'>193</a>
-<a name='L194'></a><a href='#L194'>194</a>
-<a name='L195'></a><a href='#L195'>195</a>
-<a name='L196'></a><a href='#L196'>196</a>
-<a name='L197'></a><a href='#L197'>197</a>
-<a name='L198'></a><a href='#L198'>198</a>
-<a name='L199'></a><a href='#L199'>199</a>
-<a name='L200'></a><a href='#L200'>200</a>
-<a name='L201'></a><a href='#L201'>201</a>
-<a name='L202'></a><a href='#L202'>202</a>
-<a name='L203'></a><a href='#L203'>203</a>
-<a name='L204'></a><a href='#L204'>204</a>
-<a name='L205'></a><a href='#L205'>205</a>
-<a name='L206'></a><a href='#L206'>206</a>
-<a name='L207'></a><a href='#L207'>207</a>
-<a name='L208'></a><a href='#L208'>208</a>
-<a name='L209'></a><a href='#L209'>209</a>
-<a name='L210'></a><a href='#L210'>210</a>
-<a name='L211'></a><a href='#L211'>211</a>
-<a name='L212'></a><a href='#L212'>212</a>
-<a name='L213'></a><a href='#L213'>213</a>
-<a name='L214'></a><a href='#L214'>214</a>
-<a name='L215'></a><a href='#L215'>215</a>
-<a name='L216'></a><a href='#L216'>216</a>
-<a name='L217'></a><a href='#L217'>217</a>
-<a name='L218'></a><a href='#L218'>218</a>
-<a name='L219'></a><a href='#L219'>219</a>
-<a name='L220'></a><a href='#L220'>220</a>
-<a name='L221'></a><a href='#L221'>221</a>
-<a name='L222'></a><a href='#L222'>222</a>
-<a name='L223'></a><a href='#L223'>223</a>
-<a name='L224'></a><a href='#L224'>224</a>
-<a name='L225'></a><a href='#L225'>225</a>
-<a name='L226'></a><a href='#L226'>226</a>
-<a name='L227'></a><a href='#L227'>227</a>
-<a name='L228'></a><a href='#L228'>228</a>
-<a name='L229'></a><a href='#L229'>229</a>
-<a name='L230'></a><a href='#L230'>230</a>
-<a name='L231'></a><a href='#L231'>231</a>
-<a name='L232'></a><a href='#L232'>232</a>
-<a name='L233'></a><a href='#L233'>233</a>
-<a name='L234'></a><a href='#L234'>234</a>
-<a name='L235'></a><a href='#L235'>235</a>
-<a name='L236'></a><a href='#L236'>236</a>
-<a name='L237'></a><a href='#L237'>237</a>
-<a name='L238'></a><a href='#L238'>238</a>
-<a name='L239'></a><a href='#L239'>239</a>
-<a name='L240'></a><a href='#L240'>240</a>
-<a name='L241'></a><a href='#L241'>241</a>
-<a name='L242'></a><a href='#L242'>242</a>
-<a name='L243'></a><a href='#L243'>243</a>
-<a name='L244'></a><a href='#L244'>244</a>
-<a name='L245'></a><a href='#L245'>245</a>
-<a name='L246'></a><a href='#L246'>246</a>
-<a name='L247'></a><a href='#L247'>247</a>
-<a name='L248'></a><a href='#L248'>248</a>
-<a name='L249'></a><a href='#L249'>249</a>
-<a name='L250'></a><a href='#L250'>250</a>
-<a name='L251'></a><a href='#L251'>251</a>
-<a name='L252'></a><a href='#L252'>252</a>
-<a name='L253'></a><a href='#L253'>253</a>
-<a name='L254'></a><a href='#L254'>254</a>
-<a name='L255'></a><a href='#L255'>255</a>
-<a name='L256'></a><a href='#L256'>256</a>
-<a name='L257'></a><a href='#L257'>257</a>
-<a name='L258'></a><a href='#L258'>258</a>
-<a name='L259'></a><a href='#L259'>259</a>
-<a name='L260'></a><a href='#L260'>260</a>
-<a name='L261'></a><a href='#L261'>261</a>
-<a name='L262'></a><a href='#L262'>262</a>
-<a name='L263'></a><a href='#L263'>263</a>
-<a name='L264'></a><a href='#L264'>264</a>
-<a name='L265'></a><a href='#L265'>265</a>
-<a name='L266'></a><a href='#L266'>266</a>
-<a name='L267'></a><a href='#L267'>267</a>
-<a name='L268'></a><a href='#L268'>268</a>
-<a name='L269'></a><a href='#L269'>269</a>
-<a name='L270'></a><a href='#L270'>270</a>
-<a name='L271'></a><a href='#L271'>271</a>
-<a name='L272'></a><a href='#L272'>272</a>
-<a name='L273'></a><a href='#L273'>273</a>
-<a name='L274'></a><a href='#L274'>274</a>
-<a name='L275'></a><a href='#L275'>275</a>
-<a name='L276'></a><a href='#L276'>276</a>
-<a name='L277'></a><a href='#L277'>277</a>
-<a name='L278'></a><a href='#L278'>278</a>
-<a name='L279'></a><a href='#L279'>279</a>
-<a name='L280'></a><a href='#L280'>280</a>
-<a name='L281'></a><a href='#L281'>281</a>
-<a name='L282'></a><a href='#L282'>282</a>
-<a name='L283'></a><a href='#L283'>283</a>
-<a name='L284'></a><a href='#L284'>284</a>
-<a name='L285'></a><a href='#L285'>285</a>
-<a name='L286'></a><a href='#L286'>286</a>
-<a name='L287'></a><a href='#L287'>287</a>
-<a name='L288'></a><a href='#L288'>288</a>
-<a name='L289'></a><a href='#L289'>289</a>
-<a name='L290'></a><a href='#L290'>290</a>
-<a name='L291'></a><a href='#L291'>291</a>
-<a name='L292'></a><a href='#L292'>292</a>
-<a name='L293'></a><a href='#L293'>293</a>
-<a name='L294'></a><a href='#L294'>294</a>
-<a name='L295'></a><a href='#L295'>295</a>
-<a name='L296'></a><a href='#L296'>296</a>
-<a name='L297'></a><a href='#L297'>297</a>
-<a name='L298'></a><a href='#L298'>298</a>
-<a name='L299'></a><a href='#L299'>299</a>
-<a name='L300'></a><a href='#L300'>300</a>
-<a name='L301'></a><a href='#L301'>301</a>
-<a name='L302'></a><a href='#L302'>302</a>
-<a name='L303'></a><a href='#L303'>303</a>
-<a name='L304'></a><a href='#L304'>304</a>
-<a name='L305'></a><a href='#L305'>305</a>
-<a name='L306'></a><a href='#L306'>306</a>
-<a name='L307'></a><a href='#L307'>307</a>
-<a name='L308'></a><a href='#L308'>308</a>
-<a name='L309'></a><a href='#L309'>309</a>
-<a name='L310'></a><a href='#L310'>310</a>
-<a name='L311'></a><a href='#L311'>311</a>
-<a name='L312'></a><a href='#L312'>312</a>
-<a name='L313'></a><a href='#L313'>313</a>
-<a name='L314'></a><a href='#L314'>314</a>
-<a name='L315'></a><a href='#L315'>315</a>
-<a name='L316'></a><a href='#L316'>316</a>
-<a name='L317'></a><a href='#L317'>317</a>
-<a name='L318'></a><a href='#L318'>318</a>
-<a name='L319'></a><a href='#L319'>319</a>
-<a name='L320'></a><a href='#L320'>320</a>
-<a name='L321'></a><a href='#L321'>321</a>
-<a name='L322'></a><a href='#L322'>322</a>
-<a name='L323'></a><a href='#L323'>323</a>
-<a name='L324'></a><a href='#L324'>324</a>
-<a name='L325'></a><a href='#L325'>325</a>
-<a name='L326'></a><a href='#L326'>326</a>
-<a name='L327'></a><a href='#L327'>327</a>
-<a name='L328'></a><a href='#L328'>328</a>
-<a name='L329'></a><a href='#L329'>329</a>
-<a name='L330'></a><a href='#L330'>330</a>
-<a name='L331'></a><a href='#L331'>331</a>
-<a name='L332'></a><a href='#L332'>332</a>
-<a name='L333'></a><a href='#L333'>333</a>
-<a name='L334'></a><a href='#L334'>334</a>
-<a name='L335'></a><a href='#L335'>335</a>
-<a name='L336'></a><a href='#L336'>336</a>
-<a name='L337'></a><a href='#L337'>337</a>
-<a name='L338'></a><a href='#L338'>338</a>
-<a name='L339'></a><a href='#L339'>339</a>
-<a name='L340'></a><a href='#L340'>340</a>
-<a name='L341'></a><a href='#L341'>341</a>
-<a name='L342'></a><a href='#L342'>342</a>
-<a name='L343'></a><a href='#L343'>343</a>
-<a name='L344'></a><a href='#L344'>344</a>
-<a name='L345'></a><a href='#L345'>345</a>
-<a name='L346'></a><a href='#L346'>346</a>
-<a name='L347'></a><a href='#L347'>347</a>
-<a name='L348'></a><a href='#L348'>348</a>
-<a name='L349'></a><a href='#L349'>349</a>
-<a name='L350'></a><a href='#L350'>350</a>
-<a name='L351'></a><a href='#L351'>351</a>
-<a name='L352'></a><a href='#L352'>352</a>
-<a name='L353'></a><a href='#L353'>353</a>
-<a name='L354'></a><a href='#L354'>354</a>
-<a name='L355'></a><a href='#L355'>355</a>
-<a name='L356'></a><a href='#L356'>356</a>
-<a name='L357'></a><a href='#L357'>357</a>
-<a name='L358'></a><a href='#L358'>358</a>
-<a name='L359'></a><a href='#L359'>359</a>
-<a name='L360'></a><a href='#L360'>360</a>
-<a name='L361'></a><a href='#L361'>361</a>
-<a name='L362'></a><a href='#L362'>362</a>
-<a name='L363'></a><a href='#L363'>363</a>
-<a name='L364'></a><a href='#L364'>364</a>
-<a name='L365'></a><a href='#L365'>365</a>
-<a name='L366'></a><a href='#L366'>366</a>
-<a name='L367'></a><a href='#L367'>367</a>
-<a name='L368'></a><a href='#L368'>368</a>
-<a name='L369'></a><a href='#L369'>369</a>
-<a name='L370'></a><a href='#L370'>370</a>
-<a name='L371'></a><a href='#L371'>371</a>
-<a name='L372'></a><a href='#L372'>372</a>
-<a name='L373'></a><a href='#L373'>373</a>
-<a name='L374'></a><a href='#L374'>374</a>
-<a name='L375'></a><a href='#L375'>375</a>
-<a name='L376'></a><a href='#L376'>376</a>
-<a name='L377'></a><a href='#L377'>377</a>
-<a name='L378'></a><a href='#L378'>378</a>
-<a name='L379'></a><a href='#L379'>379</a>
-<a name='L380'></a><a href='#L380'>380</a>
-<a name='L381'></a><a href='#L381'>381</a>
-<a name='L382'></a><a href='#L382'>382</a>
-<a name='L383'></a><a href='#L383'>383</a>
-<a name='L384'></a><a href='#L384'>384</a>
-<a name='L385'></a><a href='#L385'>385</a>
-<a name='L386'></a><a href='#L386'>386</a>
-<a name='L387'></a><a href='#L387'>387</a>
-<a name='L388'></a><a href='#L388'>388</a>
-<a name='L389'></a><a href='#L389'>389</a>
-<a name='L390'></a><a href='#L390'>390</a>
-<a name='L391'></a><a href='#L391'>391</a>
-<a name='L392'></a><a href='#L392'>392</a>
-<a name='L393'></a><a href='#L393'>393</a>
-<a name='L394'></a><a href='#L394'>394</a>
-<a name='L395'></a><a href='#L395'>395</a>
-<a name='L396'></a><a href='#L396'>396</a>
-<a name='L397'></a><a href='#L397'>397</a>
-<a name='L398'></a><a href='#L398'>398</a>
-<a name='L399'></a><a href='#L399'>399</a>
-<a name='L400'></a><a href='#L400'>400</a>
-<a name='L401'></a><a href='#L401'>401</a>
-<a name='L402'></a><a href='#L402'>402</a>
-<a name='L403'></a><a href='#L403'>403</a>
-<a name='L404'></a><a href='#L404'>404</a>
-<a name='L405'></a><a href='#L405'>405</a>
-<a name='L406'></a><a href='#L406'>406</a>
-<a name='L407'></a><a href='#L407'>407</a>
-<a name='L408'></a><a href='#L408'>408</a>
-<a name='L409'></a><a href='#L409'>409</a>
-<a name='L410'></a><a href='#L410'>410</a>
-<a name='L411'></a><a href='#L411'>411</a>
-<a name='L412'></a><a href='#L412'>412</a>
-<a name='L413'></a><a href='#L413'>413</a>
-<a name='L414'></a><a href='#L414'>414</a>
-<a name='L415'></a><a href='#L415'>415</a>
-<a name='L416'></a><a href='#L416'>416</a>
-<a name='L417'></a><a href='#L417'>417</a>
-<a name='L418'></a><a href='#L418'>418</a>
-<a name='L419'></a><a href='#L419'>419</a>
-<a name='L420'></a><a href='#L420'>420</a>
-<a name='L421'></a><a href='#L421'>421</a>
-<a name='L422'></a><a href='#L422'>422</a>
-<a name='L423'></a><a href='#L423'>423</a>
-<a name='L424'></a><a href='#L424'>424</a>
-<a name='L425'></a><a href='#L425'>425</a>
-<a name='L426'></a><a href='#L426'>426</a>
-<a name='L427'></a><a href='#L427'>427</a>
-<a name='L428'></a><a href='#L428'>428</a>
-<a name='L429'></a><a href='#L429'>429</a>
-<a name='L430'></a><a href='#L430'>430</a>
-<a name='L431'></a><a href='#L431'>431</a>
-<a name='L432'></a><a href='#L432'>432</a>
-<a name='L433'></a><a href='#L433'>433</a>
-<a name='L434'></a><a href='#L434'>434</a>
-<a name='L435'></a><a href='#L435'>435</a>
-<a name='L436'></a><a href='#L436'>436</a>
-<a name='L437'></a><a href='#L437'>437</a>
-<a name='L438'></a><a href='#L438'>438</a>
-<a name='L439'></a><a href='#L439'>439</a>
-<a name='L440'></a><a href='#L440'>440</a>
-<a name='L441'></a><a href='#L441'>441</a>
-<a name='L442'></a><a href='#L442'>442</a>
-<a name='L443'></a><a href='#L443'>443</a>
-<a name='L444'></a><a href='#L444'>444</a>
-<a name='L445'></a><a href='#L445'>445</a>
-<a name='L446'></a><a href='#L446'>446</a>
-<a name='L447'></a><a href='#L447'>447</a>
-<a name='L448'></a><a href='#L448'>448</a>
-<a name='L449'></a><a href='#L449'>449</a>
-<a name='L450'></a><a href='#L450'>450</a>
-<a name='L451'></a><a href='#L451'>451</a>
-<a name='L452'></a><a href='#L452'>452</a>
-<a name='L453'></a><a href='#L453'>453</a>
-<a name='L454'></a><a href='#L454'>454</a>
-<a name='L455'></a><a href='#L455'>455</a>
-<a name='L456'></a><a href='#L456'>456</a>
-<a name='L457'></a><a href='#L457'>457</a>
-<a name='L458'></a><a href='#L458'>458</a>
-<a name='L459'></a><a href='#L459'>459</a>
-<a name='L460'></a><a href='#L460'>460</a>
-<a name='L461'></a><a href='#L461'>461</a>
-<a name='L462'></a><a href='#L462'>462</a>
-<a name='L463'></a><a href='#L463'>463</a>
-<a name='L464'></a><a href='#L464'>464</a>
-<a name='L465'></a><a href='#L465'>465</a>
-<a name='L466'></a><a href='#L466'>466</a>
-<a name='L467'></a><a href='#L467'>467</a>
-<a name='L468'></a><a href='#L468'>468</a>
-<a name='L469'></a><a href='#L469'>469</a>
-<a name='L470'></a><a href='#L470'>470</a>
-<a name='L471'></a><a href='#L471'>471</a>
-<a name='L472'></a><a href='#L472'>472</a>
-<a name='L473'></a><a href='#L473'>473</a>
-<a name='L474'></a><a href='#L474'>474</a>
-<a name='L475'></a><a href='#L475'>475</a>
-<a name='L476'></a><a href='#L476'>476</a>
-<a name='L477'></a><a href='#L477'>477</a>
-<a name='L478'></a><a href='#L478'>478</a>
-<a name='L479'></a><a href='#L479'>479</a>
-<a name='L480'></a><a href='#L480'>480</a>
-<a name='L481'></a><a href='#L481'>481</a>
-<a name='L482'></a><a href='#L482'>482</a>
-<a name='L483'></a><a href='#L483'>483</a>
-<a name='L484'></a><a href='#L484'>484</a>
-<a name='L485'></a><a href='#L485'>485</a>
-<a name='L486'></a><a href='#L486'>486</a>
-<a name='L487'></a><a href='#L487'>487</a>
-<a name='L488'></a><a href='#L488'>488</a>
-<a name='L489'></a><a href='#L489'>489</a>
-<a name='L490'></a><a href='#L490'>490</a>
-<a name='L491'></a><a href='#L491'>491</a>
-<a name='L492'></a><a href='#L492'>492</a>
-<a name='L493'></a><a href='#L493'>493</a>
-<a name='L494'></a><a href='#L494'>494</a>
-<a name='L495'></a><a href='#L495'>495</a>
-<a name='L496'></a><a href='#L496'>496</a>
-<a name='L497'></a><a href='#L497'>497</a>
-<a name='L498'></a><a href='#L498'>498</a>
-<a name='L499'></a><a href='#L499'>499</a>
-<a name='L500'></a><a href='#L500'>500</a>
-<a name='L501'></a><a href='#L501'>501</a>
-<a name='L502'></a><a href='#L502'>502</a>
-<a name='L503'></a><a href='#L503'>503</a>
-<a name='L504'></a><a href='#L504'>504</a>
-<a name='L505'></a><a href='#L505'>505</a>
-<a name='L506'></a><a href='#L506'>506</a>
-<a name='L507'></a><a href='#L507'>507</a>
-<a name='L508'></a><a href='#L508'>508</a>
-<a name='L509'></a><a href='#L509'>509</a>
-<a name='L510'></a><a href='#L510'>510</a>
-<a name='L511'></a><a href='#L511'>511</a>
-<a name='L512'></a><a href='#L512'>512</a>
-<a name='L513'></a><a href='#L513'>513</a>
-<a name='L514'></a><a href='#L514'>514</a>
-<a name='L515'></a><a href='#L515'>515</a>
-<a name='L516'></a><a href='#L516'>516</a>
-<a name='L517'></a><a href='#L517'>517</a>
-<a name='L518'></a><a href='#L518'>518</a>
-<a name='L519'></a><a href='#L519'>519</a>
-<a name='L520'></a><a href='#L520'>520</a>
-<a name='L521'></a><a href='#L521'>521</a>
-<a name='L522'></a><a href='#L522'>522</a>
-<a name='L523'></a><a href='#L523'>523</a>
-<a name='L524'></a><a href='#L524'>524</a>
-<a name='L525'></a><a href='#L525'>525</a>
-<a name='L526'></a><a href='#L526'>526</a>
-<a name='L527'></a><a href='#L527'>527</a>
-<a name='L528'></a><a href='#L528'>528</a>
-<a name='L529'></a><a href='#L529'>529</a>
-<a name='L530'></a><a href='#L530'>530</a>
-<a name='L531'></a><a href='#L531'>531</a>
-<a name='L532'></a><a href='#L532'>532</a>
-<a name='L533'></a><a href='#L533'>533</a>
-<a name='L534'></a><a href='#L534'>534</a>
-<a name='L535'></a><a href='#L535'>535</a>
-<a name='L536'></a><a href='#L536'>536</a>
-<a name='L537'></a><a href='#L537'>537</a>
-<a name='L538'></a><a href='#L538'>538</a>
-<a name='L539'></a><a href='#L539'>539</a>
-<a name='L540'></a><a href='#L540'>540</a>
-<a name='L541'></a><a href='#L541'>541</a>
-<a name='L542'></a><a href='#L542'>542</a>
-<a name='L543'></a><a href='#L543'>543</a>
-<a name='L544'></a><a href='#L544'>544</a>
-<a name='L545'></a><a href='#L545'>545</a>
-<a name='L546'></a><a href='#L546'>546</a>
-<a name='L547'></a><a href='#L547'>547</a>
-<a name='L548'></a><a href='#L548'>548</a>
-<a name='L549'></a><a href='#L549'>549</a>
-<a name='L550'></a><a href='#L550'>550</a>
-<a name='L551'></a><a href='#L551'>551</a>
-<a name='L552'></a><a href='#L552'>552</a>
-<a name='L553'></a><a href='#L553'>553</a>
-<a name='L554'></a><a href='#L554'>554</a>
-<a name='L555'></a><a href='#L555'>555</a>
-<a name='L556'></a><a href='#L556'>556</a>
-<a name='L557'></a><a href='#L557'>557</a>
-<a name='L558'></a><a href='#L558'>558</a>
-<a name='L559'></a><a href='#L559'>559</a>
-<a name='L560'></a><a href='#L560'>560</a>
-<a name='L561'></a><a href='#L561'>561</a>
-<a name='L562'></a><a href='#L562'>562</a>
-<a name='L563'></a><a href='#L563'>563</a>
-<a name='L564'></a><a href='#L564'>564</a>
-<a name='L565'></a><a href='#L565'>565</a>
-<a name='L566'></a><a href='#L566'>566</a>
-<a name='L567'></a><a href='#L567'>567</a>
-<a name='L568'></a><a href='#L568'>568</a>
-<a name='L569'></a><a href='#L569'>569</a>
-<a name='L570'></a><a href='#L570'>570</a>
-<a name='L571'></a><a href='#L571'>571</a>
-<a name='L572'></a><a href='#L572'>572</a>
-<a name='L573'></a><a href='#L573'>573</a>
-<a name='L574'></a><a href='#L574'>574</a>
-<a name='L575'></a><a href='#L575'>575</a>
-<a name='L576'></a><a href='#L576'>576</a>
-<a name='L577'></a><a href='#L577'>577</a>
-<a name='L578'></a><a href='#L578'>578</a>
-<a name='L579'></a><a href='#L579'>579</a>
-<a name='L580'></a><a href='#L580'>580</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">5x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">5x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">9x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">5x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type import
-import { Node } from '@metabohub/viz-core/src/types/Node';
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Link } from '@metabohub/viz-core/src/types/Link';
-import { GraphStyleProperties } from '@metabohub/viz-core/src/types/GraphStyleProperties';
-import { Coordinate, Size } from '../types/CoordinatesSize';
-&nbsp;
-&nbsp;
-// Composable imports
-import { getSizeNodePixel } from './CalculateSize';
-&nbsp;
-// General imports
-import { checkIntersection } from 'line-intersect';
-&nbsp;
-/**
- * This file contains the functions to count the number of intersections in a network and the number of overlapping nodes and edges.
- * 
- * *********************************
- * 
- * 0. Edge intersection
- * 
- * -&gt; isIntersectionGraph : 
- *      check if there is any intersection between edges in the network
- * 
- * -&gt; edgesIntersection :
- *     check if there is any intersection between edges
- * 
- * -&gt; commonEndBetween2Edges :
- *      check if there is a common end between two edges
- * 
- * -&gt; sameCoordinates :
- *      check if two nodes have the same coordinates
- * 
- * *********************************
- * 
- * 1. Nodes overlap
- * 
- * -&gt; isOverlapNodes :
- *      check if there is any overlap between nodes in the network
- * 
- * -&gt; nodeOverlap :
- *      check if two nodes overlap
- * 
- * *********************************
- * 
- * 2. Node Edge overlap
- * 
- * -&gt; isOverlapNodesEdges :
- *      check if there is any overlap between nodes and edges in the network
- * 
- * -&gt; nodeEdgeOverlap :
- *      check if a node overlaps with an edge
- * 
- * -&gt; isPointInsideRect :
- *      check if a point is inside a rectangle
- * 
- */
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//_________________________________________________________0.  Edge intersection ________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Determines if a given graph has any intersecting edges.
- *
- * @param nodes - An object where keys are node identifiers and values are coordinates of the center of the nodes.
- * @param links - An array of link objects, each containing a source and target node identifier.
- * @returns A boolean indicating whether any edges in the graph intersect.
- */
-export function isIntersectionGraph(nodes: {[key:string]:Coordinate},links:{source:string,target:string}[]): boolean {
-    for (let i=0 ; i&lt;links.length ; i++) {
-        for (let j=i+1 ; j&lt;links.length ; j++) {
-            const link1=links[i];
-            const link2=links[j];
-             // check if intersection
-             let node1Link1=nodes[link1.source];
-             let node2Link1=nodes[link1.target];
-             let node1Link2=nodes[link2.source];
-             let node2Link2=nodes[link2.target];
-            if (edgesIntersection(node1Link1,node2Link1,node1Link2,node2Link2)){
-                return true;
-            }
-        }
-    }
-    return false;
-}
-&nbsp;
-&nbsp;
-/**
- * Determines if two edges intersect. If the edges share a common end, they are not considered to intersect.
- *
- * @param node1Link1 - The coordinates of the first point of the first edge.
- * @param node2Link1 - The coordinates of the second point of the first edge.
- * @param node1Link2 - The coordinates of the first point of the second edge.
- * @param node2Link2 - The coordinates of the second point of the second edge.
- * @returns `true` if the edges intersect, otherwise `false`.
- */
-function edgesIntersection(node1Link1:{x:number,y:number},node2Link1:{x:number,y:number},node1Link2:{x:number,y:number},node2Link2:{x:number,y:number}): boolean {
-    // case node in common
-    if (commonEndBetween2Edges(node1Link1,node2Link1,node1Link2,node2Link2)) {
-        return false;
-    }
-    const result = checkIntersection(node1Link1.x, node1Link1.y, node2Link1.x, node2Link1.y, node1Link2.x, node1Link2.y, node2Link2.x, node2Link2.y);
-    if (result.type == "intersecting") {
-        return true;
-    }else{
-        return false;
-    }
-}
-&nbsp;
-/**
- * Determines if there is a common end (same end coordinates) between two edges.
- *
- * @param node1Link1 - The coordinates of the first node of the first edge.
- * @param node2Link1 - The coordinates of the second node of the first edge.
- * @param node1Link2 - The coordinates of the first node of the second edge.
- * @param node2Link2 - The coordinates of the second node of the second edge.
- * @returns `true` if there is a common node between the two edges, otherwise `false`.
- */
-function commonEndBetween2Edges(node1Link1:{x:number,y:number},node2Link1:{x:number,y:number},node1Link2:{x:number,y:number},node2Link2:{x:number,y:number}): boolean {
-    if (sameCoordinates(node1Link1,node1Link2) || sameCoordinates(node1Link1,node2Link2) || sameCoordinates(node2Link1,node1Link2) || sameCoordinates(node2Link1,node2Link2)) {
-        return true;
-    }else {
-        return false;
-    }
-}
-&nbsp;
-/**
- * Determines if two nodes have the same coordinates.
- *
- * @param node1 - The first node with x and y coordinates.
- * @param node2 - The second node with x and y coordinates.
- * @returns `true` if both nodes have the same x and y coordinates, otherwise `false`.
- */
-function sameCoordinates(node1: {x:number,y:number},node2: {x:number,y:number}): boolean {
-    <span class="missing-if-branch" title="if path not taken" >I</span>if (!node1 || !node2 ||  node1.x==null ||  node1.y==null  || node2.x==null || node2.y==null) {
-<span class="cstat-no" title="statement not covered" >        return false;</span>
-    }
-    return node1.x===node2.x &amp;&amp; node1.y===node2.y;
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//____________________________________________________________1. Nodes overlap __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Checks if any nodes in the given network overlap based on their positions and sizes.
- *
- * @param nodesPosition - An object where keys are node IDs and values are their coordinates.
- * @param network - The network containing nodes and their properties.
- * @param networkStyle - The style properties of the graph, used to determine node sizes.
- * @returns `true` if any nodes overlap, otherwise `false`.
- */
-export function isOverlapNodes(nodesPosition: {[key:string]:Coordinate},network:Network,networkStyle:GraphStyleProperties):boolean{
-    const nodesID=Object.keys(nodesPosition);
-    for (let i=0 ; i&lt;nodesID.length ; i++) {
-        for (let j=i+1 ; j&lt;nodesID.length ; j++) {
-            // info about node1
-            const node1=network.nodes[nodesID[i]];
-            const posNode1=nodesPosition[nodesID[i]];
-            const sizeNode1=getSizeNodePixel(node1,networkStyle);
-            // info about node2
-            const node2=network.nodes[nodesID[j]];
-            const posNode2=nodesPosition[nodesID[j]];
-            const sizeNode2=getSizeNodePixel(node2,networkStyle);
-&nbsp;
-            if (nodeOverlap(posNode1,sizeNode1,posNode2,sizeNode2)){
-                return true;
-            }
-&nbsp;
-        }
-    }
-    return false;
-}
-&nbsp;
-/**
- * Determines if two nodes overlap based on their coordinates and sizes.
- *
- * @param coord1 - The coordinates of the first node.
- * @param size1 - The size (width and height) of the first node.
- * @param coord2 - The coordinates of the second node.
- * @param size2 - The size (width and height) of the second node.
- * @returns `true` if the nodes overlap, `false` otherwise.
- *
- * @remarks
- * This function checks if the bounding rectangles of two nodes overlap.
- * It handles cases where any of the input parameters are null or undefined by returning `false`.
- *
- */
-function nodeOverlap(coord1: Coordinate, size1: Size, coord2: Coordinate, size2: Size): boolean {
-    if ( !coord1 || !size1 || !coord2 || !size2 || size1.width == null || size1.height == null || size2.width == null
-        || size2.height == null || coord1.x == null || coord1.y == null || coord2.x == null || coord2.y == null ||
-        size1.width == undefined || size1.height == undefined || size2.width == undefined || size2.height == undefined ||
-        coord1.x == undefined || coord1.y == undefined || coord2.x == undefined || coord2.y == undefined) {
-        // Handle null or undefined inputs appropriately
-        return false;
-    }
-&nbsp;
-    // rectangle 1
-    const left1 = coord1.x - size1.width / 2;
-    const right1 = coord1.x + size1.width / 2;
-    const top1 = coord1.y - size1.height / 2;
-    const bottom1 = coord1.y + size1.height / 2;
-&nbsp;
-    // rectangle 2
-    const left2 = coord2.x - size2.width / 2;
-    const right2 = coord2.x + size2.width / 2;
-    const top2 = coord2.y - size2.height / 2;
-    const bottom2 = coord2.y + size2.height / 2;
-&nbsp;
-    // overlap?
-    const overlapX = left1 &lt; right2 &amp;&amp; right1 &gt; left2;
-    const overlapY = top1 &lt; bottom2 &amp;&amp; bottom1 &gt; top2;
-&nbsp;
-    return overlapX &amp;&amp; overlapY;
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//________________________________________________________2.  Node Edge overlap ________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Checks if any node overlaps with any edge in the network.
- *
- * @param nodesPosition - An object where keys are node IDs and values are objects containing x and y coordinates of the nodes.
- * @param links - An array of link objects, each containing a source and target node ID.
- * @param network - The network object containing nodes and their properties.
- * @param networkStyle - The style properties of the graph.
- * @returns A boolean indicating whether any node overlaps with any edge.
- */
-export function isOverlapNodesEdges(nodesPosition: {[key:string]:{x:number,y:number}},links:{source:string,target:string}[],network:Network,networkStyle:GraphStyleProperties):boolean{
-    const nodesID=Object.keys(nodesPosition);
-    for (let i=0 ; i&lt;nodesID.length ; i++) {
-        // info about node
-        const node=network.nodes[nodesID[i]];
-        const posNode=nodesPosition[nodesID[i]];
-        const sizeNode=getSizeNodePixel(node,networkStyle);
-&nbsp;
-        for (let j=0 ; j&lt;links.length ; j++) {        
-            // info about link
-            const link=links[j];
-            // if node is linked to the edge : continue
-            if(link.source==nodesID[i] || link.target==nodesID[i]){
-                continue;
-            }else{
-                let posLink1=nodesPosition[link.source];
-                let posLink2=nodesPosition[link.target];
-                if (nodeEdgeOverlap(posNode,sizeNode,posLink1,posLink2)){
-                    return true;
-                }
-            }
-&nbsp;
-        }
-    }
-    return false;
-}
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Determines if a node, represented as a rectangle, overlaps with an edge defined by two points.
- *
- * @param centerCoordNode - The center coordinates of the node.
- * @param sizeNode - The size of the node, including width and height.
- * @param posLink1 - The first endpoint of the edge.
- * @param posLink2 - The second endpoint of the edge.
- * @returns `true` if the node overlaps with the edge, `false` otherwise.
- */
-function nodeEdgeOverlap(centerCoordNode: Coordinate, sizeNode:Size, posLink1: Coordinate, posLink2: Coordinate): boolean {
-    
-    // Treat the node as a rectangle 
-    const rect = {
-        left: centerCoordNode.x - sizeNode.width / 2,
-        right: centerCoordNode.x + sizeNode.width / 2,
-        top: centerCoordNode.y - sizeNode.height / 2,
-        bottom: centerCoordNode.y + sizeNode.height / 2
-    };
-&nbsp;
-    // Check if any of the edge's endpoints is inside the rectangle
-    if (isPointInsideRect(posLink1,rect) || isPointInsideRect(posLink2,rect)) {
-        return true; // One of the endpoints is inside the rectangle
-    }
-&nbsp;
-   // Check for overlap between the edge and the sides of the rectangle
-    // Convert the sides of the rectangle into line segments
-    const edges = [
-        { start: { x: rect.left, y: rect.top }, end: { x: rect.right, y: rect.top } }, // Top
-        { start: { x: rect.right, y: rect.top }, end: { x: rect.right, y: rect.bottom } }, // Right
-        { start: { x: rect.left, y: rect.bottom }, end: { x: rect.right, y: rect.bottom } }, // Bottom
-        { start: { x: rect.left, y: rect.top }, end: { x: rect.left, y: rect.bottom } } // Left
-    ];
-&nbsp;
-    // Use checkIntersection function to check if two line segments intersect
-    for (const edge of edges) {
-        const result = checkIntersection(edge.start.x,edge.start.y, edge.end.x,edge.end.y, posLink1.x, posLink1.y,posLink2.x,posLink2.y);
-        if (result.type == "intersecting") {
-            return true; // There is an overlap
-        }
-    }
-&nbsp;
-    return false; // No overlap detected
-}
-&nbsp;
-&nbsp;
-/**
- * Determines if a given point is inside a specified rectangle.
- *
- * @param point - The coordinate of the point to check.
- * @param rectangle - The boundaries of the rectangle, defined by its left, right, top, and bottom edges.
- * @returns `true` if the point is inside the rectangle, `false` otherwise.
- */
-function isPointInsideRect(point: Coordinate, rectangle:{left:number,right:number,top:number,bottom:number}):boolean{ 
-    return point.x &gt;= rectangle.left &amp;&amp; point.x &lt;= rectangle.right &amp;&amp; point.y &gt;= rectangle.top &amp;&amp; point.y &lt;= rectangle.bottom;
-}
-&nbsp;
-&nbsp;
-&nbsp;
-// CHNAGE THE CODE : SEE METRICSNETWORK (for end of internship : keep this one)
-&nbsp;
-// /**
-//  * Check if the coordinates (x, y) are the same as the node's coordinates
-//  * @param node the node
-//  * @param x coordinate
-//  * @param y coordinate
-//  * @returns a boolean
-//  */
-// function isNodeCoord(node: {x:number,y:number}, x: number, y: number): boolean {
-//     return (node.x == x &amp;&amp; node.y == y);
-// }
-&nbsp;
-&nbsp;
-&nbsp;
-//______________________Intersection in the network______________________
-/**
- * Check if the 2 edges are crossing. 
- * Coming from the same node or going to the same node doesn't count as crossing.
- * @param link1 an edge
- * @param link2 an edge
- * @returns a boolean
- */
-// function edgesIntersectionLink(link1: Link, link2: Link,style:GraphStyleProperties): boolean {
-&nbsp;
-//     // case of common node
-//     if (commonNodeBetween2Links(link1,link2)) {
-//         return false;
-//     }
-&nbsp;
-//     let x1: Node = link1.source;
-//     const x1Center=AdjustCoordNodeToCenter(x1,style);
-//     let x2: Node = link1.target;
-//     const x2Center=AdjustCoordNodeToCenter(x2,style);
-//     let x3: Node = link2.source;
-//     const x3Center=AdjustCoordNodeToCenter(x3,style);
-//     let x4: Node = link2.target;
-//     const x4Center=AdjustCoordNodeToCenter(x4,style);
-&nbsp;
-//     const result = checkIntersection(x1Center.x, x1Center.y, x2Center.x, x2Center.y, x3Center.x, x3Center.y, x4Center.x, x4Center.y);
-//     if (result.type == "intersecting") {
-//         return true;
-//     } else {
-//         return false;
-//     }
-    
-// }
-&nbsp;
-// function commonNodeBetween2Links(link1: Link,link2: Link): boolean {
-//     if (link1.source==link2.source || link1.source==link2.target || link1.target==link2.source || link1.target==link2.target) {
-//         return true;
-//     }else {
-//         return false;
-//     }
-// } 
-&nbsp;
-// function sameAngleBetween2ConnectedLinks(link1: Link,link2: Link,style:GraphStyleProperties): boolean {
-&nbsp;
-//     // get nodes information
-//     let commonNode: Node;
-//     let node1: Node; // node from link 1 that is not in link 2
-//     let node2: Node; // node from link 2 that is not in link 1
-&nbsp;
-//     // if link 1 source is the common node :
-//     if (link1.source==link2.source || link1.source==link2.target){
-//         commonNode=link1.source;
-//         node1=link1.target;
-//     // if link 1 target is the common node :
-//     }else if (link1.target==link2.source || link1.target==link2.target){
-//         commonNode=link1.target;
-//         node1=link1.source;
-//     }
-//     // get node 2
-//     if (link2.source==commonNode){
-//         node2=link2.target;
-//     }else{
-//         node2=link2.source;
-//     }
-&nbsp;
-//     // adjust coord
-//     const commonNodeCenter=AdjustCoordNodeToCenter(commonNode,style);
-//     const node1Center=AdjustCoordNodeToCenter(node1,style);
-//     const node2Center=AdjustCoordNodeToCenter(node2,style);
-//     // get angle between the 2 edges
-//     const angle1=adjustAngle(Math.atan2(node1Center.y-commonNodeCenter.y,node1Center.x-commonNodeCenter.x));
-//     const angle2=adjustAngle(Math.atan2(node2Center.y-commonNodeCenter.y,node2Center.x-commonNodeCenter.x));    
-    
-//     // same angles ?
-//     return angle1==angle2;
-&nbsp;
-// }
-&nbsp;
-// function adjustAngle(angle: number): number {
-//     return (angle + 2 * Math.PI) % (2 * Math.PI);
-// }
-&nbsp;
-// function AdjustCoordNodeToCenter(node:Node,style:GraphStyleProperties):{x:number,y:number}{
-//     const size = getSizeNodePixel(node,style);
-//     return {x:node.x-size.width/2,y:node.y-size.height/2}
-// }
-&nbsp;
-// /**
-//  * Counts how many crossings are in a network
-//  * @param network the network
-//  * @returns the number of crossings
-//  */
-// export function countIntersection(network: Network,style:GraphStyleProperties): number {
-//     let nb: number = 0;
-//     for (let i=0 ; i&lt;network.links.length ; i++) {
-//         for (let j=i+1 ; j&lt;network.links.length ; j++) {
-//             const link1=network.links[i];
-//             const link2=network.links[j];
-//             if (edgesIntersectionLink(link1, link2,style)){
-//                 nb++;
-//             }
-//         }
-//     }
-//     return nb;
-// }
-&nbsp;
-&nbsp;
-//______________________Intersection in another format of graph______________________
-&nbsp;
-////CLEAN CODE : CHANGE FORMAT TO NETWORK AND USE THE OTHER FUNCTIONS FOR CYCLE
-&nbsp;
-// function AdjustCoordNodeToCenter2(node:Node,nodeCoord:{x:number,y:number},style:GraphStyleProperties):{x:number,y:number}{
-//     const size = getSizeNodePixel(node,style);
-//     return {x:nodeCoord.x-size.width/2,y:nodeCoord.y-size.height/2}
-// }
-&nbsp;
-&nbsp;
-&nbsp;
-// function commonNodeBetween2EdgesID(link1: {source:string,target:string},link2: {source:string,target:string}): boolean {
-//     if (link1.source==link2.source || link1.source==link2.target || link1.target==link2.source || link1.target==link2.target) {
-//         return true;
-//     }else {
-//         return false;
-//     }
-// }
-&nbsp;
-&nbsp;
-&nbsp;
-// function intersection2ConnectedLinks(node1Link1:{x:number,y:number},node2Link1:{x:number,y:number},node1Link2:{x:number,y:number},node2Link2:{x:number,y:number}): boolean {
-&nbsp;
-//     // get nodes information
-//     let commonNode: {x:number,y:number};
-//     let node1: {x:number,y:number}; // node from link 1 that is not in link 2
-//     let node2: {x:number,y:number}; // node from link 2 that is not in link 1
-&nbsp;
-//     // if link 1 node 1 is the common node :
-//     if (sameNode(node1Link1,node1Link2) || sameNode(node1Link1,node2Link2)){
-//         commonNode=node1Link1;
-//         node1=node2Link1;
-//     // if link 1 node 2 is the common node :
-//     }else if (sameNode(node2Link1,node1Link2) || sameNode(node2Link1,node2Link2)){
-//         commonNode=node2Link1;
-//         node1=node1Link1;
-//     }
-//     // get node 2
-//     if (sameNode(node1Link2,commonNode)){
-//         node2=node2Link2;
-//     }else{
-//         node2=node1Link2;
-//     }
-&nbsp;
-//     // get angle between the 2 edges
-//     const angle1=adjustAngle(Math.atan2(node1.y-commonNode.y,node1.x-commonNode.x));
-//     const angle2=adjustAngle(Math.atan2(node2.y-commonNode.y,node2.x-commonNode.x));
-    
-//     // same angles ?
-//     return angle1==angle2;
-&nbsp;
-// }
-&nbsp;
-// export function countIntersectionGraph(nodes: {[key:string]:{x:number,y:number}},links:{source:string,target:string}[],network:Network,style:GraphStyleProperties): number {
-//     let nb: number = 0;
-//     for (let i=0 ; i&lt;links.length ; i++) {
-//         for (let j=i+1 ; j&lt;links.length ; j++) {
-//             const link1=links[i];
-//             const link2=links[j];
-//             // check if intersection
-//             let node1Link1=nodes[link1.source];
-//             //node1Link1=AdjustCoordNodeToCenter2(network.nodes[link1.source],node1Link1,style);
-//             let node2Link1=nodes[link1.target];
-//             //node2Link1=AdjustCoordNodeToCenter2(network.nodes[link1.target],node2Link1,style);
-//             let node1Link2=nodes[link2.source];
-//             //node1Link2=AdjustCoordNodeToCenter2(network.nodes[link2.source],node1Link2,style);
-//             let node2Link2=nodes[link2.target];
-//             //node2Link2=AdjustCoordNodeToCenter2(network.nodes[link2.target],node2Link2,style);
-//             if (edgesIntersection(node1Link1,node2Link1,node1Link2,node2Link2)){
-//                 nb++;
-//             }
-//         }
-//     }
-//     return nb;
-// }
-&nbsp;
-//______________________Nodes overlap for graph______________________
-&nbsp;
-// export function countOverlapNodes(nodesPosition: {[key:string]:Coordinate},network:Network,networkStyle:GraphStyleProperties):number{
-//     let nb=0;
-//     const nodesID=Object.keys(nodesPosition);
-//     for (let i=0 ; i&lt;nodesID.length ; i++) {
-//         for (let j=i+1 ; j&lt;nodesID.length ; j++) {
-//             // info about node1
-//             const node1=network.nodes[nodesID[i]];
-//             const posNode1=nodesPosition[nodesID[i]];
-//             const sizeNode1=getSizeNodePixel(node1,networkStyle);
-//             // info about node2
-//             const node2=network.nodes[nodesID[j]];
-//             const posNode2=nodesPosition[nodesID[j]];
-//             const sizeNode2=getSizeNodePixel(node2,networkStyle);
-&nbsp;
-//             if (nodeOverlap(posNode1,sizeNode1,posNode2,sizeNode2)){
-//                 nb+=1;
-//             }
-&nbsp;
-//         }
-//     }
-//     return nb;
-// }
-&nbsp;
-//______________________Nodes overlap with edges for graph______________________
-&nbsp;
-// export function countOverlapNodesEdges(nodesPosition: {[key:string]:{x:number,y:number}},links:{source:string,target:string}[],network:Network,networkStyle:GraphStyleProperties):number{
-//     let nb=0;
-//     const nodesID=Object.keys(nodesPosition);
-//     for (let i=0 ; i&lt;nodesID.length ; i++) {
-//         // info about node
-//         const node=network.nodes[nodesID[i]];
-//         const posNode=nodesPosition[nodesID[i]];
-//         const sizeNode=getSizeNodePixel(node,networkStyle);
-&nbsp;
-//         for (let j=0 ; j&lt;links.length ; j++) {        
-//             // info about link
-//             const link=links[j];
-//             // if node is linked to the edge : continue
-//             if(link.source==nodesID[i] || link.target==nodesID[i]){
-//                 continue;
-//             }else{
-//                 let posLink1=nodesPosition[link.source];
-//                 let posLink2=nodesPosition[link.target];
-//                 //posLink1=AdjustCoordNodeToCenter2(network.nodes[link.source],posLink1,networkStyle);
-//                 //posLink2=AdjustCoordNodeToCenter2(network.nodes[link.target],posLink2,networkStyle);
-//                 if (nodeEdgeOverlap(posNode,sizeNode,posLink1,posLink2)){
-//                     nb+=1;
-//                 }
-//             }
-&nbsp;
-//         }
-//     }
-//     return nb;
-// }
-&nbsp;</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-18T15:12:01.230Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/CalculateRelationCycle.ts.html b/coverage/lcov-report/composables/CalculateRelationCycle.ts.html
deleted file mode 100644
index ffe70011923ffb06ce4e683b95eb45449b57af7f..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/CalculateRelationCycle.ts.html
+++ /dev/null
@@ -1,1582 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/CalculateRelationCycle.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> CalculateRelationCycle.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">9.37% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>15/160</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>0/99</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>0/40</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">9.8% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>15/153</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a>
-<a name='L150'></a><a href='#L150'>150</a>
-<a name='L151'></a><a href='#L151'>151</a>
-<a name='L152'></a><a href='#L152'>152</a>
-<a name='L153'></a><a href='#L153'>153</a>
-<a name='L154'></a><a href='#L154'>154</a>
-<a name='L155'></a><a href='#L155'>155</a>
-<a name='L156'></a><a href='#L156'>156</a>
-<a name='L157'></a><a href='#L157'>157</a>
-<a name='L158'></a><a href='#L158'>158</a>
-<a name='L159'></a><a href='#L159'>159</a>
-<a name='L160'></a><a href='#L160'>160</a>
-<a name='L161'></a><a href='#L161'>161</a>
-<a name='L162'></a><a href='#L162'>162</a>
-<a name='L163'></a><a href='#L163'>163</a>
-<a name='L164'></a><a href='#L164'>164</a>
-<a name='L165'></a><a href='#L165'>165</a>
-<a name='L166'></a><a href='#L166'>166</a>
-<a name='L167'></a><a href='#L167'>167</a>
-<a name='L168'></a><a href='#L168'>168</a>
-<a name='L169'></a><a href='#L169'>169</a>
-<a name='L170'></a><a href='#L170'>170</a>
-<a name='L171'></a><a href='#L171'>171</a>
-<a name='L172'></a><a href='#L172'>172</a>
-<a name='L173'></a><a href='#L173'>173</a>
-<a name='L174'></a><a href='#L174'>174</a>
-<a name='L175'></a><a href='#L175'>175</a>
-<a name='L176'></a><a href='#L176'>176</a>
-<a name='L177'></a><a href='#L177'>177</a>
-<a name='L178'></a><a href='#L178'>178</a>
-<a name='L179'></a><a href='#L179'>179</a>
-<a name='L180'></a><a href='#L180'>180</a>
-<a name='L181'></a><a href='#L181'>181</a>
-<a name='L182'></a><a href='#L182'>182</a>
-<a name='L183'></a><a href='#L183'>183</a>
-<a name='L184'></a><a href='#L184'>184</a>
-<a name='L185'></a><a href='#L185'>185</a>
-<a name='L186'></a><a href='#L186'>186</a>
-<a name='L187'></a><a href='#L187'>187</a>
-<a name='L188'></a><a href='#L188'>188</a>
-<a name='L189'></a><a href='#L189'>189</a>
-<a name='L190'></a><a href='#L190'>190</a>
-<a name='L191'></a><a href='#L191'>191</a>
-<a name='L192'></a><a href='#L192'>192</a>
-<a name='L193'></a><a href='#L193'>193</a>
-<a name='L194'></a><a href='#L194'>194</a>
-<a name='L195'></a><a href='#L195'>195</a>
-<a name='L196'></a><a href='#L196'>196</a>
-<a name='L197'></a><a href='#L197'>197</a>
-<a name='L198'></a><a href='#L198'>198</a>
-<a name='L199'></a><a href='#L199'>199</a>
-<a name='L200'></a><a href='#L200'>200</a>
-<a name='L201'></a><a href='#L201'>201</a>
-<a name='L202'></a><a href='#L202'>202</a>
-<a name='L203'></a><a href='#L203'>203</a>
-<a name='L204'></a><a href='#L204'>204</a>
-<a name='L205'></a><a href='#L205'>205</a>
-<a name='L206'></a><a href='#L206'>206</a>
-<a name='L207'></a><a href='#L207'>207</a>
-<a name='L208'></a><a href='#L208'>208</a>
-<a name='L209'></a><a href='#L209'>209</a>
-<a name='L210'></a><a href='#L210'>210</a>
-<a name='L211'></a><a href='#L211'>211</a>
-<a name='L212'></a><a href='#L212'>212</a>
-<a name='L213'></a><a href='#L213'>213</a>
-<a name='L214'></a><a href='#L214'>214</a>
-<a name='L215'></a><a href='#L215'>215</a>
-<a name='L216'></a><a href='#L216'>216</a>
-<a name='L217'></a><a href='#L217'>217</a>
-<a name='L218'></a><a href='#L218'>218</a>
-<a name='L219'></a><a href='#L219'>219</a>
-<a name='L220'></a><a href='#L220'>220</a>
-<a name='L221'></a><a href='#L221'>221</a>
-<a name='L222'></a><a href='#L222'>222</a>
-<a name='L223'></a><a href='#L223'>223</a>
-<a name='L224'></a><a href='#L224'>224</a>
-<a name='L225'></a><a href='#L225'>225</a>
-<a name='L226'></a><a href='#L226'>226</a>
-<a name='L227'></a><a href='#L227'>227</a>
-<a name='L228'></a><a href='#L228'>228</a>
-<a name='L229'></a><a href='#L229'>229</a>
-<a name='L230'></a><a href='#L230'>230</a>
-<a name='L231'></a><a href='#L231'>231</a>
-<a name='L232'></a><a href='#L232'>232</a>
-<a name='L233'></a><a href='#L233'>233</a>
-<a name='L234'></a><a href='#L234'>234</a>
-<a name='L235'></a><a href='#L235'>235</a>
-<a name='L236'></a><a href='#L236'>236</a>
-<a name='L237'></a><a href='#L237'>237</a>
-<a name='L238'></a><a href='#L238'>238</a>
-<a name='L239'></a><a href='#L239'>239</a>
-<a name='L240'></a><a href='#L240'>240</a>
-<a name='L241'></a><a href='#L241'>241</a>
-<a name='L242'></a><a href='#L242'>242</a>
-<a name='L243'></a><a href='#L243'>243</a>
-<a name='L244'></a><a href='#L244'>244</a>
-<a name='L245'></a><a href='#L245'>245</a>
-<a name='L246'></a><a href='#L246'>246</a>
-<a name='L247'></a><a href='#L247'>247</a>
-<a name='L248'></a><a href='#L248'>248</a>
-<a name='L249'></a><a href='#L249'>249</a>
-<a name='L250'></a><a href='#L250'>250</a>
-<a name='L251'></a><a href='#L251'>251</a>
-<a name='L252'></a><a href='#L252'>252</a>
-<a name='L253'></a><a href='#L253'>253</a>
-<a name='L254'></a><a href='#L254'>254</a>
-<a name='L255'></a><a href='#L255'>255</a>
-<a name='L256'></a><a href='#L256'>256</a>
-<a name='L257'></a><a href='#L257'>257</a>
-<a name='L258'></a><a href='#L258'>258</a>
-<a name='L259'></a><a href='#L259'>259</a>
-<a name='L260'></a><a href='#L260'>260</a>
-<a name='L261'></a><a href='#L261'>261</a>
-<a name='L262'></a><a href='#L262'>262</a>
-<a name='L263'></a><a href='#L263'>263</a>
-<a name='L264'></a><a href='#L264'>264</a>
-<a name='L265'></a><a href='#L265'>265</a>
-<a name='L266'></a><a href='#L266'>266</a>
-<a name='L267'></a><a href='#L267'>267</a>
-<a name='L268'></a><a href='#L268'>268</a>
-<a name='L269'></a><a href='#L269'>269</a>
-<a name='L270'></a><a href='#L270'>270</a>
-<a name='L271'></a><a href='#L271'>271</a>
-<a name='L272'></a><a href='#L272'>272</a>
-<a name='L273'></a><a href='#L273'>273</a>
-<a name='L274'></a><a href='#L274'>274</a>
-<a name='L275'></a><a href='#L275'>275</a>
-<a name='L276'></a><a href='#L276'>276</a>
-<a name='L277'></a><a href='#L277'>277</a>
-<a name='L278'></a><a href='#L278'>278</a>
-<a name='L279'></a><a href='#L279'>279</a>
-<a name='L280'></a><a href='#L280'>280</a>
-<a name='L281'></a><a href='#L281'>281</a>
-<a name='L282'></a><a href='#L282'>282</a>
-<a name='L283'></a><a href='#L283'>283</a>
-<a name='L284'></a><a href='#L284'>284</a>
-<a name='L285'></a><a href='#L285'>285</a>
-<a name='L286'></a><a href='#L286'>286</a>
-<a name='L287'></a><a href='#L287'>287</a>
-<a name='L288'></a><a href='#L288'>288</a>
-<a name='L289'></a><a href='#L289'>289</a>
-<a name='L290'></a><a href='#L290'>290</a>
-<a name='L291'></a><a href='#L291'>291</a>
-<a name='L292'></a><a href='#L292'>292</a>
-<a name='L293'></a><a href='#L293'>293</a>
-<a name='L294'></a><a href='#L294'>294</a>
-<a name='L295'></a><a href='#L295'>295</a>
-<a name='L296'></a><a href='#L296'>296</a>
-<a name='L297'></a><a href='#L297'>297</a>
-<a name='L298'></a><a href='#L298'>298</a>
-<a name='L299'></a><a href='#L299'>299</a>
-<a name='L300'></a><a href='#L300'>300</a>
-<a name='L301'></a><a href='#L301'>301</a>
-<a name='L302'></a><a href='#L302'>302</a>
-<a name='L303'></a><a href='#L303'>303</a>
-<a name='L304'></a><a href='#L304'>304</a>
-<a name='L305'></a><a href='#L305'>305</a>
-<a name='L306'></a><a href='#L306'>306</a>
-<a name='L307'></a><a href='#L307'>307</a>
-<a name='L308'></a><a href='#L308'>308</a>
-<a name='L309'></a><a href='#L309'>309</a>
-<a name='L310'></a><a href='#L310'>310</a>
-<a name='L311'></a><a href='#L311'>311</a>
-<a name='L312'></a><a href='#L312'>312</a>
-<a name='L313'></a><a href='#L313'>313</a>
-<a name='L314'></a><a href='#L314'>314</a>
-<a name='L315'></a><a href='#L315'>315</a>
-<a name='L316'></a><a href='#L316'>316</a>
-<a name='L317'></a><a href='#L317'>317</a>
-<a name='L318'></a><a href='#L318'>318</a>
-<a name='L319'></a><a href='#L319'>319</a>
-<a name='L320'></a><a href='#L320'>320</a>
-<a name='L321'></a><a href='#L321'>321</a>
-<a name='L322'></a><a href='#L322'>322</a>
-<a name='L323'></a><a href='#L323'>323</a>
-<a name='L324'></a><a href='#L324'>324</a>
-<a name='L325'></a><a href='#L325'>325</a>
-<a name='L326'></a><a href='#L326'>326</a>
-<a name='L327'></a><a href='#L327'>327</a>
-<a name='L328'></a><a href='#L328'>328</a>
-<a name='L329'></a><a href='#L329'>329</a>
-<a name='L330'></a><a href='#L330'>330</a>
-<a name='L331'></a><a href='#L331'>331</a>
-<a name='L332'></a><a href='#L332'>332</a>
-<a name='L333'></a><a href='#L333'>333</a>
-<a name='L334'></a><a href='#L334'>334</a>
-<a name='L335'></a><a href='#L335'>335</a>
-<a name='L336'></a><a href='#L336'>336</a>
-<a name='L337'></a><a href='#L337'>337</a>
-<a name='L338'></a><a href='#L338'>338</a>
-<a name='L339'></a><a href='#L339'>339</a>
-<a name='L340'></a><a href='#L340'>340</a>
-<a name='L341'></a><a href='#L341'>341</a>
-<a name='L342'></a><a href='#L342'>342</a>
-<a name='L343'></a><a href='#L343'>343</a>
-<a name='L344'></a><a href='#L344'>344</a>
-<a name='L345'></a><a href='#L345'>345</a>
-<a name='L346'></a><a href='#L346'>346</a>
-<a name='L347'></a><a href='#L347'>347</a>
-<a name='L348'></a><a href='#L348'>348</a>
-<a name='L349'></a><a href='#L349'>349</a>
-<a name='L350'></a><a href='#L350'>350</a>
-<a name='L351'></a><a href='#L351'>351</a>
-<a name='L352'></a><a href='#L352'>352</a>
-<a name='L353'></a><a href='#L353'>353</a>
-<a name='L354'></a><a href='#L354'>354</a>
-<a name='L355'></a><a href='#L355'>355</a>
-<a name='L356'></a><a href='#L356'>356</a>
-<a name='L357'></a><a href='#L357'>357</a>
-<a name='L358'></a><a href='#L358'>358</a>
-<a name='L359'></a><a href='#L359'>359</a>
-<a name='L360'></a><a href='#L360'>360</a>
-<a name='L361'></a><a href='#L361'>361</a>
-<a name='L362'></a><a href='#L362'>362</a>
-<a name='L363'></a><a href='#L363'>363</a>
-<a name='L364'></a><a href='#L364'>364</a>
-<a name='L365'></a><a href='#L365'>365</a>
-<a name='L366'></a><a href='#L366'>366</a>
-<a name='L367'></a><a href='#L367'>367</a>
-<a name='L368'></a><a href='#L368'>368</a>
-<a name='L369'></a><a href='#L369'>369</a>
-<a name='L370'></a><a href='#L370'>370</a>
-<a name='L371'></a><a href='#L371'>371</a>
-<a name='L372'></a><a href='#L372'>372</a>
-<a name='L373'></a><a href='#L373'>373</a>
-<a name='L374'></a><a href='#L374'>374</a>
-<a name='L375'></a><a href='#L375'>375</a>
-<a name='L376'></a><a href='#L376'>376</a>
-<a name='L377'></a><a href='#L377'>377</a>
-<a name='L378'></a><a href='#L378'>378</a>
-<a name='L379'></a><a href='#L379'>379</a>
-<a name='L380'></a><a href='#L380'>380</a>
-<a name='L381'></a><a href='#L381'>381</a>
-<a name='L382'></a><a href='#L382'>382</a>
-<a name='L383'></a><a href='#L383'>383</a>
-<a name='L384'></a><a href='#L384'>384</a>
-<a name='L385'></a><a href='#L385'>385</a>
-<a name='L386'></a><a href='#L386'>386</a>
-<a name='L387'></a><a href='#L387'>387</a>
-<a name='L388'></a><a href='#L388'>388</a>
-<a name='L389'></a><a href='#L389'>389</a>
-<a name='L390'></a><a href='#L390'>390</a>
-<a name='L391'></a><a href='#L391'>391</a>
-<a name='L392'></a><a href='#L392'>392</a>
-<a name='L393'></a><a href='#L393'>393</a>
-<a name='L394'></a><a href='#L394'>394</a>
-<a name='L395'></a><a href='#L395'>395</a>
-<a name='L396'></a><a href='#L396'>396</a>
-<a name='L397'></a><a href='#L397'>397</a>
-<a name='L398'></a><a href='#L398'>398</a>
-<a name='L399'></a><a href='#L399'>399</a>
-<a name='L400'></a><a href='#L400'>400</a>
-<a name='L401'></a><a href='#L401'>401</a>
-<a name='L402'></a><a href='#L402'>402</a>
-<a name='L403'></a><a href='#L403'>403</a>
-<a name='L404'></a><a href='#L404'>404</a>
-<a name='L405'></a><a href='#L405'>405</a>
-<a name='L406'></a><a href='#L406'>406</a>
-<a name='L407'></a><a href='#L407'>407</a>
-<a name='L408'></a><a href='#L408'>408</a>
-<a name='L409'></a><a href='#L409'>409</a>
-<a name='L410'></a><a href='#L410'>410</a>
-<a name='L411'></a><a href='#L411'>411</a>
-<a name='L412'></a><a href='#L412'>412</a>
-<a name='L413'></a><a href='#L413'>413</a>
-<a name='L414'></a><a href='#L414'>414</a>
-<a name='L415'></a><a href='#L415'>415</a>
-<a name='L416'></a><a href='#L416'>416</a>
-<a name='L417'></a><a href='#L417'>417</a>
-<a name='L418'></a><a href='#L418'>418</a>
-<a name='L419'></a><a href='#L419'>419</a>
-<a name='L420'></a><a href='#L420'>420</a>
-<a name='L421'></a><a href='#L421'>421</a>
-<a name='L422'></a><a href='#L422'>422</a>
-<a name='L423'></a><a href='#L423'>423</a>
-<a name='L424'></a><a href='#L424'>424</a>
-<a name='L425'></a><a href='#L425'>425</a>
-<a name='L426'></a><a href='#L426'>426</a>
-<a name='L427'></a><a href='#L427'>427</a>
-<a name='L428'></a><a href='#L428'>428</a>
-<a name='L429'></a><a href='#L429'>429</a>
-<a name='L430'></a><a href='#L430'>430</a>
-<a name='L431'></a><a href='#L431'>431</a>
-<a name='L432'></a><a href='#L432'>432</a>
-<a name='L433'></a><a href='#L433'>433</a>
-<a name='L434'></a><a href='#L434'>434</a>
-<a name='L435'></a><a href='#L435'>435</a>
-<a name='L436'></a><a href='#L436'>436</a>
-<a name='L437'></a><a href='#L437'>437</a>
-<a name='L438'></a><a href='#L438'>438</a>
-<a name='L439'></a><a href='#L439'>439</a>
-<a name='L440'></a><a href='#L440'>440</a>
-<a name='L441'></a><a href='#L441'>441</a>
-<a name='L442'></a><a href='#L442'>442</a>
-<a name='L443'></a><a href='#L443'>443</a>
-<a name='L444'></a><a href='#L444'>444</a>
-<a name='L445'></a><a href='#L445'>445</a>
-<a name='L446'></a><a href='#L446'>446</a>
-<a name='L447'></a><a href='#L447'>447</a>
-<a name='L448'></a><a href='#L448'>448</a>
-<a name='L449'></a><a href='#L449'>449</a>
-<a name='L450'></a><a href='#L450'>450</a>
-<a name='L451'></a><a href='#L451'>451</a>
-<a name='L452'></a><a href='#L452'>452</a>
-<a name='L453'></a><a href='#L453'>453</a>
-<a name='L454'></a><a href='#L454'>454</a>
-<a name='L455'></a><a href='#L455'>455</a>
-<a name='L456'></a><a href='#L456'>456</a>
-<a name='L457'></a><a href='#L457'>457</a>
-<a name='L458'></a><a href='#L458'>458</a>
-<a name='L459'></a><a href='#L459'>459</a>
-<a name='L460'></a><a href='#L460'>460</a>
-<a name='L461'></a><a href='#L461'>461</a>
-<a name='L462'></a><a href='#L462'>462</a>
-<a name='L463'></a><a href='#L463'>463</a>
-<a name='L464'></a><a href='#L464'>464</a>
-<a name='L465'></a><a href='#L465'>465</a>
-<a name='L466'></a><a href='#L466'>466</a>
-<a name='L467'></a><a href='#L467'>467</a>
-<a name='L468'></a><a href='#L468'>468</a>
-<a name='L469'></a><a href='#L469'>469</a>
-<a name='L470'></a><a href='#L470'>470</a>
-<a name='L471'></a><a href='#L471'>471</a>
-<a name='L472'></a><a href='#L472'>472</a>
-<a name='L473'></a><a href='#L473'>473</a>
-<a name='L474'></a><a href='#L474'>474</a>
-<a name='L475'></a><a href='#L475'>475</a>
-<a name='L476'></a><a href='#L476'>476</a>
-<a name='L477'></a><a href='#L477'>477</a>
-<a name='L478'></a><a href='#L478'>478</a>
-<a name='L479'></a><a href='#L479'>479</a>
-<a name='L480'></a><a href='#L480'>480</a>
-<a name='L481'></a><a href='#L481'>481</a>
-<a name='L482'></a><a href='#L482'>482</a>
-<a name='L483'></a><a href='#L483'>483</a>
-<a name='L484'></a><a href='#L484'>484</a>
-<a name='L485'></a><a href='#L485'>485</a>
-<a name='L486'></a><a href='#L486'>486</a>
-<a name='L487'></a><a href='#L487'>487</a>
-<a name='L488'></a><a href='#L488'>488</a>
-<a name='L489'></a><a href='#L489'>489</a>
-<a name='L490'></a><a href='#L490'>490</a>
-<a name='L491'></a><a href='#L491'>491</a>
-<a name='L492'></a><a href='#L492'>492</a>
-<a name='L493'></a><a href='#L493'>493</a>
-<a name='L494'></a><a href='#L494'>494</a>
-<a name='L495'></a><a href='#L495'>495</a>
-<a name='L496'></a><a href='#L496'>496</a>
-<a name='L497'></a><a href='#L497'>497</a>
-<a name='L498'></a><a href='#L498'>498</a>
-<a name='L499'></a><a href='#L499'>499</a>
-<a name='L500'></a><a href='#L500'>500</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { Link } from "@metabohub/viz-core/src/types/Link";
-import { Ordering } from "../types/EnumArgs";
-import { TypeSubgraph } from "../types/Subgraph";
-import { LinkLayout, NetworkLayout } from "../types/NetworkLayout";
-import { Coordinate } from "../types/CoordinatesSize";
-&nbsp;
-// Composable imports
-import { inCycle } from "./GetSetAttributsNodes";
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * This file contains functions to calculate the order of links for the cycle metanodes.
- * 
- * *********************************
- * 0. Get nodes
- * 
- * -&gt; neighborsGroupCycle
- *      retrieves the neighboring nodes of a given cycle group, either the parent or child nodes
- * 
- * -&gt; parentNodeNotInCycle
- *      returns an array of parent nodes, of a list of nodes, that are not part of any cycle in the subgraph network
- * 
- * -&gt; childNodeNotInCycle
- *      returns an array of child nodes, of a list of nodes, that are not part of any cycle in the subgraph network
- * 
- * -&gt; getNodesIDPlacedInGroupCycle
- *     retrieves the IDs of nodes placed (with x and y define) in a specific group cycle
- * 
- * -&gt; getNodesPlacedInGroupCycleAsArray
- *    retrieves the nodes (id, x, y) placed in a specific group cycle. If position is fixed it's (id, fx, fy). If there is no posisiton, it's only the id
- * 
- * -&gt; getNodesPlacedInGroupCycleAsObject
- *      retrieves the nodes (id, x, y) placed in a specific group cycle. If position is fixed it's (id, fx, fy). If there is no posisiton, it's only the id
- * 
- * 
- * *********************************
- * 1. Get (ordered) links
- * 
- * -&gt; cycleMetanodeLink
- *      return a link that can take into the count the cycle metanodes. If the end of the link is inside a metanode (group cycle), the end of the link is the group cycle instead of the id of the node
- * 
- * -&gt; sortLinksWithAllGroupCycle
- *      sorts the links to limit crossing with cycle metanodes (for all group cycles).
- * 
- * -&gt; sortLinksWithGroupCycle
- *      sorts the links based on the given group cycle
- * 
- * -&gt; getLinksNodeGroupCycle
- *       finds the links that are associated with the given node and group cycle
- * 
- * -&gt; getLinksForListNodes
- *      retrieves the links between nodes based on a list of node IDs
- * 
-&nbsp;
- * 
- * *********************************
- * 2. Get graph
- * 
- * -&gt; getListNodeLinksForCycleGroupAsArray
- *       retrieves the list of node and links for a specific cycle group. Position of nodes can be fixed
- * 
- * -&gt; getListNodeLinksForCycleGroupAsObject
- *       retrieves an object for node and  a list for links for a specific cycle group
- * 
- * *********************************
- * 3. Get relation cycle
- * 
- * -&gt; parentCycle
- *      return the name of the parent cycle of the cycle, if not, return the name of the cycle
- * 
- */
-&nbsp;
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________0. Get nodes __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Retrieves the neighboring nodes of a given cycle group, either the parent or child nodes.
- * The nodes of the group cycle need to have x and y coordinates precalculated to be considered in the group.
- * 
- * @param subgraphNetwork - The subgraph network containing the cycle group.
- * @param cycleGroupId - The ID of the cycle group.
- * @param parentOrChild - Specifies whether to retrieve the parent cycles or the child of the cycle group. Can be either "parent" or "child".
- * @param xSort - Optional. Specifies whether to sort the nodes of the group cycle and their parent/child by their x position. Defaults to true. 
- * The neighboring nodes are added in the order of the x position of the nodes inside the group cycle.
- * @returns An array of cycle IDs representing the neighboring cycles.
- */
-export function <span class="fstat-no" title="function not covered" >neighborsGroupCycle(</span>subgraphNetwork:SubgraphNetwork,cycleGroupId:string, parentOrChild:"parent"|"child",xSort:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true)</span>:string[]{
-<span class="cstat-no" title="statement not covered" >    if (subgraphNetwork[TypeSubgraph.CYCLEGROUP] &amp;&amp; cycleGroupId in subgraphNetwork[TypeSubgraph.CYCLEGROUP]){</span>
-        const cycleGroup=<span class="cstat-no" title="statement not covered" >subgraphNetwork[TypeSubgraph.CYCLEGROUP][cycleGroupId];   </span>
-<span class="cstat-no" title="statement not covered" >        if (cycleGroup.precalculatedNodesPosition){</span>
-            const positionNodesCycleGroup=<span class="cstat-no" title="statement not covered" >cycleGroup.precalculatedNodesPosition;</span>
-            // get the id of nodes in group cycle
-            const nodes=<span class="cstat-no" title="statement not covered" >getNodesIDPlacedInGroupCycle(subgraphNetwork,cycleGroupId);</span>
-            // sort nodes of the group cycle by x
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (xSort){</span>
-<span class="cstat-no" title="statement not covered" >                nodes.sort(<span class="fstat-no" title="function not covered" >(n</span>odeIdA, nodeIdB) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >                    <span class="missing-if-branch" title="if path not taken" >I</span>if(!(nodeIdA in positionNodesCycleGroup) || !(nodeIdB in positionNodesCycleGroup)) <span class="cstat-no" title="statement not covered" >throw new Error("Node not placed inside groupe cycle");</span></span>
-                    const nodeA = <span class="cstat-no" title="statement not covered" >positionNodesCycleGroup[nodeIdA] as Coordinate;</span>
-                    const nodeB = <span class="cstat-no" title="statement not covered" >positionNodesCycleGroup[nodeIdB] as Coordinate;</span>
-<span class="cstat-no" title="statement not covered" >                    return nodeA.x - nodeB.x;</span>
-                });
-            }
-<span class="cstat-no" title="statement not covered" >            if (parentOrChild==="parent"){</span>
-                // get parent nodes
-                const parentsDoubleArray = <span class="cstat-no" title="statement not covered" >parentNodeNotInCycle(subgraphNetwork, nodes,xSort);</span>
-                const parentCycles = <span class="cstat-no" title="statement not covered" >Array.from(new Set(parentsDoubleArray.flat()));</span>
-<span class="cstat-no" title="statement not covered" >                return parentCycles;</span>
-            } else {
-                // get child nodes
-                const childrenDoubleArray = <span class="cstat-no" title="statement not covered" >childNodeNotInCycle(subgraphNetwork, nodes,xSort);</span>
-                const childCycles = <span class="cstat-no" title="statement not covered" >Array.from(new Set(childrenDoubleArray.flat()));</span>
-<span class="cstat-no" title="statement not covered" >                return childCycles;</span>
-            }
-        }else{
-<span class="cstat-no" title="statement not covered" >            return []; </span>// no node placed inside cyclegroup
-        }
-    }else{
-<span class="cstat-no" title="statement not covered" >        throw new Error("Group cycle not in subgraphNetwork");</span>
-    }
-}
-&nbsp;
-&nbsp;
-/**
- * Returns an array of parent, of a list of nodes, that are not part of any cycle in the subgraph network.
- * 
- * @param subgraphNetwork - The subgraph network object.
- * @param listNodes - The list of nodes to check for parent nodes.
- * @param sort - Optional. Specifies whether to sort the parent nodes (for each node) by their x position. Defaults to false.
- * @returns An array of arrays : each array are the parents of a node in the lists
- */
-export function <span class="fstat-no" title="function not covered" >parentNodeNotInCycle(</span>subgraphNetwork: SubgraphNetwork, listNodes: string[],sort:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: string[][] {
-    const parentNodes = <span class="cstat-no" title="statement not covered" >listNodes.map(<span class="fstat-no" title="function not covered" >(n</span>ode: string) =&gt; {</span>
-        let parentNodesI = <span class="cstat-no" title="statement not covered" >subgraphNetwork.network.links</span>
-            .filter(<span class="fstat-no" title="function not covered" >link </span>=&gt; <span class="cstat-no" title="statement not covered" >link.target.id === node)</span> // get link with those node as child
-            .map(<span class="fstat-no" title="function not covered" >link </span>=&gt; <span class="cstat-no" title="statement not covered" >link.source.id)</span> // get the other node 
-            .filter(<span class="fstat-no" title="function not covered" >id </span>=&gt; <span class="cstat-no" title="statement not covered" >!inCycle(subgraphNetwork.network, id))</span>;// no node in a cycle 
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (sort) {</span>
-<span class="cstat-no" title="statement not covered" >                parentNodesI = parentNodesI.sort(<span class="fstat-no" title="function not covered" >(i</span>dA, idB) =&gt; {</span>
-                    const nodeA = <span class="cstat-no" title="statement not covered" >subgraphNetwork.network.nodes[idA];</span>
-                    const nodeB = <span class="cstat-no" title="statement not covered" >subgraphNetwork.network.nodes[idB];</span>
-<span class="cstat-no" title="statement not covered" >                    return nodeA.x - nodeB.x; </span>// sort by x coordinate
-                });
-            }
-<span class="cstat-no" title="statement not covered" >        return parentNodesI;</span>
-    });
-<span class="cstat-no" title="statement not covered" >    return parentNodes;</span>
-}
-&nbsp;
-&nbsp;
-/**
- * Returns an array of child nodes, of a list of nodes, that are not part of any cycle in the subgraph network.
- * 
- * @param subgraphNetwork - The subgraph network object.
- * @param listNodes - The list of nodes to check for child nodes.
- * @param sort - Optional. Specifies whether to sort the child nodes (for each node) by their x position. Defaults to false.
- * @returns An array of arrays containing the child nodes that are not part of any cycle.
- */
-export function <span class="fstat-no" title="function not covered" >childNodeNotInCycle(</span>subgraphNetwork: SubgraphNetwork, listNodes: string[],sort:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: string[][] {
-    const childNodes = <span class="cstat-no" title="statement not covered" >listNodes.map(<span class="fstat-no" title="function not covered" >(n</span>ode: string) =&gt; {</span>
-        let childNodesI = <span class="cstat-no" title="statement not covered" >subgraphNetwork.network.links</span>
-            .filter(<span class="fstat-no" title="function not covered" >link </span>=&gt; <span class="cstat-no" title="statement not covered" >link.source.id === node)</span> // get link with those node as parent
-            .map(<span class="fstat-no" title="function not covered" >link </span>=&gt; <span class="cstat-no" title="statement not covered" >link.target.id)</span> // get the other node 
-            .filter(<span class="fstat-no" title="function not covered" >id </span>=&gt; <span class="cstat-no" title="statement not covered" >!inCycle(subgraphNetwork.network, id))</span>; // no node in a cycle
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (sort) {</span>
-<span class="cstat-no" title="statement not covered" >            childNodesI = childNodesI.sort(<span class="fstat-no" title="function not covered" >(i</span>dA, idB) =&gt; {</span>
-                const nodeA = <span class="cstat-no" title="statement not covered" >subgraphNetwork.network.nodes[idA];</span>
-                const nodeB = <span class="cstat-no" title="statement not covered" >subgraphNetwork.network.nodes[idB];</span>
-<span class="cstat-no" title="statement not covered" >                return nodeA.x - nodeB.x; </span>// sort by x coordinate
-            });
-        } 
-<span class="cstat-no" title="statement not covered" >        return childNodesI;</span>
-    });
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    return childNodes;</span>
-}
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Retrieves the IDs of nodes placed (with x and y define) in a specific group cycle.
- * 
- * @param subgraphNetwork - The subgraph network containing the group cycles.
- * @param groupCycleID - The ID of the group cycle to retrieve the nodes from.
- * @returns An array of strings representing the IDs of the nodes placed in the group cycle.
- */
-export function <span class="fstat-no" title="function not covered" >getNodesIDPlacedInGroupCycle(</span>subgraphNetwork:SubgraphNetwork,groupCycleID:string):string[]{
-<span class="cstat-no" title="statement not covered" >    if (subgraphNetwork[TypeSubgraph.CYCLEGROUP] &amp;&amp; groupCycleID in subgraphNetwork[TypeSubgraph.CYCLEGROUP]){</span>
-        const groupCycle =<span class="cstat-no" title="statement not covered" >subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleID];</span>
-<span class="cstat-no" title="statement not covered" >        if (groupCycle.precalculatedNodesPosition){</span>
-            const positionNodesCycleGroup=<span class="cstat-no" title="statement not covered" >groupCycle.precalculatedNodesPosition;</span>
-<span class="cstat-no" title="statement not covered" >            return Object.entries(positionNodesCycleGroup)</span>
-                .filter(<span class="fstat-no" title="function not covered" >([</span>_,item]) =&gt; <span class="cstat-no" title="statement not covered" >item.x !== undefined &amp;&amp; item.y !== undefined)</span>
-                .map(<span class="fstat-no" title="function not covered" >([</span>key,_])=&gt;<span class="cstat-no" title="statement not covered" >key)</span>;
-        }else{
-<span class="cstat-no" title="statement not covered" >            return [];</span>
-        }
-    }else{
-<span class="cstat-no" title="statement not covered" >        throw new Error("Cycle group not in subgraphNetwork");</span>
-    }
-}
-&nbsp;
-/**
- * Retrieves the nodes (id, x, y) placed in a specific group cycle. If position is fixed it's (id, fx, fy). 
- * If there is no posisiton, it's only the id
- * 
- * @param subgraphNetwork - The subgraph network object.
- * @param groupCycleID - The ID of the group cycle.
- * @param positionAsFixed - Optional. Specifies whether to return the node positions as fixed coordinates. Defaults to false.
- * @returns An array of objects representing the nodes placed in the group cycle. Each object contains the node ID and optionally the x and y coordinates if positionAsFixed is true.
- *          If the group cycle ID is not found or the precalculated node positions are not available, null is returned.
- */
-export function <span class="fstat-no" title="function not covered" >getNodesPlacedInGroupCycleAsArray(</span>subgraphNetwork:SubgraphNetwork,groupCycleID:string,positionAsFixed:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >false)</span>:{ id: string,x?:number, y?:number, fx?:number, fy?:number }[]{
-<span class="cstat-no" title="statement not covered" >    if (subgraphNetwork[TypeSubgraph.CYCLEGROUP] &amp;&amp; groupCycleID in subgraphNetwork[TypeSubgraph.CYCLEGROUP]){</span>
-        const groupCycle =<span class="cstat-no" title="statement not covered" >subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleID];</span>
-<span class="cstat-no" title="statement not covered" >        if (groupCycle.precalculatedNodesPosition){</span>
-            const positionNodesCycleGroup=<span class="cstat-no" title="statement not covered" >groupCycle.precalculatedNodesPosition;</span>
-<span class="cstat-no" title="statement not covered" >            return Object.entries(positionNodesCycleGroup)</span>
-                    .filter(<span class="fstat-no" title="function not covered" >([</span>_, item]) =&gt; { <span class="cstat-no" title="statement not covered" >return item.x !== undefined &amp;&amp; item.y !== undefined }</span>)
-                    .map(<span class="fstat-no" title="function not covered" >([</span>key, item]) =&gt; { 
-<span class="cstat-no" title="statement not covered" >                        if (item.x!==null || item.y!==null){</span>
-<span class="cstat-no" title="statement not covered" >                            if (positionAsFixed) <span class="cstat-no" title="statement not covered" >return { id: key,fx:item.x as number, fy:item.y as number} </span></span>
-                            else <span class="cstat-no" title="statement not covered" >return { id: key,x:item.x as number, y:item.y as number } </span>
-                            
-                        }else{
-<span class="cstat-no" title="statement not covered" >                            return { id: key }</span>
-                        }
-            }); 
-        }else{
-<span class="cstat-no" title="statement not covered" >            return [];</span>
-        }
-    }else{
-<span class="cstat-no" title="statement not covered" >        throw new Error("Cycle group not in subgraphNetwork");</span>
-    }
-}
-&nbsp;
-/**
- * Retrieves the nodes (id:{x, y}) placed in a specific group cycle. 
- * If there is no posisiton, it's only the id
- * 
- * @param subgraphNetwork - The subgraph network object.
- * @param groupCycleID - The ID of the group cycle.
- * @param positionAsFixed - Optional. Specifies whether to return the node positions as fixed coordinates. Defaults to false.
- * @returns An object representing the nodes placed in the group cycle. Each value contains the x and y coordinates.
- *          If the group cycle ID is not found or the precalculated node positions are not available, null is returned.
- */
-export function <span class="fstat-no" title="function not covered" >getNodesPlacedInGroupCycleAsObject(</span>subgraphNetwork:SubgraphNetwork,groupCycleID:string):{[key:string]:Coordinate}{
-<span class="cstat-no" title="statement not covered" >    if (subgraphNetwork[TypeSubgraph.CYCLEGROUP] &amp;&amp; groupCycleID in subgraphNetwork[TypeSubgraph.CYCLEGROUP]){</span>
-        const groupCycle =<span class="cstat-no" title="statement not covered" >subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleID];</span>
-<span class="cstat-no" title="statement not covered" >        if (groupCycle.precalculatedNodesPosition){</span>
-            const positionNodesCycleGroup=<span class="cstat-no" title="statement not covered" >groupCycle.precalculatedNodesPosition;</span>
-<span class="cstat-no" title="statement not covered" >            return Object.entries(positionNodesCycleGroup)</span>
-                        .filter(<span class="fstat-no" title="function not covered" >([</span>_, item]) =&gt; { <span class="cstat-no" title="statement not covered" >return item.x !== undefined &amp;&amp; item.y !== undefined }</span>)
-                        .reduce&lt;{ [key:string]:Coordinate}&gt;(<span class="fstat-no" title="function not covered" >(a</span>cc, node) =&gt; { 
-<span class="cstat-no" title="statement not covered" >                            <span class="missing-if-branch" title="if path not taken" >I</span>if (node[1].x!==null || node[1].y!==null){</span>
-<span class="cstat-no" title="statement not covered" >                                 acc[node[0]]={ x:node[1].x as number, y:node[1].y as number } </span>
-                            }
-<span class="cstat-no" title="statement not covered" >                            return acc;</span>
-                        },{});
-        }else{
-<span class="cstat-no" title="statement not covered" >            return {};</span>
-        }
-    } else {
-<span class="cstat-no" title="statement not covered" >        throw new Error("Cycle group not in subgraphNetwork");</span>
-    }
-}
-&nbsp;
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________1. Get (ordered) links__________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Return a link that can take into the count the cycle metanodes. 
- * If the end of the link is inside a metanode (group cycle), the end of the link is the group cycle instead of the id of the node.
- * 
- * @param link - The link layout to calculate the relation cycle for.
- * @param cycle - Optional. Specifies whether to consider cycleMetanodes in the calculation. Default is true.
- * @returns An object containing the inCycle array, tail string, and head string.
- * @throws {Error} If tail or head is undefined.
- */
-export function <span class="fstat-no" title="function not covered" >cycleMetanodeLink(</span>link:LinkLayout, cycle:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true)</span>:{inCycle:string[],tail:string,head:string}{
-    
-    let inCycle:string[]=<span class="cstat-no" title="statement not covered" >[];</span>
-    let tail:string;
-    let head:string;
-&nbsp;
-     // source in cycleMetanode ?
-<span class="cstat-no" title="statement not covered" >    if(cycle &amp;&amp; link.source.metadataLayout &amp;&amp; Object.keys(link.source.metadataLayout).includes(TypeSubgraph.CYCLEGROUP) &amp;&amp; link.source.metadataLayout[TypeSubgraph.CYCLEGROUP]){</span>
-<span class="cstat-no" title="statement not covered" >        tail=link.source.metadataLayout[TypeSubgraph.CYCLEGROUP];  </span>
-<span class="cstat-no" title="statement not covered" >        inCycle.push(tail);</span>
-    }else{
-<span class="cstat-no" title="statement not covered" >        tail=link.source.id;</span>
-    }
-&nbsp;
-    // target in cycleMetanode ?
-<span class="cstat-no" title="statement not covered" >    if(cycle &amp;&amp; link.target.metadataLayout &amp;&amp; Object.keys(link.target.metadataLayout).includes(TypeSubgraph.CYCLEGROUP) &amp;&amp; link.target.metadataLayout[TypeSubgraph.CYCLEGROUP]){</span>
-<span class="cstat-no" title="statement not covered" >        head=link.target.metadataLayout[TypeSubgraph.CYCLEGROUP];  </span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if(!inCycle.includes(head)) <span class="cstat-no" title="statement not covered" >inCycle.push(head);</span></span>
-    }else{
-<span class="cstat-no" title="statement not covered" >        head=link.target.id;</span>
-    }
-    
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (!tail) <span class="cstat-no" title="statement not covered" >throw new Error("tail is undefined");</span></span>
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (!head) <span class="cstat-no" title="statement not covered" >throw new Error("head is undefined");</span></span>
-&nbsp;
-    const newLink=<span class="cstat-no" title="statement not covered" >{inCycle:inCycle,tail:tail,head:head};</span>
-<span class="cstat-no" title="statement not covered" >    return newLink;</span>
-}
-&nbsp;
-&nbsp;
-/**
- * Sorts the links to limit crossing with cycle metanodes (for all group cycles).
- * Links that are associated with the left node of the group cycle are placed first, followed by the links associated with the right node of the group cycle.
- * Then, all other links are added in the order of the input array.
- * 
- * @param subgraphNetwork - The subgraph network.
- * @param orderChange - A boolean indicating whether to change the order with group cycle. Default is false.
- * @returns The subgraphNetwork and an array of sorted links.
- */
-export function <span class="fstat-no" title="function not covered" >sortLinksWithAllGroupCycle(</span>subgraphNetwork:SubgraphNetwork,orderChange:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >false)</span>:{subgraphNetwork:SubgraphNetwork,linksOrdered:LinkLayout[]}{
-    let links:Link[]=<span class="cstat-no" title="statement not covered" >[];</span>
-&nbsp;
-    // change ordre with group cycle
-<span class="cstat-no" title="statement not covered" >    if (orderChange  &amp;&amp; subgraphNetwork[TypeSubgraph.CYCLEGROUP]){</span>
-        // adding edge in right order for each group cycle
-<span class="cstat-no" title="statement not covered" >        Object.keys(subgraphNetwork[TypeSubgraph.CYCLEGROUP]).forEach( <span class="fstat-no" title="function not covered" >(g</span>roupCycle) =&gt; {</span>
-            const resultSorting=<span class="cstat-no" title="statement not covered" >sortLinksWithGroupCycle(subgraphNetwork,groupCycle);</span>
-<span class="cstat-no" title="statement not covered" >            subgraphNetwork=resultSorting.subgraphNetwork;</span>
-<span class="cstat-no" title="statement not covered" >            links=links.concat(resultSorting.linksOrdered);</span>
-        });
-        // add other links
-<span class="cstat-no" title="statement not covered" >        Object.values(subgraphNetwork.network.links).forEach(<span class="fstat-no" title="function not covered" >(l</span>ink) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (!links.includes(link)){</span>
-<span class="cstat-no" title="statement not covered" >                links.push(link);</span>
-            }
-        });
-<span class="cstat-no" title="statement not covered" >        return { subgraphNetwork:subgraphNetwork,linksOrdered:links };</span>
-    
-    }else{ // no change
-<span class="cstat-no" title="statement not covered" >        return { subgraphNetwork:subgraphNetwork,linksOrdered:subgraphNetwork.network.links };</span>
-    }
-}
-&nbsp;
-/**
- * Sorts the links based on the given group cycle.
- * Links that are associated with the left node of the group cycle are placed first, followed by the links associated with the right node of the group cycle.
- * Choose if ordering apply for parent or children of cycle (the one with the most links)
- * 
- * @param subgraphNetwork - The subgraph network containing the cycles group.
- * @param groupCycle - The group cycle id to sort the links.
- * @returns The subgraphNetwork and an array of sorted links.
- */
-function <span class="fstat-no" title="function not covered" >sortLinksWithGroupCycle(</span>subgraphNetwork:SubgraphNetwork,groupCycle:string):{subgraphNetwork:SubgraphNetwork,linksOrdered:LinkLayout[]}{
-    let links:LinkLayout[]=<span class="cstat-no" title="statement not covered" >[];</span>
-<span class="cstat-no" title="statement not covered" >    if( subgraphNetwork[TypeSubgraph.CYCLEGROUP] &amp;&amp; groupCycle in subgraphNetwork[TypeSubgraph.CYCLEGROUP]){</span>
-        // sort parent of cycle by x of the child in the cycle
-        // (first : parent of the left node of group cycle)
-        const parents= <span class="cstat-no" title="statement not covered" >neighborsGroupCycle(subgraphNetwork,groupCycle,"parent",true);</span>
-        const children= <span class="cstat-no" title="statement not covered" >neighborsGroupCycle(subgraphNetwork,groupCycle,"child",true);</span>
-&nbsp;
-        let nodeOrder:string[]=<span class="cstat-no" title="statement not covered" >[];</span>
-        let source:"node"|"groupCycle";
-&nbsp;
-        // if more parent than children : order parent
-<span class="cstat-no" title="statement not covered" >        if (parents.length&gt;=children.length){</span>
-<span class="cstat-no" title="statement not covered" >            nodeOrder=parents;</span>
-<span class="cstat-no" title="statement not covered" >            source="node";</span>
-<span class="cstat-no" title="statement not covered" >            subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycle].ordering=Ordering.IN;</span>
-        }else{
-            // order children
-<span class="cstat-no" title="statement not covered" >            nodeOrder=children;</span>
-<span class="cstat-no" title="statement not covered" >            source="groupCycle";</span>
-<span class="cstat-no" title="statement not covered" >            subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycle].ordering=Ordering.OUT;</span>
-        }
-&nbsp;
-        // get links between the parent (or children) and the group cycle in the right order
-<span class="cstat-no" title="statement not covered" >        nodeOrder.forEach(<span class="fstat-no" title="function not covered" >(n</span>odeId) =&gt; {</span>
-            // get links for each node
-            const newLinksOrder = <span class="cstat-no" title="statement not covered" >getLinksNodeGroupCycle(subgraphNetwork,nodeId,groupCycle,source);</span>
-            // add links
-<span class="cstat-no" title="statement not covered" >            newLinksOrder.forEach(<span class="fstat-no" title="function not covered" >(n</span>ewLink) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >                links.push(newLink);</span>
-            });
-&nbsp;
-        });
-<span class="cstat-no" title="statement not covered" >        return { subgraphNetwork:subgraphNetwork,linksOrdered:links };</span>
-    }else{
-<span class="cstat-no" title="statement not covered" >        return { subgraphNetwork:subgraphNetwork,linksOrdered:[] };</span>
-    }
-}
-&nbsp;
-/**
- * Finds the links that are associated with the given node and group cycle.
- * For parent nodes, the source is the node (and the target is the group cycle). 
- * For child nodes, the source is the group cycle (and the target is the node).
- * 
- * @param subgraphNetwork 
- * @param nodeId node id
- * @param groupCycleId id of cycle group
- * @param source "node" if the parent links are needed, "groupCycle" if the child links are needed
- * @returns links that are child or parent of a group cycle
- */
-function <span class="fstat-no" title="function not covered" >getLinksNodeGroupCycle(</span>subgraphNetwork:SubgraphNetwork,nodeId:string,groupCycleId:string,source:"node"|"groupCycle"):LinkLayout[]{
-<span class="cstat-no" title="statement not covered" >    if (source==="node"){</span>
-        // node to group cycle
-<span class="cstat-no" title="statement not covered" >        return Object.values(subgraphNetwork.network.links).filter(<span class="fstat-no" title="function not covered" >(l</span>ink) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >            return link.source.id === nodeId &amp;&amp; link.target.metadataLayout &amp;&amp; TypeSubgraph.CYCLEGROUP in link.target.metadataLayout &amp;&amp; link.target.metadataLayout[TypeSubgraph.CYCLEGROUP] === groupCycleId;</span>
-        });
-    }else{
-        // group cycle to node
-<span class="cstat-no" title="statement not covered" >        return Object.values(subgraphNetwork.network.links).filter(<span class="fstat-no" title="function not covered" >(l</span>ink) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >            return link.target.id === nodeId &amp;&amp; link.source.metadataLayout &amp;&amp; TypeSubgraph.CYCLEGROUP in link.source.metadataLayout &amp;&amp; link.source.metadataLayout[TypeSubgraph.CYCLEGROUP] === groupCycleId;</span>
-        });
-    }
-}
-&nbsp;
-/**
- * Retrieves the links between nodes based on a list of node IDs.
- * 
- * @param network - The network layout object.
- * @param nodes - An array of node IDs.
- * @returns An array of link objects containing the source and target IDs.
- */
-export function <span class="fstat-no" title="function not covered" >getLinksForListNodes(</span>network: NetworkLayout, nodes: string[]): {source:string,target:string}[] {
-<span class="cstat-no" title="statement not covered" >    return network.links.filter(<span class="fstat-no" title="function not covered" >link </span>=&gt; </span>
-<span class="cstat-no" title="statement not covered" >        nodes.includes(link.source.id) &amp;&amp; nodes.includes(link.target.id)</span>
-    ).map(<span class="fstat-no" title="function not covered" >link </span>=&gt; { <span class="cstat-no" title="statement not covered" >return { source: link.source.id, target: link.target.id } }</span>);
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________2. Get graph __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Retrieves the list of node and links for a specific cycle group.
- * Position of nodes can be fixed.
- * 
- * @param subgraphNetwork - The subgraph network object.
- * @param groupCycleName - The name of the cycle group.
- * @param positionAsFixed - (Optional) Indicates whether the node positions should be fixed. Default is false.
- * 
- * @returns An object containing the list of nodes and links for the cycle group.
- */
-export function <span class="fstat-no" title="function not covered" >getListNodeLinksForCycleGroupAsArray(</span>subgraphNetwork:SubgraphNetwork,groupCycleName:string,positionAsFixed:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >false)</span>
-:{nodes:{ id: string,fx?:number, fy?:number,x?:number,y?:number }[],links:{source:string,target:string}[]}{
-    const nodesGroupCycle=<span class="cstat-no" title="statement not covered" >getNodesPlacedInGroupCycleAsArray(subgraphNetwork,groupCycleName,positionAsFixed);</span>
-    const nodesGroupCycleName=<span class="cstat-no" title="statement not covered" >Object.values(nodesGroupCycle).map(<span class="fstat-no" title="function not covered" >node=</span>&gt;<span class="cstat-no" title="statement not covered" >node.id)</span>;</span>
-    const linksGroupCycle=<span class="cstat-no" title="statement not covered" >getLinksForListNodes(subgraphNetwork.network,nodesGroupCycleName);</span>
-<span class="cstat-no" title="statement not covered" >    return {nodes:nodesGroupCycle,links:linksGroupCycle};</span>
-}
-&nbsp;
-/**
- * Retrieves an object for node and  a list for links for a specific cycle group.
- * 
- * @param subgraphNetwork - The subgraph network object.
- * @param groupCycleName - The name of the cycle group.
- * 
- * @returns An object containing the list of nodes and links for the cycle group.
- */
-export function <span class="fstat-no" title="function not covered" >getListNodeLinksForCycleGroupAsObject(</span>subgraphNetwork:SubgraphNetwork,groupCycleName:string)
-:{nodes:{[key:string]:Coordinate},links:{source:string,target:string}[]}{
-    const nodesGroupCycle=<span class="cstat-no" title="statement not covered" >getNodesPlacedInGroupCycleAsObject(subgraphNetwork,groupCycleName);</span>
-    const nodesGroupCycleName=<span class="cstat-no" title="statement not covered" >Object.keys(nodesGroupCycle);</span>
-    const linksGroupCycle=<span class="cstat-no" title="statement not covered" >getLinksForListNodes(subgraphNetwork.network,nodesGroupCycleName);</span>
-<span class="cstat-no" title="statement not covered" >    return {nodes:nodesGroupCycle,links:linksGroupCycle};</span>
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________3. Get relation cycle __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Return the name of the parent cycle of the cycle, if not, return the name of the cycle
- * @param cycleName 
- * @param subgraphNetwork 
- * @returns the name of the parent cycle of the cycle, if not, return the name of the cycle
- */
-export function <span class="fstat-no" title="function not covered" >parentCycle(</span>cycleName:string,subgraphNetwork:SubgraphNetwork):string{
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (!subgraphNetwork[TypeSubgraph.CYCLE] || !subgraphNetwork[TypeSubgraph.CYCLE][cycleName]) <span class="cstat-no" title="statement not covered" >throw new Error("cycle not in subgraphNetwork");</span></span>
-<span class="cstat-no" title="statement not covered" >    if (subgraphNetwork[TypeSubgraph.CYCLE][cycleName].parentSubgraph &amp;&amp; subgraphNetwork[TypeSubgraph.CYCLE][cycleName].parentSubgraph.type==TypeSubgraph.CYCLE){</span>
-<span class="cstat-no" title="statement not covered" >            return subgraphNetwork[TypeSubgraph.CYCLE][cycleName].parentSubgraph.name;</span>
-    }else{ 
-<span class="cstat-no" title="statement not covered" >        return cycleName;</span>
-    }
-}</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/CalculateSize.ts.html b/coverage/lcov-report/composables/CalculateSize.ts.html
deleted file mode 100644
index 6cbedc4b6cec942cd9181ac8072b2a1847e9e622..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/CalculateSize.ts.html
+++ /dev/null
@@ -1,1354 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/CalculateSize.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> CalculateSize.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">12.24% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>18/147</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>0/58</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>0/29</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">13.53% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>18/133</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a>
-<a name='L150'></a><a href='#L150'>150</a>
-<a name='L151'></a><a href='#L151'>151</a>
-<a name='L152'></a><a href='#L152'>152</a>
-<a name='L153'></a><a href='#L153'>153</a>
-<a name='L154'></a><a href='#L154'>154</a>
-<a name='L155'></a><a href='#L155'>155</a>
-<a name='L156'></a><a href='#L156'>156</a>
-<a name='L157'></a><a href='#L157'>157</a>
-<a name='L158'></a><a href='#L158'>158</a>
-<a name='L159'></a><a href='#L159'>159</a>
-<a name='L160'></a><a href='#L160'>160</a>
-<a name='L161'></a><a href='#L161'>161</a>
-<a name='L162'></a><a href='#L162'>162</a>
-<a name='L163'></a><a href='#L163'>163</a>
-<a name='L164'></a><a href='#L164'>164</a>
-<a name='L165'></a><a href='#L165'>165</a>
-<a name='L166'></a><a href='#L166'>166</a>
-<a name='L167'></a><a href='#L167'>167</a>
-<a name='L168'></a><a href='#L168'>168</a>
-<a name='L169'></a><a href='#L169'>169</a>
-<a name='L170'></a><a href='#L170'>170</a>
-<a name='L171'></a><a href='#L171'>171</a>
-<a name='L172'></a><a href='#L172'>172</a>
-<a name='L173'></a><a href='#L173'>173</a>
-<a name='L174'></a><a href='#L174'>174</a>
-<a name='L175'></a><a href='#L175'>175</a>
-<a name='L176'></a><a href='#L176'>176</a>
-<a name='L177'></a><a href='#L177'>177</a>
-<a name='L178'></a><a href='#L178'>178</a>
-<a name='L179'></a><a href='#L179'>179</a>
-<a name='L180'></a><a href='#L180'>180</a>
-<a name='L181'></a><a href='#L181'>181</a>
-<a name='L182'></a><a href='#L182'>182</a>
-<a name='L183'></a><a href='#L183'>183</a>
-<a name='L184'></a><a href='#L184'>184</a>
-<a name='L185'></a><a href='#L185'>185</a>
-<a name='L186'></a><a href='#L186'>186</a>
-<a name='L187'></a><a href='#L187'>187</a>
-<a name='L188'></a><a href='#L188'>188</a>
-<a name='L189'></a><a href='#L189'>189</a>
-<a name='L190'></a><a href='#L190'>190</a>
-<a name='L191'></a><a href='#L191'>191</a>
-<a name='L192'></a><a href='#L192'>192</a>
-<a name='L193'></a><a href='#L193'>193</a>
-<a name='L194'></a><a href='#L194'>194</a>
-<a name='L195'></a><a href='#L195'>195</a>
-<a name='L196'></a><a href='#L196'>196</a>
-<a name='L197'></a><a href='#L197'>197</a>
-<a name='L198'></a><a href='#L198'>198</a>
-<a name='L199'></a><a href='#L199'>199</a>
-<a name='L200'></a><a href='#L200'>200</a>
-<a name='L201'></a><a href='#L201'>201</a>
-<a name='L202'></a><a href='#L202'>202</a>
-<a name='L203'></a><a href='#L203'>203</a>
-<a name='L204'></a><a href='#L204'>204</a>
-<a name='L205'></a><a href='#L205'>205</a>
-<a name='L206'></a><a href='#L206'>206</a>
-<a name='L207'></a><a href='#L207'>207</a>
-<a name='L208'></a><a href='#L208'>208</a>
-<a name='L209'></a><a href='#L209'>209</a>
-<a name='L210'></a><a href='#L210'>210</a>
-<a name='L211'></a><a href='#L211'>211</a>
-<a name='L212'></a><a href='#L212'>212</a>
-<a name='L213'></a><a href='#L213'>213</a>
-<a name='L214'></a><a href='#L214'>214</a>
-<a name='L215'></a><a href='#L215'>215</a>
-<a name='L216'></a><a href='#L216'>216</a>
-<a name='L217'></a><a href='#L217'>217</a>
-<a name='L218'></a><a href='#L218'>218</a>
-<a name='L219'></a><a href='#L219'>219</a>
-<a name='L220'></a><a href='#L220'>220</a>
-<a name='L221'></a><a href='#L221'>221</a>
-<a name='L222'></a><a href='#L222'>222</a>
-<a name='L223'></a><a href='#L223'>223</a>
-<a name='L224'></a><a href='#L224'>224</a>
-<a name='L225'></a><a href='#L225'>225</a>
-<a name='L226'></a><a href='#L226'>226</a>
-<a name='L227'></a><a href='#L227'>227</a>
-<a name='L228'></a><a href='#L228'>228</a>
-<a name='L229'></a><a href='#L229'>229</a>
-<a name='L230'></a><a href='#L230'>230</a>
-<a name='L231'></a><a href='#L231'>231</a>
-<a name='L232'></a><a href='#L232'>232</a>
-<a name='L233'></a><a href='#L233'>233</a>
-<a name='L234'></a><a href='#L234'>234</a>
-<a name='L235'></a><a href='#L235'>235</a>
-<a name='L236'></a><a href='#L236'>236</a>
-<a name='L237'></a><a href='#L237'>237</a>
-<a name='L238'></a><a href='#L238'>238</a>
-<a name='L239'></a><a href='#L239'>239</a>
-<a name='L240'></a><a href='#L240'>240</a>
-<a name='L241'></a><a href='#L241'>241</a>
-<a name='L242'></a><a href='#L242'>242</a>
-<a name='L243'></a><a href='#L243'>243</a>
-<a name='L244'></a><a href='#L244'>244</a>
-<a name='L245'></a><a href='#L245'>245</a>
-<a name='L246'></a><a href='#L246'>246</a>
-<a name='L247'></a><a href='#L247'>247</a>
-<a name='L248'></a><a href='#L248'>248</a>
-<a name='L249'></a><a href='#L249'>249</a>
-<a name='L250'></a><a href='#L250'>250</a>
-<a name='L251'></a><a href='#L251'>251</a>
-<a name='L252'></a><a href='#L252'>252</a>
-<a name='L253'></a><a href='#L253'>253</a>
-<a name='L254'></a><a href='#L254'>254</a>
-<a name='L255'></a><a href='#L255'>255</a>
-<a name='L256'></a><a href='#L256'>256</a>
-<a name='L257'></a><a href='#L257'>257</a>
-<a name='L258'></a><a href='#L258'>258</a>
-<a name='L259'></a><a href='#L259'>259</a>
-<a name='L260'></a><a href='#L260'>260</a>
-<a name='L261'></a><a href='#L261'>261</a>
-<a name='L262'></a><a href='#L262'>262</a>
-<a name='L263'></a><a href='#L263'>263</a>
-<a name='L264'></a><a href='#L264'>264</a>
-<a name='L265'></a><a href='#L265'>265</a>
-<a name='L266'></a><a href='#L266'>266</a>
-<a name='L267'></a><a href='#L267'>267</a>
-<a name='L268'></a><a href='#L268'>268</a>
-<a name='L269'></a><a href='#L269'>269</a>
-<a name='L270'></a><a href='#L270'>270</a>
-<a name='L271'></a><a href='#L271'>271</a>
-<a name='L272'></a><a href='#L272'>272</a>
-<a name='L273'></a><a href='#L273'>273</a>
-<a name='L274'></a><a href='#L274'>274</a>
-<a name='L275'></a><a href='#L275'>275</a>
-<a name='L276'></a><a href='#L276'>276</a>
-<a name='L277'></a><a href='#L277'>277</a>
-<a name='L278'></a><a href='#L278'>278</a>
-<a name='L279'></a><a href='#L279'>279</a>
-<a name='L280'></a><a href='#L280'>280</a>
-<a name='L281'></a><a href='#L281'>281</a>
-<a name='L282'></a><a href='#L282'>282</a>
-<a name='L283'></a><a href='#L283'>283</a>
-<a name='L284'></a><a href='#L284'>284</a>
-<a name='L285'></a><a href='#L285'>285</a>
-<a name='L286'></a><a href='#L286'>286</a>
-<a name='L287'></a><a href='#L287'>287</a>
-<a name='L288'></a><a href='#L288'>288</a>
-<a name='L289'></a><a href='#L289'>289</a>
-<a name='L290'></a><a href='#L290'>290</a>
-<a name='L291'></a><a href='#L291'>291</a>
-<a name='L292'></a><a href='#L292'>292</a>
-<a name='L293'></a><a href='#L293'>293</a>
-<a name='L294'></a><a href='#L294'>294</a>
-<a name='L295'></a><a href='#L295'>295</a>
-<a name='L296'></a><a href='#L296'>296</a>
-<a name='L297'></a><a href='#L297'>297</a>
-<a name='L298'></a><a href='#L298'>298</a>
-<a name='L299'></a><a href='#L299'>299</a>
-<a name='L300'></a><a href='#L300'>300</a>
-<a name='L301'></a><a href='#L301'>301</a>
-<a name='L302'></a><a href='#L302'>302</a>
-<a name='L303'></a><a href='#L303'>303</a>
-<a name='L304'></a><a href='#L304'>304</a>
-<a name='L305'></a><a href='#L305'>305</a>
-<a name='L306'></a><a href='#L306'>306</a>
-<a name='L307'></a><a href='#L307'>307</a>
-<a name='L308'></a><a href='#L308'>308</a>
-<a name='L309'></a><a href='#L309'>309</a>
-<a name='L310'></a><a href='#L310'>310</a>
-<a name='L311'></a><a href='#L311'>311</a>
-<a name='L312'></a><a href='#L312'>312</a>
-<a name='L313'></a><a href='#L313'>313</a>
-<a name='L314'></a><a href='#L314'>314</a>
-<a name='L315'></a><a href='#L315'>315</a>
-<a name='L316'></a><a href='#L316'>316</a>
-<a name='L317'></a><a href='#L317'>317</a>
-<a name='L318'></a><a href='#L318'>318</a>
-<a name='L319'></a><a href='#L319'>319</a>
-<a name='L320'></a><a href='#L320'>320</a>
-<a name='L321'></a><a href='#L321'>321</a>
-<a name='L322'></a><a href='#L322'>322</a>
-<a name='L323'></a><a href='#L323'>323</a>
-<a name='L324'></a><a href='#L324'>324</a>
-<a name='L325'></a><a href='#L325'>325</a>
-<a name='L326'></a><a href='#L326'>326</a>
-<a name='L327'></a><a href='#L327'>327</a>
-<a name='L328'></a><a href='#L328'>328</a>
-<a name='L329'></a><a href='#L329'>329</a>
-<a name='L330'></a><a href='#L330'>330</a>
-<a name='L331'></a><a href='#L331'>331</a>
-<a name='L332'></a><a href='#L332'>332</a>
-<a name='L333'></a><a href='#L333'>333</a>
-<a name='L334'></a><a href='#L334'>334</a>
-<a name='L335'></a><a href='#L335'>335</a>
-<a name='L336'></a><a href='#L336'>336</a>
-<a name='L337'></a><a href='#L337'>337</a>
-<a name='L338'></a><a href='#L338'>338</a>
-<a name='L339'></a><a href='#L339'>339</a>
-<a name='L340'></a><a href='#L340'>340</a>
-<a name='L341'></a><a href='#L341'>341</a>
-<a name='L342'></a><a href='#L342'>342</a>
-<a name='L343'></a><a href='#L343'>343</a>
-<a name='L344'></a><a href='#L344'>344</a>
-<a name='L345'></a><a href='#L345'>345</a>
-<a name='L346'></a><a href='#L346'>346</a>
-<a name='L347'></a><a href='#L347'>347</a>
-<a name='L348'></a><a href='#L348'>348</a>
-<a name='L349'></a><a href='#L349'>349</a>
-<a name='L350'></a><a href='#L350'>350</a>
-<a name='L351'></a><a href='#L351'>351</a>
-<a name='L352'></a><a href='#L352'>352</a>
-<a name='L353'></a><a href='#L353'>353</a>
-<a name='L354'></a><a href='#L354'>354</a>
-<a name='L355'></a><a href='#L355'>355</a>
-<a name='L356'></a><a href='#L356'>356</a>
-<a name='L357'></a><a href='#L357'>357</a>
-<a name='L358'></a><a href='#L358'>358</a>
-<a name='L359'></a><a href='#L359'>359</a>
-<a name='L360'></a><a href='#L360'>360</a>
-<a name='L361'></a><a href='#L361'>361</a>
-<a name='L362'></a><a href='#L362'>362</a>
-<a name='L363'></a><a href='#L363'>363</a>
-<a name='L364'></a><a href='#L364'>364</a>
-<a name='L365'></a><a href='#L365'>365</a>
-<a name='L366'></a><a href='#L366'>366</a>
-<a name='L367'></a><a href='#L367'>367</a>
-<a name='L368'></a><a href='#L368'>368</a>
-<a name='L369'></a><a href='#L369'>369</a>
-<a name='L370'></a><a href='#L370'>370</a>
-<a name='L371'></a><a href='#L371'>371</a>
-<a name='L372'></a><a href='#L372'>372</a>
-<a name='L373'></a><a href='#L373'>373</a>
-<a name='L374'></a><a href='#L374'>374</a>
-<a name='L375'></a><a href='#L375'>375</a>
-<a name='L376'></a><a href='#L376'>376</a>
-<a name='L377'></a><a href='#L377'>377</a>
-<a name='L378'></a><a href='#L378'>378</a>
-<a name='L379'></a><a href='#L379'>379</a>
-<a name='L380'></a><a href='#L380'>380</a>
-<a name='L381'></a><a href='#L381'>381</a>
-<a name='L382'></a><a href='#L382'>382</a>
-<a name='L383'></a><a href='#L383'>383</a>
-<a name='L384'></a><a href='#L384'>384</a>
-<a name='L385'></a><a href='#L385'>385</a>
-<a name='L386'></a><a href='#L386'>386</a>
-<a name='L387'></a><a href='#L387'>387</a>
-<a name='L388'></a><a href='#L388'>388</a>
-<a name='L389'></a><a href='#L389'>389</a>
-<a name='L390'></a><a href='#L390'>390</a>
-<a name='L391'></a><a href='#L391'>391</a>
-<a name='L392'></a><a href='#L392'>392</a>
-<a name='L393'></a><a href='#L393'>393</a>
-<a name='L394'></a><a href='#L394'>394</a>
-<a name='L395'></a><a href='#L395'>395</a>
-<a name='L396'></a><a href='#L396'>396</a>
-<a name='L397'></a><a href='#L397'>397</a>
-<a name='L398'></a><a href='#L398'>398</a>
-<a name='L399'></a><a href='#L399'>399</a>
-<a name='L400'></a><a href='#L400'>400</a>
-<a name='L401'></a><a href='#L401'>401</a>
-<a name='L402'></a><a href='#L402'>402</a>
-<a name='L403'></a><a href='#L403'>403</a>
-<a name='L404'></a><a href='#L404'>404</a>
-<a name='L405'></a><a href='#L405'>405</a>
-<a name='L406'></a><a href='#L406'>406</a>
-<a name='L407'></a><a href='#L407'>407</a>
-<a name='L408'></a><a href='#L408'>408</a>
-<a name='L409'></a><a href='#L409'>409</a>
-<a name='L410'></a><a href='#L410'>410</a>
-<a name='L411'></a><a href='#L411'>411</a>
-<a name='L412'></a><a href='#L412'>412</a>
-<a name='L413'></a><a href='#L413'>413</a>
-<a name='L414'></a><a href='#L414'>414</a>
-<a name='L415'></a><a href='#L415'>415</a>
-<a name='L416'></a><a href='#L416'>416</a>
-<a name='L417'></a><a href='#L417'>417</a>
-<a name='L418'></a><a href='#L418'>418</a>
-<a name='L419'></a><a href='#L419'>419</a>
-<a name='L420'></a><a href='#L420'>420</a>
-<a name='L421'></a><a href='#L421'>421</a>
-<a name='L422'></a><a href='#L422'>422</a>
-<a name='L423'></a><a href='#L423'>423</a>
-<a name='L424'></a><a href='#L424'>424</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Node } from "@metabohub/viz-core/src/types/Node";
-import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { Subgraph, TypeSubgraph } from "../types/Subgraph";
-import { Coordinate, Size } from "../types/CoordinatesSize";
-&nbsp;
-// Composable imports
-import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
-import { inCycle, isSideCompound } from "./GetSetAttributsNodes";
-&nbsp;
-// General imports
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * This file contains functions to calculate the size of nodes, edges and subgraphs. Anf function to shift coordinates depending on node size.
- * 
- * *********************************
- * 0.  Nodes
- * 
- * -&gt; pixelsToInches :
- *          Converts pixels to inches based on the given DPI (dots per inch).
- * 
- * -&gt; inchesToPixels :
- *         Converts inches to pixels based on the given DPI (dots per inch).
- * 
- * -&gt; getSizeNodePixel :
- *        Calculates the size of a node in pixels based on its style properties.
- * 
- * -&gt; getMeanNodesSizePixel :
- *       Calculates the mean size of nodes in pixels.
- * 
- * -&gt; getSepAttributesInches :
- *      Calculate the rank separation and node separation in inches depending on node size.
- * 
- * -&gt; getSepAttributesPixel :
- *     Calculate the rank separation and node separation in pixels depending on node size.
- * 
- * 
- * *********************************
- * 1.  Edges
- * 
- * -&gt; minEdgeLength :
- *     Calculates the minimum edge length between nodes in a network.
- * 
- * -&gt; medianLengthDistance :
- *    Calculates the median edge length between nodes in a network.
- * 
- * 
- * *********************************
- * 2.  Subgraphs
- * 
- * -&gt; rectangleSize :
- *      Calculates the size and center coordinates of a rectangle based on a list of coordinates.
- * 
- * -&gt; getSizeAllGroupCycles :
- *      Calculates the size of all group cycles.
- * 
- * -&gt; getSizeGroupCycles :
- *      Calculates the size of a group cycle.
- * 
- * 
- * *********************************
- * 3.  Shift coordinates depending on size
- * 
- * -&gt; shiftAllToGetTopLeftCoord :
- *       Shifts all nodes in the network to get the top left coordinate based on the given style.
- * 
- * -&gt; getTopLeftCoordFromCenter :
-*        Calculates the top left coordinate of a node based on its center coordinate and size.
- * 
- * -&gt; getCenterCoordFromTopLeft :
- *       Calculates the center coordinates of a node based on its top-left coordinates and size.
- * 
- */
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________0.  Nodes __________________________________________________________________________
-&nbsp;
-&nbsp;
-export const defaultHeightNode = 25;
-export const defaultWidthNode = 25;
-&nbsp;
-&nbsp;
-/**
- * Converts pixels to inches based on the given DPI (dots per inch).
- * @param pixels - The number of pixels to convert.
- * @param dpi - The DPI value to use for the conversion. Defaults to 96 DPI.
- * @returns The converted value in inches.
- */
-export function <span class="fstat-no" title="function not covered" >pixelsToInches(</span>pixels: number, dpi: number = <span class="branch-0 cbranch-no" title="branch not covered" >72)</span>: number {
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (dpi===0) <span class="cstat-no" title="statement not covered" >throw new Error("DPI value cannot be 0");</span></span>
-<span class="cstat-no" title="statement not covered" >    return parseFloat((pixels / dpi).toFixed(2));</span>
-}
-&nbsp;
-/**
- * Converts inches to pixels based on the given DPI (dots per inch).
- * @param inches - The number of inches to convert.
- * @param dpi - The DPI value to use for the conversion. Defaults to 72 DPI.
- * @returns The converted value in pixels.
- */
-export function <span class="fstat-no" title="function not covered" >inchesToPixels(</span>inches: number, dpi: number = <span class="branch-0 cbranch-no" title="branch not covered" >72)</span>: number {
-<span class="cstat-no" title="statement not covered" >    return parseFloat((inches * dpi).toFixed(2));</span>
-}
-&nbsp;
-/**
- * Calculates the size of a node in pixels based on its style properties.
- * @param node - The node for which to calculate the size.
- * @param styleNetwork - The style properties of the graph.
- * @returns An object containing the height and width of the node in pixels.
- */
-export function <span class="fstat-no" title="function not covered" >getSizeNodePixel(</span>node:Node,styleNetwork:GraphStyleProperties):Size{
-    let height:number=<span class="cstat-no" title="statement not covered" >defaultHeightNode;</span>
-    let width:number=<span class="cstat-no" title="statement not covered" >defaultWidthNode;</span>
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (node.classes){</span>
-<span class="cstat-no" title="statement not covered" >        node.classes.forEach(<span class="fstat-no" title="function not covered" >(c</span>lasse)=&gt;{</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (styleNetwork.nodeStyles &amp;&amp; classe in styleNetwork.nodeStyles){;</span>
-                const style=<span class="cstat-no" title="statement not covered" >styleNetwork.nodeStyles[classe];</span>
-<span class="cstat-no" title="statement not covered" >                height = style.height? style.height:height;</span>
-<span class="cstat-no" title="statement not covered" >                width = style.width? style.width:width;</span>
-            }
-        });
-    }
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    return {height:height,width:width};</span>
-}
-&nbsp;
-/**
- * Calculates the mean size of nodes in pixels.
- * 
- * @param nodes - An array of nodes.
- * @param styleNetwork - The style properties of the graph.
- * @returns An object containing the mean height and width of the nodes in pixels.
- */
-export async function <span class="fstat-no" title="function not covered" >getMeanNodesSizePixel(<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span>nodes:Node[],</span>styleNetwork:GraphStyleProperties,includeSideCompounds:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true)</span>:Promise&lt;Size&gt;{</span>
-    let height:number = <span class="cstat-no" title="statement not covered" >0;</span>
-    let width:number = <span class="cstat-no" title="statement not covered" >0;</span>
-    let n:number = <span class="cstat-no" title="statement not covered" >0;</span>
-<span class="cstat-no" title="statement not covered" >    nodes.forEach(<span class="fstat-no" title="function not covered" >(n</span>ode)=&gt;{</span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (includeSideCompounds ||  !isSideCompound(node) ){ </span>
-            let size = <span class="cstat-no" title="statement not covered" >getSizeNodePixel(node,styleNetwork);</span>
-<span class="cstat-no" title="statement not covered" >            height += size.height;</span>
-<span class="cstat-no" title="statement not covered" >            width += size.width;</span>
-<span class="cstat-no" title="statement not covered" >            n+=1;</span>
-        }
-    });
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (n===0){</span>
-<span class="cstat-no" title="statement not covered" >        return {height:defaultHeightNode,width:defaultWidthNode};</span>
-    }
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    return {height:height/n,width:width/n};</span>
-}
-&nbsp;
-&nbsp;
-/**
- * Calculate the rank separation and node separation in inches depending on node size : 
- * rank separation = mean height node * factor
- * node separation = mean width node * factor
- * @param network contains nodes
- * @param styleNetwork contains informations of nodes size
- * @param factor number of mean size node for the sep attributes
- * @returns rank separation and node separation in inches
- */
-export async function <span class="fstat-no" title="function not covered" >getSepAttributesInches(<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span>network:Network,</span>styleNetwork:GraphStyleProperties,factor:number=<span class="branch-0 cbranch-no" title="branch not covered" >1)</span>:Promise&lt;{rankSep:number,nodeSep:number}&gt;{</span>
-    const meanSizeNode= <span class="cstat-no" title="statement not covered" >await getMeanNodesSizePixel(Object.values(network.nodes),styleNetwork);</span>
-    const rankSep = <span class="cstat-no" title="statement not covered" >pixelsToInches(meanSizeNode.height * factor);</span>
-    const nodeSep = <span class="cstat-no" title="statement not covered" >pixelsToInches(meanSizeNode.width * factor);</span>
-<span class="cstat-no" title="statement not covered" >    return { rankSep, nodeSep };</span>
-}
-&nbsp;
-/**
- * Calculate the rank separation and node separation in pixels depending on node size : 
- * rank separation = mean height node * factor
- * node separation = mean width node * factor
- * @param network contains nodes
- * @param styleNetwork contains informations of nodes size
- * @param factor number of mean size node for the sep attributes
- * @returns rank separation and node separation in pixels
- */
-export async function <span class="fstat-no" title="function not covered" >getSepAttributesPixel(<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span>network:Network,</span>styleNetwork:GraphStyleProperties,factor:number=<span class="branch-0 cbranch-no" title="branch not covered" >1)</span>:Promise&lt;{rankSep:number,nodeSep:number}&gt;{</span>
-    const meanSizeNode= <span class="cstat-no" title="statement not covered" >await getMeanNodesSizePixel(Object.values(network.nodes),styleNetwork);</span>
-    const rankSep = <span class="cstat-no" title="statement not covered" >meanSizeNode.height * factor;</span>
-    const nodeSep = <span class="cstat-no" title="statement not covered" >meanSizeNode.width *factor;</span>
-<span class="cstat-no" title="statement not covered" >    return { rankSep, nodeSep };</span>
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________1.  Edges __________________________________________________________________________
-&nbsp;
-&nbsp;
-const defaultMinEdgeLength = 25;
-&nbsp;
-&nbsp;
-/**
- * Calculates the minimum edge length between nodes in a network.
- * 
- * @param network - The network object containing nodes.
- * @returns The minimum edge length between nodes.
- */
-export function <span class="fstat-no" title="function not covered" >minEdgeLength(</span>network: Network,cycleInclude:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: number {
-    let minDistance = <span class="cstat-no" title="statement not covered" >Infinity;</span>
-<span class="cstat-no" title="statement not covered" >    network.links.forEach(<span class="fstat-no" title="function not covered" >(l</span>ink) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (cycleInclude || (!inCycle(network,link.target.id) || !inCycle(network,link.source.id)) ){</span>
-            const dx:number = <span class="cstat-no" title="statement not covered" >link.source.x - link.target.x;</span>
-            const dy:number = <span class="cstat-no" title="statement not covered" >link.source.y - link.target.y;</span>
-            const distance:number = <span class="cstat-no" title="statement not covered" >Math.sqrt(dx * dx + dy * dy);</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (isFinite(distance)){</span>
-<span class="cstat-no" title="statement not covered" >                minDistance = Math.min(minDistance, distance);</span>
-            }
-        }
-    });
-<span class="cstat-no" title="statement not covered" >    if(!isFinite(minDistance)){</span>
-<span class="cstat-no" title="statement not covered" >        return NaN;</span>
-    }else{
-<span class="cstat-no" title="statement not covered" >        return parseFloat(minDistance.toFixed(2));</span>
-    }
-}
-&nbsp;
-/**
- * Calculates the median edge length between nodes in a network.
- * 
- * @param network - The network object containing nodes.
- * @param cycleInclude - Flag to include or exclude links in cycles.
- * @returns The median length distance between nodes.
- */
-export function <span class="fstat-no" title="function not covered" >medianEdgeLength(</span>network: Network, cycleInclude: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: number {
-    const distances: number[] = <span class="cstat-no" title="statement not covered" >[];</span>
-<span class="cstat-no" title="statement not covered" >    network.links.forEach(<span class="fstat-no" title="function not covered" >(l</span>ink) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (cycleInclude || (!inCycle(network, link.target.id) || !inCycle(network, link.source.id))) {</span>
-            const dx = <span class="cstat-no" title="statement not covered" >link.source.x - link.target.x;</span>
-            const dy = <span class="cstat-no" title="statement not covered" >link.source.y - link.target.y;</span>
-            const distance = <span class="cstat-no" title="statement not covered" >Math.sqrt(dx * dx + dy * dy);</span>
-<span class="cstat-no" title="statement not covered" >            distances.push(distance);</span>
-        }
-    });
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    distances.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >a - b)</span>;</span>
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (distances.length === 0) <span class="cstat-no" title="statement not covered" >return 0; </span></span>// Handle case with no distances
-&nbsp;
-    const mid = <span class="cstat-no" title="statement not covered" >Math.floor(distances.length / 2);</span>
-&nbsp;
-    // If even number of distances, median is average of two middle numbers
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (distances.length % 2 === 0) {</span>
-<span class="cstat-no" title="statement not covered" >        return parseFloat(((distances[mid - 1] + distances[mid]) / 2).toFixed(2));</span>
-    }
-&nbsp;
-    // If odd number of distances, median is middle number
-<span class="cstat-no" title="statement not covered" >    return parseFloat(distances[mid].toFixed(2));</span>
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________2.  Subgraphs __________________________________________________________________________
-&nbsp;
-&nbsp;
-/**
- * Calculates the size and center coordinates of a rectangle based on a list of coordinates.
- * @param listCoordinates - The list of coordinates in the rectangle.
- * @returns An object containing the width, height, and center coordinates of the rectangle.
- */
-export function <span class="fstat-no" title="function not covered" >rectangleSize(</span>listCoordinates:Coordinate[],listID?:string[],subgraphNetwork?:SubgraphNetwork):{width:number,height:number,center:Coordinate}{
-&nbsp;
-    // get the x and y coordinates
-    const xCoordinates=<span class="cstat-no" title="statement not covered" >listCoordinates.map(<span class="fstat-no" title="function not covered" >coord=</span>&gt;<span class="cstat-no" title="statement not covered" >coord.x)</span>;</span>
-    const yCoordinates=<span class="cstat-no" title="statement not covered" >listCoordinates.map(<span class="fstat-no" title="function not covered" >coord=</span>&gt;<span class="cstat-no" title="statement not covered" >coord.y)</span>;</span>
-&nbsp;
-    // get the min and max of x and y coordinates
-    let minX = <span class="cstat-no" title="statement not covered" >Math.min(...xCoordinates);</span>
-    const minXIndex = <span class="cstat-no" title="statement not covered" >xCoordinates.indexOf(minX); </span>
-&nbsp;
-    let maxX = <span class="cstat-no" title="statement not covered" >Math.max(...xCoordinates);</span>
-    const maxXIndex = <span class="cstat-no" title="statement not covered" >xCoordinates.indexOf(maxX); </span>
-&nbsp;
-    let minY = <span class="cstat-no" title="statement not covered" >Math.min(...yCoordinates);</span>
-    const minYIndex = <span class="cstat-no" title="statement not covered" >yCoordinates.indexOf(minY); </span>
-&nbsp;
-    let maxY = <span class="cstat-no" title="statement not covered" >Math.max(...yCoordinates);</span>
-    const maxYIndex = <span class="cstat-no" title="statement not covered" >yCoordinates.indexOf(maxY); </span>
-&nbsp;
-    // if nodes ID : take into account its size
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (listID &amp;&amp; subgraphNetwork){</span>
-&nbsp;
-        // min x
-<span class="cstat-no" title="statement not covered" >        if (minXIndex === -1){</span>
-<span class="cstat-no" title="statement not covered" >            minX = -defaultWidthNode/2;</span>
-        } else {
-            const minXNode = <span class="cstat-no" title="statement not covered" >listID[minXIndex];</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (!(minXNode in subgraphNetwork.network.nodes)) <span class="cstat-no" title="statement not covered" >throw new Error("Node not in network");</span></span>
-            const sizeMinXNode = <span class="cstat-no" title="statement not covered" >getSizeNodePixel(subgraphNetwork.network.nodes[minXNode],subgraphNetwork.networkStyle);</span>
-<span class="cstat-no" title="statement not covered" >            minX = minX - sizeMinXNode.width/2;</span>
-        }
-&nbsp;
-        // max x
-<span class="cstat-no" title="statement not covered" >        if (maxXIndex === -1){</span>
-<span class="cstat-no" title="statement not covered" >            maxX = defaultWidthNode/2;</span>
-        }else {
-            const maxXNode = <span class="cstat-no" title="statement not covered" >listID[maxXIndex];</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (!(maxXNode in subgraphNetwork.network.nodes)) <span class="cstat-no" title="statement not covered" >throw new Error("Node not in network");</span></span>
-            const sizeMaxXNode = <span class="cstat-no" title="statement not covered" >getSizeNodePixel(subgraphNetwork.network.nodes[maxXNode],subgraphNetwork.networkStyle);</span>
-<span class="cstat-no" title="statement not covered" >            maxX = maxX + sizeMaxXNode.width/2;</span>
-        }
-&nbsp;
-        // min y
-<span class="cstat-no" title="statement not covered" >        if (minYIndex === -1){</span>
-<span class="cstat-no" title="statement not covered" >            minY = -defaultHeightNode/2;</span>
-        } else {
-            const minYNode = <span class="cstat-no" title="statement not covered" >listID[minYIndex];</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (!(minYNode in subgraphNetwork.network.nodes)) <span class="cstat-no" title="statement not covered" >throw new Error("Node not in network");</span></span>
-            const sizeMinYNode = <span class="cstat-no" title="statement not covered" >getSizeNodePixel(subgraphNetwork.network.nodes[minYNode],subgraphNetwork.networkStyle);</span>
-<span class="cstat-no" title="statement not covered" >            minY = minY - sizeMinYNode.height/2;</span>
-        }
-&nbsp;
-        // max y
-<span class="cstat-no" title="statement not covered" >        if (maxYIndex === -1){</span>
-<span class="cstat-no" title="statement not covered" >            maxY = defaultHeightNode/2;</span>
-        } else {
-            const maxYNode = <span class="cstat-no" title="statement not covered" >listID[maxYIndex];</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (!(maxYNode in subgraphNetwork.network.nodes)) <span class="cstat-no" title="statement not covered" >throw new Error("Node not in network");</span></span>
-            const sizeMaxYNode = <span class="cstat-no" title="statement not covered" >getSizeNodePixel(subgraphNetwork.network.nodes[maxYNode],subgraphNetwork.networkStyle);</span>
-<span class="cstat-no" title="statement not covered" >            maxY = maxY + sizeMaxYNode.height/2;</span>
-        }
-    }
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    return {</span>
-        width: maxX - minX,
-        height: maxY - minY,
-        center: {
-            x: (minX + maxX) / 2,
-            y: (minY + maxY) / 2
-        }
-    };
-}
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Calculates the size of all group cycles 
- * 
- * @param subgraphNetwork - The subgraph network to calculate the size for.
- * @returns The subgraphNetwork with the size of all group cycles calculated.
- */
-export function <span class="fstat-no" title="function not covered" >getSizeAllGroupCycles(</span>subgraphNetwork:SubgraphNetwork):SubgraphNetwork{
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (subgraphNetwork[TypeSubgraph.CYCLEGROUP]){</span>
-<span class="cstat-no" title="statement not covered" >        Object.values(subgraphNetwork[TypeSubgraph.CYCLEGROUP]).forEach(<span class="fstat-no" title="function not covered" >groupCycle </span>=&gt; {</span>
-<span class="cstat-no" title="statement not covered" >            subgraphNetwork=getSizeGroupCycles(subgraphNetwork,groupCycle);</span>
-        });
-    }
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    return subgraphNetwork;</span>
-}
-&nbsp;
-/**
- * Calculates the size of a group cycle.
- * 
- * @param subgraphNetwork - The subgraph network to calculate the size for.
- * @param groupCycle - The group cycle to calculate the size for.
- * @returns The subgraphNetwork with the size of the group cycle calculated.
- */
-function <span class="fstat-no" title="function not covered" >getSizeGroupCycles(</span>subgraphNetwork:SubgraphNetwork,groupCycle:Subgraph):SubgraphNetwork{
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (groupCycle.precalculatedNodesPosition){</span>
-        // get all nodes with x and y coordinates
-        const listNodesMetadata = <span class="cstat-no" title="statement not covered" >Object.entries(groupCycle.precalculatedNodesPosition)</span>
-                        .filter(<span class="fstat-no" title="function not covered" >([</span>_,item]) =&gt; <span class="cstat-no" title="statement not covered" >item.x !== undefined &amp;&amp; item.y !== undefined &amp;&amp; item.x!==null &amp;&amp; item.y!==null)</span>;
-        const listCoordinates = <span class="cstat-no" title="statement not covered" >listNodesMetadata.map(<span class="fstat-no" title="function not covered" >([</span>_,item]) =&gt; {<span class="cstat-no" title="statement not covered" >return {x:item.x as number,y:item.y as number}})</span>;</span>
-        const listID = <span class="cstat-no" title="statement not covered" >listNodesMetadata.map(<span class="fstat-no" title="function not covered" >([</span>id,_]) =&gt; {<span class="cstat-no" title="statement not covered" >return id})</span>;</span>
-        // get the size of the rectangle
-        const {width,height,center}=<span class="cstat-no" title="statement not covered" >rectangleSize(listCoordinates,listID,subgraphNetwork);</span>
-<span class="cstat-no" title="statement not covered" >        groupCycle.width=width;</span>
-<span class="cstat-no" title="statement not covered" >        groupCycle.height=height;</span>
-<span class="cstat-no" title="statement not covered" >        groupCycle.originalPosition=center;</span>
-    }
-<span class="cstat-no" title="statement not covered" >    return subgraphNetwork;</span>
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________3.  Shift coordinates depending on size ____________________________________________________________
-&nbsp;
-&nbsp;
-/**
- * Shifts all nodes in the network to get the top left coordinate based on the given style.
- * 
- * @param network - The network object containing the nodes.
- * @param style - The style properties used to calculate the top left coordinate.
- * @param moveCycleToo - Optional parameter indicating whether to move nodes in cycles as well. Defaults to true.
- */
-export function <span class="fstat-no" title="function not covered" >shiftAllToGetTopLeftCoord(</span>network:Network,style:GraphStyleProperties,moveCycleToo:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true)</span> {
-<span class="cstat-no" title="statement not covered" >    Object.values(network.nodes).forEach(<span class="fstat-no" title="function not covered" >node=</span>&gt;{</span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if( moveCycleToo || !inCycle(network,node.id)){</span>
-            const {x,y}=<span class="cstat-no" title="statement not covered" >getTopLeftCoordFromCenter(node,style);</span>
-<span class="cstat-no" title="statement not covered" >            node.x=x;</span>
-<span class="cstat-no" title="statement not covered" >            node.y=y;</span>
-        }
-    })
-}
-&nbsp;
-/**
- * Calculates the top left coordinate of a node based on its center coordinate and size.
- * 
- * @param node - The node for which to calculate the top left coordinate.
- * @param style - The style properties of the node.
- * @returns The top left coordinate of the node.
- */
-export function <span class="fstat-no" title="function not covered" >getTopLeftCoordFromCenter(</span>node:Node,style:GraphStyleProperties):Coordinate{
-    const size = <span class="cstat-no" title="statement not covered" >getSizeNodePixel(node,style);</span>
-<span class="cstat-no" title="statement not covered" >    return {x:node.x-size.width/2,y:node.y-size.height/2}</span>
-}
-&nbsp;
-/**
- * Calculates the center coordinates of a node based on its top-left coordinates and size.
- * 
- * @param node - The node for which to calculate the center coordinates.
- * @param style - The style properties of the node.
- * @returns The center coordinates of the node.
- */
-export function <span class="fstat-no" title="function not covered" >getCenterCoordFromTopLeft(</span>node:Node,style:GraphStyleProperties):Coordinate{
-    const size = <span class="cstat-no" title="statement not covered" >getSizeNodePixel(node,style);</span>
-<span class="cstat-no" title="statement not covered" >    return {x:node.x+size.width/2,y:node.y+size.height/2}</span>
-}</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/CalculateStartNodes.ts.html b/coverage/lcov-report/composables/CalculateStartNodes.ts.html
deleted file mode 100644
index 79c33181aca4b7c491816b5b940f0bcab7e04ffa..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/CalculateStartNodes.ts.html
+++ /dev/null
@@ -1,634 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/CalculateStartNodes.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> CalculateStartNodes.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">9.25% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>5/54</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>0/25</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>0/17</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">10.41% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>5/48</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a>
-<a name='L150'></a><a href='#L150'>150</a>
-<a name='L151'></a><a href='#L151'>151</a>
-<a name='L152'></a><a href='#L152'>152</a>
-<a name='L153'></a><a href='#L153'>153</a>
-<a name='L154'></a><a href='#L154'>154</a>
-<a name='L155'></a><a href='#L155'>155</a>
-<a name='L156'></a><a href='#L156'>156</a>
-<a name='L157'></a><a href='#L157'>157</a>
-<a name='L158'></a><a href='#L158'>158</a>
-<a name='L159'></a><a href='#L159'>159</a>
-<a name='L160'></a><a href='#L160'>160</a>
-<a name='L161'></a><a href='#L161'>161</a>
-<a name='L162'></a><a href='#L162'>162</a>
-<a name='L163'></a><a href='#L163'>163</a>
-<a name='L164'></a><a href='#L164'>164</a>
-<a name='L165'></a><a href='#L165'>165</a>
-<a name='L166'></a><a href='#L166'>166</a>
-<a name='L167'></a><a href='#L167'>167</a>
-<a name='L168'></a><a href='#L168'>168</a>
-<a name='L169'></a><a href='#L169'>169</a>
-<a name='L170'></a><a href='#L170'>170</a>
-<a name='L171'></a><a href='#L171'>171</a>
-<a name='L172'></a><a href='#L172'>172</a>
-<a name='L173'></a><a href='#L173'>173</a>
-<a name='L174'></a><a href='#L174'>174</a>
-<a name='L175'></a><a href='#L175'>175</a>
-<a name='L176'></a><a href='#L176'>176</a>
-<a name='L177'></a><a href='#L177'>177</a>
-<a name='L178'></a><a href='#L178'>178</a>
-<a name='L179'></a><a href='#L179'>179</a>
-<a name='L180'></a><a href='#L180'>180</a>
-<a name='L181'></a><a href='#L181'>181</a>
-<a name='L182'></a><a href='#L182'>182</a>
-<a name='L183'></a><a href='#L183'>183</a>
-<a name='L184'></a><a href='#L184'>184</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Types imports
-import { StartNodesType } from "../types/EnumArgs";
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { NetworkLayout, NodeLayout } from "../types/NetworkLayout";
-&nbsp;
-// Composable imports
-import { networkToGDSGraph } from "./ConvertFromNetwork";
-&nbsp;
-&nbsp;
-/**
- * This file contains the functions to calculate the start nodes of a network for graph traversal.
- * 
- * -&gt; assignRankOrder :
- *       assign rank and order to nodes of a network
- * 
- * -&gt; getStartNodes :
- *       get the start nodes of a network for graph traversal
- * 
- * -&gt; concatSources :
- *      concatenate two arrays of strings and remove duplicates
- * 
- * -&gt; hasRank0 :
- *      check if a node has rank 0 in metadata
- * 
- * -&gt; needRank :
- *      check if the rank information is needed for the sourcetype
- * 
- * -&gt; needSource :
- *     check if the topological source information is needed for the sourcetype
- * 
- * -&gt; needAll :
- *    check if all nodes are needed for the sourcetype
- * 
- * -&gt; concatSources :
- *     concatenate two arrays of strings and remove duplicates
- * 
- */
-&nbsp;
-&nbsp;
-/**
- * Assigns rank and order to nodes in a network layout based on their x and y coordinates.
- * 
- * @param network - The network object.
- * @param unique_y - An array of unique y coordinates that indicates the y that will be associated with rank.
- *                  If a node in the network have a "y" not in this array, it will not be assigned a rank (and order)
- * @param onlyRank - Optional parameter to indicate whether to assign only the rank or both rank and order. Default is true.
- */
-export function <span class="fstat-no" title="function not covered" >assignRankOrder(</span>network: NetworkLayout, unique_y: Array&lt;number&gt;,onlyRank:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true)</span>:void {
-&nbsp;
-    // sort the y to know the associated rank for a y coordinate
-<span class="cstat-no" title="statement not covered" >    unique_y.sort(<span class="fstat-no" title="function not covered" >(a</span>:number, b:number) =&gt; <span class="cstat-no" title="statement not covered" >a - b)</span>;</span>
-&nbsp;
-    // get the rank for each node
-    const xNodeByRank: number[][] = <span class="cstat-no" title="statement not covered" >Array.from({ length: unique_y.length }, <span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >[])</span>;</span>
-<span class="cstat-no" title="statement not covered" >    Object.values(network.nodes).forEach(<span class="fstat-no" title="function not covered" >(n</span>ode) =&gt; {</span>
-        const rank = <span class="cstat-no" title="statement not covered" >unique_y.indexOf(node.y);</span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if(rank &gt;-1){</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (!node.metadataLayout) <span class="cstat-no" title="statement not covered" >node.metadataLayout={}; </span></span>
-<span class="cstat-no" title="statement not covered" >            node.metadataLayout.rank = rank;</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (!onlyRank){</span>
-<span class="cstat-no" title="statement not covered" >                xNodeByRank[rank].push(node.x);</span>
-            }
-        }
-    });
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (onlyRank) <span class="cstat-no" title="statement not covered" >return;</span></span>
-&nbsp;
-    // sort the y by rank
-<span class="cstat-no" title="statement not covered" >    xNodeByRank.forEach(<span class="fstat-no" title="function not covered" >sublist </span>=&gt; {</span>
-<span class="cstat-no" title="statement not covered" >        sublist.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >a - b)</span>; </span>
-    });
-&nbsp;
-    // get the order for each node 
-<span class="cstat-no" title="statement not covered" >    Object.values(network.nodes).forEach(<span class="fstat-no" title="function not covered" >(n</span>ode) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (node.metadataLayout &amp;&amp; node.metadataLayout.rank!==undefined){</span>
-            const rank = <span class="cstat-no" title="statement not covered" >node.metadataLayout.rank;</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (rank&lt;xNodeByRank.length){</span>
-                const order = <span class="cstat-no" title="statement not covered" >xNodeByRank[rank].indexOf(node.x);</span>
-<span class="cstat-no" title="statement not covered" >                node.metadataLayout.order = order;</span>
-            }
-        }
-    });
-}
-&nbsp;
-&nbsp;
-/**
- * Get a list of nodes to use as start node for graph traversal (DFS for example)
- * @param network 
- * @param typeSource type of sources to get, with a certain order if several types
- * RANK_ONLY : sources are nodes of rank 0
- * SOURCE_ONLY : sources are topological sources of the network (nul indegree)
- * RANK_SOURCE : sources are node of rank 0, then source nodes
- * ALL : sources are all nodes
- * SOURCE_ALL : sources are topological sources, then all the others nodes
- * RANK_SOURCE_ALL : sources are node of rank 0, then topological sources, then all the other nodes
- * @returns the id of the sources
- */
-export async function <span class="fstat-no" title="function not covered" >getStartNodes(</span>network:Network, typeSource:StartNodesType):Promise&lt;Array&lt;string&gt;&gt;{
-&nbsp;
-    // if all nodes as source
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (typeSource==StartNodesType.ALL){</span>
-<span class="cstat-no" title="statement not covered" >        return Object.keys(network.nodes).sort();</span>
-    }
-&nbsp;
-    const start_rank:string[]=<span class="cstat-no" title="statement not covered" >[];</span>
-    const start_source:string[]=<span class="cstat-no" title="statement not covered" >[];</span>
-    const start_all:string[]=<span class="cstat-no" title="statement not covered" >[];</span>
-&nbsp;
-    // get object for data-graph-structure if indegree information needed (when source nodes needed)
-    let graph:{[key:string]:Function};
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if(needSource(typeSource)){</span>
-<span class="cstat-no" title="statement not covered" >        graph= await networkToGDSGraph(network);</span>
-    }
-&nbsp;
-    // adding node depending on sourcetype : Order is important !! 
-    // always rank, then source, then all
-<span class="cstat-no" title="statement not covered" >    Object.entries(network.nodes).sort(<span class="fstat-no" title="function not covered" >([</span>keyA], [keyB]) =&gt; <span class="cstat-no" title="statement not covered" >keyA.localeCompare(keyB))</span></span>
-    .map(<span class="fstat-no" title="function not covered" >([</span>, value]) =&gt; <span class="cstat-no" title="statement not covered" >value)</span>
-    .forEach(<span class="fstat-no" title="function not covered" >node </span>=&gt;{      
-<span class="cstat-no" title="statement not covered" >        if(needRank(typeSource) &amp;&amp; hasRank0(node)){</span>
-<span class="cstat-no" title="statement not covered" >            start_rank.push(node.id);</span>
-        } else <span class="cstat-no" title="statement not covered" >if (needSource(typeSource) &amp;&amp; graph.indegree(node.id)===0){</span>
-<span class="cstat-no" title="statement not covered" >            start_source.push(node.id);</span>
-        } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (needAll(typeSource)) {</span>
-<span class="cstat-no" title="statement not covered" >            start_all.push(node.id);</span>
-        }       
-    });
-    
-<span class="cstat-no" title="statement not covered" >    return start_rank.concat(start_source, start_all);</span>
-&nbsp;
-}
-&nbsp;
-&nbsp;
-/**
- * Node has rank 0 in metadata ?
- * @param node Node
- * @returns boolean
- */
-function <span class="fstat-no" title="function not covered" >hasRank0(</span>node:NodeLayout):boolean{
-<span class="cstat-no" title="statement not covered" >    return node.metadataLayout?.rank === 0;</span>
-}
-&nbsp;
-/**
- * Depending on the sourcetype, does the information of rank is needed ?
- * @param sourcetype 
- * @returns boolean
- */
-function <span class="fstat-no" title="function not covered" >needRank(</span>sourcetype:StartNodesType):boolean{
-<span class="cstat-no" title="statement not covered" >    return [StartNodesType.RANK_ONLY,StartNodesType.RANK_SOURCE,StartNodesType.RANK_SOURCE_ALL].includes(sourcetype);</span>
-}
-&nbsp;
-/**
- * Depending on the sourcetype, does the information of topological source is needed ?
- * @param sourcetype 
- * @returns boolean
- */
-function <span class="fstat-no" title="function not covered" >needSource(</span>sourcetype:StartNodesType):boolean{
-<span class="cstat-no" title="statement not covered" >    return [StartNodesType.SOURCE_ONLY,StartNodesType.SOURCE_ALL,StartNodesType.RANK_SOURCE,StartNodesType.RANK_SOURCE_ALL].includes(sourcetype);</span>
-}
-&nbsp;
-/**
- * Depending on the sourcetype, does all the nodes are needed ?
- * @param sourcetype 
- * @returns boolean
- */
-function <span class="fstat-no" title="function not covered" >needAll(</span>sourcetype:StartNodesType):boolean{
-<span class="cstat-no" title="statement not covered" >    return [StartNodesType.ALL,StartNodesType.SOURCE_ALL,StartNodesType.RANK_SOURCE_ALL].includes(sourcetype);</span>
-}
-&nbsp;
-/**
- * Concatenates two source arrays of strings and removes duplicates. The result is the first array, then the second (order is preserved).
- * @param firstSources - The first array of strings.
- * @param secondSources - The second array of strings.
- * @returns A new array containing the unique elements from both input arrays.
- */
-export function <span class="fstat-no" title="function not covered" >concatSources(</span>firstSources: string[], secondSources: string[]): string[] {
-    const result = <span class="cstat-no" title="statement not covered" >[...firstSources];</span>
-<span class="cstat-no" title="statement not covered" >    secondSources.forEach(<span class="fstat-no" title="function not covered" >item </span>=&gt; {</span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (!result.includes(item)) {</span>
-<span class="cstat-no" title="statement not covered" >            result.push(item);</span>
-        }
-    });
-<span class="cstat-no" title="statement not covered" >    return result;</span>
-}</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/ConvertFromNetwork.ts.html b/coverage/lcov-report/composables/ConvertFromNetwork.ts.html
deleted file mode 100644
index b83c057e04510157b141dce48df0d5dfd33b859e..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/ConvertFromNetwork.ts.html
+++ /dev/null
@@ -1,1537 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/ConvertFromNetwork.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> ConvertFromNetwork.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">9.15% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>13/142</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>0/96</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>0/31</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">9.62% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>13/135</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a>
-<a name='L150'></a><a href='#L150'>150</a>
-<a name='L151'></a><a href='#L151'>151</a>
-<a name='L152'></a><a href='#L152'>152</a>
-<a name='L153'></a><a href='#L153'>153</a>
-<a name='L154'></a><a href='#L154'>154</a>
-<a name='L155'></a><a href='#L155'>155</a>
-<a name='L156'></a><a href='#L156'>156</a>
-<a name='L157'></a><a href='#L157'>157</a>
-<a name='L158'></a><a href='#L158'>158</a>
-<a name='L159'></a><a href='#L159'>159</a>
-<a name='L160'></a><a href='#L160'>160</a>
-<a name='L161'></a><a href='#L161'>161</a>
-<a name='L162'></a><a href='#L162'>162</a>
-<a name='L163'></a><a href='#L163'>163</a>
-<a name='L164'></a><a href='#L164'>164</a>
-<a name='L165'></a><a href='#L165'>165</a>
-<a name='L166'></a><a href='#L166'>166</a>
-<a name='L167'></a><a href='#L167'>167</a>
-<a name='L168'></a><a href='#L168'>168</a>
-<a name='L169'></a><a href='#L169'>169</a>
-<a name='L170'></a><a href='#L170'>170</a>
-<a name='L171'></a><a href='#L171'>171</a>
-<a name='L172'></a><a href='#L172'>172</a>
-<a name='L173'></a><a href='#L173'>173</a>
-<a name='L174'></a><a href='#L174'>174</a>
-<a name='L175'></a><a href='#L175'>175</a>
-<a name='L176'></a><a href='#L176'>176</a>
-<a name='L177'></a><a href='#L177'>177</a>
-<a name='L178'></a><a href='#L178'>178</a>
-<a name='L179'></a><a href='#L179'>179</a>
-<a name='L180'></a><a href='#L180'>180</a>
-<a name='L181'></a><a href='#L181'>181</a>
-<a name='L182'></a><a href='#L182'>182</a>
-<a name='L183'></a><a href='#L183'>183</a>
-<a name='L184'></a><a href='#L184'>184</a>
-<a name='L185'></a><a href='#L185'>185</a>
-<a name='L186'></a><a href='#L186'>186</a>
-<a name='L187'></a><a href='#L187'>187</a>
-<a name='L188'></a><a href='#L188'>188</a>
-<a name='L189'></a><a href='#L189'>189</a>
-<a name='L190'></a><a href='#L190'>190</a>
-<a name='L191'></a><a href='#L191'>191</a>
-<a name='L192'></a><a href='#L192'>192</a>
-<a name='L193'></a><a href='#L193'>193</a>
-<a name='L194'></a><a href='#L194'>194</a>
-<a name='L195'></a><a href='#L195'>195</a>
-<a name='L196'></a><a href='#L196'>196</a>
-<a name='L197'></a><a href='#L197'>197</a>
-<a name='L198'></a><a href='#L198'>198</a>
-<a name='L199'></a><a href='#L199'>199</a>
-<a name='L200'></a><a href='#L200'>200</a>
-<a name='L201'></a><a href='#L201'>201</a>
-<a name='L202'></a><a href='#L202'>202</a>
-<a name='L203'></a><a href='#L203'>203</a>
-<a name='L204'></a><a href='#L204'>204</a>
-<a name='L205'></a><a href='#L205'>205</a>
-<a name='L206'></a><a href='#L206'>206</a>
-<a name='L207'></a><a href='#L207'>207</a>
-<a name='L208'></a><a href='#L208'>208</a>
-<a name='L209'></a><a href='#L209'>209</a>
-<a name='L210'></a><a href='#L210'>210</a>
-<a name='L211'></a><a href='#L211'>211</a>
-<a name='L212'></a><a href='#L212'>212</a>
-<a name='L213'></a><a href='#L213'>213</a>
-<a name='L214'></a><a href='#L214'>214</a>
-<a name='L215'></a><a href='#L215'>215</a>
-<a name='L216'></a><a href='#L216'>216</a>
-<a name='L217'></a><a href='#L217'>217</a>
-<a name='L218'></a><a href='#L218'>218</a>
-<a name='L219'></a><a href='#L219'>219</a>
-<a name='L220'></a><a href='#L220'>220</a>
-<a name='L221'></a><a href='#L221'>221</a>
-<a name='L222'></a><a href='#L222'>222</a>
-<a name='L223'></a><a href='#L223'>223</a>
-<a name='L224'></a><a href='#L224'>224</a>
-<a name='L225'></a><a href='#L225'>225</a>
-<a name='L226'></a><a href='#L226'>226</a>
-<a name='L227'></a><a href='#L227'>227</a>
-<a name='L228'></a><a href='#L228'>228</a>
-<a name='L229'></a><a href='#L229'>229</a>
-<a name='L230'></a><a href='#L230'>230</a>
-<a name='L231'></a><a href='#L231'>231</a>
-<a name='L232'></a><a href='#L232'>232</a>
-<a name='L233'></a><a href='#L233'>233</a>
-<a name='L234'></a><a href='#L234'>234</a>
-<a name='L235'></a><a href='#L235'>235</a>
-<a name='L236'></a><a href='#L236'>236</a>
-<a name='L237'></a><a href='#L237'>237</a>
-<a name='L238'></a><a href='#L238'>238</a>
-<a name='L239'></a><a href='#L239'>239</a>
-<a name='L240'></a><a href='#L240'>240</a>
-<a name='L241'></a><a href='#L241'>241</a>
-<a name='L242'></a><a href='#L242'>242</a>
-<a name='L243'></a><a href='#L243'>243</a>
-<a name='L244'></a><a href='#L244'>244</a>
-<a name='L245'></a><a href='#L245'>245</a>
-<a name='L246'></a><a href='#L246'>246</a>
-<a name='L247'></a><a href='#L247'>247</a>
-<a name='L248'></a><a href='#L248'>248</a>
-<a name='L249'></a><a href='#L249'>249</a>
-<a name='L250'></a><a href='#L250'>250</a>
-<a name='L251'></a><a href='#L251'>251</a>
-<a name='L252'></a><a href='#L252'>252</a>
-<a name='L253'></a><a href='#L253'>253</a>
-<a name='L254'></a><a href='#L254'>254</a>
-<a name='L255'></a><a href='#L255'>255</a>
-<a name='L256'></a><a href='#L256'>256</a>
-<a name='L257'></a><a href='#L257'>257</a>
-<a name='L258'></a><a href='#L258'>258</a>
-<a name='L259'></a><a href='#L259'>259</a>
-<a name='L260'></a><a href='#L260'>260</a>
-<a name='L261'></a><a href='#L261'>261</a>
-<a name='L262'></a><a href='#L262'>262</a>
-<a name='L263'></a><a href='#L263'>263</a>
-<a name='L264'></a><a href='#L264'>264</a>
-<a name='L265'></a><a href='#L265'>265</a>
-<a name='L266'></a><a href='#L266'>266</a>
-<a name='L267'></a><a href='#L267'>267</a>
-<a name='L268'></a><a href='#L268'>268</a>
-<a name='L269'></a><a href='#L269'>269</a>
-<a name='L270'></a><a href='#L270'>270</a>
-<a name='L271'></a><a href='#L271'>271</a>
-<a name='L272'></a><a href='#L272'>272</a>
-<a name='L273'></a><a href='#L273'>273</a>
-<a name='L274'></a><a href='#L274'>274</a>
-<a name='L275'></a><a href='#L275'>275</a>
-<a name='L276'></a><a href='#L276'>276</a>
-<a name='L277'></a><a href='#L277'>277</a>
-<a name='L278'></a><a href='#L278'>278</a>
-<a name='L279'></a><a href='#L279'>279</a>
-<a name='L280'></a><a href='#L280'>280</a>
-<a name='L281'></a><a href='#L281'>281</a>
-<a name='L282'></a><a href='#L282'>282</a>
-<a name='L283'></a><a href='#L283'>283</a>
-<a name='L284'></a><a href='#L284'>284</a>
-<a name='L285'></a><a href='#L285'>285</a>
-<a name='L286'></a><a href='#L286'>286</a>
-<a name='L287'></a><a href='#L287'>287</a>
-<a name='L288'></a><a href='#L288'>288</a>
-<a name='L289'></a><a href='#L289'>289</a>
-<a name='L290'></a><a href='#L290'>290</a>
-<a name='L291'></a><a href='#L291'>291</a>
-<a name='L292'></a><a href='#L292'>292</a>
-<a name='L293'></a><a href='#L293'>293</a>
-<a name='L294'></a><a href='#L294'>294</a>
-<a name='L295'></a><a href='#L295'>295</a>
-<a name='L296'></a><a href='#L296'>296</a>
-<a name='L297'></a><a href='#L297'>297</a>
-<a name='L298'></a><a href='#L298'>298</a>
-<a name='L299'></a><a href='#L299'>299</a>
-<a name='L300'></a><a href='#L300'>300</a>
-<a name='L301'></a><a href='#L301'>301</a>
-<a name='L302'></a><a href='#L302'>302</a>
-<a name='L303'></a><a href='#L303'>303</a>
-<a name='L304'></a><a href='#L304'>304</a>
-<a name='L305'></a><a href='#L305'>305</a>
-<a name='L306'></a><a href='#L306'>306</a>
-<a name='L307'></a><a href='#L307'>307</a>
-<a name='L308'></a><a href='#L308'>308</a>
-<a name='L309'></a><a href='#L309'>309</a>
-<a name='L310'></a><a href='#L310'>310</a>
-<a name='L311'></a><a href='#L311'>311</a>
-<a name='L312'></a><a href='#L312'>312</a>
-<a name='L313'></a><a href='#L313'>313</a>
-<a name='L314'></a><a href='#L314'>314</a>
-<a name='L315'></a><a href='#L315'>315</a>
-<a name='L316'></a><a href='#L316'>316</a>
-<a name='L317'></a><a href='#L317'>317</a>
-<a name='L318'></a><a href='#L318'>318</a>
-<a name='L319'></a><a href='#L319'>319</a>
-<a name='L320'></a><a href='#L320'>320</a>
-<a name='L321'></a><a href='#L321'>321</a>
-<a name='L322'></a><a href='#L322'>322</a>
-<a name='L323'></a><a href='#L323'>323</a>
-<a name='L324'></a><a href='#L324'>324</a>
-<a name='L325'></a><a href='#L325'>325</a>
-<a name='L326'></a><a href='#L326'>326</a>
-<a name='L327'></a><a href='#L327'>327</a>
-<a name='L328'></a><a href='#L328'>328</a>
-<a name='L329'></a><a href='#L329'>329</a>
-<a name='L330'></a><a href='#L330'>330</a>
-<a name='L331'></a><a href='#L331'>331</a>
-<a name='L332'></a><a href='#L332'>332</a>
-<a name='L333'></a><a href='#L333'>333</a>
-<a name='L334'></a><a href='#L334'>334</a>
-<a name='L335'></a><a href='#L335'>335</a>
-<a name='L336'></a><a href='#L336'>336</a>
-<a name='L337'></a><a href='#L337'>337</a>
-<a name='L338'></a><a href='#L338'>338</a>
-<a name='L339'></a><a href='#L339'>339</a>
-<a name='L340'></a><a href='#L340'>340</a>
-<a name='L341'></a><a href='#L341'>341</a>
-<a name='L342'></a><a href='#L342'>342</a>
-<a name='L343'></a><a href='#L343'>343</a>
-<a name='L344'></a><a href='#L344'>344</a>
-<a name='L345'></a><a href='#L345'>345</a>
-<a name='L346'></a><a href='#L346'>346</a>
-<a name='L347'></a><a href='#L347'>347</a>
-<a name='L348'></a><a href='#L348'>348</a>
-<a name='L349'></a><a href='#L349'>349</a>
-<a name='L350'></a><a href='#L350'>350</a>
-<a name='L351'></a><a href='#L351'>351</a>
-<a name='L352'></a><a href='#L352'>352</a>
-<a name='L353'></a><a href='#L353'>353</a>
-<a name='L354'></a><a href='#L354'>354</a>
-<a name='L355'></a><a href='#L355'>355</a>
-<a name='L356'></a><a href='#L356'>356</a>
-<a name='L357'></a><a href='#L357'>357</a>
-<a name='L358'></a><a href='#L358'>358</a>
-<a name='L359'></a><a href='#L359'>359</a>
-<a name='L360'></a><a href='#L360'>360</a>
-<a name='L361'></a><a href='#L361'>361</a>
-<a name='L362'></a><a href='#L362'>362</a>
-<a name='L363'></a><a href='#L363'>363</a>
-<a name='L364'></a><a href='#L364'>364</a>
-<a name='L365'></a><a href='#L365'>365</a>
-<a name='L366'></a><a href='#L366'>366</a>
-<a name='L367'></a><a href='#L367'>367</a>
-<a name='L368'></a><a href='#L368'>368</a>
-<a name='L369'></a><a href='#L369'>369</a>
-<a name='L370'></a><a href='#L370'>370</a>
-<a name='L371'></a><a href='#L371'>371</a>
-<a name='L372'></a><a href='#L372'>372</a>
-<a name='L373'></a><a href='#L373'>373</a>
-<a name='L374'></a><a href='#L374'>374</a>
-<a name='L375'></a><a href='#L375'>375</a>
-<a name='L376'></a><a href='#L376'>376</a>
-<a name='L377'></a><a href='#L377'>377</a>
-<a name='L378'></a><a href='#L378'>378</a>
-<a name='L379'></a><a href='#L379'>379</a>
-<a name='L380'></a><a href='#L380'>380</a>
-<a name='L381'></a><a href='#L381'>381</a>
-<a name='L382'></a><a href='#L382'>382</a>
-<a name='L383'></a><a href='#L383'>383</a>
-<a name='L384'></a><a href='#L384'>384</a>
-<a name='L385'></a><a href='#L385'>385</a>
-<a name='L386'></a><a href='#L386'>386</a>
-<a name='L387'></a><a href='#L387'>387</a>
-<a name='L388'></a><a href='#L388'>388</a>
-<a name='L389'></a><a href='#L389'>389</a>
-<a name='L390'></a><a href='#L390'>390</a>
-<a name='L391'></a><a href='#L391'>391</a>
-<a name='L392'></a><a href='#L392'>392</a>
-<a name='L393'></a><a href='#L393'>393</a>
-<a name='L394'></a><a href='#L394'>394</a>
-<a name='L395'></a><a href='#L395'>395</a>
-<a name='L396'></a><a href='#L396'>396</a>
-<a name='L397'></a><a href='#L397'>397</a>
-<a name='L398'></a><a href='#L398'>398</a>
-<a name='L399'></a><a href='#L399'>399</a>
-<a name='L400'></a><a href='#L400'>400</a>
-<a name='L401'></a><a href='#L401'>401</a>
-<a name='L402'></a><a href='#L402'>402</a>
-<a name='L403'></a><a href='#L403'>403</a>
-<a name='L404'></a><a href='#L404'>404</a>
-<a name='L405'></a><a href='#L405'>405</a>
-<a name='L406'></a><a href='#L406'>406</a>
-<a name='L407'></a><a href='#L407'>407</a>
-<a name='L408'></a><a href='#L408'>408</a>
-<a name='L409'></a><a href='#L409'>409</a>
-<a name='L410'></a><a href='#L410'>410</a>
-<a name='L411'></a><a href='#L411'>411</a>
-<a name='L412'></a><a href='#L412'>412</a>
-<a name='L413'></a><a href='#L413'>413</a>
-<a name='L414'></a><a href='#L414'>414</a>
-<a name='L415'></a><a href='#L415'>415</a>
-<a name='L416'></a><a href='#L416'>416</a>
-<a name='L417'></a><a href='#L417'>417</a>
-<a name='L418'></a><a href='#L418'>418</a>
-<a name='L419'></a><a href='#L419'>419</a>
-<a name='L420'></a><a href='#L420'>420</a>
-<a name='L421'></a><a href='#L421'>421</a>
-<a name='L422'></a><a href='#L422'>422</a>
-<a name='L423'></a><a href='#L423'>423</a>
-<a name='L424'></a><a href='#L424'>424</a>
-<a name='L425'></a><a href='#L425'>425</a>
-<a name='L426'></a><a href='#L426'>426</a>
-<a name='L427'></a><a href='#L427'>427</a>
-<a name='L428'></a><a href='#L428'>428</a>
-<a name='L429'></a><a href='#L429'>429</a>
-<a name='L430'></a><a href='#L430'>430</a>
-<a name='L431'></a><a href='#L431'>431</a>
-<a name='L432'></a><a href='#L432'>432</a>
-<a name='L433'></a><a href='#L433'>433</a>
-<a name='L434'></a><a href='#L434'>434</a>
-<a name='L435'></a><a href='#L435'>435</a>
-<a name='L436'></a><a href='#L436'>436</a>
-<a name='L437'></a><a href='#L437'>437</a>
-<a name='L438'></a><a href='#L438'>438</a>
-<a name='L439'></a><a href='#L439'>439</a>
-<a name='L440'></a><a href='#L440'>440</a>
-<a name='L441'></a><a href='#L441'>441</a>
-<a name='L442'></a><a href='#L442'>442</a>
-<a name='L443'></a><a href='#L443'>443</a>
-<a name='L444'></a><a href='#L444'>444</a>
-<a name='L445'></a><a href='#L445'>445</a>
-<a name='L446'></a><a href='#L446'>446</a>
-<a name='L447'></a><a href='#L447'>447</a>
-<a name='L448'></a><a href='#L448'>448</a>
-<a name='L449'></a><a href='#L449'>449</a>
-<a name='L450'></a><a href='#L450'>450</a>
-<a name='L451'></a><a href='#L451'>451</a>
-<a name='L452'></a><a href='#L452'>452</a>
-<a name='L453'></a><a href='#L453'>453</a>
-<a name='L454'></a><a href='#L454'>454</a>
-<a name='L455'></a><a href='#L455'>455</a>
-<a name='L456'></a><a href='#L456'>456</a>
-<a name='L457'></a><a href='#L457'>457</a>
-<a name='L458'></a><a href='#L458'>458</a>
-<a name='L459'></a><a href='#L459'>459</a>
-<a name='L460'></a><a href='#L460'>460</a>
-<a name='L461'></a><a href='#L461'>461</a>
-<a name='L462'></a><a href='#L462'>462</a>
-<a name='L463'></a><a href='#L463'>463</a>
-<a name='L464'></a><a href='#L464'>464</a>
-<a name='L465'></a><a href='#L465'>465</a>
-<a name='L466'></a><a href='#L466'>466</a>
-<a name='L467'></a><a href='#L467'>467</a>
-<a name='L468'></a><a href='#L468'>468</a>
-<a name='L469'></a><a href='#L469'>469</a>
-<a name='L470'></a><a href='#L470'>470</a>
-<a name='L471'></a><a href='#L471'>471</a>
-<a name='L472'></a><a href='#L472'>472</a>
-<a name='L473'></a><a href='#L473'>473</a>
-<a name='L474'></a><a href='#L474'>474</a>
-<a name='L475'></a><a href='#L475'>475</a>
-<a name='L476'></a><a href='#L476'>476</a>
-<a name='L477'></a><a href='#L477'>477</a>
-<a name='L478'></a><a href='#L478'>478</a>
-<a name='L479'></a><a href='#L479'>479</a>
-<a name='L480'></a><a href='#L480'>480</a>
-<a name='L481'></a><a href='#L481'>481</a>
-<a name='L482'></a><a href='#L482'>482</a>
-<a name='L483'></a><a href='#L483'>483</a>
-<a name='L484'></a><a href='#L484'>484</a>
-<a name='L485'></a><a href='#L485'>485</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import { Network } from '@metabohub/viz-core/src/types/Network';
-import { Subgraph, TypeSubgraph } from '../types/Subgraph';
-import { SubgraphNetwork } from '../types/SubgraphNetwork';
-import { Node } from '@metabohub/viz-core/src/types/Node';
-import { LinkLayout, NetworkLayout, NodeLayout } from '../types/NetworkLayout';
-import { Ordering } from '../types/EnumArgs';
-&nbsp;
-// Composable imports
-import { addMainChainForViz,subgraphDot } from './SubgraphForViz';
-import { getSizeNodePixel, pixelsToInches } from './CalculateSize';
-import { inCycle } from './GetSetAttributsNodes';
-import { cycleMetanodeLink, sortLinksWithAllGroupCycle } from './CalculateRelationCycle';
-&nbsp;
-&nbsp;
-// General imports
-//import  dagre  from 'dagrejs/dist/dagre.js';
-import { Graph } from "@viz-js/viz";
-import * as GDS from 'graph-data-structure';
-import { h } from 'vue';
-import { link } from 'fs';
-//import { s } from 'vitest/dist/reporters-1evA5lom';
-import { get } from 'http';
-//import cytoscape, { ElementDefinition,Stylesheet } from 'cytoscape';
-import { layout } from 'dagrejs';
-import { dot } from 'node:test/reporters';
-&nbsp;
-&nbsp;
-/**
- * This file contains functions to convert a network object into different formats.
- * 
- * *********************************
- * 0.  Graph 
- * 
- * -&gt; networktoNetworkLayout
- *      convert a network object into a network layout object (network with information to calculate layout)
- * 
- * -&gt; networkToSerialized
- *      take a network object and return a serialized object for graph-data-strucutre lib containing the same nodes and edge
- * 
- * -&gt; networkToGDSGraph
- *      take a network object and return a graph object for graph-data-structure
- * 
- * -&gt; networkToAdjacentObject
- *      convert a network into an adjacency object.
- * 
- * *********************************
- * 1.  Layout library
- * 
- * -&gt; networkToDagre
- *     take a network object and return a dagre.graphlib.Graph object containing the same nodes and edge
- * 
- * -&gt; networkToCytoscape
- *      take a network object and return a cytoscape object containing the same nodes and edge
- * 
- * -&gt; networkToDOT
- *      take a network object and return a DOT string representation
- * 
- * -&gt; networkToViz
- *     take a network object and return a graph object for viz containing the same nodes and edge
- * 
- * -&gt; graphVizToDot
- *      converts a viz graph to a DOT string representation.
- * 
- * -&gt; customStringify
- *     converts an object into a custom string representation (used in graphVizToDot)
- * 
- * 
- */
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________0.  Graph __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Convert a network object into a network layout object (network with information to calculate layout)
- * @param network the network object to convert
- * @returns the new network layout object
- */
-export function <span class="fstat-no" title="function not covered" >networktoNetworkLayout(</span>network: Network): NetworkLayout {
-  
-    // Convert nodes
-    const nodes: { [key: string]: NodeLayout } = <span class="cstat-no" title="statement not covered" >Object.keys(network.nodes).reduce(</span>
-<span class="fstat-no" title="function not covered" >      (a</span>cc, key) =&gt; {
-        const node = <span class="cstat-no" title="statement not covered" >network.nodes[key];</span>
-<span class="cstat-no" title="statement not covered" >        acc[key] = {</span>
-          ...node,
-          metadataLayout: {}
-        };
-<span class="cstat-no" title="statement not covered" >        return acc;</span>
-      },
-      {} as { [key: string]: NodeLayout }
-    );
-  
-    // Convert links
-    const links: Array&lt;LinkLayout&gt; = <span class="cstat-no" title="statement not covered" >network.links.map(<span class="fstat-no" title="function not covered" >link </span>=&gt; <span class="cstat-no" title="statement not covered" >({</span></span>
-      ...link,
-      source: nodes[link.source.id], // update of pointer
-      target: nodes[link.target.id], // update of pointer
-      metadataLayout: {}
-    }));
-  
-    // Convert network to network layout
-    const networkLayout: NetworkLayout = <span class="cstat-no" title="statement not covered" >{</span>
-      ...network,
-      nodes,
-      links,
-    } as NetworkLayout;
-  
-<span class="cstat-no" title="statement not covered" >    return networkLayout;</span>
-  }
-&nbsp;
-&nbsp;
-  /**
- * Take a network object and return a serialized object for graph-data-strucutre lib containing the same nodes and edge 
- * @param {Network}  Network object 
- * @returns {Serialized} Return serialized object for graph-data-strucutre
- */
-export function <span class="fstat-no" title="function not covered" >networkToSerialized(</span>network: Network): GDS.Serialized {
-    const serializedNodes = <span class="cstat-no" title="statement not covered" >Object.values(network.nodes).map(<span class="fstat-no" title="function not covered" >node </span>=&gt; (<span class="cstat-no" title="statement not covered" >{ id: node.id })</span>)</span>
-    .sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >a.id.localeCompare(b.id))</span>;
-    const serializedLinks = <span class="cstat-no" title="statement not covered" >network.links.map(<span class="fstat-no" title="function not covered" >link </span>=&gt; (<span class="cstat-no" title="statement not covered" >{</span></span>
-        source: link.source.id,
-        target: link.target.id,
-        weight: 1 
-    }));
-<span class="cstat-no" title="statement not covered" >    return { nodes: serializedNodes, links: serializedLinks };</span>
-}
-&nbsp;
-&nbsp;
-/**
- * Take a network object and return a graph for graph-data-structure
- * @param network 
- * @returns Graph object as {[key:string]:Function}
- */
-export async function <span class="fstat-no" title="function not covered" >networkToGDSGraph(</span>network: Network):Promise&lt;{[key:string]:Function}&gt;{ 
-    const graph = <span class="cstat-no" title="statement not covered" >GDS.Graph();</span>
-    const networkSerialized: GDS.Serialized = <span class="cstat-no" title="statement not covered" >networkToSerialized(network);</span>
-<span class="cstat-no" title="statement not covered" >    graph.deserialize(networkSerialized);</span>
-<span class="cstat-no" title="statement not covered" >    return graph;</span>
-}
-&nbsp;
-&nbsp;
-/**
- * Convert a network into an adjacency object.
- * @param network The network to convert.
- * @returns An adjacency object representing the network : an object with nodes as key, and children of node as values
- */
-export function <span class="fstat-no" title="function not covered" >networkToAdjacentObject(</span>network:Network):{[key : string]:string[]}{
-    const adjacence:{[key : string]:string[]}=<span class="cstat-no" title="statement not covered" >{};</span>
-<span class="cstat-no" title="statement not covered" >    Object.keys(network.nodes).forEach(<span class="fstat-no" title="function not covered" >node=</span>&gt;{</span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (!(node in Object.keys(adjacence))){</span>
-<span class="cstat-no" title="statement not covered" >            adjacence[node]=[];</span>
-        }
-    })
-<span class="cstat-no" title="statement not covered" >    network.links.forEach(<span class="fstat-no" title="function not covered" >link=</span>&gt;{</span>
-        const source=<span class="cstat-no" title="statement not covered" >link.source.id;</span>
-        const target=<span class="cstat-no" title="statement not covered" >link.target.id;</span>
-<span class="cstat-no" title="statement not covered" >        adjacence[source].push(target);</span>
-    });
-<span class="cstat-no" title="statement not covered" >    return adjacence;</span>
-}
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________1.  Layout library __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-/** 
- * Take a network object and return a dagre.graphlib.Graph object containing the same nodes and edge 
- * @param {Network}  Network object 
- * @param  graphAttributes for dagre layout (see https://github.com/dagrejs/dagre/wiki)
- * @returns {dagre.graphlib.Graph} Return dagre.graphlib.Graph object 
- */
-// export function networkToDagre(network: Network,graphAttributes={}): dagre.graphlib.Graph{
-&nbsp;
-//     // initialisation dagre graph
-//     var g = new dagre.graphlib.Graph();
-//     g.setGraph(graphAttributes);
-//     g.setDefaultEdgeLabel(() =&gt; ({}));
-&nbsp;
-//     // insert nodes into graph
-//     Object.values(network.nodes).forEach((node) =&gt; {
-//         const { id, label, x, y } = node;
-//         g.setNode(id, { label, width: 100, height: 100, x, y });
-//     });
-&nbsp;
-//     // insert edges into graph
-//     network.links.forEach((link) =&gt; {
-//         const { source, target } = link;
-//         g.setEdge(source.id, target.id);
-//     });
-&nbsp;
-//     return g;
-&nbsp;
-// }
-&nbsp;
-&nbsp;
-  
-/**
- * Converts a network object to a Cytoscape object.
- * 
- * @param network - The network object to convert.
- * @param initialPosition - Optional. Specifies whether to initialize the position of the nodes. Default is false.
- * @returns The converted Cytoscape object.
- */
-// export function networkToCytoscape(network: Network, initialPosition:boolean=false): cytoscape.Core {
-&nbsp;
-//     // Convert nodes
-//     const nodes: ElementDefinition[] = Object.values(network.nodes).map(node =&gt; ({
-//         data: {
-//           id: node.id,
-//         },
-//         position: {
-//           x: node.x,
-//           y: node.y,
-//         },
-//       }));
-  
-//     // Convert links
-//     const edges: ElementDefinition[] = [];
-//     network.links.forEach(link =&gt; {
-//         edges.push({
-//         data: {
-//           id: link.id,
-//           source: link.source.id,
-//           target: link.target.id,
-//         }
-//       });
-//     });
-&nbsp;
-&nbsp;
-//     if (initialPosition){
-//         return cytoscape({
-//             container: undefined, 
-//             elements: {nodes:nodes, edges:edges},
-//             layout: { 
-//               name: 'preset', // to initialize the position of the nodes
-//             },
-//     });
-//     }else{
-//         return cytoscape({
-//         container: undefined, 
-//         elements: {nodes:nodes, edges:edges},
-//         });
-//   }
-// }
-&nbsp;
-&nbsp;
-/**
- * Converts a SubgraphNetwork object to a DOT string representation.
- * 
- * @param subgraphNetwork - The SubgraphNetwork object to convert.
- * @param cycle - Optional. Specifies whether to include cycles in the DOT string. Default is true.
- * @param addNodes - Optional. Specifies whether to include nodes in the DOT string. Default is true.
- * @param groupOrCluster - Optional. Specifies whether to use "group" or "cluster" for grouping nodes. Default is "cluster".
- * @param orderChange - Optional. Specifies whether to change the order of links in the DOT string. Default is false.
- * @returns The DOT string representation of the SubgraphNetwork.
- */
-export function <span class="fstat-no" title="function not covered" >networkToDOT(</span>subgraphNetwork:SubgraphNetwork,cycle:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true,</span> addNodes:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true,</span>groupOrCluster:"group"|"cluster"=<span class="branch-0 cbranch-no" title="branch not covered" >"cluster",</span>orderChange:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: string{
-    const graphViz=<span class="cstat-no" title="statement not covered" >networkToViz(subgraphNetwork,cycle,addNodes,groupOrCluster,orderChange);</span>
-    const dotString=<span class="cstat-no" title="statement not covered" >graphVizToDot(graphViz);</span>
-<span class="cstat-no" title="statement not covered" >    return dotString;</span>
-}
-&nbsp;
-/**
- * Take a network object and return a graph object for viz containing the same nodes and edge 
- * @param {Network}  Network object 
- * @param  graphAttributes for viz dot layout (see https://graphviz.org/docs/layouts/dot/)
- * @param clusters clusters for viz
- * @returns {Graph} Return graph object for viz
- */
-export function <span class="fstat-no" title="function not covered" >networkToViz(</span>subgraphNetwork:SubgraphNetwork,cycle:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true,</span> addNodes:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true,</span>groupOrCluster:"group"|"cluster"=<span class="branch-0 cbranch-no" title="branch not covered" >"cluster",</span>orderChange:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: Graph{
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    if (groupOrCluster==="group" &amp;&amp; !addNodes){</span>
-<span class="cstat-no" title="statement not covered" >        console.warn('Group without nodes in the file not taken into account'); </span>
-    }else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (groupOrCluster==="cluster" &amp;&amp; orderChange){</span>
-<span class="cstat-no" title="statement not covered" >        console.warn('When ordering and cluster : cluster is prioritized over ordering');</span>
-    }
-&nbsp;
-    // initialisation viz graph
-    let graphViz: Graph =<span class="cstat-no" title="statement not covered" >{</span>
-        graphAttributes: subgraphNetwork.attributs,
-        directed: true,
-        edges: [],
-        nodes: [],
-        subgraphs:[]
-    }
-&nbsp;
-    // insert nodes 
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (addNodes){</span>
-<span class="cstat-no" title="statement not covered" >        Object.entries(subgraphNetwork.network.nodes)</span>
-        .sort(<span class="fstat-no" title="function not covered" >([</span>keyA], [keyB]) =&gt; <span class="cstat-no" title="statement not covered" >keyA.localeCompare(keyB))</span>
-        .forEach(<span class="fstat-no" title="function not covered" >([</span>key, node])=&gt; { 
-            const nodeViz=<span class="cstat-no" title="statement not covered" >nodeForViz(subgraphNetwork,node,cycle,groupOrCluster);</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (nodeViz &amp;&amp; graphViz.nodes &amp;&amp; !graphViz.nodes.some(<span class="fstat-no" title="function not covered" >node </span>=&gt; <span class="cstat-no" title="statement not covered" >node.name === nodeViz.name)</span>){</span>
-<span class="cstat-no" title="statement not covered" >                graphViz.nodes.push(nodeViz);   </span>
-            }   
-        });
-    }
-    
-    // insert link (but with cycle metanode if cycle is true) 
-    let links:LinkLayout[]=<span class="cstat-no" title="statement not covered" >[];</span>
-    const resultOrdering=<span class="cstat-no" title="statement not covered" >sortLinksWithAllGroupCycle(subgraphNetwork,orderChange);</span>   // order of link changed  for cycle group
-<span class="cstat-no" title="statement not covered" >    links=resultOrdering.linksOrdered;</span>
-<span class="cstat-no" title="statement not covered" >    subgraphNetwork=resultOrdering.subgraphNetwork; </span>// BEWARE: do this before adding cycle metanode (because of attribut ordering)
-<span class="cstat-no" title="statement not covered" >    links.forEach(<span class="fstat-no" title="function not covered" >(l</span>ink)=&gt;{   </span>
-        // get tail and head (take into account cycle metanode)
-        const {tail,head}=<span class="cstat-no" title="statement not covered" >cycleMetanodeLink(link,cycle);</span>
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (tail!==head &amp;&amp;  graphViz.edges &amp;&amp; !graphViz.edges.some(<span class="fstat-no" title="function not covered" >edge </span>=&gt; <span class="cstat-no" title="statement not covered" >edge.tail === tail &amp;&amp; edge.head === head)</span>){</span>
-<span class="cstat-no" title="statement not covered" >            graphViz.edges.push({</span>
-                tail: tail,
-                head: head,
-            });
-        }
-    });
-        
-&nbsp;
-    // insert mainChain cluster 
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (groupOrCluster==="cluster" &amp;&amp; subgraphNetwork[TypeSubgraph.MAIN_CHAIN]){</span>
-        const mainChain = <span class="cstat-no" title="statement not covered" >subgraphNetwork[TypeSubgraph.MAIN_CHAIN];</span>
-<span class="cstat-no" title="statement not covered" >        Object.keys(mainChain).sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >mainChain[b].nodes.length - mainChain[a].nodes.length)</span> // sort depending on size : bigger first</span>
-            .forEach(<span class="fstat-no" title="function not covered" >(n</span>ameMainChain) =&gt; {
-<span class="cstat-no" title="statement not covered" >                graphViz=addMainChainForViz(graphViz,nameMainChain,subgraphNetwork,cycle);</span>
-        });
-    }
-&nbsp;
-    // insert cycle metanode
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (cycle &amp;&amp; subgraphNetwork[TypeSubgraph.CYCLEGROUP]){</span>
-        const cycleGroup=<span class="cstat-no" title="statement not covered" >subgraphNetwork[TypeSubgraph.CYCLEGROUP];</span>
-<span class="cstat-no" title="statement not covered" >        Object.values(cycleGroup).sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; { // sort depending on size : bigger first</span>
-            const widthA = <span class="cstat-no" title="statement not covered" >a?.width;</span>
-            const widthB = <span class="cstat-no" title="statement not covered" >b?.width;</span>
-            const heightA = <span class="cstat-no" title="statement not covered" >a?.height;</span>
-            const heightB = <span class="cstat-no" title="statement not covered" >b?.height;</span>
-<span class="cstat-no" title="statement not covered" >            if (widthA &amp;&amp; widthB &amp;&amp; heightA &amp;&amp; heightB){</span>
-                const areaB = <span class="cstat-no" title="statement not covered" >widthB * heightB;</span>
-                const areaA = <span class="cstat-no" title="statement not covered" >widthA * heightA;</span>
-<span class="cstat-no" title="statement not covered" >                return areaB - areaA;</span>
-            }else{
-<span class="cstat-no" title="statement not covered" >                throw new Error("Cycle group without width or height");</span>
-            }
-        })
-        .forEach(<span class="fstat-no" title="function not covered" >(c</span>ycleGroup) =&gt; {
-            const attributes:AttributesViz=<span class="cstat-no" title="statement not covered" >{fixedsize:true};</span>
-&nbsp;
-            const heightPixel=<span class="cstat-no" title="statement not covered" >cycleGroup?.height;</span>
-            const widthPixel=<span class="cstat-no" title="statement not covered" >cycleGroup?.width;</span>
-<span class="cstat-no" title="statement not covered" >            if(heightPixel &amp;&amp; widthPixel){</span>
-                const height=<span class="cstat-no" title="statement not covered" >pixelsToInches(heightPixel);</span>
-                const width=<span class="cstat-no" title="statement not covered" >pixelsToInches(widthPixel);</span>
-<span class="cstat-no" title="statement not covered" >                attributes.height=height;</span>
-<span class="cstat-no" title="statement not covered" >                attributes.width=width;</span>
-            }else{
-<span class="cstat-no" title="statement not covered" >                throw new Error("Cycle group without width or height");</span>
-            }
-<span class="cstat-no" title="statement not covered" >            if(orderChange &amp;&amp; cycleGroup.ordering!==undefined){</span>
-<span class="cstat-no" title="statement not covered" >                attributes.ordering=cycleGroup.ordering;</span>
-            }else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (orderChange &amp;&amp; !cycleGroup.ordering){</span>
-<span class="cstat-no" title="statement not covered" >                throw new Error("Demand of change order but cycle group without ordering");</span>
-            }
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (!graphViz.nodes) <span class="cstat-no" title="statement not covered" >graphViz.nodes=[];</span></span>
-<span class="cstat-no" title="statement not covered" >            graphViz.nodes.push({name:cycleGroup.name, attributes:attributes});</span>
-        });
-    }
-<span class="cstat-no" title="statement not covered" >    return graphViz;</span>
-}
-&nbsp;
-/**
- * Converts a node from the subgraph network to a format suitable for the Viz library.
- * 
- * @param subgraphNetwork - The subgraph network.
- * @param node - The node
- * @param cycle - Indicates whether cycle is taken into account : no node if in a metanode cycle
- * @param groupOrCluster - Specifies whether the node belongs to a group or cluster.
- * @returns An object containing the name and attributes of the converted node.
- */
-function <span class="fstat-no" title="function not covered" >nodeForViz(</span>subgraphNetwork:SubgraphNetwork,node:NodeLayout,cycle:boolean,groupOrCluster:"group"|"cluster"):{name:string,attributes:AttributesViz}|undefined{
-    // if cycle not taken into account or not in cycle
-<span class="cstat-no" title="statement not covered" >    if (!cycle || !inCycle(subgraphNetwork.network,node.id)){</span>
-        const attributes:AttributesViz=<span class="cstat-no" title="statement not covered" >{};</span>
-        // size of node in inches
-        const sizeNode= <span class="cstat-no" title="statement not covered" >getSizeNodePixel(node,subgraphNetwork.networkStyle);</span>
-<span class="cstat-no" title="statement not covered" >        attributes.height=pixelsToInches(sizeNode.height);</span>
-<span class="cstat-no" title="statement not covered" >        attributes.width=pixelsToInches(sizeNode.width);</span>
-<span class="cstat-no" title="statement not covered" >        attributes.fixedsize=true;</span>
-        // if main chain : add group attribut
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (groupOrCluster==="group"){</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (node.metadataLayout &amp;&amp; node.metadataLayout[TypeSubgraph.MAIN_CHAIN]){</span>
-                const mainChain=<span class="cstat-no" title="statement not covered" >node.metadataLayout[TypeSubgraph.MAIN_CHAIN];</span>
-<span class="cstat-no" title="statement not covered" >                <span class="missing-if-branch" title="if path not taken" >I</span>if (mainChain.length!==0){</span>
-<span class="cstat-no" title="statement not covered" >                    attributes.group=mainChain[0]; </span>// can't be in several main chain
-                }
-            }
-        }
-<span class="cstat-no" title="statement not covered" >        return {name:node.id,attributes:attributes};</span>
-    }else{
-<span class="cstat-no" title="statement not covered" >        return undefined;</span>
-    }
-}
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Converts a viz graph to a DOT string representation.
- * 
- * @param vizGraph - The network graph to convert.
- * @param subgraphFirst - Determines whether subgraphs should be placed before nodes and edges. Default is true.
- * @returns The DOT string representation of the network graph.
- */
-export function <span class="fstat-no" title="function not covered" >graphVizToDot(</span>vizGraph:Graph, subgraphFirst:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true)</span>:string{
-    // initialisation viz graph with graph attributs
-    let dotString=<span class="cstat-no" title="statement not covered" >"strict digraph G {\n graph "+customStringify(vizGraph.graphAttributes as AttributesViz)+"\n";</span>
-    
-<span class="cstat-no" title="statement not covered" >    if (subgraphFirst){</span>
-        // clusters
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (vizGraph.subgraphs) {</span>
-<span class="cstat-no" title="statement not covered" >            vizGraph.subgraphs.forEach(<span class="fstat-no" title="function not covered" >(s</span>ubgraph) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >                dotString+=subgraphDot(subgraph as SubgraphViz);</span>
-            });
-        }
-&nbsp;
-        // nodes 
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (vizGraph.nodes){</span>
-<span class="cstat-no" title="statement not covered" >            vizGraph.nodes.forEach(<span class="fstat-no" title="function not covered" >(n</span>ode) =&gt; {</span>
-                const nodeAttributes= <span class="cstat-no" title="statement not covered" >customStringify(node.attributes as AttributesViz);</span>
-<span class="cstat-no" title="statement not covered" >                dotString+=`${node.name}  ${nodeAttributes};\n`;</span>
-            });
-        }
-&nbsp;
-        // edges 
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (vizGraph.edges){</span>
-<span class="cstat-no" title="statement not covered" >            vizGraph.edges.forEach(<span class="fstat-no" title="function not covered" >(e</span>dge) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >                dotString+=`${edge.tail} -&gt; ${edge.head};\n`;</span>
-            });
-        }
-    } else {
-&nbsp;
-        // nodes 
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (vizGraph.nodes){</span>
-<span class="cstat-no" title="statement not covered" >            vizGraph.nodes.forEach(<span class="fstat-no" title="function not covered" >(n</span>ode) =&gt; {</span>
-                const nodeAttributes= <span class="cstat-no" title="statement not covered" >customStringify(node.attributes as AttributesViz);</span>
-<span class="cstat-no" title="statement not covered" >                dotString+=`${node.name}  ${nodeAttributes};\n`;</span>
-            });
-        }
-        // edges 
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (vizGraph.edges){</span>
-<span class="cstat-no" title="statement not covered" >            vizGraph.edges.forEach(<span class="fstat-no" title="function not covered" >(e</span>dge) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >                dotString+=`${edge.tail} -&gt; ${edge.head};\n`;</span>
-            });
-        }
-&nbsp;
-        // clusters
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (vizGraph.subgraphs) {</span>
-<span class="cstat-no" title="statement not covered" >            vizGraph.subgraphs.forEach(<span class="fstat-no" title="function not covered" >(s</span>ubgraph) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >                dotString+=subgraphDot(subgraph as SubgraphViz);</span>
-            });
-        }
-    }
-    
-<span class="cstat-no" title="statement not covered" >    return dotString+"}";</span>
-}
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Converts an object to a string representation with attribute-value pairs.
- * 
- * @param obj - The object to convert.
- * @returns A string representation of the object with attribute-value pairs.
- */
-function <span class="fstat-no" title="function not covered" >customStringify(</span>obj:AttributesViz|undefined) {
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (!obj || Object.keys(obj).length === 0) {</span>
-<span class="cstat-no" title="statement not covered" >        return "[]";</span>
-    }
-    let str = <span class="cstat-no" title="statement not covered" >'[';</span>
-<span class="cstat-no" title="statement not covered" >    for (let key in obj) {</span>
-<span class="cstat-no" title="statement not covered" >        str += `${key}="${obj[key]}", `;</span>
-    }
-<span class="cstat-no" title="statement not covered" >    str = str.slice(0, -2); </span>// remove trailing comma and space
-<span class="cstat-no" title="statement not covered" >    str += ']';</span>
-<span class="cstat-no" title="statement not covered" >    return str;</span>
-}</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/ConvertToNetwork.ts.html b/coverage/lcov-report/composables/ConvertToNetwork.ts.html
deleted file mode 100644
index be22aacfc36003eb2521e71ff47410f1e0178717..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/ConvertToNetwork.ts.html
+++ /dev/null
@@ -1,541 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/ConvertToNetwork.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> ConvertToNetwork.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">12.9% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>4/31</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>0/28</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>0/6</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">13.33% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>4/30</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a>
-<a name='L150'></a><a href='#L150'>150</a>
-<a name='L151'></a><a href='#L151'>151</a>
-<a name='L152'></a><a href='#L152'>152</a>
-<a name='L153'></a><a href='#L153'>153</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import { JsonViz } from '../types/FormatJsonViz';
-import { Coordinate } from '../types/CoordinatesSize';
-import { Network } from '@metabohub/viz-core/src/types/Network';
-import type { Node } from "@metabohub/viz-core/src/types/Node";
-import { NetworkLayout } from '../types/NetworkLayout';
-import { SubgraphNetwork } from '../types/SubgraphNetwork';
-&nbsp;
-// Composable imports
-import { assignRankOrder } from './CalculateStartNodes';
-import { getSizeNodePixel } from './CalculateSize';
-&nbsp;
-// General imports
-// import cytoscape, { ElementDefinition } from 'cytoscape';
-// import  dagre  from 'dagrejs/dist/dagre.js';
-import { type } from 'os';
-import { TypeSubgraph } from '../types/Subgraph';
-&nbsp;
-/**
- * This file contains functions to get or update a network from another format.
- * 
- * -&gt; networkLayoutToNetwork :
- *      Convert a network layout object (network with information to calculate layout) into a network object
- * 
- * -&gt; changeNetworkFromDagre :
- *      Take dagre.graphlib.Graph object and the network associated (with the graph) : change the position and metadata (rank and order) of network's node by the one of the graph.
- * 
- * -&gt; changeNetworkFromViz :
- *      Take a json of a viz graph and the network associated (with the json) : change the position and metadata (rank and order) of network's node by the one of the json.
- * 
- * -&gt; changeNetworkFromCytoscape :
- *      Updates the positions of nodes in the network based on the provided Cytoscape JSON.
- */
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Convert a network layout object (network with information to calculate layout) into a network object
- * @param networkLayout the network layout object
- * @returns the new network object
- */
-export function <span class="fstat-no" title="function not covered" >networkLayoutToNetwork(</span>networkLayout: NetworkLayout): Network {
-&nbsp;
-<span class="cstat-no" title="statement not covered" >  Object.values(networkLayout.nodes).forEach(<span class="fstat-no" title="function not covered" >(n</span>odeLayout) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >    delete nodeLayout.metadataLayout;</span>
-  });
-&nbsp;
-<span class="cstat-no" title="statement not covered" >  networkLayout.links.forEach(<span class="fstat-no" title="function not covered" >(l</span>inkLayout) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >    delete linkLayout.metadataLayout; </span>
-  });
-&nbsp;
-<span class="cstat-no" title="statement not covered" >  return networkLayout as Network;</span>
-}
-&nbsp;
-&nbsp;
-// /**
-//  * Take dagre.graphlib.Graph object and the network associated (with the graph) : change the position and metadata (rank and order) of network's node by the one of the graph.
-//  * The graph and network need to have the same nodes !
-//  * @param {dagre.graphlib.Graph}  dagre.graphlib.Graph object 
-//  * @param {Network} Network object (value of pointer)
-//  */
-// export async function changeNetworkFromDagre(graph: dagre.graphlib.Graph,network: NetworkLayout): Promise&lt;void&gt;{
-//     Object.entries(graph["_nodes"]).forEach(([node, nodeData]:[string, dagre.graphlib.Node]) =&gt; {
-//         if (!network.nodes[node].metadataLayout) {
-//             network.nodes[node].metadataLayout = {};
-//         }
-//         const { x, y, _order,_rank  } = nodeData;
-//         // if there is some position x and y : network is updated
-//         if (x !== undefined &amp;&amp; y !== undefined){
-//             if (network.nodes[node]) {
-//                 network.nodes[node].x = x;
-//                 network.nodes[node].y = y;
-//             } else {
-//                 throw new Error(`Node '${node}' not found in the network.`);
-//             }
-//             network.nodes[node].metadataLayout.order = _order;
-//             network.nodes[node].metadataLayout.rank = _rank / 2; // because rank 0 is 0, and the next is 2, 4, ...
-//         }
-//     });
-// }
-&nbsp;
-&nbsp;
-/**
- * Take a json of a viz graph and the network associated (with the json) : change the position and metadata (rank and order) of network's node by the one of the json.
- * The json and network need to have the same nodes !
- * @param {object}  object return by render method from viz (renderJSON)
- * @param {Network} Network object (value of pointer)
- * @param assignRank boolean that indicates if rank and order need to be infered and assigned to nodes
- */
-export async function <span class="fstat-no" title="function not covered" >changeNetworkFromViz(<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span>json: JsonViz,</span> subgraphNetwork: SubgraphNetwork, assignRank:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: Promise&lt;SubgraphNetwork&gt; {</span>
-    const network=<span class="cstat-no" title="statement not covered" >subgraphNetwork.network;</span>
-    const unique_y:Array&lt;number&gt; =<span class="cstat-no" title="statement not covered" >[];</span>
-<span class="cstat-no" title="statement not covered" >    json["objects"].forEach(<span class="fstat-no" title="function not covered" >(n</span>ode) =&gt; {</span>
-       
-        const nodeId = <span class="cstat-no" title="statement not covered" >node.name;</span>
-&nbsp;
-        // if node is a 'classic' node
-<span class="cstat-no" title="statement not covered" >        if (nodeId in network.nodes &amp;&amp; Object.keys(node).includes("pos")){</span>
-                const pos = <span class="cstat-no" title="statement not covered" >node["pos"]?.split(',') ?? [];</span>
-                let x = <span class="cstat-no" title="statement not covered" >parseFloat(pos[0]);</span>
-                let y = <span class="cstat-no" title="statement not covered" >parseFloat(pos[1]);</span>
-                
-<span class="cstat-no" title="statement not covered" >                network.nodes[nodeId].x = x;</span>
-<span class="cstat-no" title="statement not covered" >                network.nodes[nodeId].y = y;</span>
-&nbsp;
-<span class="cstat-no" title="statement not covered" >                <span class="missing-if-branch" title="if path not taken" >I</span>if( !unique_y.includes(y)){</span>
-<span class="cstat-no" title="statement not covered" >                    unique_y.push(y);</span>
-                }
-&nbsp;
-        }else <span class="cstat-no" title="statement not covered" >if (subgraphNetwork[TypeSubgraph.CYCLEGROUP] &amp;&amp; nodeId in subgraphNetwork[TypeSubgraph.CYCLEGROUP] &amp;&amp; Object.keys(node).includes("pos")){</span>
-&nbsp;
-            //if node is a cycle metanode
-            const pos = <span class="cstat-no" title="statement not covered" >node["pos"]?.split(',') ?? [];</span>
-            const x = <span class="cstat-no" title="statement not covered" >parseFloat(pos[0]);</span>
-            const y = <span class="cstat-no" title="statement not covered" >parseFloat(pos[1]);</span>
-          
-<span class="cstat-no" title="statement not covered" >            subgraphNetwork[TypeSubgraph.CYCLEGROUP][nodeId].position={x:x,y:y};</span>
-            
-        }else{
-<span class="cstat-no" title="statement not covered" >            throw new Error(`Node ou group cycle  '${nodeId}' not found in the network.`);</span>
-        }
-    });               
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if(assignRank){</span>
-<span class="cstat-no" title="statement not covered" >        assignRankOrder(network,unique_y); </span>// the information of rank isn't in the result, unlike dagre 
-    }
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    return subgraphNetwork;</span>
-}
-&nbsp;
-&nbsp;
-// /**
-//  * Updates the positions of nodes in the network based on the provided Cytoscape JSON.
-//  * 
-//  * @param jsonCytoscape - The Cytoscape JSON containing the elements and their positions.
-//  * @param network - The network to update.
-//  */
-// export function changeNetworkFromCytoscape(jsonCytoscape: {elements:  { nodes:ElementDefinition[] } }, network:Network) : void {
-&nbsp;
-//     jsonCytoscape.elements.nodes.forEach((node: any) =&gt; {
-//         const idNode= node.data.id;
-//         if (Object.keys(network.nodes).includes(idNode)) {
-//             network.nodes[idNode].x = node.position.x;
-//             network.nodes[idNode].y = node.position.y;
-//         }else{
-//             throw new Error(`Node '${idNode}' not found in the network.`);
-//         }
-//     });
-// }
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T07:32:17.101Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/GetSetAttributsNodes.ts.html b/coverage/lcov-report/composables/GetSetAttributsNodes.ts.html
deleted file mode 100644
index 595ba8644c0c533b249b4faac8d1d58aad479b14..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/GetSetAttributsNodes.ts.html
+++ /dev/null
@@ -1,793 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/GetSetAttributsNodes.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> GetSetAttributsNodes.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">30.9% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>17/55</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>0/26</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>0/12</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">33.33% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>17/51</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a>
-<a name='L150'></a><a href='#L150'>150</a>
-<a name='L151'></a><a href='#L151'>151</a>
-<a name='L152'></a><a href='#L152'>152</a>
-<a name='L153'></a><a href='#L153'>153</a>
-<a name='L154'></a><a href='#L154'>154</a>
-<a name='L155'></a><a href='#L155'>155</a>
-<a name='L156'></a><a href='#L156'>156</a>
-<a name='L157'></a><a href='#L157'>157</a>
-<a name='L158'></a><a href='#L158'>158</a>
-<a name='L159'></a><a href='#L159'>159</a>
-<a name='L160'></a><a href='#L160'>160</a>
-<a name='L161'></a><a href='#L161'>161</a>
-<a name='L162'></a><a href='#L162'>162</a>
-<a name='L163'></a><a href='#L163'>163</a>
-<a name='L164'></a><a href='#L164'>164</a>
-<a name='L165'></a><a href='#L165'>165</a>
-<a name='L166'></a><a href='#L166'>166</a>
-<a name='L167'></a><a href='#L167'>167</a>
-<a name='L168'></a><a href='#L168'>168</a>
-<a name='L169'></a><a href='#L169'>169</a>
-<a name='L170'></a><a href='#L170'>170</a>
-<a name='L171'></a><a href='#L171'>171</a>
-<a name='L172'></a><a href='#L172'>172</a>
-<a name='L173'></a><a href='#L173'>173</a>
-<a name='L174'></a><a href='#L174'>174</a>
-<a name='L175'></a><a href='#L175'>175</a>
-<a name='L176'></a><a href='#L176'>176</a>
-<a name='L177'></a><a href='#L177'>177</a>
-<a name='L178'></a><a href='#L178'>178</a>
-<a name='L179'></a><a href='#L179'>179</a>
-<a name='L180'></a><a href='#L180'>180</a>
-<a name='L181'></a><a href='#L181'>181</a>
-<a name='L182'></a><a href='#L182'>182</a>
-<a name='L183'></a><a href='#L183'>183</a>
-<a name='L184'></a><a href='#L184'>184</a>
-<a name='L185'></a><a href='#L185'>185</a>
-<a name='L186'></a><a href='#L186'>186</a>
-<a name='L187'></a><a href='#L187'>187</a>
-<a name='L188'></a><a href='#L188'>188</a>
-<a name='L189'></a><a href='#L189'>189</a>
-<a name='L190'></a><a href='#L190'>190</a>
-<a name='L191'></a><a href='#L191'>191</a>
-<a name='L192'></a><a href='#L192'>192</a>
-<a name='L193'></a><a href='#L193'>193</a>
-<a name='L194'></a><a href='#L194'>194</a>
-<a name='L195'></a><a href='#L195'>195</a>
-<a name='L196'></a><a href='#L196'>196</a>
-<a name='L197'></a><a href='#L197'>197</a>
-<a name='L198'></a><a href='#L198'>198</a>
-<a name='L199'></a><a href='#L199'>199</a>
-<a name='L200'></a><a href='#L200'>200</a>
-<a name='L201'></a><a href='#L201'>201</a>
-<a name='L202'></a><a href='#L202'>202</a>
-<a name='L203'></a><a href='#L203'>203</a>
-<a name='L204'></a><a href='#L204'>204</a>
-<a name='L205'></a><a href='#L205'>205</a>
-<a name='L206'></a><a href='#L206'>206</a>
-<a name='L207'></a><a href='#L207'>207</a>
-<a name='L208'></a><a href='#L208'>208</a>
-<a name='L209'></a><a href='#L209'>209</a>
-<a name='L210'></a><a href='#L210'>210</a>
-<a name='L211'></a><a href='#L211'>211</a>
-<a name='L212'></a><a href='#L212'>212</a>
-<a name='L213'></a><a href='#L213'>213</a>
-<a name='L214'></a><a href='#L214'>214</a>
-<a name='L215'></a><a href='#L215'>215</a>
-<a name='L216'></a><a href='#L216'>216</a>
-<a name='L217'></a><a href='#L217'>217</a>
-<a name='L218'></a><a href='#L218'>218</a>
-<a name='L219'></a><a href='#L219'>219</a>
-<a name='L220'></a><a href='#L220'>220</a>
-<a name='L221'></a><a href='#L221'>221</a>
-<a name='L222'></a><a href='#L222'>222</a>
-<a name='L223'></a><a href='#L223'>223</a>
-<a name='L224'></a><a href='#L224'>224</a>
-<a name='L225'></a><a href='#L225'>225</a>
-<a name='L226'></a><a href='#L226'>226</a>
-<a name='L227'></a><a href='#L227'>227</a>
-<a name='L228'></a><a href='#L228'>228</a>
-<a name='L229'></a><a href='#L229'>229</a>
-<a name='L230'></a><a href='#L230'>230</a>
-<a name='L231'></a><a href='#L231'>231</a>
-<a name='L232'></a><a href='#L232'>232</a>
-<a name='L233'></a><a href='#L233'>233</a>
-<a name='L234'></a><a href='#L234'>234</a>
-<a name='L235'></a><a href='#L235'>235</a>
-<a name='L236'></a><a href='#L236'>236</a>
-<a name='L237'></a><a href='#L237'>237</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import { TypeSubgraph } from "../types/Subgraph";
-import { Node } from "@metabohub/viz-core/src/types/Node";
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Link } from "@metabohub/viz-core/src/types/Link";
-import { NetworkLayout } from "../types/NetworkLayout";
-&nbsp;
-/**
- * This file contains functions to check if a node has a specific attribute
- * 
- * *********************************
- * 0. Side Compounds
- * 
- * -&gt; isSideCompound :
- *      Return if the node is declare as side compound
- * 
- * -&gt; setAsSideCompound :
- *    Set the node as side compound
- * 
- * 
- * *********************************
- * 1. Duplicate
- * 
- * -&gt; isDuplicate :
- *          Checks if a node in the network is a duplicate.
- * 
- * 
- * *********************************
- * 2. Reversible
- * 
- * -&gt; addMetadataReversibleWithClass :
- *         Adds the reversible attribute to the given node in the network.
- * 
- * -&gt; addReversibleNetwork :
- *       Adds the reversible attribute to the given node in the network.
- * 
- * -&gt; addReversible :
- *        Adds the reversible attribute to the given node.
- * 
- * -&gt; addLinkClassReversible :
- *       Adds a class to the given node's classes array in a reversible manner.
- * 
- * -&gt; pushUniqueString :
- *      Adds a unique string value to an array if it does not already exist.
- * 
- * -&gt; isReversible :
- *     Checks if a node in the network is reversible.
- * 
- * -&gt; isReaction :
- *    Checks if a given node is a reaction.
- * 
- * 
- * *********************************
- * 3.  Cycle
- * 
- * 
- */
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________0.  Side Compounds __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-export const sideCompoundAttribute="isSideCompound";
-&nbsp;
-/**
- * Return if the node is declare as side compound
- * @param network 
- * @param nodeID id of the node
- * @returns node is a side compound ?
- */
-export function <span class="fstat-no" title="function not covered" >isSideCompound(</span>node:Node):boolean{
-<span class="cstat-no" title="statement not covered" >    return Boolean(node.metadata &amp;&amp; node.metadata[sideCompoundAttribute]);</span>
-}
-&nbsp;
-&nbsp;
-/**
- * Set the node as side compound
- * @param network 
- * @param nodeID id of the node
- */
-export function <span class="fstat-no" title="function not covered" >setAsSideCompound(</span>network:Network,nodeID:string):void{
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if(!network.nodes[nodeID]) <span class="cstat-no" title="statement not covered" >throw new Error("Node not found");</span></span>
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if(!network.nodes[nodeID].metadata) <span class="cstat-no" title="statement not covered" >network.nodes[nodeID].metadata={};</span></span>
-<span class="cstat-no" title="statement not covered" >    network.nodes[nodeID].metadata[sideCompoundAttribute]=true;</span>
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________1.  Duplicate __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-export const classDuplicate="duplicate";
-&nbsp;
-/**
- * Checks if a node in the network is a duplicate.
- * @param network - The network object.
- * @param nodeID - The ID of the node to check.
- * @returns A boolean indicating whether the node is a duplicate.
- */
-export function <span class="fstat-no" title="function not covered" >isDuplicate(</span>network:Network,nodeID:string):boolean{
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if(!network.nodes[nodeID]) <span class="cstat-no" title="statement not covered" >throw new Error("Node not found");</span></span>
-<span class="cstat-no" title="statement not covered" >    return Boolean(network.nodes[nodeID].classes &amp;&amp; network.nodes[nodeID].classes.includes(classDuplicate));</span>
-}
-&nbsp;
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________2.  Reversible __________________________________________________________________________
-&nbsp;
-export const classReversible="reversible";
-export const reversibleAttribute="reversible";
-export const reactionClass="reaction";
-&nbsp;
-/**
- * Checks if a node in the network is reversible by checking its classes.
- * =&gt; done for my type of file, not necessaty if reversible information already in the metadata
- * @param network - The network object.
- */
-export async function <span class="fstat-no" title="function not covered" >addMetadataReversibleWithClass(</span>network:Network):Promise&lt;void&gt;{
-<span class="cstat-no" title="statement not covered" >    Object.values(network.nodes).forEach(<span class="fstat-no" title="function not covered" >(n</span>ode) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >      <span class="missing-if-branch" title="if path not taken" >I</span>if(node.classes &amp;&amp; node.classes.includes(classReversible)){</span>
-<span class="cstat-no" title="statement not covered" >        addReversibleNetwork(network,node.id);</span>
-      }
-    });
-  }
-&nbsp;
-&nbsp;
-/**
- * Adds the reversible attribute to the given node in the network.
- * 
- * @param network - The network object.
- * @param node - The node to add the reversible attribute to.
- */
-export function <span class="fstat-no" title="function not covered" >addReversibleNetwork(</span>network:Network,nodeID:string):void{
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (!network.nodes[nodeID]){</span>
-<span class="cstat-no" title="statement not covered" >        throw new Error("Node not found to set as reversible ");</span>
-    }
-<span class="cstat-no" title="statement not covered" >    network.nodes[nodeID]=addReversible(network.nodes[nodeID]);</span>
-}
-&nbsp;
-/**
- * Adds the reversible attribute to the given node.
- * 
- * @param node - The node to add the reversible attribute to.
- * @returns The modified node with the reversible attribute added.
- */
-export function <span class="fstat-no" title="function not covered" >addReversible(</span>node:Node):Node{
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if(!node.metadata){</span>
-<span class="cstat-no" title="statement not covered" >        node.metadata={};</span>
-    }
-<span class="cstat-no" title="statement not covered" >    node.metadata[reversibleAttribute]=true;</span>
-<span class="cstat-no" title="statement not covered" >    return node;</span>
-}
-&nbsp;
-/**
- * Adds a class to the given node's classes array in a reversible manner.
- * If the node does not have a classes array, it creates one.
- * @param node - The node to add the class to.
- * @returns The modified node with the added class.
- */
-export function <span class="fstat-no" title="function not covered" >addLinkClassReversible(</span>link:Link):Link{
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if(!link.classes){</span>
-<span class="cstat-no" title="statement not covered" >        link.classes=[];</span>
-    }
-<span class="cstat-no" title="statement not covered" >    link.classes=pushUniqueString(link.classes,classReversible);</span>
-<span class="cstat-no" title="statement not covered" >    return link;</span>
-}
-&nbsp;
-/**
- * Adds a unique string value to an array if it does not already exist.
- * 
- * @param object - The array to add the value to.
- * @param value - The string value to add.
- * @returns The updated array with the added value, if it was not already present.
- */
-export function <span class="fstat-no" title="function not covered" >pushUniqueString(</span>object:Array&lt;string&gt;, value: string): Array&lt;string&gt; {
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (!object.includes(value)) {</span>
-<span class="cstat-no" title="statement not covered" >        object.push(value);</span>
-    }
-<span class="cstat-no" title="statement not covered" >    return object;</span>
-  }
-&nbsp;
-&nbsp;
-/**
- * Checks if a node in the network is reversible.
- * 
- * @param {Network} network - The network object.
- * @param {string} nodeID - The ID of the node to check.
- * @returns {boolean} - Returns true if the node is reversible, otherwise false.
- * @throws {Error} - Throws an error if the node is not found.
- */
-export function <span class="fstat-no" title="function not covered" >isReversible(</span>network:Network,nodeID:string):boolean{
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (!network.nodes[nodeID]){</span>
-<span class="cstat-no" title="statement not covered" >        throw new Error("Node not found to check if reversible");</span>
-    }
-<span class="cstat-no" title="statement not covered" >    return Boolean(network.nodes[nodeID].metadata &amp;&amp; network.nodes[nodeID].metadata[reversibleAttribute]);</span>
-}
-&nbsp;
-/**
- * Checks if a given node is a reaction.
- * 
- * @param node - The node to check.
- * @returns A boolean indicating whether the node is a reaction.
- */
-export function <span class="fstat-no" title="function not covered" >isReaction(</span>node:Node):boolean{
-<span class="cstat-no" title="statement not covered" >    return Boolean(node.classes &amp;&amp; node.classes.includes(reactionClass));</span>
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________3.  Cycle  __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Checks if a node is part of a cycle in the network.
- * @param network - The network object.
- * @param idNode - The ID of the node to check.
- * @returns A boolean indicating whether the node is in a cycle or not.
- */
-export function <span class="fstat-no" title="function not covered" >inCycle(</span>network: NetworkLayout, idNode: string): boolean {
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (!(idNode in network.nodes)) {</span>
-<span class="cstat-no" title="statement not covered" >        throw new Error("Node not found in network");</span>
-    }
-    // no metadata or no cycle metadata or empty cycle metadata : that is, not in a cycle
-    let inCycle:boolean=<span class="cstat-no" title="statement not covered" >false;</span>
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if ( network.nodes[idNode].metadataLayout &amp;&amp; TypeSubgraph.CYCLE in network.nodes[idNode].metadataLayout){</span>
-            const cycles=<span class="cstat-no" title="statement not covered" >network.nodes[idNode].metadataLayout[TypeSubgraph.CYCLE];</span>
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if (cycles &amp;&amp; cycles.length&gt;0) <span class="cstat-no" title="statement not covered" >inCycle=true;</span></span>
-    }
-<span class="cstat-no" title="statement not covered" >    return inCycle;</span>
-}
-&nbsp;
-&nbsp;</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/LayoutReversibleReactions.ts.html b/coverage/lcov-report/composables/LayoutReversibleReactions.ts.html
deleted file mode 100644
index 15d7461484334acc6974e2382bfd2f8b4fdf1597..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/LayoutReversibleReactions.ts.html
+++ /dev/null
@@ -1,1474 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/LayoutReversibleReactions.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> LayoutReversibleReactions.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">96.49% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>110/114</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">90.19% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>46/51</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>20/20</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">96.33% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>105/109</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line high'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a>
-<a name='L150'></a><a href='#L150'>150</a>
-<a name='L151'></a><a href='#L151'>151</a>
-<a name='L152'></a><a href='#L152'>152</a>
-<a name='L153'></a><a href='#L153'>153</a>
-<a name='L154'></a><a href='#L154'>154</a>
-<a name='L155'></a><a href='#L155'>155</a>
-<a name='L156'></a><a href='#L156'>156</a>
-<a name='L157'></a><a href='#L157'>157</a>
-<a name='L158'></a><a href='#L158'>158</a>
-<a name='L159'></a><a href='#L159'>159</a>
-<a name='L160'></a><a href='#L160'>160</a>
-<a name='L161'></a><a href='#L161'>161</a>
-<a name='L162'></a><a href='#L162'>162</a>
-<a name='L163'></a><a href='#L163'>163</a>
-<a name='L164'></a><a href='#L164'>164</a>
-<a name='L165'></a><a href='#L165'>165</a>
-<a name='L166'></a><a href='#L166'>166</a>
-<a name='L167'></a><a href='#L167'>167</a>
-<a name='L168'></a><a href='#L168'>168</a>
-<a name='L169'></a><a href='#L169'>169</a>
-<a name='L170'></a><a href='#L170'>170</a>
-<a name='L171'></a><a href='#L171'>171</a>
-<a name='L172'></a><a href='#L172'>172</a>
-<a name='L173'></a><a href='#L173'>173</a>
-<a name='L174'></a><a href='#L174'>174</a>
-<a name='L175'></a><a href='#L175'>175</a>
-<a name='L176'></a><a href='#L176'>176</a>
-<a name='L177'></a><a href='#L177'>177</a>
-<a name='L178'></a><a href='#L178'>178</a>
-<a name='L179'></a><a href='#L179'>179</a>
-<a name='L180'></a><a href='#L180'>180</a>
-<a name='L181'></a><a href='#L181'>181</a>
-<a name='L182'></a><a href='#L182'>182</a>
-<a name='L183'></a><a href='#L183'>183</a>
-<a name='L184'></a><a href='#L184'>184</a>
-<a name='L185'></a><a href='#L185'>185</a>
-<a name='L186'></a><a href='#L186'>186</a>
-<a name='L187'></a><a href='#L187'>187</a>
-<a name='L188'></a><a href='#L188'>188</a>
-<a name='L189'></a><a href='#L189'>189</a>
-<a name='L190'></a><a href='#L190'>190</a>
-<a name='L191'></a><a href='#L191'>191</a>
-<a name='L192'></a><a href='#L192'>192</a>
-<a name='L193'></a><a href='#L193'>193</a>
-<a name='L194'></a><a href='#L194'>194</a>
-<a name='L195'></a><a href='#L195'>195</a>
-<a name='L196'></a><a href='#L196'>196</a>
-<a name='L197'></a><a href='#L197'>197</a>
-<a name='L198'></a><a href='#L198'>198</a>
-<a name='L199'></a><a href='#L199'>199</a>
-<a name='L200'></a><a href='#L200'>200</a>
-<a name='L201'></a><a href='#L201'>201</a>
-<a name='L202'></a><a href='#L202'>202</a>
-<a name='L203'></a><a href='#L203'>203</a>
-<a name='L204'></a><a href='#L204'>204</a>
-<a name='L205'></a><a href='#L205'>205</a>
-<a name='L206'></a><a href='#L206'>206</a>
-<a name='L207'></a><a href='#L207'>207</a>
-<a name='L208'></a><a href='#L208'>208</a>
-<a name='L209'></a><a href='#L209'>209</a>
-<a name='L210'></a><a href='#L210'>210</a>
-<a name='L211'></a><a href='#L211'>211</a>
-<a name='L212'></a><a href='#L212'>212</a>
-<a name='L213'></a><a href='#L213'>213</a>
-<a name='L214'></a><a href='#L214'>214</a>
-<a name='L215'></a><a href='#L215'>215</a>
-<a name='L216'></a><a href='#L216'>216</a>
-<a name='L217'></a><a href='#L217'>217</a>
-<a name='L218'></a><a href='#L218'>218</a>
-<a name='L219'></a><a href='#L219'>219</a>
-<a name='L220'></a><a href='#L220'>220</a>
-<a name='L221'></a><a href='#L221'>221</a>
-<a name='L222'></a><a href='#L222'>222</a>
-<a name='L223'></a><a href='#L223'>223</a>
-<a name='L224'></a><a href='#L224'>224</a>
-<a name='L225'></a><a href='#L225'>225</a>
-<a name='L226'></a><a href='#L226'>226</a>
-<a name='L227'></a><a href='#L227'>227</a>
-<a name='L228'></a><a href='#L228'>228</a>
-<a name='L229'></a><a href='#L229'>229</a>
-<a name='L230'></a><a href='#L230'>230</a>
-<a name='L231'></a><a href='#L231'>231</a>
-<a name='L232'></a><a href='#L232'>232</a>
-<a name='L233'></a><a href='#L233'>233</a>
-<a name='L234'></a><a href='#L234'>234</a>
-<a name='L235'></a><a href='#L235'>235</a>
-<a name='L236'></a><a href='#L236'>236</a>
-<a name='L237'></a><a href='#L237'>237</a>
-<a name='L238'></a><a href='#L238'>238</a>
-<a name='L239'></a><a href='#L239'>239</a>
-<a name='L240'></a><a href='#L240'>240</a>
-<a name='L241'></a><a href='#L241'>241</a>
-<a name='L242'></a><a href='#L242'>242</a>
-<a name='L243'></a><a href='#L243'>243</a>
-<a name='L244'></a><a href='#L244'>244</a>
-<a name='L245'></a><a href='#L245'>245</a>
-<a name='L246'></a><a href='#L246'>246</a>
-<a name='L247'></a><a href='#L247'>247</a>
-<a name='L248'></a><a href='#L248'>248</a>
-<a name='L249'></a><a href='#L249'>249</a>
-<a name='L250'></a><a href='#L250'>250</a>
-<a name='L251'></a><a href='#L251'>251</a>
-<a name='L252'></a><a href='#L252'>252</a>
-<a name='L253'></a><a href='#L253'>253</a>
-<a name='L254'></a><a href='#L254'>254</a>
-<a name='L255'></a><a href='#L255'>255</a>
-<a name='L256'></a><a href='#L256'>256</a>
-<a name='L257'></a><a href='#L257'>257</a>
-<a name='L258'></a><a href='#L258'>258</a>
-<a name='L259'></a><a href='#L259'>259</a>
-<a name='L260'></a><a href='#L260'>260</a>
-<a name='L261'></a><a href='#L261'>261</a>
-<a name='L262'></a><a href='#L262'>262</a>
-<a name='L263'></a><a href='#L263'>263</a>
-<a name='L264'></a><a href='#L264'>264</a>
-<a name='L265'></a><a href='#L265'>265</a>
-<a name='L266'></a><a href='#L266'>266</a>
-<a name='L267'></a><a href='#L267'>267</a>
-<a name='L268'></a><a href='#L268'>268</a>
-<a name='L269'></a><a href='#L269'>269</a>
-<a name='L270'></a><a href='#L270'>270</a>
-<a name='L271'></a><a href='#L271'>271</a>
-<a name='L272'></a><a href='#L272'>272</a>
-<a name='L273'></a><a href='#L273'>273</a>
-<a name='L274'></a><a href='#L274'>274</a>
-<a name='L275'></a><a href='#L275'>275</a>
-<a name='L276'></a><a href='#L276'>276</a>
-<a name='L277'></a><a href='#L277'>277</a>
-<a name='L278'></a><a href='#L278'>278</a>
-<a name='L279'></a><a href='#L279'>279</a>
-<a name='L280'></a><a href='#L280'>280</a>
-<a name='L281'></a><a href='#L281'>281</a>
-<a name='L282'></a><a href='#L282'>282</a>
-<a name='L283'></a><a href='#L283'>283</a>
-<a name='L284'></a><a href='#L284'>284</a>
-<a name='L285'></a><a href='#L285'>285</a>
-<a name='L286'></a><a href='#L286'>286</a>
-<a name='L287'></a><a href='#L287'>287</a>
-<a name='L288'></a><a href='#L288'>288</a>
-<a name='L289'></a><a href='#L289'>289</a>
-<a name='L290'></a><a href='#L290'>290</a>
-<a name='L291'></a><a href='#L291'>291</a>
-<a name='L292'></a><a href='#L292'>292</a>
-<a name='L293'></a><a href='#L293'>293</a>
-<a name='L294'></a><a href='#L294'>294</a>
-<a name='L295'></a><a href='#L295'>295</a>
-<a name='L296'></a><a href='#L296'>296</a>
-<a name='L297'></a><a href='#L297'>297</a>
-<a name='L298'></a><a href='#L298'>298</a>
-<a name='L299'></a><a href='#L299'>299</a>
-<a name='L300'></a><a href='#L300'>300</a>
-<a name='L301'></a><a href='#L301'>301</a>
-<a name='L302'></a><a href='#L302'>302</a>
-<a name='L303'></a><a href='#L303'>303</a>
-<a name='L304'></a><a href='#L304'>304</a>
-<a name='L305'></a><a href='#L305'>305</a>
-<a name='L306'></a><a href='#L306'>306</a>
-<a name='L307'></a><a href='#L307'>307</a>
-<a name='L308'></a><a href='#L308'>308</a>
-<a name='L309'></a><a href='#L309'>309</a>
-<a name='L310'></a><a href='#L310'>310</a>
-<a name='L311'></a><a href='#L311'>311</a>
-<a name='L312'></a><a href='#L312'>312</a>
-<a name='L313'></a><a href='#L313'>313</a>
-<a name='L314'></a><a href='#L314'>314</a>
-<a name='L315'></a><a href='#L315'>315</a>
-<a name='L316'></a><a href='#L316'>316</a>
-<a name='L317'></a><a href='#L317'>317</a>
-<a name='L318'></a><a href='#L318'>318</a>
-<a name='L319'></a><a href='#L319'>319</a>
-<a name='L320'></a><a href='#L320'>320</a>
-<a name='L321'></a><a href='#L321'>321</a>
-<a name='L322'></a><a href='#L322'>322</a>
-<a name='L323'></a><a href='#L323'>323</a>
-<a name='L324'></a><a href='#L324'>324</a>
-<a name='L325'></a><a href='#L325'>325</a>
-<a name='L326'></a><a href='#L326'>326</a>
-<a name='L327'></a><a href='#L327'>327</a>
-<a name='L328'></a><a href='#L328'>328</a>
-<a name='L329'></a><a href='#L329'>329</a>
-<a name='L330'></a><a href='#L330'>330</a>
-<a name='L331'></a><a href='#L331'>331</a>
-<a name='L332'></a><a href='#L332'>332</a>
-<a name='L333'></a><a href='#L333'>333</a>
-<a name='L334'></a><a href='#L334'>334</a>
-<a name='L335'></a><a href='#L335'>335</a>
-<a name='L336'></a><a href='#L336'>336</a>
-<a name='L337'></a><a href='#L337'>337</a>
-<a name='L338'></a><a href='#L338'>338</a>
-<a name='L339'></a><a href='#L339'>339</a>
-<a name='L340'></a><a href='#L340'>340</a>
-<a name='L341'></a><a href='#L341'>341</a>
-<a name='L342'></a><a href='#L342'>342</a>
-<a name='L343'></a><a href='#L343'>343</a>
-<a name='L344'></a><a href='#L344'>344</a>
-<a name='L345'></a><a href='#L345'>345</a>
-<a name='L346'></a><a href='#L346'>346</a>
-<a name='L347'></a><a href='#L347'>347</a>
-<a name='L348'></a><a href='#L348'>348</a>
-<a name='L349'></a><a href='#L349'>349</a>
-<a name='L350'></a><a href='#L350'>350</a>
-<a name='L351'></a><a href='#L351'>351</a>
-<a name='L352'></a><a href='#L352'>352</a>
-<a name='L353'></a><a href='#L353'>353</a>
-<a name='L354'></a><a href='#L354'>354</a>
-<a name='L355'></a><a href='#L355'>355</a>
-<a name='L356'></a><a href='#L356'>356</a>
-<a name='L357'></a><a href='#L357'>357</a>
-<a name='L358'></a><a href='#L358'>358</a>
-<a name='L359'></a><a href='#L359'>359</a>
-<a name='L360'></a><a href='#L360'>360</a>
-<a name='L361'></a><a href='#L361'>361</a>
-<a name='L362'></a><a href='#L362'>362</a>
-<a name='L363'></a><a href='#L363'>363</a>
-<a name='L364'></a><a href='#L364'>364</a>
-<a name='L365'></a><a href='#L365'>365</a>
-<a name='L366'></a><a href='#L366'>366</a>
-<a name='L367'></a><a href='#L367'>367</a>
-<a name='L368'></a><a href='#L368'>368</a>
-<a name='L369'></a><a href='#L369'>369</a>
-<a name='L370'></a><a href='#L370'>370</a>
-<a name='L371'></a><a href='#L371'>371</a>
-<a name='L372'></a><a href='#L372'>372</a>
-<a name='L373'></a><a href='#L373'>373</a>
-<a name='L374'></a><a href='#L374'>374</a>
-<a name='L375'></a><a href='#L375'>375</a>
-<a name='L376'></a><a href='#L376'>376</a>
-<a name='L377'></a><a href='#L377'>377</a>
-<a name='L378'></a><a href='#L378'>378</a>
-<a name='L379'></a><a href='#L379'>379</a>
-<a name='L380'></a><a href='#L380'>380</a>
-<a name='L381'></a><a href='#L381'>381</a>
-<a name='L382'></a><a href='#L382'>382</a>
-<a name='L383'></a><a href='#L383'>383</a>
-<a name='L384'></a><a href='#L384'>384</a>
-<a name='L385'></a><a href='#L385'>385</a>
-<a name='L386'></a><a href='#L386'>386</a>
-<a name='L387'></a><a href='#L387'>387</a>
-<a name='L388'></a><a href='#L388'>388</a>
-<a name='L389'></a><a href='#L389'>389</a>
-<a name='L390'></a><a href='#L390'>390</a>
-<a name='L391'></a><a href='#L391'>391</a>
-<a name='L392'></a><a href='#L392'>392</a>
-<a name='L393'></a><a href='#L393'>393</a>
-<a name='L394'></a><a href='#L394'>394</a>
-<a name='L395'></a><a href='#L395'>395</a>
-<a name='L396'></a><a href='#L396'>396</a>
-<a name='L397'></a><a href='#L397'>397</a>
-<a name='L398'></a><a href='#L398'>398</a>
-<a name='L399'></a><a href='#L399'>399</a>
-<a name='L400'></a><a href='#L400'>400</a>
-<a name='L401'></a><a href='#L401'>401</a>
-<a name='L402'></a><a href='#L402'>402</a>
-<a name='L403'></a><a href='#L403'>403</a>
-<a name='L404'></a><a href='#L404'>404</a>
-<a name='L405'></a><a href='#L405'>405</a>
-<a name='L406'></a><a href='#L406'>406</a>
-<a name='L407'></a><a href='#L407'>407</a>
-<a name='L408'></a><a href='#L408'>408</a>
-<a name='L409'></a><a href='#L409'>409</a>
-<a name='L410'></a><a href='#L410'>410</a>
-<a name='L411'></a><a href='#L411'>411</a>
-<a name='L412'></a><a href='#L412'>412</a>
-<a name='L413'></a><a href='#L413'>413</a>
-<a name='L414'></a><a href='#L414'>414</a>
-<a name='L415'></a><a href='#L415'>415</a>
-<a name='L416'></a><a href='#L416'>416</a>
-<a name='L417'></a><a href='#L417'>417</a>
-<a name='L418'></a><a href='#L418'>418</a>
-<a name='L419'></a><a href='#L419'>419</a>
-<a name='L420'></a><a href='#L420'>420</a>
-<a name='L421'></a><a href='#L421'>421</a>
-<a name='L422'></a><a href='#L422'>422</a>
-<a name='L423'></a><a href='#L423'>423</a>
-<a name='L424'></a><a href='#L424'>424</a>
-<a name='L425'></a><a href='#L425'>425</a>
-<a name='L426'></a><a href='#L426'>426</a>
-<a name='L427'></a><a href='#L427'>427</a>
-<a name='L428'></a><a href='#L428'>428</a>
-<a name='L429'></a><a href='#L429'>429</a>
-<a name='L430'></a><a href='#L430'>430</a>
-<a name='L431'></a><a href='#L431'>431</a>
-<a name='L432'></a><a href='#L432'>432</a>
-<a name='L433'></a><a href='#L433'>433</a>
-<a name='L434'></a><a href='#L434'>434</a>
-<a name='L435'></a><a href='#L435'>435</a>
-<a name='L436'></a><a href='#L436'>436</a>
-<a name='L437'></a><a href='#L437'>437</a>
-<a name='L438'></a><a href='#L438'>438</a>
-<a name='L439'></a><a href='#L439'>439</a>
-<a name='L440'></a><a href='#L440'>440</a>
-<a name='L441'></a><a href='#L441'>441</a>
-<a name='L442'></a><a href='#L442'>442</a>
-<a name='L443'></a><a href='#L443'>443</a>
-<a name='L444'></a><a href='#L444'>444</a>
-<a name='L445'></a><a href='#L445'>445</a>
-<a name='L446'></a><a href='#L446'>446</a>
-<a name='L447'></a><a href='#L447'>447</a>
-<a name='L448'></a><a href='#L448'>448</a>
-<a name='L449'></a><a href='#L449'>449</a>
-<a name='L450'></a><a href='#L450'>450</a>
-<a name='L451'></a><a href='#L451'>451</a>
-<a name='L452'></a><a href='#L452'>452</a>
-<a name='L453'></a><a href='#L453'>453</a>
-<a name='L454'></a><a href='#L454'>454</a>
-<a name='L455'></a><a href='#L455'>455</a>
-<a name='L456'></a><a href='#L456'>456</a>
-<a name='L457'></a><a href='#L457'>457</a>
-<a name='L458'></a><a href='#L458'>458</a>
-<a name='L459'></a><a href='#L459'>459</a>
-<a name='L460'></a><a href='#L460'>460</a>
-<a name='L461'></a><a href='#L461'>461</a>
-<a name='L462'></a><a href='#L462'>462</a>
-<a name='L463'></a><a href='#L463'>463</a>
-<a name='L464'></a><a href='#L464'>464</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">10x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">26x</span>
-<span class="cline-any cline-yes">7x</span>
-<span class="cline-any cline-yes">7x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">17x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">12x</span>
-<span class="cline-any cline-yes">12x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import { Link } from "@metabohub/viz-core/src/types/Link";
-import { Node } from "@metabohub/viz-core/src/types/Node";
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { TypeSubgraph } from "../types/Subgraph";
-import { StartNodesType } from "../types/EnumArgs";
-import { NetworkLayout, NodeLayout } from "../types/NetworkLayout";
-&nbsp;
-// Composable imports
-import { removeAllSelectedNodes } from "@metabohub/viz-core";
-import { BFSWithSources } from "./AlgorithmBFS";
-import { addLinkClassReversible, addMetadataReversibleWithClass, isReaction, isReversible } from "./GetSetAttributsNodes";
-&nbsp;
-// General imports
-//import { e } from "vitest/dist/reporters-1evA5lom";
-import { l } from "vite/dist/node/types.d-aGj9QkWt";
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * This file contains the functions to duplicate reversible reactions in a network and choose one of the duplicated reactions to keep.
- * 
- * *********************************
- * 
- * 0. Duplicate reaction
- * 
- * -&gt; duplicateReversibleReactions :
- *      Take a network and add a duplicated node of reversible reactions, and add links to this reaction
- * 
- * -&gt; linkIsReversible :
- *        Determines if a link is reversible in a network by checking if the source or target is a reversible reaction.
- * 
- * -&gt; duplicateNodeReactionReversible :
- *       Duplicates a node reaction and makes it reversible.
- * 
- * -&gt; reversibleNodeReaction :
- *      Reverses the given node layout by appending a suffix to its ID and updating its metadataLayout.
- * 
- * -&gt; reversibleLink :
- *      Links two nodes in a network with a reversible link.
- * 
- * 
- * *********************************
- * 
- * 1. Choose reaction
- * 
- * -&gt; chooseReversibleReaction :
- *       Take a network with duplicated nodes (a node is duplicated if the id of the duplicated version is in metadata.reversibleVersion of a node),
- * 
- * -&gt; keepFirstReversibleNode :
- *       Keeps the first reversible node in the given node order, removing all others and their corresponding reversible versions from the network.
- * 
- * -&gt; renameAllIDNode :
- *       Renames the nodes and edges in a subgraph network based on the provided mapping.
- * 
- * -&gt; renameInSubgraph :
- *      Renames all nodes in a subgraph based on a given mapping.
- * 
- * 
- */
-&nbsp;
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________0. Duplicate reaction __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Take a network and add a duplicated node of reversible reactions, and add links to this reaction
- * @param {Network}  Network object
- * @param suffix to put at the end of id of the original reaction : can't be "" !
- */
-export async function duplicateReversibleReactions(networkLayout:NetworkLayout):Promise&lt;void&gt; {
-&nbsp;
-  try {
-    // add metadata "reversible" to nodes
-    console.warn("add metadata reversible if in the class. Not necessary if file with correct format (done bcs of the file I have) =&gt; to remove ?");
-    await addMetadataReversibleWithClass(networkLayout);
-&nbsp;
-    const newLinks: Array&lt;Link&gt; = []; //links associated with new reactions nodes
-    
-    await Promise.all(networkLayout.links.map(async (link) =&gt; {
-      // If the link is reversible: get the reaction node and duplicate it
-      const linkReversible = linkIsReversible(networkLayout, link);
-      if (linkReversible.isReversible) {
-        // add class reversible to the link
-        link= addLinkClassReversible(link);
-&nbsp;
-        // Duplication of the reaction node
-        let nodeToDuplicate: NodeLayout;
-        const reactionIsSource: boolean|undefined = linkReversible.sourceIsReversible;
-  
-        if (reactionIsSource) {
-          nodeToDuplicate = link.source;
-        } else {
-          nodeToDuplicate = link.target;
-        }
-  
-        await duplicateNodeReactionReversible(networkLayout, nodeToDuplicate).then((newReactionNode) =&gt; {
-          // Add the new reaction node if it is not already present
-&nbsp;
-          if (newReactionNode &amp;&amp; !networkLayout.nodes[newReactionNode.id]) {
-            networkLayout.nodes[newReactionNode.id] = newReactionNode;
-          }
-          // Adding the link to the new reaction node in the opposite direction (the target becomes the source and the source becomes the target)
-          if (reactionIsSource) {
-            const target = link.target;
-            newLinks.push(reversibleLink(networkLayout, link, newReactionNode.id, target.id));
-          } else {
-            const source = link.source;
-            newLinks.push(reversibleLink(networkLayout, link, source.id, newReactionNode.id));
-          }
-        });
-      }
-    }));
-&nbsp;
-    newLinks.forEach((link) =&gt; {
-      networkLayout.links.push(link);
-    });
-&nbsp;
-  } catch (error) {
-<span class="cstat-no" title="statement not covered" >    throw error;</span>
-  }
-}
-&nbsp;
-/**
- * Determines if a link is reversible in a network by checking if the source or target is a reversible reaction.
- * 
- * @param network - The network object.
- * @param link - The link object.
- * @returns An object containing the reversibility information:
- *   - `isReversible` - A boolean indicating if the link is reversible.
- *   - `sourceIsReversible` - A boolean indicating if it's the source of the link that is reversible.
- */
-function linkIsReversible(network:Network,link: Link): {isReversible:boolean,sourceIsReversible:boolean|undefined}{ 
-    if (isReaction(link.source) &amp;&amp; isReversible(network,link.source.id)){
-      return {isReversible:true,sourceIsReversible:true};
-    } else if (isReaction(link.target) &amp;&amp; isReversible(network,link.target.id)){
-      return {isReversible:true,sourceIsReversible:false};
-    } else{
-      return {isReversible:false,sourceIsReversible:undefined};
-    }
-}
-&nbsp;
-/**
- * Duplicates a node reaction and makes it reversible.
- * 
- * @param networkLayout - The network layout.
- * @param nodeReaction - The node reaction to duplicate.
- * @returns The duplicated node reaction with reversible metadata.
- */
-async function duplicateNodeReactionReversible(networkLayout: NetworkLayout, nodeReaction: NodeLayout): Promise&lt;Node&gt; {
-    return new Promise(async (resolve, reject) =&gt; {
-        try {
-            // Duplicate target node
-            const newReactionNode = await reversibleNodeReaction(nodeReaction);
-            const newId = newReactionNode.id;
-&nbsp;
-            // Add attribute reversible to original reaction
-            <span class="missing-if-branch" title="if path not taken" >I</span>if (!networkLayout.nodes[nodeReaction.id]) {
-<span class="cstat-no" title="statement not covered" >                throw new Error("Node not found to set as reversible");</span>
-            }
-&nbsp;
-            if (!nodeReaction.metadataLayout) {
-              nodeReaction.metadataLayout={};
-            }
-            nodeReaction.metadataLayout.reversibleNodeVersion = newId;
-&nbsp;
-            resolve(newReactionNode);
-        } catch (error) {
-<span class="cstat-no" title="statement not covered" >            reject(error);</span>
-        }
-    });
-}
-&nbsp;
-&nbsp;
-/**
- * Reverses the given node layout by appending a suffix to its ID and updating its metadataLayout.
- * 
- * @param node - The original node layout to be reversed.
- * @param suffix - The suffix to be appended to the ID of the reversed node. Default value is "_rev".
- * @returns The reversed node layout.
- */
-async function reversibleNodeReaction(node: NodeLayout, suffix: string = "_rev"): Promise&lt;Node&gt; {
-  const  id = node.id;
-  const newId = id.endsWith(suffix) ? <span class="branch-0 cbranch-no" title="branch not covered" >id.slice(0, -suffix.length) </span>: id + suffix;
-  let newNodeReversed:boolean;
-  // if original node is a reversed version :
-  if (node.metadataLayout &amp;&amp; node.metadataLayout.isReversedVersion){
-    newNodeReversed=false; // the new node is the original one
-  }else{
-    newNodeReversed=true;
-  }
-  
-  //const newLabel = label.endsWith(suffix) ? label.slice(0, -suffix.length) : label + suffix;
-&nbsp;
-  //const newClasses: string[] = [];
-  // add classes of original reaction, 
-  // and add class reversibleVersion if not present, removed if present
-  // classes.forEach(item =&gt;{
-  //   newClasses.push(item)
-  // });
-  // const revIndex = newClasses.indexOf("reversibleVersion");
-  // if (revIndex !== -1) {
-  //   newClasses.splice(revIndex, 1);
-  // }else{
-  //   newClasses.push("reversibleVersion");
-  // }
-  
-  const newNode: NodeLayout = {
-    ...node,
-    id: newId,
-    //metadata: {...node.metadata, reversibleVersion: id},  // to remove : doest work
-    metadataLayout: {reversibleNodeVersion:id,isReversedVersion:newNodeReversed},
-  };
-  return newNode;
-}
-&nbsp;
-/**
- * Links two nodes in a network with a reversible link.
- * 
- * @param network - The network object.
- * @param link - The link to be made reversible.
- * @param sourceID - The ID of the source node.
- * @param targetID - The ID of the target node.
- * @returns The new reversible link.
- * @throws Error if either the source node or the target node is not found in the network.
- */
-function reversibleLink(network:Network,link:Link,sourceID:string,targetID:string):Link{
-  <span class="missing-if-branch" title="if path not taken" >I</span>if (!network.nodes[sourceID] || !network.nodes[targetID]){
-<span class="cstat-no" title="statement not covered" >    throw new Error("Node not found to set as reversible ");</span>
-  }
-  let newLink:Link={
-    ...link,
-    id: `${targetID}--${sourceID}`,
-    source: network.nodes[targetID],
-    target: network.nodes[sourceID],
-  }
-  newLink= addLinkClassReversible(newLink);
-  return newLink;
-}
-&nbsp;
-&nbsp;
-/*******************************************************************************************************************************************************/
-//___________________________________________________1. Choose reaction __________________________________________________________________________
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Take a network with duplicated nodes (a node is duplicated if the id of the duplicated version is in metadata.reversibleVersion of a node),
- * and remove one of the duplication. A method in argument (nodeOrderFunction) is used for the choice, the source nodes for the method are in parameter of the function. The node that is keeped 
- * is the first in the returned array.
- * BEWARE : the method with not all sources might miss some duplicated nodes
- * @param subgraphNetwork 
- * @param sources sources nodes (id) to use, if type source :
- * RANK_ONLY : sources are nodes of rank 0
- * SOURCE_ONLY : sources are topological sources of the network (nul indegree)
- * RANK_SOURCE : sources are node of rank 0, then source nodes
- * ALL : sources are all nodes
- * SOURCE_ALL : sources are topological sources, then all the others nodes
- * RANK_SOURCE_ALL : sources are node of rank 0, then topological sources, then all the other nodes
- * For this method, a source type with "all" is advised, to not miss any duplicated reaction.
- * @param nodeOrderFunction the method that return an array of nodes order (a same node can be present several time!), with sources as input
- * @returns A promise of the subgraphNetwork with only one version of the duplicated reactions
- */
-export async function chooseReversibleReaction(
-  subgraphNetwork:SubgraphNetwork,
-  sources: Array&lt;string&gt; | StartNodesType,
-  nodeOrderFunction: (network: Network, sources: Array&lt;string&gt; | StartNodesType) =&gt; Promise&lt;string[]&gt; = <span class="branch-0 cbranch-no" title="branch not covered" >BFSWithSources</span>
-): Promise&lt;SubgraphNetwork&gt; {
-  let nodeOrder: string[] = [];
-  const network = subgraphNetwork.network;
-  // get node order
-  nodeOrder = await nodeOrderFunction(network,sources);
-  // keep the first node seen only, for duplicated nodes
-  subgraphNetwork=keepFirstReversibleNode(subgraphNetwork, nodeOrder,true) as SubgraphNetwork;
-&nbsp;
-  return subgraphNetwork;
-}
-&nbsp;
-&nbsp;
-/**
- * Keeps the first reversible node in the given node order, removing all others and their corresponding reversible versions from the network.
- * @param subgraphNetwork 
- * @param nodeOrder The order of nodes to consider for keeping the first reversible node.
- */
-export function keepFirstReversibleNode(subgraphNetwork:SubgraphNetwork,nodeOrder:string[],doRename:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true)</span>:SubgraphNetwork |{[key: string]: string}{
-  const network = subgraphNetwork.network;
-  const reactionToRemove:Array&lt;string&gt;=[];
-  const nodeToRename:{[key: string]: string}={};
-&nbsp;
-  for(let i=0;i&lt;nodeOrder.length;i++){
-    const nodeID=nodeOrder[i];
-    if (!(nodeID in network.nodes))  throw new Error("Error : the node "+nodeID+" is not found in the network.");
-    // if there is a reversible version of the current node:
-    if(network.nodes[nodeID].metadataLayout &amp;&amp; network.nodes[nodeID].metadataLayout.reversibleNodeVersion){
-      const reversibleNodeID=network.nodes[nodeID].metadataLayout.reversibleNodeVersion;
-      if (!(reversibleNodeID in network.nodes))  throw new Error("Error : the reversible version of the node "+nodeID+" is not found in the network.");
-&nbsp;
-      // add the reversible reaction to the list of nodes to remove
-      reactionToRemove.push(reversibleNodeID);
-&nbsp;
-      // Put on list renaming of id if necessary :
-      if(network.nodes[nodeID].metadataLayout.isReversedVersion){
-        if (network.nodes[reversibleNodeID].metadataLayout &amp;&amp;  network.nodes[reversibleNodeID].metadataLayout.isReversedVersion){
-          throw new Error("Both version of node have attribut reversibleNodeVersion as true");
-        }
-        // the duplicated version is the one keeped, its id have to be renamed by the original id
-        nodeToRename[nodeID]=reversibleNodeID;
-      }else if (!network.nodes[reversibleNodeID].metadataLayout || !network.nodes[reversibleNodeID].metadataLayout.isReversedVersion){
-        throw new Error("One duplication of node lack attribut isReversedVersion");
-      }
-&nbsp;
-      // remove metadata information about reversible node for current node and its reversible version
-      delete network.nodes[nodeID].metadataLayout.reversibleNodeVersion;
-      if(network.nodes[reversibleNodeID].metadataLayout &amp;&amp;  network.nodes[reversibleNodeID].metadataLayout.reversibleNodeVersion){ 
-        delete network.nodes[reversibleNodeID].metadataLayout.reversibleNodeVersion;
-      }
-    }
-  }
-  // remove one version of the reaction
-  removeAllSelectedNodes(reactionToRemove,network);
-  // rename the other if it was the reversible version that is keeped
-  console.warn("need to check if subgraph still exist ?")
-  if(doRename){
-    const subgraphNetworkRename=renameAllIDNode(subgraphNetwork,nodeToRename);
-    return  subgraphNetworkRename// return object renamed
-  }
-  return nodeToRename; // if doRename is false, return the list of node to rename to do it later
-}
-&nbsp;
-/**
- * Renames the nodes and edges in a subgraph network based on the provided mapping {oldName:newName}.
- * 
- * @param subgraphNetwork - The subgraph network to modify.
- * @param nodesToRename - An object containing the mapping of old node IDs to new node IDs.
- * @returns The modified subgraph network.
- */
-export function renameAllIDNode(subgraphNetwork:SubgraphNetwork,nodesToRename:{[key: string]: string}):SubgraphNetwork{
-  const network = subgraphNetwork.network;
-&nbsp;
-  // Modify nodes
-  Object.keys(network.nodes).forEach(ID =&gt; { 
-    if (nodesToRename[ID]) { 
-      // then change the name of the node :
-      const oldName=ID;
-      const newName=nodesToRename[ID];
-      // insert new node with new name
-      network.nodes[newName]=network.nodes[oldName];
-      network.nodes[newName].id=newName;
-      // delete old node
-      delete network.nodes[oldName];     
-    }
-  });
-&nbsp;
-  // Modify edges -&gt; not necessary because pointer for links (not id of node)
-  // network.links.forEach(link =&gt; {
-  //   if (nodesToRename[link.source.id]) {
-  //     link.source = network.nodes[nodesToRename[link.source.id]];
-  //   }
-  //   if (nodesToRename[link.target.id]) {
-  //     link.target = network.nodes[nodesToRename[link.target.id]];
-  //   }
-  // });
-&nbsp;
-  // Modify subgraphs
-  // in cycles
-  renameAllInSubgraph(subgraphNetwork,TypeSubgraph.CYCLE,nodesToRename);
-  // in main chains
-  renameAllInSubgraph(subgraphNetwork,TypeSubgraph.MAIN_CHAIN,nodesToRename);
-  // in secondary chains
-  renameAllInSubgraph(subgraphNetwork,TypeSubgraph.SECONDARY_CHAIN,nodesToRename);
-&nbsp;
-  return subgraphNetwork;
-}
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Renames all nodes in a subgraph based on a given mapping.
- * 
- * @param subgraphNetwork - The subgraph network object.
- * @param typeSubgraph - The type of subgraph.
- * @param nodesToRename - The mapping of nodes to their new names.
- */
-function renameAllInSubgraph(subgraphNetwork:SubgraphNetwork, typeSubgraph:TypeSubgraph, nodesToRename:{[key: string]: string}){
-  const subgraphs = subgraphNetwork[typeSubgraph] ? subgraphNetwork[typeSubgraph] : {};
-  Object.entries(subgraphs).forEach(([ID, subgraph]) =&gt; {
-    subgraph.nodes = subgraph.nodes.map(node =&gt; {
-      if(nodesToRename[node]){
-        // change metadata of node to know in which subgraph it is
-        //console.warn("pk fonction ici ?");
-        //updateNodeMetadataSubgraph(subgraphNetwork.network.value, nodesToRename[node], ID, typeSubgraph);
-        // change the name of the node in the subgraph
-        return nodesToRename[node];
-      }
-      return node;
-    });
-  });
-}
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-// export function renameIDNode(subgraphNetwork:SubgraphNetwork,oldName:string,newName:string):SubgraphNetwork{
-//   const network = subgraphNetwork.network.value;
-//   if(oldName in network.nodes &amp;&amp; !(newName in network.nodes)){
-&nbsp;
-//     // modify node :
-//     // insert new node with new name
-//     network.nodes[newName]=network.nodes[oldName];
-//     const newNode=network.nodes[newName];
-//     newNode.id=newName;
-//     // delete old node
-//     delete network.nodes[oldName];
-&nbsp;
-//     // modify edges :
-//     // when the node is source
-//     const linksOldNodeAsSource = Object.values(network.links).filter((link) =&gt; {
-//       return link.source.id === oldName;
-//     });
-//     linksOldNodeAsSource.forEach((link) =&gt; {
-//       link.source = newNode;
-//     });
-//     // when the node is target
-//     const linksOldNodeAsTarget = Object.values(network.links).filter((link) =&gt; {
-//       return link.target.id === oldName;
-//     });
-//     linksOldNodeAsTarget.forEach((link) =&gt; {
-//       link.target = newNode;
-//     });
-&nbsp;
-//     // modify subgraphs :
-//     // in cycles
-//     renameInSubgraph(subgraphNetwork,TypeSubgraph.CYCLE,oldName,newName);
-//     // in main chains
-//     renameInSubgraph(subgraphNetwork,TypeSubgraph.MAIN_CHAIN,oldName,newName);
-//     // in secondary chains
-//     renameInSubgraph(subgraphNetwork,TypeSubgraph.SECONDARY_CHAIN,oldName,newName);
-&nbsp;
-//     return subgraphNetwork;
-&nbsp;
-//   }else{
-//     console.log("Error : impossible to rename node "+oldName+" to "+newName+", node already exist or not found in network.");
-//   }
-// }
-&nbsp;
-// function renameInSubgraph(subgraphNetwork:SubgraphNetwork,typeSubgraph:TypeSubgraph,oldName:string,newName:string){
-//   const subgraphs = subgraphNetwork[typeSubgraph]? subgraphNetwork[typeSubgraph]:{};
-//     Object.entries(subgraphs).forEach(([ID,subgraph])=&gt;{
-//       if(subgraph.nodes.includes(oldName)){
-//         // change the name of the node in the subgraph
-//         subgraph.nodes = subgraph.nodes.map(node =&gt; node === oldName ? newName : node);
-//         // change metadata of node to know in which subgraph it is
-//         updateNodeMetadataSubgraph(subgraphNetwork.network.value, newName, ID,typeSubgraph); //newName because the node has been renamed
-//       }
-//     });
-// }
-&nbsp;
-&nbsp;</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/LayoutSugiyama.ts.html b/coverage/lcov-report/composables/LayoutSugiyama.ts.html
deleted file mode 100644
index f087c69f9137a4ee1c2a43943863fcfa6714115d..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/LayoutSugiyama.ts.html
+++ /dev/null
@@ -1,754 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/LayoutSugiyama.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> LayoutSugiyama.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">94.11% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>16/17</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">90% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>9/10</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>5/5</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>14/14</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line high'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a>
-<a name='L129'></a><a href='#L129'>129</a>
-<a name='L130'></a><a href='#L130'>130</a>
-<a name='L131'></a><a href='#L131'>131</a>
-<a name='L132'></a><a href='#L132'>132</a>
-<a name='L133'></a><a href='#L133'>133</a>
-<a name='L134'></a><a href='#L134'>134</a>
-<a name='L135'></a><a href='#L135'>135</a>
-<a name='L136'></a><a href='#L136'>136</a>
-<a name='L137'></a><a href='#L137'>137</a>
-<a name='L138'></a><a href='#L138'>138</a>
-<a name='L139'></a><a href='#L139'>139</a>
-<a name='L140'></a><a href='#L140'>140</a>
-<a name='L141'></a><a href='#L141'>141</a>
-<a name='L142'></a><a href='#L142'>142</a>
-<a name='L143'></a><a href='#L143'>143</a>
-<a name='L144'></a><a href='#L144'>144</a>
-<a name='L145'></a><a href='#L145'>145</a>
-<a name='L146'></a><a href='#L146'>146</a>
-<a name='L147'></a><a href='#L147'>147</a>
-<a name='L148'></a><a href='#L148'>148</a>
-<a name='L149'></a><a href='#L149'>149</a>
-<a name='L150'></a><a href='#L150'>150</a>
-<a name='L151'></a><a href='#L151'>151</a>
-<a name='L152'></a><a href='#L152'>152</a>
-<a name='L153'></a><a href='#L153'>153</a>
-<a name='L154'></a><a href='#L154'>154</a>
-<a name='L155'></a><a href='#L155'>155</a>
-<a name='L156'></a><a href='#L156'>156</a>
-<a name='L157'></a><a href='#L157'>157</a>
-<a name='L158'></a><a href='#L158'>158</a>
-<a name='L159'></a><a href='#L159'>159</a>
-<a name='L160'></a><a href='#L160'>160</a>
-<a name='L161'></a><a href='#L161'>161</a>
-<a name='L162'></a><a href='#L162'>162</a>
-<a name='L163'></a><a href='#L163'>163</a>
-<a name='L164'></a><a href='#L164'>164</a>
-<a name='L165'></a><a href='#L165'>165</a>
-<a name='L166'></a><a href='#L166'>166</a>
-<a name='L167'></a><a href='#L167'>167</a>
-<a name='L168'></a><a href='#L168'>168</a>
-<a name='L169'></a><a href='#L169'>169</a>
-<a name='L170'></a><a href='#L170'>170</a>
-<a name='L171'></a><a href='#L171'>171</a>
-<a name='L172'></a><a href='#L172'>172</a>
-<a name='L173'></a><a href='#L173'>173</a>
-<a name='L174'></a><a href='#L174'>174</a>
-<a name='L175'></a><a href='#L175'>175</a>
-<a name='L176'></a><a href='#L176'>176</a>
-<a name='L177'></a><a href='#L177'>177</a>
-<a name='L178'></a><a href='#L178'>178</a>
-<a name='L179'></a><a href='#L179'>179</a>
-<a name='L180'></a><a href='#L180'>180</a>
-<a name='L181'></a><a href='#L181'>181</a>
-<a name='L182'></a><a href='#L182'>182</a>
-<a name='L183'></a><a href='#L183'>183</a>
-<a name='L184'></a><a href='#L184'>184</a>
-<a name='L185'></a><a href='#L185'>185</a>
-<a name='L186'></a><a href='#L186'>186</a>
-<a name='L187'></a><a href='#L187'>187</a>
-<a name='L188'></a><a href='#L188'>188</a>
-<a name='L189'></a><a href='#L189'>189</a>
-<a name='L190'></a><a href='#L190'>190</a>
-<a name='L191'></a><a href='#L191'>191</a>
-<a name='L192'></a><a href='#L192'>192</a>
-<a name='L193'></a><a href='#L193'>193</a>
-<a name='L194'></a><a href='#L194'>194</a>
-<a name='L195'></a><a href='#L195'>195</a>
-<a name='L196'></a><a href='#L196'>196</a>
-<a name='L197'></a><a href='#L197'>197</a>
-<a name='L198'></a><a href='#L198'>198</a>
-<a name='L199'></a><a href='#L199'>199</a>
-<a name='L200'></a><a href='#L200'>200</a>
-<a name='L201'></a><a href='#L201'>201</a>
-<a name='L202'></a><a href='#L202'>202</a>
-<a name='L203'></a><a href='#L203'>203</a>
-<a name='L204'></a><a href='#L204'>204</a>
-<a name='L205'></a><a href='#L205'>205</a>
-<a name='L206'></a><a href='#L206'>206</a>
-<a name='L207'></a><a href='#L207'>207</a>
-<a name='L208'></a><a href='#L208'>208</a>
-<a name='L209'></a><a href='#L209'>209</a>
-<a name='L210'></a><a href='#L210'>210</a>
-<a name='L211'></a><a href='#L211'>211</a>
-<a name='L212'></a><a href='#L212'>212</a>
-<a name='L213'></a><a href='#L213'>213</a>
-<a name='L214'></a><a href='#L214'>214</a>
-<a name='L215'></a><a href='#L215'>215</a>
-<a name='L216'></a><a href='#L216'>216</a>
-<a name='L217'></a><a href='#L217'>217</a>
-<a name='L218'></a><a href='#L218'>218</a>
-<a name='L219'></a><a href='#L219'>219</a>
-<a name='L220'></a><a href='#L220'>220</a>
-<a name='L221'></a><a href='#L221'>221</a>
-<a name='L222'></a><a href='#L222'>222</a>
-<a name='L223'></a><a href='#L223'>223</a>
-<a name='L224'></a><a href='#L224'>224</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
-import { JsonViz } from "../types/FormatJsonViz";
-import { Subgraph } from "../types/Subgraph";
-import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { Network } from "@metabohub/viz-core/src/types/Network";
-&nbsp;
-// Composable imports
-import { getSepAttributesInches } from "./CalculateSize";
-import {  networkToDOT } from './ConvertFromNetwork';
-import {  changeNetworkFromViz } from './ConvertToNetwork';
-&nbsp;
-// General imports
-//import * as d3 from 'd3';
-import { reactive } from "vue";
-// import cytoscape from 'cytoscape';
-// import fcose from 'cytoscape-fcose';
-// import cosebilkent from 'cytoscape-cose-bilkent';
-import dagre from 'dagrejs';
-import { Graph, instance } from "@viz-js/viz";
-&nbsp;
-&nbsp;
-/**
- * This file contains functions to apply layout algorithms to a network.
- * 
- * -&gt; dagreLayout :
- *      Take a network object and change the (x,y) position of the node with dagre lib
- * 
- * -&gt; vizLayout :
- *      Take a network object and change the (x,y) position of the node with viz lib
- * 
- * -&gt; forceLayout :
- *      Applies the force-directed layout algorithm to the given network.
- */
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-/** 
- * Take a network object and change the (x,y) position of the node with dagre lib
- * @param {Network}  Network object 
- * @param  graphAttributes for dagre layout (see https://github.com/dagrejs/dagre/wiki)
- * @param [callbackFunction=() =&gt; {}] function to do after the layout is done
- */
-// export function dagreLayout(network: Network,graphAttributes={},callbackFunction = () =&gt; {}):void {
-&nbsp;
-//     setTimeout(async function() {
-//         let graphDagre = networkToDagre(network,graphAttributes);
-//         dagre.layout(graphDagre);
-//         changeNetworkFromDagre(graphDagre, network).then(() =&gt; {
-//             callbackFunction();
-//         });
-//     }, 1);
-        
-// }
-&nbsp;
-&nbsp;
-/** 
- * Take a network object and change the (x,y) position of the node with viz lib
- * @param {Network}  Network object
- * @param mainChains clusters for viz (type version for quick search)
- * @param graphAttributes for viz dot layout (see https://graphviz.org/docs/layouts/dot/)
- * @param assignRank indicates if rank and order need to be infered after layout is applied
- * @param [callbackFunction=() =&gt; {}] function to do after the layout is done
- */
-export async function vizLayout(subgraphNetwork:SubgraphNetwork,assignRank:boolean=false, cycle:boolean=true,addNodes:boolean=true,
-    groupOrCluster:"group"|"cluster"="cluster",orderChange:boolean=false,printDot:boolean=false,dpi:number=72,factorLenghtEdge:number=3,callbackFunction = () =&gt; {}): Promise&lt;SubgraphNetwork&gt; {
-&nbsp;
-        await instance().then( async viz =&gt; {
-        // attributes for viz
-        const sep =await getSepAttributesInches(subgraphNetwork.network,subgraphNetwork.networkStyle,factorLenghtEdge);
-        subgraphNetwork.attributs={rankdir: "BT" , newrank:true, compound:true,splines:false,ranksep:sep.rankSep,nodesep:sep.nodeSep,dpi:dpi};
-        const dot=networkToDOT(subgraphNetwork,cycle,addNodes,groupOrCluster,orderChange);
-        <span class="missing-if-branch" title="if path not taken" >I</span>if(printDot) <span class="cstat-no" title="statement not covered" >console.log(dot);</span>
-        const json=viz.renderJSON(dot) as JsonViz;
-        subgraphNetwork= await changeNetworkFromViz(json,subgraphNetwork,assignRank);
-        callbackFunction();
-    });
-    return subgraphNetwork;
-}
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Applies the force-directed layout algorithm to the given network.
- * Use cytoscapes' cose-bilkent layout.
- * 
- * @param network - The network to apply the layout to.
- * @param networkStyle - The style properties of the network.
- * @param shiftCoord - Optional. Specifies whether to shift the coordinates of the nodes to the top-left corner. Defaults to false.
- * @returns A Promise that resolves to the updated network after applying the layout.
- */
-// export async function forceLayout(network: Network, networkStyle:GraphStyleProperties, shiftCoord: boolean = false): Promise&lt;Network&gt; {
-&nbsp;
-//     //cytoscape.use(fcose);
-//     cytoscape.use(cosebilkent);
-&nbsp;
-//     const size=await getMeanNodesSizePixel(Object.values(network.nodes), networkStyle,false);
-//     const edgeFactor=3;
-//     const edgeLength = Math.max(size.height, size.width) * edgeFactor;
-&nbsp;
-//     const layout ={
-//         name:"cose-bilkent", //fcose
-//         animate: false,
-//         randomize: false,
-//         idealEdgeLength: edgeLength,
-//         nodeRepulsion: 70000, // high number if randomize = false
-//         gravity : 0.001,
-//         numIter: 3000
-&nbsp;
-//     }
-&nbsp;
-//     let cyto = networkToCytoscape(network,true);
-&nbsp;
-//     await new Promise&lt;void&gt;((resolve) =&gt; {
-//         cyto.ready(function () {
-//             setTimeout(function () {
-//                 cyto.elements().layout(layout).run();
-//                 resolve();
-//             }, 5000);
-//         });
-//     });
-&nbsp;
-//     if (shiftCoord) {
-//         shiftAllToGetTopLeftCoord(network, networkStyle);
-//     }
-&nbsp;
-//     const json = cyto.json();
-//     changeNetworkFromCytoscape(json, network);
-&nbsp;
-//     return network;
-// }
-  
-  
-&nbsp;
-&nbsp;
-//   /**
-//    * Take a network and apply a d3 force layout algorithm on WITHOUT simulation
-//    * @param network Network object
-//    * @returns {Network} Network object with d3 force layout apply on
-//    */
-//   export async function forceLayout3(network: Network, autoRescale: Boolean = false): Promise&lt;Network&gt; {
-//     const seuil = 0.04;
-//     const maxiter = 1000;
-//     const minMovement = 0.01; 
-//     const listNodesID=Object.keys(network.nodes);
-//     let svgHeight = screen.height;
-//     let svgWidth = screen.width;
-&nbsp;
-//     const simulation = d3.forceSimulation(Object.values(network.nodes))
-//         .force('link', d3.forceLink()
-//             .id((d: any) =&gt; d.id)
-//             .links(network.links)
-//         )
-//         .force('charge', d3.forceManyBody())
-//         .velocityDecay(0.1)
-//         .force('center', d3.forceCenter(svgWidth / 2, svgHeight / 2))
-//         .stop();
-&nbsp;
-//     await sendTick();
-&nbsp;
-//     async function sendTick() {
-//         let iter=0;
-//         let lastPositions = new Map(Object.values(network.nodes).map(node =&gt; [node.id, { x: node.x, y: node.y }]));
-//         while (iter &lt; maxiter) {
-//             iter++;
-//             simulation.tick();
-&nbsp;
-//             let maxMovement = 0;
-//             for (let nodeID of listNodesID) {
-//                 const node=network.nodes[nodeID];
-//                 const lastPos = lastPositions.get(nodeID);
-//                 const dx = node.x - lastPos.x;
-//                 const dy = node.y - lastPos.y;
-//                 const distance = Math.sqrt(dx * dx + dy * dy);
-&nbsp;
-//                 if (distance &gt; maxMovement) {
-//                     maxMovement = distance;
-//                 }
-&nbsp;
-//                 lastPositions.set(node.id, { x: node.x, y: node.y });
-//             }
-&nbsp;
-//             if (maxMovement &lt; minMovement) {
-//                 console.log('Force layout converged after ' + iter + ' iterations');
-//                 break;
-//             }else{
-//                 console.log(iter);
-//             }
-//         }
-//     }
-&nbsp;
-//     return network;
-// }
-&nbsp;
-  
-// export async function forceLayout2(network: Network, autoRescale: Boolean = false): Promise&lt;Network&gt; {
-//     let svgHeight = screen.height;
-//     let svgWidth = screen.width;
-  
-//     const simulation = d3.forceSimulation(Object.values(network.nodes))
-//       .force('link', d3.forceLink()
-//         .id((d: any) =&gt; {
-//           return d.id;
-//         })
-//         .links(network.links)
-//       )
-//       .force('charge', d3.forceManyBody())
-//       .force('center', d3.forceCenter(svgWidth / 2, svgHeight / 2))
-//       .alphaMin(0.4)
-//       .stop();
-  
-//     await sendTick();
-  
-//     async function sendTick() {
-//       for (let i = simulation.alpha(); i &gt; 0.4; i = simulation.alpha()) {
-//         simulation.tick();
-//       }
-//     }
-  
-//     return network;
-  
-//   }
-&nbsp;</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T07:32:17.101Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/SubgraphForSubgraphNetwork.ts.html b/coverage/lcov-report/composables/SubgraphForSubgraphNetwork.ts.html
deleted file mode 100644
index 4d73d94761b7f4a64df759781b8f5868b4b8972f..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/SubgraphForSubgraphNetwork.ts.html
+++ /dev/null
@@ -1,457 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/SubgraphForSubgraphNetwork.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> SubgraphForSubgraphNetwork.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>36/36</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>16/16</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>5/5</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>34/34</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line high'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">5x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">7x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">7x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import { NetworkLayout } from "../types/NetworkLayout";
-import { Subgraph, TypeSubgraph } from "../types/Subgraph";
-import { SubgraphNetwork } from "../types/SubgraphNetwork";
-&nbsp;
-&nbsp;
-/**
- * This file contains functions to manage subgraphs in a subgraphNetwork.
- * 
- * -&gt; createSubgraph :
- *      creates a new subgraph with the specified properties.
- * 
- * -&gt; addSubgraphToNetwork :
- *      adds a subgraph to the subgraph network.
- * 
- * -&gt; updateNodeMetadataSubgraph :
- *      updates the metadata of a node in the network by adding a subgraph ID to its list of subgraph.
- * 
- * -&gt; updateParentSubgraphOf :
- *       updates the parent of a subgraph by adding the subgraph to its list of child subgraph.
- */
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-/**
- * Creates a new subgraph with the specified properties.
- * @param name The name of the subgraph.
- * @param nodes The array of nodes in the subgraph (defaults to an empty array).
- * @param classes The array of classes associated with the subgraph (defaults to an empty array).
- * @returns The newly created subgraph.
- */
-export function createSubgraph(name: string, nodes: Array&lt;string&gt;, classes: Array&lt;string&gt;, type: TypeSubgraph, forSubgraph?: {name:string,type:TypeSubgraph}, associatedSubgraphs?:Array&lt;{name:string,type:TypeSubgraph}&gt;): Subgraph {
-    return {
-        name,
-        classes,
-        nodes,
-        type,
-        parentSubgraph: forSubgraph,
-        childrenSubgraphs: associatedSubgraphs
-    };
-}
-&nbsp;
-/**
- * Adds a subgraph to the subgraph network.
- * 
- * @param subgraphNetwork - The subgraph network to add the subgraph to.
- * @param subgraph - The subgraph to add.
- * @param type - The type of the subgraph. Defaults to TypeSubgraph.MAIN_CHAIN.
- * @returns The updated subgraph network.
- */
-export function addSubgraphToNetwork(subgraphNetwork:SubgraphNetwork,subgraph:Subgraph,type:TypeSubgraph): SubgraphNetwork {
-    if (!subgraphNetwork[type]) subgraphNetwork[type]={};
-    if(!(subgraph.name in subgraphNetwork[type])){
-        // adding subgraph to subgraphNetwork
-        subgraphNetwork[type][subgraph.name]=subgraph;
-        // node matadata update
-        subgraph.nodes.forEach(node=&gt;{
-            updateNodeMetadataSubgraph(subgraphNetwork.network, node, subgraph.name, type);
-        });
-        // if subgraph associated with another subgraph : add to associatedSubgraphs of the "parent" subgraph
-        if (subgraph.parentSubgraph){
-          subgraphNetwork=updateParentSubgraphOf(subgraphNetwork,subgraph);
-        }
-    }else{
-        throw new Error("subgraph already in subgraphNetwork : "+subgraph.name);
-    }
-    return subgraphNetwork;
-    
-}
-&nbsp;
-&nbsp;
-/**
- * Updates the metadata of a node in the network by adding a subgraph ID to its list of subgraph.
- * If the metadata does not exist, they will be created.
- * 
- * @param networkLayout - The network object.
- * @param nodeID - The ID of the node to update.
- * @param subgraphID - The ID of the cluster to add.
- */
-export function updateNodeMetadataSubgraph(networkLayout: NetworkLayout, nodeID: string, subgraphID: string, subgraphType: TypeSubgraph): void {
-    if ( ! networkLayout.nodes[nodeID]) throw new Error('Node not found in networkLayout');
-&nbsp;
-  if ( !(networkLayout.nodes[nodeID].metadataLayout)){
-    networkLayout.nodes[nodeID].metadataLayout={};
-  }
-  // if subgraphType is CYCLEGROUP, add the subgraphID to the metadataLayout directly
-  if (subgraphType == TypeSubgraph.CYCLEGROUP){
-    networkLayout.nodes[nodeID].metadataLayout[subgraphType]=subgraphID;
-&nbsp;
-  } else {
-    // if subgraphType is not CYCLEGROUP, add the subgraphID to the metadataLayout[subgraphType] array
-    let listSubgraphOfNode: Array&lt;string&gt;;
-    if (!(subgraphType in networkLayout.nodes[nodeID].metadataLayout)){
-        networkLayout.nodes[nodeID].metadataLayout[subgraphType]=[];
-    }
-    listSubgraphOfNode=networkLayout.nodes[nodeID].metadataLayout[subgraphType] as Array&lt;string&gt;;
-    if (!listSubgraphOfNode.includes(subgraphID)){ 
-        listSubgraphOfNode.push(subgraphID);
-    }
-  }
-}
-&nbsp;
-/**
- * Updates the parent of a subgraph by adding the subgraph to its list of child subgraph.
- * @param subgraphNetwork 
- * @param subgraph 
- * @returns subgraphNetwork updated
- */
-export function updateParentSubgraphOf(subgraphNetwork:SubgraphNetwork,subgraph:Subgraph):SubgraphNetwork{
-    if (subgraph.parentSubgraph){
-        const nameParent=subgraph.parentSubgraph.name;
-        const typeParent=subgraph.parentSubgraph.type;
-        if (subgraphNetwork[typeParent] &amp;&amp; nameParent in subgraphNetwork[typeParent]){
-            if (!subgraphNetwork[typeParent][nameParent].childrenSubgraphs){
-                subgraphNetwork[typeParent][nameParent].childrenSubgraphs=[];
-            }
-            subgraphNetwork[typeParent][nameParent].childrenSubgraphs.push({name:subgraph.name,type:subgraph.type as TypeSubgraph});
-        }else{
-           throw new Error("parent subgraph not in subgraphNetwork");
-        }
-    }
-    return subgraphNetwork;
-}
-&nbsp;</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-17T13:53:06.107Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/SubgraphForViz.ts.html b/coverage/lcov-report/composables/SubgraphForViz.ts.html
deleted file mode 100644
index f10826c408387b290cd81e745038328e8221a06a..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/SubgraphForViz.ts.html
+++ /dev/null
@@ -1,466 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables/SubgraphForViz.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">composables</a> SubgraphForViz.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">6.81% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>3/44</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>0/32</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">0% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>0/8</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">7.5% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>3/40</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a>
-<a name='L46'></a><a href='#L46'>46</a>
-<a name='L47'></a><a href='#L47'>47</a>
-<a name='L48'></a><a href='#L48'>48</a>
-<a name='L49'></a><a href='#L49'>49</a>
-<a name='L50'></a><a href='#L50'>50</a>
-<a name='L51'></a><a href='#L51'>51</a>
-<a name='L52'></a><a href='#L52'>52</a>
-<a name='L53'></a><a href='#L53'>53</a>
-<a name='L54'></a><a href='#L54'>54</a>
-<a name='L55'></a><a href='#L55'>55</a>
-<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a>
-<a name='L58'></a><a href='#L58'>58</a>
-<a name='L59'></a><a href='#L59'>59</a>
-<a name='L60'></a><a href='#L60'>60</a>
-<a name='L61'></a><a href='#L61'>61</a>
-<a name='L62'></a><a href='#L62'>62</a>
-<a name='L63'></a><a href='#L63'>63</a>
-<a name='L64'></a><a href='#L64'>64</a>
-<a name='L65'></a><a href='#L65'>65</a>
-<a name='L66'></a><a href='#L66'>66</a>
-<a name='L67'></a><a href='#L67'>67</a>
-<a name='L68'></a><a href='#L68'>68</a>
-<a name='L69'></a><a href='#L69'>69</a>
-<a name='L70'></a><a href='#L70'>70</a>
-<a name='L71'></a><a href='#L71'>71</a>
-<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a>
-<a name='L74'></a><a href='#L74'>74</a>
-<a name='L75'></a><a href='#L75'>75</a>
-<a name='L76'></a><a href='#L76'>76</a>
-<a name='L77'></a><a href='#L77'>77</a>
-<a name='L78'></a><a href='#L78'>78</a>
-<a name='L79'></a><a href='#L79'>79</a>
-<a name='L80'></a><a href='#L80'>80</a>
-<a name='L81'></a><a href='#L81'>81</a>
-<a name='L82'></a><a href='#L82'>82</a>
-<a name='L83'></a><a href='#L83'>83</a>
-<a name='L84'></a><a href='#L84'>84</a>
-<a name='L85'></a><a href='#L85'>85</a>
-<a name='L86'></a><a href='#L86'>86</a>
-<a name='L87'></a><a href='#L87'>87</a>
-<a name='L88'></a><a href='#L88'>88</a>
-<a name='L89'></a><a href='#L89'>89</a>
-<a name='L90'></a><a href='#L90'>90</a>
-<a name='L91'></a><a href='#L91'>91</a>
-<a name='L92'></a><a href='#L92'>92</a>
-<a name='L93'></a><a href='#L93'>93</a>
-<a name='L94'></a><a href='#L94'>94</a>
-<a name='L95'></a><a href='#L95'>95</a>
-<a name='L96'></a><a href='#L96'>96</a>
-<a name='L97'></a><a href='#L97'>97</a>
-<a name='L98'></a><a href='#L98'>98</a>
-<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a>
-<a name='L101'></a><a href='#L101'>101</a>
-<a name='L102'></a><a href='#L102'>102</a>
-<a name='L103'></a><a href='#L103'>103</a>
-<a name='L104'></a><a href='#L104'>104</a>
-<a name='L105'></a><a href='#L105'>105</a>
-<a name='L106'></a><a href='#L106'>106</a>
-<a name='L107'></a><a href='#L107'>107</a>
-<a name='L108'></a><a href='#L108'>108</a>
-<a name='L109'></a><a href='#L109'>109</a>
-<a name='L110'></a><a href='#L110'>110</a>
-<a name='L111'></a><a href='#L111'>111</a>
-<a name='L112'></a><a href='#L112'>112</a>
-<a name='L113'></a><a href='#L113'>113</a>
-<a name='L114'></a><a href='#L114'>114</a>
-<a name='L115'></a><a href='#L115'>115</a>
-<a name='L116'></a><a href='#L116'>116</a>
-<a name='L117'></a><a href='#L117'>117</a>
-<a name='L118'></a><a href='#L118'>118</a>
-<a name='L119'></a><a href='#L119'>119</a>
-<a name='L120'></a><a href='#L120'>120</a>
-<a name='L121'></a><a href='#L121'>121</a>
-<a name='L122'></a><a href='#L122'>122</a>
-<a name='L123'></a><a href='#L123'>123</a>
-<a name='L124'></a><a href='#L124'>124</a>
-<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a>
-<a name='L127'></a><a href='#L127'>127</a>
-<a name='L128'></a><a href='#L128'>128</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Type imports
-import {  TypeSubgraph } from "../types/Subgraph";
-import { SubgraphNetwork } from "../types/SubgraphNetwork";
-&nbsp;
-// General imports
-import { Graph } from "@viz-js/viz";
-&nbsp;
-/**
- * This file contains functions to manage subgraphs for viz graph.
- * 
- * -&gt; addMainChainForViz :
- *      Adds a main chain to the viz graph.
- * 
- * -&gt; changeCycleMetanodes :
- *      Changes list of nodes to replace nodes in cycle by the metanode.
- * 
- * -&gt; subgraphDot :
- *      Create a subgraph dot representation for viz.
- */
-&nbsp;
-&nbsp;
-/**
- * Adds a main chain to the viz graph.
- * 
- * @param vizGraph - The viz graph to add the main chain to.
- * @param nameMainChain - The name of the main chain.
- * @param subgraphNetwork - The subgraph network containing the main chain.
- * @param cycle - Optional. Specifies whether to apply cycle changes to the nodes. Defaults to true.
- * @param isCluster - Optional. Specifies whether the main chain should be treated as a cluster. Defaults to true.
- * @returns The updated visualization graph.
- * @throws Error if the main chain is not found in the subgraph network.
- */
-export function <span class="fstat-no" title="function not covered" >addMainChainForViz(</span>vizGraph: Graph, nameMainChain: string, subgraphNetwork:SubgraphNetwork,cycle:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true,</span>isCluster:boolean=<span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: Graph {
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if ( !subgraphNetwork[TypeSubgraph.MAIN_CHAIN] || !subgraphNetwork[TypeSubgraph.MAIN_CHAIN][nameMainChain])  <span class="cstat-no" title="statement not covered" >throw new Error("Main chain not found in subgraphNetwork");</span></span>
-&nbsp;
-    // get values from cluster and change nodes format : new cluster format (for viz)
-    let { name, nodes ,childrenSubgraphs} = <span class="cstat-no" title="statement not covered" >subgraphNetwork[TypeSubgraph.MAIN_CHAIN][nameMainChain];</span>
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if(cycle) {</span>
-<span class="cstat-no" title="statement not covered" >        nodes=changeCycleMetanodes(subgraphNetwork,nodes);</span>
-    }
-&nbsp;
-    // change format
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (isCluster &amp;&amp; !name.startsWith("cluster_")) {</span>
-<span class="cstat-no" title="statement not covered" >        name = "cluster_" + name;</span>
-    }
-    const clusterViz: SubgraphViz = <span class="cstat-no" title="statement not covered" >{</span>
-        name: name,
-        nodes: nodes?.map(<span class="fstat-no" title="function not covered" >(n</span>ame: string) =&gt; (<span class="cstat-no" title="statement not covered" >{ name:name })</span>) || []
-    };
-&nbsp;
-    //add node of children subgraph           !!!!!BEWARE : only one level of children!!!!
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (childrenSubgraphs){</span>
-<span class="cstat-no" title="statement not covered" >            childrenSubgraphs.forEach(<span class="fstat-no" title="function not covered" >subgraph </span>=&gt; {</span>
-                const subgraphs=<span class="cstat-no" title="statement not covered" >subgraphNetwork[subgraph.type];</span>
-<span class="cstat-no" title="statement not covered" >                <span class="missing-if-branch" title="if path not taken" >I</span>if (subgraphs &amp;&amp; subgraphs[subgraph.name]){</span>
-                    let nodeToAdd =<span class="cstat-no" title="statement not covered" >subgraphs[subgraph.name].nodes;</span>
-<span class="cstat-no" title="statement not covered" >                    <span class="missing-if-branch" title="if path not taken" >I</span>if(cycle){</span>
-<span class="cstat-no" title="statement not covered" >                        nodeToAdd=changeCycleMetanodes(subgraphNetwork,nodeToAdd);</span>
-                    }
-<span class="cstat-no" title="statement not covered" >                    <span class="missing-if-branch" title="if path not taken" >I</span>if (!clusterViz.nodes) <span class="cstat-no" title="statement not covered" >clusterViz.nodes = [];</span></span>
-<span class="cstat-no" title="statement not covered" >                    clusterViz.nodes.push(...nodeToAdd.map(<span class="fstat-no" title="function not covered" >(n</span>ame: string) =&gt; (<span class="cstat-no" title="statement not covered" >{ name:name })</span>)); </span>  // add and change format    
-                }
-            });
-        }
-    
-&nbsp;
-    // push cluster for viz
-<span class="cstat-no" title="statement not covered" >    <span class="missing-if-branch" title="if path not taken" >I</span>if (!vizGraph.subgraphs) {</span>
-<span class="cstat-no" title="statement not covered" >        vizGraph.subgraphs = [];</span>
-    }
-<span class="cstat-no" title="statement not covered" >    vizGraph.subgraphs.push(clusterViz);</span>
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    return vizGraph;</span>
-}
-&nbsp;
-&nbsp;
-/**
- * Changes list of nodes to replace nodes in cycle by the metanode.
- * 
- * @param subgraphNetwork - The subgraph network.
- * @param listNodeBefore - The list of nodes before the change.
- * @returns The list of nodes after the change.
- * @throws {Error} If a node is not found in the network.
- */
-function <span class="fstat-no" title="function not covered" >changeCycleMetanodes(</span>subgraphNetwork:SubgraphNetwork,listNodeBefore:string[]):string[]{
-    const network=<span class="cstat-no" title="statement not covered" >subgraphNetwork.network;</span>
-    const listNodeAfter:string[]=<span class="cstat-no" title="statement not covered" >[];</span>
-    // for each nodes :
-<span class="cstat-no" title="statement not covered" >    listNodeBefore.forEach(<span class="fstat-no" title="function not covered" >node </span>=&gt;{</span>
-        // if node is in cycle metanode :
-<span class="cstat-no" title="statement not covered" >        <span class="missing-if-branch" title="if path not taken" >I</span>if (!(node in network.nodes)) <span class="cstat-no" title="statement not covered" >throw new Error("Node not found in network");</span></span>
-&nbsp;
-        let cycle:string;
-<span class="cstat-no" title="statement not covered" >        if (network.nodes[node].metadataLayout &amp;&amp; network.nodes[node].metadataLayout[TypeSubgraph.CYCLEGROUP]){</span>
-<span class="cstat-no" title="statement not covered" >            cycle = network.nodes[node].metadataLayout[TypeSubgraph.CYCLEGROUP]; </span>
-            //cycle=inBiggerCycle(cycle,subgraphNetwork)
-<span class="cstat-no" title="statement not covered" >            <span class="missing-if-branch" title="if path not taken" >I</span>if(!(listNodeAfter.includes(cycle))){</span>
-                // push node cycle
-<span class="cstat-no" title="statement not covered" >                listNodeAfter.push(cycle);</span>
-            } 
-        }else{
-<span class="cstat-no" title="statement not covered" >            listNodeAfter.push(node);</span>
-        }
-    });
-<span class="cstat-no" title="statement not covered" >    return listNodeAfter;</span>
-}
-&nbsp;
-/**
- * Create a subgraph dot representation for viz.
- * 
- * @param subgraph - The subgraph to add the dot representation for.
- * @returns The dot representation of the subgraph.
- * @throws {Error} If there are no nodes in the subgraph.
- */
-export function <span class="fstat-no" title="function not covered" >subgraphDot(</span>subgraph: SubgraphViz): string {
-&nbsp;
-<span class="cstat-no" title="statement not covered" >    if (subgraph.nodes &amp;&amp; subgraph.nodes.length&gt;0) {</span>
-        let clusterString = <span class="cstat-no" title="statement not covered" >`subgraph ${subgraph.name} {\n`;</span>
-<span class="cstat-no" title="statement not covered" >        subgraph.nodes.forEach(<span class="fstat-no" title="function not covered" >(n</span>ode) =&gt; {</span>
-<span class="cstat-no" title="statement not covered" >            clusterString+=`${node.name};`;</span>
-        });
-<span class="cstat-no" title="statement not covered" >        return clusterString+"}\n";</span>
-    }else{
-<span class="cstat-no" title="statement not covered" >        throw new Error("No nodes in subgraph");</span>
-    }
-    
-  }</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/composables/index.html b/coverage/lcov-report/composables/index.html
deleted file mode 100644
index befbab795fb3b993ac171952a783f0dd4b09d54f..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/composables/index.html
+++ /dev/null
@@ -1,221 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for composables</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> composables</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">24.86% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>185/744</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">11.5% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>46/400</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">12.42% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>20/161</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">25.82% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>180/697</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <div class="pad1">
-<table class="coverage-summary">
-<thead>
-<tr>
-   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
-   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
-   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
-   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
-   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
-   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
-   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
-   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
-   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
-   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
-</tr>
-</thead>
-<tbody><tr>
-	<td class="file low" data-value="AlgorithmBFS.ts"><a href="AlgorithmBFS.ts.html">AlgorithmBFS.ts</a></td>
-	<td data-value="14.28" class="pic low">
-	<div class="chart"><div class="cover-fill" style="width: 14%"></div><div class="cover-empty" style="width: 86%"></div></div>
-	</td>
-	<td data-value="14.28" class="pct low">14.28%</td>
-	<td data-value="28" class="abs low">4/28</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="13" class="abs low">0/13</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="4" class="abs low">0/4</td>
-	<td data-value="14.28" class="pct low">14.28%</td>
-	<td data-value="28" class="abs low">4/28</td>
-	</tr>
-
-<tr>
-	<td class="file low" data-value="CalculateRelationCycle.ts"><a href="CalculateRelationCycle.ts.html">CalculateRelationCycle.ts</a></td>
-	<td data-value="9.37" class="pic low">
-	<div class="chart"><div class="cover-fill" style="width: 9%"></div><div class="cover-empty" style="width: 91%"></div></div>
-	</td>
-	<td data-value="9.37" class="pct low">9.37%</td>
-	<td data-value="160" class="abs low">15/160</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="99" class="abs low">0/99</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="40" class="abs low">0/40</td>
-	<td data-value="9.8" class="pct low">9.8%</td>
-	<td data-value="153" class="abs low">15/153</td>
-	</tr>
-
-<tr>
-	<td class="file low" data-value="CalculateSize.ts"><a href="CalculateSize.ts.html">CalculateSize.ts</a></td>
-	<td data-value="12.24" class="pic low">
-	<div class="chart"><div class="cover-fill" style="width: 12%"></div><div class="cover-empty" style="width: 88%"></div></div>
-	</td>
-	<td data-value="12.24" class="pct low">12.24%</td>
-	<td data-value="147" class="abs low">18/147</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="58" class="abs low">0/58</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="29" class="abs low">0/29</td>
-	<td data-value="13.53" class="pct low">13.53%</td>
-	<td data-value="133" class="abs low">18/133</td>
-	</tr>
-
-<tr>
-	<td class="file low" data-value="CalculateStartNodes.ts"><a href="CalculateStartNodes.ts.html">CalculateStartNodes.ts</a></td>
-	<td data-value="9.25" class="pic low">
-	<div class="chart"><div class="cover-fill" style="width: 9%"></div><div class="cover-empty" style="width: 91%"></div></div>
-	</td>
-	<td data-value="9.25" class="pct low">9.25%</td>
-	<td data-value="54" class="abs low">5/54</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="25" class="abs low">0/25</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="17" class="abs low">0/17</td>
-	<td data-value="10.41" class="pct low">10.41%</td>
-	<td data-value="48" class="abs low">5/48</td>
-	</tr>
-
-<tr>
-	<td class="file low" data-value="ConvertFromNetwork.ts"><a href="ConvertFromNetwork.ts.html">ConvertFromNetwork.ts</a></td>
-	<td data-value="9.15" class="pic low">
-	<div class="chart"><div class="cover-fill" style="width: 9%"></div><div class="cover-empty" style="width: 91%"></div></div>
-	</td>
-	<td data-value="9.15" class="pct low">9.15%</td>
-	<td data-value="142" class="abs low">13/142</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="96" class="abs low">0/96</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="31" class="abs low">0/31</td>
-	<td data-value="9.62" class="pct low">9.62%</td>
-	<td data-value="135" class="abs low">13/135</td>
-	</tr>
-
-<tr>
-	<td class="file low" data-value="GetSetAttributsNodes.ts"><a href="GetSetAttributsNodes.ts.html">GetSetAttributsNodes.ts</a></td>
-	<td data-value="30.9" class="pic low">
-	<div class="chart"><div class="cover-fill" style="width: 30%"></div><div class="cover-empty" style="width: 70%"></div></div>
-	</td>
-	<td data-value="30.9" class="pct low">30.9%</td>
-	<td data-value="55" class="abs low">17/55</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="26" class="abs low">0/26</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="12" class="abs low">0/12</td>
-	<td data-value="33.33" class="pct low">33.33%</td>
-	<td data-value="51" class="abs low">17/51</td>
-	</tr>
-
-<tr>
-	<td class="file high" data-value="LayoutReversibleReactions.ts"><a href="LayoutReversibleReactions.ts.html">LayoutReversibleReactions.ts</a></td>
-	<td data-value="96.49" class="pic high">
-	<div class="chart"><div class="cover-fill" style="width: 96%"></div><div class="cover-empty" style="width: 4%"></div></div>
-	</td>
-	<td data-value="96.49" class="pct high">96.49%</td>
-	<td data-value="114" class="abs high">110/114</td>
-	<td data-value="90.19" class="pct high">90.19%</td>
-	<td data-value="51" class="abs high">46/51</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="20" class="abs high">20/20</td>
-	<td data-value="96.33" class="pct high">96.33%</td>
-	<td data-value="109" class="abs high">105/109</td>
-	</tr>
-
-<tr>
-	<td class="file low" data-value="SubgraphForViz.ts"><a href="SubgraphForViz.ts.html">SubgraphForViz.ts</a></td>
-	<td data-value="6.81" class="pic low">
-	<div class="chart"><div class="cover-fill" style="width: 6%"></div><div class="cover-empty" style="width: 94%"></div></div>
-	</td>
-	<td data-value="6.81" class="pct low">6.81%</td>
-	<td data-value="44" class="abs low">3/44</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="32" class="abs low">0/32</td>
-	<td data-value="0" class="pct low">0%</td>
-	<td data-value="8" class="abs low">0/8</td>
-	<td data-value="7.5" class="pct low">7.5%</td>
-	<td data-value="40" class="abs low">3/40</td>
-	</tr>
-
-</tbody>
-</table>
-</div>
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png
deleted file mode 100644
index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000
Binary files a/coverage/lcov-report/favicon.png and /dev/null differ
diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html
deleted file mode 100644
index bc4bf4689c2cc9f6067e9db69b6b355999c21de7..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/index.html
+++ /dev/null
@@ -1,131 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for All files</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="prettify.css" />
-    <link rel="stylesheet" href="base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1>All files</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">27.87% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>216/775</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">14.07% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>58/412</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">15.56% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>26/167</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">28.98% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>211/728</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line low'></div>
-    <div class="pad1">
-<table class="coverage-summary">
-<thead>
-<tr>
-   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
-   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
-   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
-   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
-   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
-   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
-   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
-   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
-   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
-   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
-</tr>
-</thead>
-<tbody><tr>
-	<td class="file low" data-value="composables"><a href="composables/index.html">composables</a></td>
-	<td data-value="24.86" class="pic low">
-	<div class="chart"><div class="cover-fill" style="width: 24%"></div><div class="cover-empty" style="width: 76%"></div></div>
-	</td>
-	<td data-value="24.86" class="pct low">24.86%</td>
-	<td data-value="744" class="abs low">185/744</td>
-	<td data-value="11.5" class="pct low">11.5%</td>
-	<td data-value="400" class="abs low">46/400</td>
-	<td data-value="12.42" class="pct low">12.42%</td>
-	<td data-value="161" class="abs low">20/161</td>
-	<td data-value="25.82" class="pct low">25.82%</td>
-	<td data-value="697" class="abs low">180/697</td>
-	</tr>
-
-<tr>
-	<td class="file high" data-value="types"><a href="types/index.html">types</a></td>
-	<td data-value="100" class="pic high">
-	<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
-	</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="31" class="abs high">31/31</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="12" class="abs high">12/12</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="6" class="abs high">6/6</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="31" class="abs high">31/31</td>
-	</tr>
-
-</tbody>
-</table>
-</div>
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="sorter.js"></script>
-        <script src="block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css
deleted file mode 100644
index b317a7cda31a440fbd47540297ee3c68d51f343e..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/prettify.css
+++ /dev/null
@@ -1 +0,0 @@
-.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js
deleted file mode 100644
index b3225238f26e3ab49a5e41e9cb287a73c82740b7..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/prettify.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* eslint-disable */
-window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png
deleted file mode 100644
index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000
Binary files a/coverage/lcov-report/sort-arrow-sprite.png and /dev/null differ
diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js
deleted file mode 100644
index 2bb296a8ca8e48e468f22b92250b9fe2518b8cfc..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/sorter.js
+++ /dev/null
@@ -1,196 +0,0 @@
-/* eslint-disable */
-var addSorting = (function() {
-    'use strict';
-    var cols,
-        currentSort = {
-            index: 0,
-            desc: false
-        };
-
-    // returns the summary table element
-    function getTable() {
-        return document.querySelector('.coverage-summary');
-    }
-    // returns the thead element of the summary table
-    function getTableHeader() {
-        return getTable().querySelector('thead tr');
-    }
-    // returns the tbody element of the summary table
-    function getTableBody() {
-        return getTable().querySelector('tbody');
-    }
-    // returns the th element for nth column
-    function getNthColumn(n) {
-        return getTableHeader().querySelectorAll('th')[n];
-    }
-
-    function onFilterInput() {
-        const searchValue = document.getElementById('fileSearch').value;
-        const rows = document.getElementsByTagName('tbody')[0].children;
-        for (let i = 0; i < rows.length; i++) {
-            const row = rows[i];
-            if (
-                row.textContent
-                    .toLowerCase()
-                    .includes(searchValue.toLowerCase())
-            ) {
-                row.style.display = '';
-            } else {
-                row.style.display = 'none';
-            }
-        }
-    }
-
-    // loads the search box
-    function addSearchBox() {
-        var template = document.getElementById('filterTemplate');
-        var templateClone = template.content.cloneNode(true);
-        templateClone.getElementById('fileSearch').oninput = onFilterInput;
-        template.parentElement.appendChild(templateClone);
-    }
-
-    // loads all columns
-    function loadColumns() {
-        var colNodes = getTableHeader().querySelectorAll('th'),
-            colNode,
-            cols = [],
-            col,
-            i;
-
-        for (i = 0; i < colNodes.length; i += 1) {
-            colNode = colNodes[i];
-            col = {
-                key: colNode.getAttribute('data-col'),
-                sortable: !colNode.getAttribute('data-nosort'),
-                type: colNode.getAttribute('data-type') || 'string'
-            };
-            cols.push(col);
-            if (col.sortable) {
-                col.defaultDescSort = col.type === 'number';
-                colNode.innerHTML =
-                    colNode.innerHTML + '<span class="sorter"></span>';
-            }
-        }
-        return cols;
-    }
-    // attaches a data attribute to every tr element with an object
-    // of data values keyed by column name
-    function loadRowData(tableRow) {
-        var tableCols = tableRow.querySelectorAll('td'),
-            colNode,
-            col,
-            data = {},
-            i,
-            val;
-        for (i = 0; i < tableCols.length; i += 1) {
-            colNode = tableCols[i];
-            col = cols[i];
-            val = colNode.getAttribute('data-value');
-            if (col.type === 'number') {
-                val = Number(val);
-            }
-            data[col.key] = val;
-        }
-        return data;
-    }
-    // loads all row data
-    function loadData() {
-        var rows = getTableBody().querySelectorAll('tr'),
-            i;
-
-        for (i = 0; i < rows.length; i += 1) {
-            rows[i].data = loadRowData(rows[i]);
-        }
-    }
-    // sorts the table using the data for the ith column
-    function sortByIndex(index, desc) {
-        var key = cols[index].key,
-            sorter = function(a, b) {
-                a = a.data[key];
-                b = b.data[key];
-                return a < b ? -1 : a > b ? 1 : 0;
-            },
-            finalSorter = sorter,
-            tableBody = document.querySelector('.coverage-summary tbody'),
-            rowNodes = tableBody.querySelectorAll('tr'),
-            rows = [],
-            i;
-
-        if (desc) {
-            finalSorter = function(a, b) {
-                return -1 * sorter(a, b);
-            };
-        }
-
-        for (i = 0; i < rowNodes.length; i += 1) {
-            rows.push(rowNodes[i]);
-            tableBody.removeChild(rowNodes[i]);
-        }
-
-        rows.sort(finalSorter);
-
-        for (i = 0; i < rows.length; i += 1) {
-            tableBody.appendChild(rows[i]);
-        }
-    }
-    // removes sort indicators for current column being sorted
-    function removeSortIndicators() {
-        var col = getNthColumn(currentSort.index),
-            cls = col.className;
-
-        cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
-        col.className = cls;
-    }
-    // adds sort indicators for current column being sorted
-    function addSortIndicators() {
-        getNthColumn(currentSort.index).className += currentSort.desc
-            ? ' sorted-desc'
-            : ' sorted';
-    }
-    // adds event listeners for all sorter widgets
-    function enableUI() {
-        var i,
-            el,
-            ithSorter = function ithSorter(i) {
-                var col = cols[i];
-
-                return function() {
-                    var desc = col.defaultDescSort;
-
-                    if (currentSort.index === i) {
-                        desc = !currentSort.desc;
-                    }
-                    sortByIndex(i, desc);
-                    removeSortIndicators();
-                    currentSort.index = i;
-                    currentSort.desc = desc;
-                    addSortIndicators();
-                };
-            };
-        for (i = 0; i < cols.length; i += 1) {
-            if (cols[i].sortable) {
-                // add the click event handler on the th so users
-                // dont have to click on those tiny arrows
-                el = getNthColumn(i).querySelector('.sorter').parentElement;
-                if (el.addEventListener) {
-                    el.addEventListener('click', ithSorter(i));
-                } else {
-                    el.attachEvent('onclick', ithSorter(i));
-                }
-            }
-        }
-    }
-    // adds sorting functionality to the UI
-    return function() {
-        if (!getTable()) {
-            return;
-        }
-        cols = loadColumns();
-        loadData();
-        addSearchBox();
-        addSortIndicators();
-        enableUI();
-    };
-})();
-
-window.addEventListener('load', addSorting);
diff --git a/coverage/lcov-report/types/EnumArgs.ts.html b/coverage/lcov-report/types/EnumArgs.ts.html
deleted file mode 100644
index 4e9533055d91266702441d837635b8129ede360c..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/types/EnumArgs.ts.html
+++ /dev/null
@@ -1,187 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for types/EnumArgs.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">types</a> EnumArgs.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>26/26</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>10/10</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>5/5</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>26/26</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line high'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export enum StartNodesType {
-    SOURCE_ONLY = "source_only",
-    SOURCE_ALL="source_all",
-    RANK_ONLY = "rank_only",
-    RANK_SOURCE = "rank_source",
-    RANK_SOURCE_ALL="rank_source_all",
-    ALL = "all",
-}
-&nbsp;
-export enum PathType {
-    LONGEST='longest',
-    ALL_LONGEST='all_longest',
-    ALL='all'
-}
-&nbsp;
-export enum Ordering {
-    DEFAULT = "",
-    IN = "in",
-    OUT = "out"
-}
-&nbsp;
-export enum Algo{
-    DEFAULT,
-    FORCE,
-    VIZ,
-    ALGO, // default : main chain with all longest
-    ALGO_V0, // no main chain
-    ALGO_V1, // main chain with longest
-    ALGO_V3 // main chain with all paths
-}
-&nbsp;
-export enum VizArgs{
-    RANKSEP="ranksep",
-    NODESEP="nodesep",
-}</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/types/Subgraph.ts.html b/coverage/lcov-report/types/Subgraph.ts.html
deleted file mode 100644
index 2508c2f10af93917b13338b653873a1148d5db21..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/types/Subgraph.ts.html
+++ /dev/null
@@ -1,217 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for types/Subgraph.ts</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> / <a href="index.html">types</a> Subgraph.ts</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>5/5</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>2/2</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>1/1</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>5/5</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line high'></div>
-    <pre><table class="coverage">
-<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
-<a name='L2'></a><a href='#L2'>2</a>
-<a name='L3'></a><a href='#L3'>3</a>
-<a name='L4'></a><a href='#L4'>4</a>
-<a name='L5'></a><a href='#L5'>5</a>
-<a name='L6'></a><a href='#L6'>6</a>
-<a name='L7'></a><a href='#L7'>7</a>
-<a name='L8'></a><a href='#L8'>8</a>
-<a name='L9'></a><a href='#L9'>9</a>
-<a name='L10'></a><a href='#L10'>10</a>
-<a name='L11'></a><a href='#L11'>11</a>
-<a name='L12'></a><a href='#L12'>12</a>
-<a name='L13'></a><a href='#L13'>13</a>
-<a name='L14'></a><a href='#L14'>14</a>
-<a name='L15'></a><a href='#L15'>15</a>
-<a name='L16'></a><a href='#L16'>16</a>
-<a name='L17'></a><a href='#L17'>17</a>
-<a name='L18'></a><a href='#L18'>18</a>
-<a name='L19'></a><a href='#L19'>19</a>
-<a name='L20'></a><a href='#L20'>20</a>
-<a name='L21'></a><a href='#L21'>21</a>
-<a name='L22'></a><a href='#L22'>22</a>
-<a name='L23'></a><a href='#L23'>23</a>
-<a name='L24'></a><a href='#L24'>24</a>
-<a name='L25'></a><a href='#L25'>25</a>
-<a name='L26'></a><a href='#L26'>26</a>
-<a name='L27'></a><a href='#L27'>27</a>
-<a name='L28'></a><a href='#L28'>28</a>
-<a name='L29'></a><a href='#L29'>29</a>
-<a name='L30'></a><a href='#L30'>30</a>
-<a name='L31'></a><a href='#L31'>31</a>
-<a name='L32'></a><a href='#L32'>32</a>
-<a name='L33'></a><a href='#L33'>33</a>
-<a name='L34'></a><a href='#L34'>34</a>
-<a name='L35'></a><a href='#L35'>35</a>
-<a name='L36'></a><a href='#L36'>36</a>
-<a name='L37'></a><a href='#L37'>37</a>
-<a name='L38'></a><a href='#L38'>38</a>
-<a name='L39'></a><a href='#L39'>39</a>
-<a name='L40'></a><a href='#L40'>40</a>
-<a name='L41'></a><a href='#L41'>41</a>
-<a name='L42'></a><a href='#L42'>42</a>
-<a name='L43'></a><a href='#L43'>43</a>
-<a name='L44'></a><a href='#L44'>44</a>
-<a name='L45'></a><a href='#L45'>45</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Coordinate, CoordinateNull } from "./CoordinatesSize";
-import { Ordering } from "./EnumArgs";
-&nbsp;
-/**
- * This file contains the types for the Subgraph object : main chain, secondary chain, cycle and cycle group.
- * A subgraph can be considered as a metanode in the network. Its width and height are the width and height of the rectangle containing the metanode.
- * Its position is the center of the rectangle, and the originalPosition is the position of the center of the metanode before the layout (when coordinates precalculated).
- */
-&nbsp;
-export enum TypeSubgraph {
-    MAIN_CHAIN = "mainChains",
-    SECONDARY_CHAIN = "secondaryChains",
-    CYCLE = "cycles",
-    CYCLEGROUP="cyclesGroup"
-}
-&nbsp;
-export interface Subgraph {
-    name: string;
-    classes?: Array&lt;string&gt;;
-    nodes: Array&lt;string&gt;;
-    type: TypeSubgraph;
-&nbsp;
-    // if subgraph associated with another subgraph (like secondary chain associated with a main chain) :
-    parentSubgraph?: {name:string,type:TypeSubgraph}; // the "parent" subgraph
-    childrenSubgraphs?: Array&lt;{name:string,type:TypeSubgraph}&gt;; // the "children" subgraphs
-&nbsp;
-    rank?:string;
-    ordering?:Ordering;
-&nbsp;
-    width?:number;
-    height?:number;
-    position?:Coordinate;
-    originalPosition?:Coordinate; // if metanode : the metanode center not well positionned (precalulated position)
-&nbsp;
-    precalculatedNodesPosition?: {[key: string]: CoordinateNull}; // if metanode : the position of the nodes in the metanode. Null indicates a need of placement by force layout
-&nbsp;
-    radiusCycle?:number; // if cycle : the radius of the circle  
-    centroidCycle?:Coordinate; // if cycle  : the center of the circle 
-&nbsp;
-    }
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;
-&nbsp;</pre></td></tr></table></pre>
-
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov-report/types/index.html b/coverage/lcov-report/types/index.html
deleted file mode 100644
index 4c1c87ea498613f4dc01cdff0f7b02872e58a204..0000000000000000000000000000000000000000
--- a/coverage/lcov-report/types/index.html
+++ /dev/null
@@ -1,131 +0,0 @@
-
-<!doctype html>
-<html lang="en">
-
-<head>
-    <title>Code coverage report for types</title>
-    <meta charset="utf-8" />
-    <link rel="stylesheet" href="../prettify.css" />
-    <link rel="stylesheet" href="../base.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <style type='text/css'>
-        .coverage-summary .sorter {
-            background-image: url(../sort-arrow-sprite.png);
-        }
-    </style>
-</head>
-    
-<body>
-<div class='wrapper'>
-    <div class='pad1'>
-        <h1><a href="../index.html">All files</a> types</h1>
-        <div class='clearfix'>
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Statements</span>
-                <span class='fraction'>31/31</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Branches</span>
-                <span class='fraction'>12/12</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Functions</span>
-                <span class='fraction'>6/6</span>
-            </div>
-        
-            
-            <div class='fl pad1y space-right2'>
-                <span class="strong">100% </span>
-                <span class="quiet">Lines</span>
-                <span class='fraction'>31/31</span>
-            </div>
-        
-            
-        </div>
-        <p class="quiet">
-            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
-        </p>
-        <template id="filterTemplate">
-            <div class="quiet">
-                Filter:
-                <input type="search" id="fileSearch">
-            </div>
-        </template>
-    </div>
-    <div class='status-line high'></div>
-    <div class="pad1">
-<table class="coverage-summary">
-<thead>
-<tr>
-   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
-   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
-   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
-   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
-   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
-   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
-   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
-   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
-   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
-   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
-</tr>
-</thead>
-<tbody><tr>
-	<td class="file high" data-value="EnumArgs.ts"><a href="EnumArgs.ts.html">EnumArgs.ts</a></td>
-	<td data-value="100" class="pic high">
-	<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
-	</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="26" class="abs high">26/26</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="10" class="abs high">10/10</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="5" class="abs high">5/5</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="26" class="abs high">26/26</td>
-	</tr>
-
-<tr>
-	<td class="file high" data-value="Subgraph.ts"><a href="Subgraph.ts.html">Subgraph.ts</a></td>
-	<td data-value="100" class="pic high">
-	<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
-	</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="5" class="abs high">5/5</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="2" class="abs high">2/2</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="1" class="abs high">1/1</td>
-	<td data-value="100" class="pct high">100%</td>
-	<td data-value="5" class="abs high">5/5</td>
-	</tr>
-
-</tbody>
-</table>
-</div>
-                <div class='push'></div><!-- for sticky footer -->
-            </div><!-- /wrapper -->
-            <div class='footer quiet pad2 space-top1 center small'>
-                Code coverage generated by
-                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
-                at 2024-09-19T14:51:21.275Z
-            </div>
-        <script src="../prettify.js"></script>
-        <script>
-            window.onload = function () {
-                prettyPrint();
-            };
-        </script>
-        <script src="../sorter.js"></script>
-        <script src="../block-navigation.js"></script>
-    </body>
-</html>
-    
\ No newline at end of file
diff --git a/coverage/lcov.info b/coverage/lcov.info
deleted file mode 100644
index c1578fd32b7b1d289a6c7fc1c38bd2b817bc35f8..0000000000000000000000000000000000000000
--- a/coverage/lcov.info
+++ /dev/null
@@ -1,1564 +0,0 @@
-TN:
-SF:src/composables/AlgorithmBFS.ts
-FN:28,BFS
-FN:38,(anonymous_8)
-FN:65,BFSWithSources
-FN:82,(anonymous_11)
-FNF:4
-FNH:0
-FNDA:0,BFS
-FNDA:0,(anonymous_8)
-FNDA:0,BFSWithSources
-FNDA:0,(anonymous_11)
-DA:6,1
-DA:7,1
-DA:28,1
-DA:29,0
-DA:30,0
-DA:32,0
-DA:33,0
-DA:35,0
-DA:36,0
-DA:37,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:48,0
-DA:65,1
-DA:67,0
-DA:68,0
-DA:71,0
-DA:75,0
-DA:76,0
-DA:78,0
-DA:82,0
-DA:84,0
-DA:85,0
-DA:86,0
-DA:90,0
-DA:92,0
-LF:28
-LH:4
-BRDA:35,0,0,0
-BRDA:35,1,0,0
-BRDA:35,1,1,0
-BRDA:37,2,0,0
-BRDA:37,2,1,0
-BRDA:39,3,0,0
-BRDA:40,4,0,0
-BRDA:40,5,0,0
-BRDA:40,5,1,0
-BRDA:40,5,2,0
-BRDA:75,6,0,0
-BRDA:75,6,1,0
-BRDA:84,7,0,0
-BRF:13
-BRH:0
-end_of_record
-TN:
-SF:src/composables/CalculateRelationCycle.ts
-FN:94,neighborsGroupCycle
-FN:103,(anonymous_1)
-FN:138,parentNodeNotInCycle
-FN:139,(anonymous_3)
-FN:141,(anonymous_4)
-FN:142,(anonymous_5)
-FN:143,(anonymous_6)
-FN:145,(anonymous_7)
-FN:165,childNodeNotInCycle
-FN:166,(anonymous_9)
-FN:168,(anonymous_10)
-FN:169,(anonymous_11)
-FN:170,(anonymous_12)
-FN:172,(anonymous_13)
-FN:194,getNodesIDPlacedInGroupCycle
-FN:200,(anonymous_15)
-FN:201,(anonymous_16)
-FN:220,getNodesPlacedInGroupCycleAsArray
-FN:226,(anonymous_18)
-FN:227,(anonymous_19)
-FN:254,getNodesPlacedInGroupCycleAsObject
-FN:260,(anonymous_21)
-FN:261,(anonymous_22)
-FN:291,cycleMetanodeLink
-FN:330,sortLinksWithAllGroupCycle
-FN:336,(anonymous_25)
-FN:342,(anonymous_26)
-FN:363,sortLinksWithGroupCycle
-FN:387,(anonymous_28)
-FN:391,(anonymous_29)
-FN:413,getLinksNodeGroupCycle
-FN:416,(anonymous_31)
-FN:421,(anonymous_32)
-FN:434,getLinksForListNodes
-FN:435,(anonymous_34)
-FN:437,(anonymous_35)
-FN:457,getListNodeLinksForCycleGroupAsArray
-FN:460,(anonymous_37)
-FN:473,getListNodeLinksForCycleGroupAsObject
-FN:493,parentCycle
-FNF:40
-FNH:0
-FNDA:0,neighborsGroupCycle
-FNDA:0,(anonymous_1)
-FNDA:0,parentNodeNotInCycle
-FNDA:0,(anonymous_3)
-FNDA:0,(anonymous_4)
-FNDA:0,(anonymous_5)
-FNDA:0,(anonymous_6)
-FNDA:0,(anonymous_7)
-FNDA:0,childNodeNotInCycle
-FNDA:0,(anonymous_9)
-FNDA:0,(anonymous_10)
-FNDA:0,(anonymous_11)
-FNDA:0,(anonymous_12)
-FNDA:0,(anonymous_13)
-FNDA:0,getNodesIDPlacedInGroupCycle
-FNDA:0,(anonymous_15)
-FNDA:0,(anonymous_16)
-FNDA:0,getNodesPlacedInGroupCycleAsArray
-FNDA:0,(anonymous_18)
-FNDA:0,(anonymous_19)
-FNDA:0,getNodesPlacedInGroupCycleAsObject
-FNDA:0,(anonymous_21)
-FNDA:0,(anonymous_22)
-FNDA:0,cycleMetanodeLink
-FNDA:0,sortLinksWithAllGroupCycle
-FNDA:0,(anonymous_25)
-FNDA:0,(anonymous_26)
-FNDA:0,sortLinksWithGroupCycle
-FNDA:0,(anonymous_28)
-FNDA:0,(anonymous_29)
-FNDA:0,getLinksNodeGroupCycle
-FNDA:0,(anonymous_31)
-FNDA:0,(anonymous_32)
-FNDA:0,getLinksForListNodes
-FNDA:0,(anonymous_34)
-FNDA:0,(anonymous_35)
-FNDA:0,getListNodeLinksForCycleGroupAsArray
-FNDA:0,(anonymous_37)
-FNDA:0,getListNodeLinksForCycleGroupAsObject
-FNDA:0,parentCycle
-DA:4,1
-DA:5,1
-DA:10,1
-DA:94,1
-DA:95,0
-DA:96,0
-DA:97,0
-DA:98,0
-DA:100,0
-DA:102,0
-DA:103,0
-DA:104,0
-DA:105,0
-DA:106,0
-DA:107,0
-DA:110,0
-DA:112,0
-DA:113,0
-DA:114,0
-DA:117,0
-DA:118,0
-DA:119,0
-DA:122,0
-DA:125,0
-DA:138,1
-DA:139,0
-DA:140,0
-DA:141,0
-DA:142,0
-DA:143,0
-DA:144,0
-DA:145,0
-DA:146,0
-DA:147,0
-DA:148,0
-DA:151,0
-DA:153,0
-DA:165,1
-DA:166,0
-DA:167,0
-DA:168,0
-DA:169,0
-DA:170,0
-DA:171,0
-DA:172,0
-DA:173,0
-DA:174,0
-DA:175,0
-DA:178,0
-DA:181,0
-DA:194,1
-DA:195,0
-DA:196,0
-DA:197,0
-DA:198,0
-DA:199,0
-DA:200,0
-DA:201,0
-DA:203,0
-DA:206,0
-DA:220,1
-DA:221,0
-DA:222,0
-DA:223,0
-DA:224,0
-DA:225,0
-DA:226,0
-DA:228,0
-DA:229,0
-DA:230,0
-DA:233,0
-DA:237,0
-DA:240,0
-DA:254,1
-DA:255,0
-DA:256,0
-DA:257,0
-DA:258,0
-DA:259,0
-DA:260,0
-DA:262,0
-DA:263,0
-DA:265,0
-DA:268,0
-DA:271,0
-DA:291,1
-DA:293,0
-DA:298,0
-DA:299,0
-DA:300,0
-DA:302,0
-DA:306,0
-DA:307,0
-DA:308,0
-DA:310,0
-DA:313,0
-DA:314,0
-DA:316,0
-DA:317,0
-DA:330,1
-DA:331,0
-DA:334,0
-DA:336,0
-DA:337,0
-DA:338,0
-DA:339,0
-DA:342,0
-DA:343,0
-DA:344,0
-DA:347,0
-DA:350,0
-DA:364,0
-DA:365,0
-DA:368,0
-DA:369,0
-DA:371,0
-DA:375,0
-DA:376,0
-DA:377,0
-DA:378,0
-DA:381,0
-DA:382,0
-DA:383,0
-DA:387,0
-DA:389,0
-DA:391,0
-DA:392,0
-DA:396,0
-DA:398,0
-DA:414,0
-DA:416,0
-DA:417,0
-DA:421,0
-DA:422,0
-DA:434,1
-DA:435,0
-DA:436,0
-DA:437,0
-DA:457,1
-DA:459,0
-DA:460,0
-DA:461,0
-DA:462,0
-DA:473,1
-DA:475,0
-DA:476,0
-DA:477,0
-DA:478,0
-DA:493,1
-DA:494,0
-DA:495,0
-DA:496,0
-DA:498,0
-LF:153
-LH:15
-BRDA:94,0,0,0
-BRDA:95,1,0,0
-BRDA:95,1,1,0
-BRDA:95,2,0,0
-BRDA:95,2,1,0
-BRDA:97,3,0,0
-BRDA:97,3,1,0
-BRDA:102,4,0,0
-BRDA:104,5,0,0
-BRDA:104,6,0,0
-BRDA:104,6,1,0
-BRDA:110,7,0,0
-BRDA:110,7,1,0
-BRDA:138,8,0,0
-BRDA:144,9,0,0
-BRDA:165,10,0,0
-BRDA:171,11,0,0
-BRDA:195,12,0,0
-BRDA:195,12,1,0
-BRDA:195,13,0,0
-BRDA:195,13,1,0
-BRDA:197,14,0,0
-BRDA:197,14,1,0
-BRDA:200,15,0,0
-BRDA:200,15,1,0
-BRDA:220,16,0,0
-BRDA:221,17,0,0
-BRDA:221,17,1,0
-BRDA:221,18,0,0
-BRDA:221,18,1,0
-BRDA:223,19,0,0
-BRDA:223,19,1,0
-BRDA:226,20,0,0
-BRDA:226,20,1,0
-BRDA:228,21,0,0
-BRDA:228,21,1,0
-BRDA:228,22,0,0
-BRDA:228,22,1,0
-BRDA:229,23,0,0
-BRDA:229,23,1,0
-BRDA:255,24,0,0
-BRDA:255,24,1,0
-BRDA:255,25,0,0
-BRDA:255,25,1,0
-BRDA:257,26,0,0
-BRDA:257,26,1,0
-BRDA:260,27,0,0
-BRDA:260,27,1,0
-BRDA:262,28,0,0
-BRDA:262,29,0,0
-BRDA:262,29,1,0
-BRDA:291,30,0,0
-BRDA:298,31,0,0
-BRDA:298,31,1,0
-BRDA:298,32,0,0
-BRDA:298,32,1,0
-BRDA:298,32,2,0
-BRDA:298,32,3,0
-BRDA:306,33,0,0
-BRDA:306,33,1,0
-BRDA:306,34,0,0
-BRDA:306,34,1,0
-BRDA:306,34,2,0
-BRDA:306,34,3,0
-BRDA:308,35,0,0
-BRDA:313,36,0,0
-BRDA:314,37,0,0
-BRDA:330,38,0,0
-BRDA:334,39,0,0
-BRDA:334,39,1,0
-BRDA:334,40,0,0
-BRDA:334,40,1,0
-BRDA:343,41,0,0
-BRDA:365,42,0,0
-BRDA:365,42,1,0
-BRDA:365,43,0,0
-BRDA:365,43,1,0
-BRDA:375,44,0,0
-BRDA:375,44,1,0
-BRDA:414,45,0,0
-BRDA:414,45,1,0
-BRDA:417,46,0,0
-BRDA:417,46,1,0
-BRDA:417,46,2,0
-BRDA:417,46,3,0
-BRDA:422,47,0,0
-BRDA:422,47,1,0
-BRDA:422,47,2,0
-BRDA:422,47,3,0
-BRDA:436,48,0,0
-BRDA:436,48,1,0
-BRDA:457,49,0,0
-BRDA:494,50,0,0
-BRDA:494,51,0,0
-BRDA:494,51,1,0
-BRDA:495,52,0,0
-BRDA:495,52,1,0
-BRDA:495,53,0,0
-BRDA:495,53,1,0
-BRF:99
-BRH:0
-end_of_record
-TN:
-SF:src/composables/CalculateSize.ts
-FN:93,pixelsToInches
-FN:104,inchesToPixels
-FN:114,getSizeNodePixel
-FN:118,(anonymous_10)
-FN:137,getMeanNodesSizePixel
-FN:137,(anonymous_12)
-FN:141,(anonymous_13)
-FN:167,getSepAttributesInches
-FN:167,(anonymous_15)
-FN:183,getSepAttributesPixel
-FN:183,(anonymous_17)
-FN:204,minEdgeLength
-FN:206,(anonymous_19)
-FN:230,medianEdgeLength
-FN:232,(anonymous_21)
-FN:241,(anonymous_22)
-FN:266,rectangleSize
-FN:269,(anonymous_24)
-FN:270,(anonymous_25)
-FN:347,getSizeAllGroupCycles
-FN:349,(anonymous_27)
-FN:364,getSizeGroupCycles
-FN:368,(anonymous_29)
-FN:369,(anonymous_30)
-FN:370,(anonymous_31)
-FN:392,shiftAllToGetTopLeftCoord
-FN:393,(anonymous_33)
-FN:409,getTopLeftCoordFromCenter
-FN:421,getCenterCoordFromTopLeft
-FNF:29
-FNH:0
-FNDA:0,pixelsToInches
-FNDA:0,inchesToPixels
-FNDA:0,getSizeNodePixel
-FNDA:0,(anonymous_10)
-FNDA:0,getMeanNodesSizePixel
-FNDA:0,(anonymous_12)
-FNDA:0,(anonymous_13)
-FNDA:0,getSepAttributesInches
-FNDA:0,(anonymous_15)
-FNDA:0,getSepAttributesPixel
-FNDA:0,(anonymous_17)
-FNDA:0,minEdgeLength
-FNDA:0,(anonymous_19)
-FNDA:0,medianEdgeLength
-FNDA:0,(anonymous_21)
-FNDA:0,(anonymous_22)
-FNDA:0,rectangleSize
-FNDA:0,(anonymous_24)
-FNDA:0,(anonymous_25)
-FNDA:0,getSizeAllGroupCycles
-FNDA:0,(anonymous_27)
-FNDA:0,getSizeGroupCycles
-FNDA:0,(anonymous_29)
-FNDA:0,(anonymous_30)
-FNDA:0,(anonymous_31)
-FNDA:0,shiftAllToGetTopLeftCoord
-FNDA:0,(anonymous_33)
-FNDA:0,getTopLeftCoordFromCenter
-FNDA:0,getCenterCoordFromTopLeft
-DA:5,1
-DA:10,1
-DA:83,1
-DA:84,1
-DA:93,1
-DA:94,0
-DA:95,0
-DA:104,1
-DA:105,0
-DA:114,1
-DA:115,0
-DA:116,0
-DA:117,0
-DA:118,0
-DA:119,0
-DA:120,0
-DA:121,0
-DA:122,0
-DA:127,0
-DA:137,1
-DA:138,0
-DA:139,0
-DA:140,0
-DA:141,0
-DA:142,0
-DA:143,0
-DA:144,0
-DA:145,0
-DA:146,0
-DA:150,0
-DA:151,0
-DA:154,0
-DA:167,1
-DA:168,0
-DA:169,0
-DA:170,0
-DA:171,0
-DA:183,1
-DA:184,0
-DA:185,0
-DA:186,0
-DA:187,0
-DA:195,1
-DA:204,1
-DA:205,0
-DA:206,0
-DA:207,0
-DA:208,0
-DA:209,0
-DA:210,0
-DA:211,0
-DA:212,0
-DA:216,0
-DA:217,0
-DA:219,0
-DA:230,1
-DA:231,0
-DA:232,0
-DA:233,0
-DA:234,0
-DA:235,0
-DA:236,0
-DA:237,0
-DA:241,0
-DA:243,0
-DA:245,0
-DA:248,0
-DA:249,0
-DA:253,0
-DA:266,1
-DA:269,0
-DA:270,0
-DA:273,0
-DA:274,0
-DA:276,0
-DA:277,0
-DA:279,0
-DA:280,0
-DA:282,0
-DA:283,0
-DA:286,0
-DA:289,0
-DA:290,0
-DA:292,0
-DA:293,0
-DA:294,0
-DA:295,0
-DA:299,0
-DA:300,0
-DA:302,0
-DA:303,0
-DA:304,0
-DA:305,0
-DA:309,0
-DA:310,0
-DA:312,0
-DA:313,0
-DA:314,0
-DA:315,0
-DA:319,0
-DA:320,0
-DA:322,0
-DA:323,0
-DA:324,0
-DA:325,0
-DA:329,0
-DA:347,1
-DA:348,0
-DA:349,0
-DA:350,0
-DA:354,0
-DA:365,0
-DA:367,0
-DA:368,0
-DA:369,0
-DA:370,0
-DA:372,0
-DA:373,0
-DA:374,0
-DA:375,0
-DA:377,0
-DA:392,1
-DA:393,0
-DA:394,0
-DA:395,0
-DA:396,0
-DA:397,0
-DA:409,1
-DA:410,0
-DA:411,0
-DA:421,1
-DA:422,0
-DA:423,0
-LF:133
-LH:18
-BRDA:93,0,0,0
-BRDA:94,1,0,0
-BRDA:104,2,0,0
-BRDA:117,3,0,0
-BRDA:119,4,0,0
-BRDA:119,5,0,0
-BRDA:119,5,1,0
-BRDA:121,6,0,0
-BRDA:121,6,1,0
-BRDA:122,7,0,0
-BRDA:122,7,1,0
-BRDA:137,8,0,0
-BRDA:142,9,0,0
-BRDA:142,10,0,0
-BRDA:142,10,1,0
-BRDA:150,11,0,0
-BRDA:167,12,0,0
-BRDA:183,13,0,0
-BRDA:204,14,0,0
-BRDA:207,15,0,0
-BRDA:207,16,0,0
-BRDA:207,16,1,0
-BRDA:207,16,2,0
-BRDA:211,17,0,0
-BRDA:216,18,0,0
-BRDA:216,18,1,0
-BRDA:230,19,0,0
-BRDA:233,20,0,0
-BRDA:233,21,0,0
-BRDA:233,21,1,0
-BRDA:233,21,2,0
-BRDA:243,22,0,0
-BRDA:248,23,0,0
-BRDA:286,24,0,0
-BRDA:286,25,0,0
-BRDA:286,25,1,0
-BRDA:289,26,0,0
-BRDA:289,26,1,0
-BRDA:293,27,0,0
-BRDA:299,28,0,0
-BRDA:299,28,1,0
-BRDA:303,29,0,0
-BRDA:309,30,0,0
-BRDA:309,30,1,0
-BRDA:313,31,0,0
-BRDA:319,32,0,0
-BRDA:319,32,1,0
-BRDA:323,33,0,0
-BRDA:348,34,0,0
-BRDA:365,35,0,0
-BRDA:368,36,0,0
-BRDA:368,36,1,0
-BRDA:368,36,2,0
-BRDA:368,36,3,0
-BRDA:392,37,0,0
-BRDA:394,38,0,0
-BRDA:394,39,0,0
-BRDA:394,39,1,0
-BRF:58
-BRH:0
-end_of_record
-TN:
-SF:src/composables/CalculateStartNodes.ts
-FN:48,assignRankOrder
-FN:51,(anonymous_8)
-FN:54,(anonymous_9)
-FN:55,(anonymous_10)
-FN:69,(anonymous_11)
-FN:70,(anonymous_12)
-FN:74,(anonymous_13)
-FN:98,getStartNodes
-FN:117,(anonymous_16)
-FN:118,(anonymous_17)
-FN:119,(anonymous_18)
-FN:139,hasRank0
-FN:148,needRank
-FN:157,needSource
-FN:166,needAll
-FN:176,concatSources
-FN:178,(anonymous_24)
-FNF:17
-FNH:0
-FNDA:0,assignRankOrder
-FNDA:0,(anonymous_8)
-FNDA:0,(anonymous_9)
-FNDA:0,(anonymous_10)
-FNDA:0,(anonymous_11)
-FNDA:0,(anonymous_12)
-FNDA:0,(anonymous_13)
-FNDA:0,getStartNodes
-FNDA:0,(anonymous_16)
-FNDA:0,(anonymous_17)
-FNDA:0,(anonymous_18)
-FNDA:0,hasRank0
-FNDA:0,needRank
-FNDA:0,needSource
-FNDA:0,needAll
-FNDA:0,concatSources
-FNDA:0,(anonymous_24)
-DA:2,1
-DA:7,1
-DA:48,1
-DA:51,0
-DA:54,0
-DA:55,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:59,0
-DA:60,0
-DA:61,0
-DA:66,0
-DA:69,0
-DA:70,0
-DA:74,0
-DA:75,0
-DA:76,0
-DA:77,0
-DA:78,0
-DA:79,0
-DA:98,1
-DA:101,0
-DA:102,0
-DA:105,0
-DA:106,0
-DA:107,0
-DA:111,0
-DA:112,0
-DA:117,0
-DA:118,0
-DA:120,0
-DA:121,0
-DA:122,0
-DA:123,0
-DA:124,0
-DA:125,0
-DA:129,0
-DA:140,0
-DA:149,0
-DA:158,0
-DA:167,0
-DA:176,1
-DA:177,0
-DA:178,0
-DA:179,0
-DA:180,0
-DA:183,0
-LF:48
-LH:5
-BRDA:48,0,0,0
-BRDA:57,1,0,0
-BRDA:58,2,0,0
-BRDA:60,3,0,0
-BRDA:66,4,0,0
-BRDA:75,5,0,0
-BRDA:75,6,0,0
-BRDA:75,6,1,0
-BRDA:77,7,0,0
-BRDA:101,8,0,0
-BRDA:111,9,0,0
-BRDA:120,10,0,0
-BRDA:120,10,1,0
-BRDA:120,11,0,0
-BRDA:120,11,1,0
-BRDA:122,12,0,0
-BRDA:122,12,1,0
-BRDA:122,13,0,0
-BRDA:122,13,1,0
-BRDA:124,14,0,0
-BRDA:140,15,0,0
-BRDA:140,15,1,0
-BRDA:140,16,0,0
-BRDA:140,16,1,0
-BRDA:179,17,0,0
-BRF:25
-BRH:0
-end_of_record
-TN:
-SF:src/composables/ConvertFromNetwork.ts
-FN:82,networktoNetworkLayout
-FN:86,(anonymous_14)
-FN:98,(anonymous_15)
-FN:121,networkToSerialized
-FN:122,(anonymous_17)
-FN:123,(anonymous_18)
-FN:124,(anonymous_19)
-FN:138,networkToGDSGraph
-FN:151,networkToAdjacentObject
-FN:153,(anonymous_23)
-FN:158,(anonymous_24)
-FN:262,networkToDOT
-FN:275,networkToViz
-FN:295,(anonymous_27)
-FN:296,(anonymous_28)
-FN:298,(anonymous_29)
-FN:309,(anonymous_30)
-FN:312,(anonymous_31)
-FN:324,(anonymous_32)
-FN:325,(anonymous_33)
-FN:333,(anonymous_34)
-FN:346,(anonymous_35)
-FN:380,nodeForViz
-FN:413,graphVizToDot
-FN:420,(anonymous_38)
-FN:427,(anonymous_39)
-FN:435,(anonymous_40)
-FN:443,(anonymous_41)
-FN:450,(anonymous_42)
-FN:457,(anonymous_43)
-FN:474,customStringify
-FNF:31
-FNH:0
-FNDA:0,networktoNetworkLayout
-FNDA:0,(anonymous_14)
-FNDA:0,(anonymous_15)
-FNDA:0,networkToSerialized
-FNDA:0,(anonymous_17)
-FNDA:0,(anonymous_18)
-FNDA:0,(anonymous_19)
-FNDA:0,networkToGDSGraph
-FNDA:0,networkToAdjacentObject
-FNDA:0,(anonymous_23)
-FNDA:0,(anonymous_24)
-FNDA:0,networkToDOT
-FNDA:0,networkToViz
-FNDA:0,(anonymous_27)
-FNDA:0,(anonymous_28)
-FNDA:0,(anonymous_29)
-FNDA:0,(anonymous_30)
-FNDA:0,(anonymous_31)
-FNDA:0,(anonymous_32)
-FNDA:0,(anonymous_33)
-FNDA:0,(anonymous_34)
-FNDA:0,(anonymous_35)
-FNDA:0,nodeForViz
-FNDA:0,graphVizToDot
-FNDA:0,(anonymous_38)
-FNDA:0,(anonymous_39)
-FNDA:0,(anonymous_40)
-FNDA:0,(anonymous_41)
-FNDA:0,(anonymous_42)
-FNDA:0,(anonymous_43)
-FNDA:0,customStringify
-DA:3,1
-DA:10,1
-DA:11,1
-DA:12,1
-DA:13,1
-DA:19,1
-DA:82,1
-DA:85,0
-DA:87,0
-DA:88,0
-DA:92,0
-DA:98,0
-DA:106,0
-DA:112,0
-DA:121,1
-DA:122,0
-DA:123,0
-DA:124,0
-DA:129,0
-DA:138,1
-DA:139,0
-DA:140,0
-DA:141,0
-DA:142,0
-DA:151,1
-DA:152,0
-DA:153,0
-DA:154,0
-DA:155,0
-DA:158,0
-DA:159,0
-DA:160,0
-DA:161,0
-DA:163,0
-DA:262,1
-DA:263,0
-DA:264,0
-DA:265,0
-DA:275,1
-DA:277,0
-DA:278,0
-DA:279,0
-DA:280,0
-DA:284,0
-DA:293,0
-DA:294,0
-DA:295,0
-DA:297,0
-DA:298,0
-DA:299,0
-DA:305,0
-DA:306,0
-DA:307,0
-DA:308,0
-DA:309,0
-DA:311,0
-DA:312,0
-DA:313,0
-DA:322,0
-DA:323,0
-DA:324,0
-DA:326,0
-DA:331,0
-DA:332,0
-DA:333,0
-DA:334,0
-DA:335,0
-DA:336,0
-DA:337,0
-DA:338,0
-DA:339,0
-DA:340,0
-DA:341,0
-DA:343,0
-DA:347,0
-DA:349,0
-DA:350,0
-DA:351,0
-DA:352,0
-DA:353,0
-DA:354,0
-DA:355,0
-DA:357,0
-DA:359,0
-DA:360,0
-DA:361,0
-DA:362,0
-DA:364,0
-DA:365,0
-DA:368,0
-DA:382,0
-DA:383,0
-DA:385,0
-DA:386,0
-DA:387,0
-DA:388,0
-DA:390,0
-DA:391,0
-DA:392,0
-DA:393,0
-DA:394,0
-DA:398,0
-DA:400,0
-DA:413,1
-DA:415,0
-DA:417,0
-DA:419,0
-DA:420,0
-DA:421,0
-DA:426,0
-DA:427,0
-DA:428,0
-DA:429,0
-DA:434,0
-DA:435,0
-DA:436,0
-DA:442,0
-DA:443,0
-DA:444,0
-DA:445,0
-DA:449,0
-DA:450,0
-DA:451,0
-DA:456,0
-DA:457,0
-DA:458,0
-DA:463,0
-DA:475,0
-DA:476,0
-DA:478,0
-DA:479,0
-DA:480,0
-DA:482,0
-DA:483,0
-DA:484,0
-LF:135
-LH:13
-BRDA:154,0,0,0
-BRDA:262,1,0,0
-BRDA:262,2,0,0
-BRDA:262,3,0,0
-BRDA:262,4,0,0
-BRDA:275,5,0,0
-BRDA:275,6,0,0
-BRDA:275,7,0,0
-BRDA:275,8,0,0
-BRDA:277,9,0,0
-BRDA:277,9,1,0
-BRDA:277,10,0,0
-BRDA:277,10,1,0
-BRDA:279,11,0,0
-BRDA:279,12,0,0
-BRDA:279,12,1,0
-BRDA:293,13,0,0
-BRDA:298,14,0,0
-BRDA:298,15,0,0
-BRDA:298,15,1,0
-BRDA:298,15,2,0
-BRDA:312,16,0,0
-BRDA:312,17,0,0
-BRDA:312,17,1,0
-BRDA:312,17,2,0
-BRDA:312,18,0,0
-BRDA:312,18,1,0
-BRDA:322,19,0,0
-BRDA:322,20,0,0
-BRDA:322,20,1,0
-BRDA:331,21,0,0
-BRDA:331,22,0,0
-BRDA:331,22,1,0
-BRDA:334,23,0,0
-BRDA:334,23,1,0
-BRDA:334,24,0,0
-BRDA:334,24,1,0
-BRDA:335,25,0,0
-BRDA:335,25,1,0
-BRDA:335,26,0,0
-BRDA:335,26,1,0
-BRDA:336,27,0,0
-BRDA:336,27,1,0
-BRDA:336,28,0,0
-BRDA:336,28,1,0
-BRDA:337,29,0,0
-BRDA:337,29,1,0
-BRDA:337,30,0,0
-BRDA:337,30,1,0
-BRDA:338,31,0,0
-BRDA:338,31,1,0
-BRDA:338,32,0,0
-BRDA:338,32,1,0
-BRDA:338,32,2,0
-BRDA:338,32,3,0
-BRDA:349,33,0,0
-BRDA:349,33,1,0
-BRDA:349,34,0,0
-BRDA:349,34,1,0
-BRDA:350,35,0,0
-BRDA:350,35,1,0
-BRDA:350,36,0,0
-BRDA:350,36,1,0
-BRDA:351,37,0,0
-BRDA:351,37,1,0
-BRDA:351,38,0,0
-BRDA:351,38,1,0
-BRDA:359,39,0,0
-BRDA:359,39,1,0
-BRDA:359,40,0,0
-BRDA:359,40,1,0
-BRDA:361,41,0,0
-BRDA:361,42,0,0
-BRDA:361,42,1,0
-BRDA:364,43,0,0
-BRDA:382,44,0,0
-BRDA:382,44,1,0
-BRDA:382,45,0,0
-BRDA:382,45,1,0
-BRDA:390,46,0,0
-BRDA:391,47,0,0
-BRDA:391,48,0,0
-BRDA:391,48,1,0
-BRDA:393,49,0,0
-BRDA:413,50,0,0
-BRDA:417,51,0,0
-BRDA:417,51,1,0
-BRDA:419,52,0,0
-BRDA:426,53,0,0
-BRDA:434,54,0,0
-BRDA:442,55,0,0
-BRDA:449,56,0,0
-BRDA:456,57,0,0
-BRDA:475,58,0,0
-BRDA:475,59,0,0
-BRDA:475,59,1,0
-BRF:96
-BRH:0
-end_of_record
-TN:
-SF:src/composables/GetSetAttributsNodes.ts
-FN:73,isSideCompound
-FN:83,setAsSideCompound
-FN:103,isDuplicate
-FN:122,addMetadataReversibleWithClass
-FN:123,(anonymous_12)
-FN:137,addReversibleNetwork
-FN:150,addReversible
-FN:164,addLinkClassReversible
-FN:179,pushUniqueString
-FN:195,isReversible
-FN:208,isReaction
-FN:224,inCycle
-FNF:12
-FNH:0
-FNDA:0,isSideCompound
-FNDA:0,setAsSideCompound
-FNDA:0,isDuplicate
-FNDA:0,addMetadataReversibleWithClass
-FNDA:0,(anonymous_12)
-FNDA:0,addReversibleNetwork
-FNDA:0,addReversible
-FNDA:0,addLinkClassReversible
-FNDA:0,pushUniqueString
-FNDA:0,isReversible
-FNDA:0,isReaction
-FNDA:0,inCycle
-DA:2,1
-DA:65,1
-DA:73,1
-DA:74,0
-DA:83,1
-DA:84,0
-DA:85,0
-DA:86,0
-DA:95,1
-DA:103,1
-DA:104,0
-DA:105,0
-DA:113,1
-DA:114,1
-DA:115,1
-DA:122,1
-DA:123,0
-DA:124,0
-DA:125,0
-DA:137,1
-DA:138,0
-DA:139,0
-DA:141,0
-DA:150,1
-DA:151,0
-DA:152,0
-DA:154,0
-DA:155,0
-DA:164,1
-DA:165,0
-DA:166,0
-DA:168,0
-DA:169,0
-DA:179,1
-DA:180,0
-DA:181,0
-DA:183,0
-DA:195,1
-DA:196,0
-DA:197,0
-DA:199,0
-DA:208,1
-DA:209,0
-DA:224,1
-DA:225,0
-DA:226,0
-DA:229,0
-DA:230,0
-DA:231,0
-DA:232,0
-DA:234,0
-LF:51
-LH:17
-BRDA:74,0,0,0
-BRDA:74,0,1,0
-BRDA:84,1,0,0
-BRDA:85,2,0,0
-BRDA:104,3,0,0
-BRDA:105,4,0,0
-BRDA:105,4,1,0
-BRDA:124,5,0,0
-BRDA:124,6,0,0
-BRDA:124,6,1,0
-BRDA:138,7,0,0
-BRDA:151,8,0,0
-BRDA:165,9,0,0
-BRDA:180,10,0,0
-BRDA:196,11,0,0
-BRDA:199,12,0,0
-BRDA:199,12,1,0
-BRDA:209,13,0,0
-BRDA:209,13,1,0
-BRDA:225,14,0,0
-BRDA:230,15,0,0
-BRDA:230,16,0,0
-BRDA:230,16,1,0
-BRDA:232,17,0,0
-BRDA:232,18,0,0
-BRDA:232,18,1,0
-BRF:26
-BRH:0
-end_of_record
-TN:
-SF:src/composables/LayoutReversibleReactions.ts
-FN:76,duplicateReversibleReactions
-FN:85,(anonymous_9)
-FN:85,(anonymous_10)
-FN:102,(anonymous_11)
-FN:120,(anonymous_12)
-FN:138,linkIsReversible
-FN:155,duplicateNodeReactionReversible
-FN:156,(anonymous_16)
-FN:156,(anonymous_17)
-FN:187,reversibleNodeReaction
-FN:187,(anonymous_19)
-FN:232,reversibleLink
-FN:270,chooseReversibleReaction
-FN:271,(anonymous_22)
-FN:291,keepFirstReversibleNode
-FN:343,renameAllIDNode
-FN:347,(anonymous_25)
-FN:390,renameAllInSubgraph
-FN:392,(anonymous_27)
-FN:393,(anonymous_28)
-FNF:20
-FNH:20
-FNDA:2,duplicateReversibleReactions
-FNDA:10,(anonymous_9)
-FNDA:10,(anonymous_10)
-FNDA:6,(anonymous_11)
-FNDA:6,(anonymous_12)
-FNDA:10,linkIsReversible
-FNDA:6,duplicateNodeReactionReversible
-FNDA:6,(anonymous_16)
-FNDA:6,(anonymous_17)
-FNDA:6,reversibleNodeReaction
-FNDA:6,(anonymous_19)
-FNDA:6,reversibleLink
-FNDA:1,chooseReversibleReaction
-FNDA:1,(anonymous_22)
-FNDA:8,keepFirstReversibleNode
-FNDA:4,renameAllIDNode
-FNDA:17,(anonymous_25)
-FNDA:12,renameAllInSubgraph
-FNDA:3,(anonymous_27)
-FNDA:4,(anonymous_28)
-DA:6,1
-DA:11,1
-DA:12,1
-DA:13,1
-DA:76,1
-DA:78,2
-DA:80,2
-DA:81,2
-DA:83,2
-DA:85,10
-DA:87,10
-DA:88,10
-DA:90,6
-DA:94,6
-DA:96,6
-DA:97,2
-DA:99,4
-DA:102,6
-DA:105,6
-DA:106,2
-DA:109,6
-DA:110,2
-DA:111,2
-DA:113,4
-DA:114,4
-DA:120,2
-DA:121,6
-DA:125,0
-DA:139,10
-DA:140,2
-DA:141,8
-DA:142,4
-DA:144,4
-DA:156,6
-DA:157,6
-DA:159,6
-DA:160,6
-DA:163,6
-DA:164,0
-DA:167,6
-DA:168,1
-DA:170,6
-DA:172,6
-DA:174,0
-DA:187,6
-DA:188,6
-DA:189,6
-DA:192,6
-DA:193,3
-DA:195,3
-DA:213,6
-DA:219,6
-DA:233,6
-DA:234,0
-DA:236,6
-DA:242,6
-DA:243,6
-DA:270,1
-DA:271,1
-DA:275,1
-DA:276,1
-DA:278,1
-DA:280,1
-DA:282,1
-DA:291,1
-DA:292,8
-DA:293,8
-DA:294,8
-DA:296,8
-DA:297,27
-DA:298,27
-DA:300,26
-DA:301,7
-DA:302,7
-DA:305,6
-DA:308,6
-DA:309,4
-DA:310,1
-DA:313,3
-DA:314,2
-DA:315,1
-DA:319,4
-DA:320,4
-DA:321,4
-DA:326,4
-DA:328,4
-DA:329,4
-DA:330,2
-DA:331,2
-DA:333,2
-DA:343,1
-DA:344,4
-DA:347,4
-DA:348,17
-DA:350,4
-DA:351,4
-DA:353,4
-DA:354,4
-DA:356,4
-DA:372,4
-DA:374,4
-DA:376,4
-DA:378,4
-DA:391,12
-DA:392,12
-DA:393,3
-DA:394,4
-DA:399,2
-DA:401,2
-LF:109
-LH:105
-BRDA:88,0,0,6
-BRDA:96,1,0,2
-BRDA:96,1,1,4
-BRDA:105,2,0,2
-BRDA:105,3,0,6
-BRDA:105,3,1,6
-BRDA:109,4,0,2
-BRDA:109,4,1,4
-BRDA:139,5,0,2
-BRDA:139,5,1,8
-BRDA:139,6,0,10
-BRDA:139,6,1,4
-BRDA:141,7,0,4
-BRDA:141,7,1,4
-BRDA:141,8,0,8
-BRDA:141,8,1,6
-BRDA:163,9,0,0
-BRDA:167,10,0,1
-BRDA:187,11,0,6
-BRDA:189,12,0,0
-BRDA:189,12,1,6
-BRDA:192,13,0,3
-BRDA:192,13,1,3
-BRDA:192,14,0,6
-BRDA:192,14,1,3
-BRDA:233,15,0,0
-BRDA:233,16,0,6
-BRDA:233,16,1,6
-BRDA:273,17,0,0
-BRDA:291,18,0,0
-BRDA:298,19,0,1
-BRDA:300,20,0,7
-BRDA:300,21,0,26
-BRDA:300,21,1,11
-BRDA:302,22,0,1
-BRDA:308,23,0,4
-BRDA:308,23,1,2
-BRDA:309,24,0,1
-BRDA:309,25,0,4
-BRDA:309,25,1,4
-BRDA:314,26,0,1
-BRDA:314,27,0,2
-BRDA:314,27,1,2
-BRDA:320,28,0,4
-BRDA:320,29,0,4
-BRDA:320,29,1,4
-BRDA:329,30,0,2
-BRDA:348,31,0,4
-BRDA:391,32,0,3
-BRDA:391,32,1,9
-BRDA:394,33,0,2
-BRF:51
-BRH:46
-end_of_record
-TN:
-SF:src/composables/SubgraphForViz.ts
-FN:33,addMainChainForViz
-FN:49,(anonymous_1)
-FN:54,(anonymous_2)
-FN:62,(anonymous_3)
-FN:86,changeCycleMetanodes
-FN:90,(anonymous_5)
-FN:116,subgraphDot
-FN:120,(anonymous_7)
-FNF:8
-FNH:0
-FNDA:0,addMainChainForViz
-FNDA:0,(anonymous_1)
-FNDA:0,(anonymous_2)
-FNDA:0,(anonymous_3)
-FNDA:0,changeCycleMetanodes
-FNDA:0,(anonymous_5)
-FNDA:0,subgraphDot
-FNDA:0,(anonymous_7)
-DA:2,1
-DA:33,1
-DA:34,0
-DA:37,0
-DA:39,0
-DA:40,0
-DA:44,0
-DA:45,0
-DA:47,0
-DA:49,0
-DA:53,0
-DA:54,0
-DA:55,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:59,0
-DA:61,0
-DA:62,0
-DA:69,0
-DA:70,0
-DA:72,0
-DA:74,0
-DA:87,0
-DA:88,0
-DA:90,0
-DA:92,0
-DA:95,0
-DA:96,0
-DA:98,0
-DA:100,0
-DA:103,0
-DA:106,0
-DA:116,1
-DA:118,0
-DA:119,0
-DA:120,0
-DA:121,0
-DA:123,0
-DA:125,0
-LF:40
-LH:3
-BRDA:33,0,0,0
-BRDA:33,1,0,0
-BRDA:34,2,0,0
-BRDA:34,3,0,0
-BRDA:34,3,1,0
-BRDA:39,4,0,0
-BRDA:44,5,0,0
-BRDA:44,6,0,0
-BRDA:44,6,1,0
-BRDA:49,7,0,0
-BRDA:49,7,1,0
-BRDA:49,8,0,0
-BRDA:49,8,1,0
-BRDA:49,9,0,0
-BRDA:49,9,1,0
-BRDA:53,10,0,0
-BRDA:56,11,0,0
-BRDA:56,12,0,0
-BRDA:56,12,1,0
-BRDA:58,13,0,0
-BRDA:61,14,0,0
-BRDA:69,15,0,0
-BRDA:92,16,0,0
-BRDA:95,17,0,0
-BRDA:95,17,1,0
-BRDA:95,18,0,0
-BRDA:95,18,1,0
-BRDA:98,19,0,0
-BRDA:118,20,0,0
-BRDA:118,20,1,0
-BRDA:118,21,0,0
-BRDA:118,21,1,0
-BRF:32
-BRH:0
-end_of_record
-TN:
-SF:src/types/EnumArgs.ts
-FN:1,(anonymous_0)
-FN:10,(anonymous_1)
-FN:16,(anonymous_2)
-FN:22,(anonymous_3)
-FN:32,(anonymous_4)
-FNF:5
-FNH:5
-FNDA:1,(anonymous_0)
-FNDA:1,(anonymous_1)
-FNDA:1,(anonymous_2)
-FNDA:1,(anonymous_3)
-FNDA:1,(anonymous_4)
-DA:1,1
-DA:2,1
-DA:3,1
-DA:4,1
-DA:5,1
-DA:6,1
-DA:7,1
-DA:10,1
-DA:11,1
-DA:12,1
-DA:13,1
-DA:16,1
-DA:17,1
-DA:18,1
-DA:19,1
-DA:22,1
-DA:23,1
-DA:24,1
-DA:25,1
-DA:26,1
-DA:27,1
-DA:28,1
-DA:29,1
-DA:32,1
-DA:33,1
-DA:34,1
-LF:26
-LH:26
-BRDA:1,0,0,1
-BRDA:1,0,1,1
-BRDA:10,1,0,1
-BRDA:10,1,1,1
-BRDA:16,2,0,1
-BRDA:16,2,1,1
-BRDA:22,3,0,1
-BRDA:22,3,1,1
-BRDA:32,4,0,1
-BRDA:32,4,1,1
-BRF:10
-BRH:10
-end_of_record
-TN:
-SF:src/types/Subgraph.ts
-FN:10,(anonymous_0)
-FNF:1
-FNH:1
-FNDA:1,(anonymous_0)
-DA:10,1
-DA:11,1
-DA:12,1
-DA:13,1
-DA:14,1
-LF:5
-LH:5
-BRDA:10,0,0,1
-BRDA:10,0,1,1
-BRF:2
-BRH:2
-end_of_record
diff --git a/env.d.ts b/env.d.ts
index c1321fe6fef0779b5ceac3f592597fd8bd27f19c..e955ccfb3b567884184daede71782b4770d72ad9 100644
--- a/env.d.ts
+++ b/env.d.ts
@@ -1,6 +1 @@
-declare module '@metabohub/viz-core';
-declare module 'dagrejs';
-declare module '@metabohub/viz-context-menu';
 declare module 'line-intersect';
-// declare module 'dagrejs/dist/dagre.js';
-// declare module 'cytoscape';
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 6b1f97e7c1506dd17b54de46c40169fe76f6d51b..e720393f253a2addf25b10b924ff93142c586526 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,13 +10,9 @@
       "license": "Apache-2.0",
       "dependencies": {
         "@mdi/font": "^7.4.47",
-        "@metabohub/viz-context-menu": "^0.0.2",
-        "@metabohub/viz-core": "^0.6.1",
         "@types/d3": "^7.4.3",
-        "cytoscape": "^3.30.2",
         "d3": "^7.9.0",
-        "line-intersect": "^3.0.0",
-        "xml2js": "^0.6.2"
+        "line-intersect": "^3.0.0"
       },
       "devDependencies": {
         "@eslint/js": "^9.10.0",
@@ -24,12 +20,7 @@
         "@types/jest": "^29.5.12",
         "@types/jsdom": "^21.1.6",
         "@types/node": "^20.11.14",
-        "@types/xml2js": "^0.4.14",
         "@viz-js/viz": "^3.4.0",
-        "cytoscape": "^3.30.2",
-        "cytoscape-cose-bilkent": "^3.0.0",
-        "cytoscape-fcose": "^2.2.0",
-        "dagrejs": "^0.2.1",
         "eslint": "^9.10.0",
         "graph-data-structure": "^3.5.0",
         "jest": "^29.7.0",
@@ -205,6 +196,7 @@
       "version": "7.24.8",
       "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
       "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -213,6 +205,7 @@
       "version": "7.24.7",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
       "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -330,6 +323,7 @@
       "version": "7.25.6",
       "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz",
       "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==",
+      "dev": true,
       "dependencies": {
         "@babel/types": "^7.25.6"
       },
@@ -553,6 +547,7 @@
       "version": "7.25.6",
       "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz",
       "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==",
+      "dev": true,
       "dependencies": {
         "@babel/helper-string-parser": "^7.24.8",
         "@babel/helper-validator-identifier": "^7.24.7",
@@ -1569,7 +1564,7 @@
       "version": "0.3.5",
       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
       "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
-      "devOptional": true,
+      "dev": true,
       "dependencies": {
         "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
@@ -1583,7 +1578,7 @@
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
       "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
-      "devOptional": true,
+      "dev": true,
       "engines": {
         "node": ">=6.0.0"
       }
@@ -1592,32 +1587,22 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
       "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
-      "devOptional": true,
+      "dev": true,
       "engines": {
         "node": ">=6.0.0"
       }
     },
-    "node_modules/@jridgewell/source-map": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
-      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
-      "optional": true,
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.25"
-      }
-    },
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
-      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+      "dev": true
     },
     "node_modules/@jridgewell/trace-mapping": {
       "version": "0.3.25",
       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
       "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
-      "devOptional": true,
+      "dev": true,
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
         "@jridgewell/sourcemap-codec": "^1.4.14"
@@ -1628,30 +1613,6 @@
       "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz",
       "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw=="
     },
-    "node_modules/@metabohub/viz-context-menu": {
-      "version": "0.0.2",
-      "resolved": "https://forgemia.inra.fr/api/v4/projects/11129/packages/npm/@metabohub/viz-context-menu/-/@metabohub/viz-context-menu-0.0.2.tgz",
-      "integrity": "sha1-851aHxYa7Y9LimYhpJEgXdatdkQ=",
-      "dependencies": {
-        "@mdi/font": "^7.4.47",
-        "roboto-fontface": "*",
-        "vue": "^3.4.15",
-        "vuetify": "^3.5.2",
-        "webfontloader": "^1.6.28"
-      }
-    },
-    "node_modules/@metabohub/viz-core": {
-      "version": "0.6.1",
-      "resolved": "https://forgemia.inra.fr/api/v4/projects/8209/packages/npm/@metabohub/viz-core/-/@metabohub/viz-core-0.6.1.tgz",
-      "integrity": "sha1-OtkeLt1AEBpOMOIT8gszu3tftyQ=",
-      "dependencies": {
-        "@vueuse/core": "^10.7.0",
-        "d3": "^7.8.5",
-        "lodash-es": "^4.17.21",
-        "uuid": "^9.0.1",
-        "vue": "^3.3.4"
-      }
-    },
     "node_modules/@microsoft/api-extractor": {
       "version": "7.43.0",
       "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.43.0.tgz",
@@ -2578,7 +2539,7 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/@types/geojson": {
       "version": "7946.0.14",
@@ -2649,7 +2610,7 @@
       "version": "20.12.12",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz",
       "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==",
-      "devOptional": true,
+      "dev": true,
       "dependencies": {
         "undici-types": "~5.26.4"
       }
@@ -2666,20 +2627,6 @@
       "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
       "dev": true
     },
-    "node_modules/@types/web-bluetooth": {
-      "version": "0.0.20",
-      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
-      "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
-    },
-    "node_modules/@types/xml2js": {
-      "version": "0.4.14",
-      "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz",
-      "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
     "node_modules/@types/yargs": {
       "version": "17.0.32",
       "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
@@ -2907,209 +2854,11 @@
       "integrity": "sha512-xbqbRanQCG06yfpnv2hsgX43G26q0JCSjcYSpvmUlx1VRCzA0ngi7zsPn0jW9K2ITchpjQiC1tyO6+zFgS/IyA==",
       "dev": true
     },
-    "node_modules/@vue/compiler-core": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.4.tgz",
-      "integrity": "sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ==",
-      "dependencies": {
-        "@babel/parser": "^7.25.3",
-        "@vue/shared": "3.5.4",
-        "entities": "^4.5.0",
-        "estree-walker": "^2.0.2",
-        "source-map-js": "^1.2.0"
-      }
-    },
-    "node_modules/@vue/compiler-core/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "node_modules/@vue/compiler-dom": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.4.tgz",
-      "integrity": "sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw==",
-      "dependencies": {
-        "@vue/compiler-core": "3.5.4",
-        "@vue/shared": "3.5.4"
-      }
-    },
-    "node_modules/@vue/compiler-sfc": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.4.tgz",
-      "integrity": "sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ==",
-      "dependencies": {
-        "@babel/parser": "^7.25.3",
-        "@vue/compiler-core": "3.5.4",
-        "@vue/compiler-dom": "3.5.4",
-        "@vue/compiler-ssr": "3.5.4",
-        "@vue/shared": "3.5.4",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.30.11",
-        "postcss": "^8.4.44",
-        "source-map-js": "^1.2.0"
-      }
-    },
-    "node_modules/@vue/compiler-sfc/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "node_modules/@vue/compiler-ssr": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.4.tgz",
-      "integrity": "sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg==",
-      "dependencies": {
-        "@vue/compiler-dom": "3.5.4",
-        "@vue/shared": "3.5.4"
-      }
-    },
-    "node_modules/@vue/reactivity": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.4.tgz",
-      "integrity": "sha512-HKKbEuP7tYSGCq4e4nK6ZW6l5hyG66OUetefBp4budUyjvAYsnQDf+bgFzg2RAgnH0CInyqXwD9y47jwJEHrQw==",
-      "dependencies": {
-        "@vue/shared": "3.5.4"
-      }
-    },
-    "node_modules/@vue/runtime-core": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.4.tgz",
-      "integrity": "sha512-f3ek2sTA0AFu0n+w+kCtz567Euqqa3eHewvo4klwS7mWfSj/A+UmYTwsnUFo35KeyAFY60JgrCGvEBsu1n/3LA==",
-      "dependencies": {
-        "@vue/reactivity": "3.5.4",
-        "@vue/shared": "3.5.4"
-      }
-    },
-    "node_modules/@vue/runtime-dom": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.4.tgz",
-      "integrity": "sha512-ofyc0w6rbD5KtjhP1i9hGOKdxGpvmuB1jprP7Djlj0X7R5J/oLwuNuE98GJ8WW31Hu2VxQHtk/LYTAlW8xrJdw==",
-      "dependencies": {
-        "@vue/reactivity": "3.5.4",
-        "@vue/runtime-core": "3.5.4",
-        "@vue/shared": "3.5.4",
-        "csstype": "^3.1.3"
-      }
-    },
-    "node_modules/@vue/server-renderer": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.4.tgz",
-      "integrity": "sha512-FbjV6DJLgKRetMYFBA1UXCroCiED/Ckr53/ba9wivyd7D/Xw9fpo0T6zXzCnxQwyvkyrL7y6plgYhWhNjGxY5g==",
-      "dependencies": {
-        "@vue/compiler-ssr": "3.5.4",
-        "@vue/shared": "3.5.4"
-      },
-      "peerDependencies": {
-        "vue": "3.5.4"
-      }
-    },
-    "node_modules/@vue/shared": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.4.tgz",
-      "integrity": "sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA=="
-    },
-    "node_modules/@vuetify/loader-shared": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-2.0.3.tgz",
-      "integrity": "sha512-Ss3GC7eJYkp2SF6xVzsT7FAruEmdihmn4OCk2+UocREerlXKWgOKKzTN5PN3ZVN5q05jHHrsNhTuWbhN61Bpdg==",
-      "optional": true,
-      "peer": true,
-      "dependencies": {
-        "upath": "^2.0.1"
-      },
-      "peerDependencies": {
-        "vue": "^3.0.0",
-        "vuetify": "^3.0.0"
-      }
-    },
-    "node_modules/@vueuse/core": {
-      "version": "10.11.1",
-      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz",
-      "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==",
-      "dependencies": {
-        "@types/web-bluetooth": "^0.0.20",
-        "@vueuse/metadata": "10.11.1",
-        "@vueuse/shared": "10.11.1",
-        "vue-demi": ">=0.14.8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/core/node_modules/vue-demi": {
-      "version": "0.14.10",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
-      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@vueuse/metadata": {
-      "version": "10.11.1",
-      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz",
-      "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/shared": {
-      "version": "10.11.1",
-      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz",
-      "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==",
-      "dependencies": {
-        "vue-demi": ">=0.14.8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/shared/node_modules/vue-demi": {
-      "version": "0.14.10",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
-      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/acorn": {
       "version": "8.12.1",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
       "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
-      "devOptional": true,
+      "dev": true,
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -3454,7 +3203,7 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/bundle-require": {
       "version": "4.1.0",
@@ -3757,15 +3506,6 @@
       "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
       "dev": true
     },
-    "node_modules/cose-base": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz",
-      "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==",
-      "dev": true,
-      "dependencies": {
-        "layout-base": "^2.0.0"
-      }
-    },
     "node_modules/create-jest": {
       "version": "29.7.0",
       "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
@@ -3819,44 +3559,6 @@
         "node": ">=18"
       }
     },
-    "node_modules/csstype": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
-      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
-    },
-    "node_modules/cytoscape": {
-      "version": "3.30.2",
-      "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz",
-      "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/cytoscape-cose-bilkent": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-3.0.4.tgz",
-      "integrity": "sha512-oAh/ga1fxJ7j9bBjjfGRlpTAKVFddYu+HfwJaebLpZTc0LUnnnHe/Ng3aiWj1Ammc301+RDTSXT6ecpIz4dSMQ==",
-      "dev": true,
-      "dependencies": {
-        "linkedlist-js": "1.3.0"
-      },
-      "peerDependencies": {
-        "cytoscape": "^2.4.0 || ^3.0.0"
-      }
-    },
-    "node_modules/cytoscape-fcose": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz",
-      "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==",
-      "dev": true,
-      "dependencies": {
-        "cose-base": "^2.2.0"
-      },
-      "peerDependencies": {
-        "cytoscape": "^3.2.0"
-      }
-    },
     "node_modules/d3": {
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
@@ -4246,16 +3948,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/dagrejs": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/dagrejs/-/dagrejs-0.2.1.tgz",
-      "integrity": "sha512-4bb1y+4aM1xtkK7ieP0V7Xn/34GQfnCapl0yubrOMX8Qb/PIwM1Dii2uUBv/KtuzrQtxPliSP4r5MQBsnP6gNg==",
-      "dev": true,
-      "dependencies": {
-        "graphlib": "^2.1.8",
-        "lodash": "^4.17.19"
-      }
-    },
     "node_modules/data-urls": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
@@ -4307,7 +3999,7 @@
       "version": "4.3.4",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
       "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "devOptional": true,
+      "dev": true,
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -4445,6 +4137,7 @@
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
       "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "dev": true,
       "engines": {
         "node": ">=0.12"
       },
@@ -4997,6 +4690,7 @@
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
       "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
       "hasInstallScript": true,
       "optional": true,
       "os": [
@@ -5135,15 +4829,6 @@
       "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
       "dev": true
     },
-    "node_modules/graphlib": {
-      "version": "2.1.8",
-      "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz",
-      "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
-      "dev": true,
-      "dependencies": {
-        "lodash": "^4.17.15"
-      }
-    },
     "node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -6367,12 +6052,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/layout-base": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz",
-      "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==",
-      "dev": true
-    },
     "node_modules/leven": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -6418,12 +6097,6 @@
       "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
       "dev": true
     },
-    "node_modules/linkedlist-js": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/linkedlist-js/-/linkedlist-js-1.3.0.tgz",
-      "integrity": "sha512-YwgG4Et8dJF04nsn9YuyrydUJvwmJHOQo7PzxvkT09NTgQ1yC+vXHGBolo48rTjAItIYR7YWIXh6xZsavCBSvQ==",
-      "dev": true
-    },
     "node_modules/load-tsconfig": {
       "version": "0.2.5",
       "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
@@ -6449,12 +6122,9 @@
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
-    },
-    "node_modules/lodash-es": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
-      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+      "dev": true,
+      "optional": true,
+      "peer": true
     },
     "node_modules/lodash.get": {
       "version": "4.4.2",
@@ -6499,14 +6169,6 @@
         "node": "14 || >=16.14"
       }
     },
-    "node_modules/magic-string": {
-      "version": "0.30.11",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
-      "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
-      "dependencies": {
-        "@jridgewell/sourcemap-codec": "^1.5.0"
-      }
-    },
     "node_modules/make-dir": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
@@ -6635,7 +6297,7 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/mz": {
       "version": "2.7.0",
@@ -6652,12 +6314,15 @@
       "version": "3.3.7",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
       "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "optional": true,
+      "peer": true,
       "bin": {
         "nanoid": "bin/nanoid.cjs"
       },
@@ -6914,7 +6579,8 @@
     "node_modules/picocolors": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
-      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+      "dev": true
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
@@ -6953,6 +6619,7 @@
       "version": "8.4.45",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz",
       "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==",
+      "dev": true,
       "funding": [
         {
           "type": "opencollective",
@@ -6967,6 +6634,8 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "nanoid": "^3.3.7",
         "picocolors": "^1.0.1",
@@ -7221,11 +6890,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/roboto-fontface": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.10.0.tgz",
-      "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g=="
-    },
     "node_modules/robust-predicates": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
@@ -7235,7 +6899,7 @@
       "version": "4.21.2",
       "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz",
       "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==",
-      "devOptional": true,
+      "dev": true,
       "dependencies": {
         "@types/estree": "1.0.5"
       },
@@ -7308,7 +6972,8 @@
     "node_modules/sax": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
-      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="
+      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+      "dev": true
     },
     "node_modules/saxes": {
       "version": "6.0.0",
@@ -7389,6 +7054,9 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
       "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "dev": true,
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7653,53 +7321,6 @@
       "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
       "dev": true
     },
-    "node_modules/terser": {
-      "version": "5.32.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.32.0.tgz",
-      "integrity": "sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==",
-      "optional": true,
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/source-map": "^0.3.3",
-        "acorn": "^8.8.2",
-        "commander": "^2.20.0",
-        "source-map-support": "~0.5.20"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/terser/node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "optional": true,
-      "peer": true
-    },
-    "node_modules/terser/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "optional": true,
-      "peer": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/terser/node_modules/source-map-support": {
-      "version": "0.5.21",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-      "optional": true,
-      "peer": true,
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
     "node_modules/test-exclude": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@@ -7793,6 +7414,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
       "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "dev": true,
       "engines": {
         "node": ">=4"
       }
@@ -8053,7 +7675,7 @@
       "version": "5.6.2",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz",
       "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==",
-      "devOptional": true,
+      "dev": true,
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -8089,18 +7711,7 @@
       "version": "5.26.5",
       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
       "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
-      "devOptional": true
-    },
-    "node_modules/upath": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
-      "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
-      "optional": true,
-      "peer": true,
-      "engines": {
-        "node": ">=4",
-        "yarn": "*"
-      }
+      "dev": true
     },
     "node_modules/update-browserslist-db": {
       "version": "1.1.0",
@@ -8151,18 +7762,6 @@
         "requires-port": "^1.0.0"
       }
     },
-    "node_modules/uuid": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
-      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
-      "funding": [
-        "https://github.com/sponsors/broofa",
-        "https://github.com/sponsors/ctavan"
-      ],
-      "bin": {
-        "uuid": "dist/bin/uuid"
-      }
-    },
     "node_modules/v8-compile-cache-lib": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
@@ -8194,549 +7793,13 @@
         "node": ">= 0.10"
       }
     },
-    "node_modules/vite": {
-      "version": "5.4.3",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz",
-      "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==",
-      "optional": true,
-      "peer": true,
+    "node_modules/w3c-xmlserializer": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+      "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+      "dev": true,
       "dependencies": {
-        "esbuild": "^0.21.3",
-        "postcss": "^8.4.43",
-        "rollup": "^4.20.0"
-      },
-      "bin": {
-        "vite": "bin/vite.js"
-      },
-      "engines": {
-        "node": "^18.0.0 || >=20.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/vitejs/vite?sponsor=1"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.3"
-      },
-      "peerDependencies": {
-        "@types/node": "^18.0.0 || >=20.0.0",
-        "less": "*",
-        "lightningcss": "^1.21.0",
-        "sass": "*",
-        "sass-embedded": "*",
-        "stylus": "*",
-        "sugarss": "*",
-        "terser": "^5.4.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        },
-        "less": {
-          "optional": true
-        },
-        "lightningcss": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "sass-embedded": {
-          "optional": true
-        },
-        "stylus": {
-          "optional": true
-        },
-        "sugarss": {
-          "optional": true
-        },
-        "terser": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vite-plugin-vuetify": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.0.4.tgz",
-      "integrity": "sha512-A4cliYUoP/u4AWSRVRvAPKgpgR987Pss7LpFa7s1GvOe8WjgDq92Rt3eVXrvgxGCWvZsPKziVqfHHdCMqeDhfw==",
-      "optional": true,
-      "peer": true,
-      "dependencies": {
-        "@vuetify/loader-shared": "^2.0.3",
-        "debug": "^4.3.3",
-        "upath": "^2.0.1"
-      },
-      "engines": {
-        "node": "^18.0.0 || >=20.0.0"
-      },
-      "peerDependencies": {
-        "vite": ">=5",
-        "vue": "^3.0.0",
-        "vuetify": "^3.0.0"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
-      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
-      "cpu": [
-        "ppc64"
-      ],
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-arm": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
-      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
-      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
-      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
-      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/darwin-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
-      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
-      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
-      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-arm": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
-      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
-      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-ia32": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
-      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
-      "cpu": [
-        "ia32"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-loong64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
-      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
-      "cpu": [
-        "loong64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
-      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
-      "cpu": [
-        "mips64el"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
-      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
-      "cpu": [
-        "ppc64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
-      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-s390x": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
-      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
-      "cpu": [
-        "s390x"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
-      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
-      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
-      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/sunos-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
-      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
-      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-ia32": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
-      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
-      "cpu": [
-        "ia32"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
-      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/esbuild": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
-      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
-      "hasInstallScript": true,
-      "optional": true,
-      "peer": true,
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.21.5",
-        "@esbuild/android-arm": "0.21.5",
-        "@esbuild/android-arm64": "0.21.5",
-        "@esbuild/android-x64": "0.21.5",
-        "@esbuild/darwin-arm64": "0.21.5",
-        "@esbuild/darwin-x64": "0.21.5",
-        "@esbuild/freebsd-arm64": "0.21.5",
-        "@esbuild/freebsd-x64": "0.21.5",
-        "@esbuild/linux-arm": "0.21.5",
-        "@esbuild/linux-arm64": "0.21.5",
-        "@esbuild/linux-ia32": "0.21.5",
-        "@esbuild/linux-loong64": "0.21.5",
-        "@esbuild/linux-mips64el": "0.21.5",
-        "@esbuild/linux-ppc64": "0.21.5",
-        "@esbuild/linux-riscv64": "0.21.5",
-        "@esbuild/linux-s390x": "0.21.5",
-        "@esbuild/linux-x64": "0.21.5",
-        "@esbuild/netbsd-x64": "0.21.5",
-        "@esbuild/openbsd-x64": "0.21.5",
-        "@esbuild/sunos-x64": "0.21.5",
-        "@esbuild/win32-arm64": "0.21.5",
-        "@esbuild/win32-ia32": "0.21.5",
-        "@esbuild/win32-x64": "0.21.5"
-      }
-    },
-    "node_modules/vue": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.4.tgz",
-      "integrity": "sha512-3yAj2gkmiY+i7+22A1PWM+kjOVXjU74UPINcTiN7grIVPyFFI0lpGwHlV/4xydDmobaBn7/xmi+YG8HeSlCTcg==",
-      "dependencies": {
-        "@vue/compiler-dom": "3.5.4",
-        "@vue/compiler-sfc": "3.5.4",
-        "@vue/runtime-dom": "3.5.4",
-        "@vue/server-renderer": "3.5.4",
-        "@vue/shared": "3.5.4"
-      },
-      "peerDependencies": {
-        "typescript": "*"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vuetify": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.1.tgz",
-      "integrity": "sha512-N1XlczbgeGt/O+JUk72QPrqcDaRIXUdptUciJqGyTvZ9cfMoSlEWs6TZO+dOOfXbKvmIMFMycYg4dgSHDpCPhg==",
-      "engines": {
-        "node": "^12.20 || >=14.13"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/johnleider"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.7",
-        "vite-plugin-vuetify": ">=1.0.0",
-        "vue": "^3.3.0",
-        "webpack-plugin-vuetify": ">=2.0.0"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        },
-        "vite-plugin-vuetify": {
-          "optional": true
-        },
-        "webpack-plugin-vuetify": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/w3c-xmlserializer": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
-      "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
-      "dev": true,
-      "dependencies": {
-        "xml-name-validator": "^5.0.0"
+        "xml-name-validator": "^5.0.0"
       },
       "engines": {
         "node": ">=18"
@@ -8760,11 +7823,6 @@
         "makeerror": "1.0.12"
       }
     },
-    "node_modules/webfontloader": {
-      "version": "1.6.28",
-      "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz",
-      "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ=="
-    },
     "node_modules/webidl-conversions": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
@@ -8982,26 +8040,6 @@
         "xml-js": "bin/cli.js"
       }
     },
-    "node_modules/xml2js": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
-      "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
-      "dependencies": {
-        "sax": ">=0.6.0",
-        "xmlbuilder": "~11.0.0"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/xmlbuilder": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
     "node_modules/xmlchars": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
diff --git a/package.json b/package.json
index 4e94f435278eac9ab6452f5580adc89887bcb52d..852486561b6b4a7b9542cf5598dc27da704ba42b 100644
--- a/package.json
+++ b/package.json
@@ -8,13 +8,9 @@
   },
   "dependencies": {
     "@mdi/font": "^7.4.47",
-    "@metabohub/viz-context-menu": "^0.0.2",
-    "@metabohub/viz-core": "^0.6.1",
     "@types/d3": "^7.4.3",
-    "cytoscape": "^3.30.2",
     "d3": "^7.9.0",
-    "line-intersect": "^3.0.0",
-    "xml2js": "^0.6.2"
+    "line-intersect": "^3.0.0"
   },
   "devDependencies": {
     "@eslint/js": "^9.10.0",
@@ -22,12 +18,7 @@
     "@types/jest": "^29.5.12",
     "@types/jsdom": "^21.1.6",
     "@types/node": "^20.11.14",
-    "@types/xml2js": "^0.4.14",
     "@viz-js/viz": "^3.4.0",
-    "cytoscape": "^3.30.2",
-    "cytoscape-cose-bilkent": "^3.0.0",
-    "cytoscape-fcose": "^2.2.0",
-    "dagrejs": "^0.2.1",
     "eslint": "^9.10.0",
     "graph-data-structure": "^3.5.0",
     "jest": "^29.7.0",
diff --git a/src/composables/AlgorithmBFS.ts b/src/composables/AlgorithmBFS.ts
index fad45dc605ec60514970fc3f525e7529bc6dd1e9..dfdd1a53bca9398359aa8689d4e16ddb6d88c094 100644
--- a/src/composables/AlgorithmBFS.ts
+++ b/src/composables/AlgorithmBFS.ts
@@ -1,6 +1,6 @@
 // Types imports
 import { StartNodesType } from "../types/EnumArgs";
-import { Network } from "@metabohub/viz-core/src/types/Network";
+import { Network } from "../types/TypeVizCore";
 
 // Composable imports
 import { getStartNodes } from "./CalculateStartNodes";
diff --git a/src/composables/AlgorithmDFS.ts b/src/composables/AlgorithmDFS.ts
index 9534b34c17b9addc70aa83ba23403fb9dbde9210..1748b83d6ac29af7db9c01cf437a2ac3e511e31b 100644
--- a/src/composables/AlgorithmDFS.ts
+++ b/src/composables/AlgorithmDFS.ts
@@ -1,5 +1,5 @@
 // Type imports
-import { Network } from '@metabohub/viz-core/src/types/Network';
+import { Network } from "../types/TypeVizCore";
 import { StartNodesType } from '../types/EnumArgs';
 
 // Composable imports
@@ -66,18 +66,19 @@ export async function DFSWithSources(network:Network, sources:Array<string>|Star
  * @param sources to use as staring node for DFS
  * @returns the reverse dfs order (topological sort) and a graph object without the cycles accessible from the sources 
  */
-export async function DFSsourceDAG(network:Network, sources:Array<string>):Promise<{dfs:Array<string>, graph:{[key:string]:Function} }> {
+export async function DFSsourceDAG(network:Network, sources:Array<string>):Promise<{dfs:Array<string>, graph:{[key:string]:Function}}> {
     let DFS:DFS=await createGraphForDFS(network);
 
-    sources.forEach(async sourceID =>{
-        const nodesID:string[]=DFS.nodesID;
-        if (nodesID.length===0) return; // no nodes 
+    const nodesID:string[]=DFS.nodesID;
+    if (nodesID.length===0) return { dfs:[],graph:DFS.GDSgraph }; // no nodes 
+
+    for (const sourceID of sources){
         const sourceIndex=nodesID.indexOf(sourceID);
         // if the source exist in the network and it's not already visited : dfs from this source
         if (sourceIndex!==-1 && !DFS.visited[sourceIndex]){
             DFS= await nodeDagDFS(DFS,sourceIndex,[]);           
         }
-    });
+    };
 
     return { dfs:DFS.dfsOrder.reverse(),graph:DFS.GDSgraph };
 }
@@ -115,8 +116,8 @@ async function nodeDagDFS(DFS:DFS,nodeIndex:number,currentPath:number[]):Promise
     path.push(nodeIndex)
 
     // loop through the children of the node
-    DFS.GDSgraph.adjacent(DFS.nodesID[nodeIndex]).sort().forEach(async (childID:string) => {
-
+    const childrenOfNode=DFS.GDSgraph.adjacent(DFS.nodesID[nodeIndex]).sort();
+    for (const childID of childrenOfNode){
         // get the index of the child
         const childIndex = DFS.nodesID.indexOf(childID);
         if(childIndex!==-1){
@@ -136,7 +137,7 @@ async function nodeDagDFS(DFS:DFS,nodeIndex:number,currentPath:number[]):Promise
                 
             }
         }
-    });
+    };
     
     // add the node to the dfs order
     DFS.dfsOrder.push(DFS.nodesID[nodeIndex]); 
diff --git a/src/composables/CalculateOverlaps.ts b/src/composables/CalculateOverlaps.ts
index 1e38ed06d62905f0b96f3b83404e37a2ef3a0fff..973b7348b835c37a3790390b0a901fc7f564a9bd 100644
--- a/src/composables/CalculateOverlaps.ts
+++ b/src/composables/CalculateOverlaps.ts
@@ -1,8 +1,5 @@
 // Type import
-import { Node } from '@metabohub/viz-core/src/types/Node';
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Link } from '@metabohub/viz-core/src/types/Link';
-import { GraphStyleProperties } from '@metabohub/viz-core/src/types/GraphStyleProperties';
+import { Network,GraphStyleProperties } from "../types/TypeVizCore";
 import { Coordinate, Size } from '../types/CoordinatesSize';
 
 
@@ -321,259 +318,3 @@ function nodeEdgeOverlap(centerCoordNode: Coordinate, sizeNode:Size, posLink1: C
 function isPointInsideRect(point: Coordinate, rectangle:{left:number,right:number,top:number,bottom:number}):boolean{ 
     return point.x >= rectangle.left && point.x <= rectangle.right && point.y >= rectangle.top && point.y <= rectangle.bottom;
 }
-
-
-
-// CHNAGE THE CODE : SEE METRICSNETWORK (for end of internship : keep this one)
-
-// /**
-//  * Check if the coordinates (x, y) are the same as the node's coordinates
-//  * @param node the node
-//  * @param x coordinate
-//  * @param y coordinate
-//  * @returns a boolean
-//  */
-// function isNodeCoord(node: {x:number,y:number}, x: number, y: number): boolean {
-//     return (node.x == x && node.y == y);
-// }
-
-
-
-//______________________Intersection in the network______________________
-/**
- * Check if the 2 edges are crossing. 
- * Coming from the same node or going to the same node doesn't count as crossing.
- * @param link1 an edge
- * @param link2 an edge
- * @returns a boolean
- */
-// function edgesIntersectionLink(link1: Link, link2: Link,style:GraphStyleProperties): boolean {
-
-//     // case of common node
-//     if (commonNodeBetween2Links(link1,link2)) {
-//         return false;
-//     }
-
-//     let x1: Node = link1.source;
-//     const x1Center=AdjustCoordNodeToCenter(x1,style);
-//     let x2: Node = link1.target;
-//     const x2Center=AdjustCoordNodeToCenter(x2,style);
-//     let x3: Node = link2.source;
-//     const x3Center=AdjustCoordNodeToCenter(x3,style);
-//     let x4: Node = link2.target;
-//     const x4Center=AdjustCoordNodeToCenter(x4,style);
-
-//     const result = checkIntersection(x1Center.x, x1Center.y, x2Center.x, x2Center.y, x3Center.x, x3Center.y, x4Center.x, x4Center.y);
-//     if (result.type == "intersecting") {
-//         return true;
-//     } else {
-//         return false;
-//     }
-    
-// }
-
-// function commonNodeBetween2Links(link1: Link,link2: Link): boolean {
-//     if (link1.source==link2.source || link1.source==link2.target || link1.target==link2.source || link1.target==link2.target) {
-//         return true;
-//     }else {
-//         return false;
-//     }
-// } 
-
-// function sameAngleBetween2ConnectedLinks(link1: Link,link2: Link,style:GraphStyleProperties): boolean {
-
-//     // get nodes information
-//     let commonNode: Node;
-//     let node1: Node; // node from link 1 that is not in link 2
-//     let node2: Node; // node from link 2 that is not in link 1
-
-//     // if link 1 source is the common node :
-//     if (link1.source==link2.source || link1.source==link2.target){
-//         commonNode=link1.source;
-//         node1=link1.target;
-//     // if link 1 target is the common node :
-//     }else if (link1.target==link2.source || link1.target==link2.target){
-//         commonNode=link1.target;
-//         node1=link1.source;
-//     }
-//     // get node 2
-//     if (link2.source==commonNode){
-//         node2=link2.target;
-//     }else{
-//         node2=link2.source;
-//     }
-
-//     // adjust coord
-//     const commonNodeCenter=AdjustCoordNodeToCenter(commonNode,style);
-//     const node1Center=AdjustCoordNodeToCenter(node1,style);
-//     const node2Center=AdjustCoordNodeToCenter(node2,style);
-//     // get angle between the 2 edges
-//     const angle1=adjustAngle(Math.atan2(node1Center.y-commonNodeCenter.y,node1Center.x-commonNodeCenter.x));
-//     const angle2=adjustAngle(Math.atan2(node2Center.y-commonNodeCenter.y,node2Center.x-commonNodeCenter.x));    
-    
-//     // same angles ?
-//     return angle1==angle2;
-
-// }
-
-// function adjustAngle(angle: number): number {
-//     return (angle + 2 * Math.PI) % (2 * Math.PI);
-// }
-
-// function AdjustCoordNodeToCenter(node:Node,style:GraphStyleProperties):{x:number,y:number}{
-//     const size = getSizeNodePixel(node,style);
-//     return {x:node.x-size.width/2,y:node.y-size.height/2}
-// }
-
-// /**
-//  * Counts how many crossings are in a network
-//  * @param network the network
-//  * @returns the number of crossings
-//  */
-// export function countIntersection(network: Network,style:GraphStyleProperties): number {
-//     let nb: number = 0;
-//     for (let i=0 ; i<network.links.length ; i++) {
-//         for (let j=i+1 ; j<network.links.length ; j++) {
-//             const link1=network.links[i];
-//             const link2=network.links[j];
-//             if (edgesIntersectionLink(link1, link2,style)){
-//                 nb++;
-//             }
-//         }
-//     }
-//     return nb;
-// }
-
-
-//______________________Intersection in another format of graph______________________
-
-////CLEAN CODE : CHANGE FORMAT TO NETWORK AND USE THE OTHER FUNCTIONS FOR CYCLE
-
-// function AdjustCoordNodeToCenter2(node:Node,nodeCoord:{x:number,y:number},style:GraphStyleProperties):{x:number,y:number}{
-//     const size = getSizeNodePixel(node,style);
-//     return {x:nodeCoord.x-size.width/2,y:nodeCoord.y-size.height/2}
-// }
-
-
-
-// function commonNodeBetween2EdgesID(link1: {source:string,target:string},link2: {source:string,target:string}): boolean {
-//     if (link1.source==link2.source || link1.source==link2.target || link1.target==link2.source || link1.target==link2.target) {
-//         return true;
-//     }else {
-//         return false;
-//     }
-// }
-
-
-
-// function intersection2ConnectedLinks(node1Link1:{x:number,y:number},node2Link1:{x:number,y:number},node1Link2:{x:number,y:number},node2Link2:{x:number,y:number}): boolean {
-
-//     // get nodes information
-//     let commonNode: {x:number,y:number};
-//     let node1: {x:number,y:number}; // node from link 1 that is not in link 2
-//     let node2: {x:number,y:number}; // node from link 2 that is not in link 1
-
-//     // if link 1 node 1 is the common node :
-//     if (sameNode(node1Link1,node1Link2) || sameNode(node1Link1,node2Link2)){
-//         commonNode=node1Link1;
-//         node1=node2Link1;
-//     // if link 1 node 2 is the common node :
-//     }else if (sameNode(node2Link1,node1Link2) || sameNode(node2Link1,node2Link2)){
-//         commonNode=node2Link1;
-//         node1=node1Link1;
-//     }
-//     // get node 2
-//     if (sameNode(node1Link2,commonNode)){
-//         node2=node2Link2;
-//     }else{
-//         node2=node1Link2;
-//     }
-
-//     // get angle between the 2 edges
-//     const angle1=adjustAngle(Math.atan2(node1.y-commonNode.y,node1.x-commonNode.x));
-//     const angle2=adjustAngle(Math.atan2(node2.y-commonNode.y,node2.x-commonNode.x));
-    
-//     // same angles ?
-//     return angle1==angle2;
-
-// }
-
-// export function countIntersectionGraph(nodes: {[key:string]:{x:number,y:number}},links:{source:string,target:string}[],network:Network,style:GraphStyleProperties): number {
-//     let nb: number = 0;
-//     for (let i=0 ; i<links.length ; i++) {
-//         for (let j=i+1 ; j<links.length ; j++) {
-//             const link1=links[i];
-//             const link2=links[j];
-//             // check if intersection
-//             let node1Link1=nodes[link1.source];
-//             //node1Link1=AdjustCoordNodeToCenter2(network.nodes[link1.source],node1Link1,style);
-//             let node2Link1=nodes[link1.target];
-//             //node2Link1=AdjustCoordNodeToCenter2(network.nodes[link1.target],node2Link1,style);
-//             let node1Link2=nodes[link2.source];
-//             //node1Link2=AdjustCoordNodeToCenter2(network.nodes[link2.source],node1Link2,style);
-//             let node2Link2=nodes[link2.target];
-//             //node2Link2=AdjustCoordNodeToCenter2(network.nodes[link2.target],node2Link2,style);
-//             if (edgesIntersection(node1Link1,node2Link1,node1Link2,node2Link2)){
-//                 nb++;
-//             }
-//         }
-//     }
-//     return nb;
-// }
-
-//______________________Nodes overlap for graph______________________
-
-// export function countOverlapNodes(nodesPosition: {[key:string]:Coordinate},network:Network,networkStyle:GraphStyleProperties):number{
-//     let nb=0;
-//     const nodesID=Object.keys(nodesPosition);
-//     for (let i=0 ; i<nodesID.length ; i++) {
-//         for (let j=i+1 ; j<nodesID.length ; j++) {
-//             // info about node1
-//             const node1=network.nodes[nodesID[i]];
-//             const posNode1=nodesPosition[nodesID[i]];
-//             const sizeNode1=getSizeNodePixel(node1,networkStyle);
-//             // info about node2
-//             const node2=network.nodes[nodesID[j]];
-//             const posNode2=nodesPosition[nodesID[j]];
-//             const sizeNode2=getSizeNodePixel(node2,networkStyle);
-
-//             if (nodeOverlap(posNode1,sizeNode1,posNode2,sizeNode2)){
-//                 nb+=1;
-//             }
-
-//         }
-//     }
-//     return nb;
-// }
-
-//______________________Nodes overlap with edges for graph______________________
-
-// export function countOverlapNodesEdges(nodesPosition: {[key:string]:{x:number,y:number}},links:{source:string,target:string}[],network:Network,networkStyle:GraphStyleProperties):number{
-//     let nb=0;
-//     const nodesID=Object.keys(nodesPosition);
-//     for (let i=0 ; i<nodesID.length ; i++) {
-//         // info about node
-//         const node=network.nodes[nodesID[i]];
-//         const posNode=nodesPosition[nodesID[i]];
-//         const sizeNode=getSizeNodePixel(node,networkStyle);
-
-//         for (let j=0 ; j<links.length ; j++) {        
-//             // info about link
-//             const link=links[j];
-//             // if node is linked to the edge : continue
-//             if(link.source==nodesID[i] || link.target==nodesID[i]){
-//                 continue;
-//             }else{
-//                 let posLink1=nodesPosition[link.source];
-//                 let posLink2=nodesPosition[link.target];
-//                 //posLink1=AdjustCoordNodeToCenter2(network.nodes[link.source],posLink1,networkStyle);
-//                 //posLink2=AdjustCoordNodeToCenter2(network.nodes[link.target],posLink2,networkStyle);
-//                 if (nodeEdgeOverlap(posNode,sizeNode,posLink1,posLink2)){
-//                     nb+=1;
-//                 }
-//             }
-
-//         }
-//     }
-//     return nb;
-// }
diff --git a/src/composables/CalculateRelationCycle.ts b/src/composables/CalculateRelationCycle.ts
index f68a09a92928f0b6414b0d7840ae8c7f9c233241..805295cfd63bd5a7404986d075172e8e60322912 100644
--- a/src/composables/CalculateRelationCycle.ts
+++ b/src/composables/CalculateRelationCycle.ts
@@ -1,6 +1,6 @@
 // Type imports
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { Link } from "@metabohub/viz-core/src/types/Link";
+import { Link } from "../types/TypeVizCore";
 import { Ordering } from "../types/EnumArgs";
 import { TypeSubgraph } from "../types/Subgraph";
 import { LinkLayout, NetworkLayout } from "../types/NetworkLayout";
@@ -89,15 +89,15 @@ import { inCycle } from "./GetSetAttributsNodes";
  * @param parentOrChild - Specifies whether to retrieve the parent cycles or the child of the cycle group. Can be either "parent" or "child".
  * @param xSort - Optional. Specifies whether to sort the nodes of the group cycle and their parent/child by their x position. Defaults to true. 
  * The neighboring nodes are added in the order of the x position of the nodes inside the group cycle.
- * @returns An array of cycle IDs representing the neighboring cycles.
+ * @returns Promise of an array of cycle IDs representing the neighboring cycles.
  */
-export function neighborsGroupCycle(subgraphNetwork:SubgraphNetwork,cycleGroupId:string, parentOrChild:"parent"|"child",xSort:boolean=true):string[]{
+export async function neighborsGroupCycle(subgraphNetwork:SubgraphNetwork,cycleGroupId:string, parentOrChild:"parent"|"child",xSort:boolean=true):Promise<string[]>{
     if (subgraphNetwork[TypeSubgraph.CYCLEGROUP] && cycleGroupId in subgraphNetwork[TypeSubgraph.CYCLEGROUP]){
         const cycleGroup=subgraphNetwork[TypeSubgraph.CYCLEGROUP][cycleGroupId];   
         if (cycleGroup.precalculatedNodesPosition){
             const positionNodesCycleGroup=cycleGroup.precalculatedNodesPosition;
             // get the id of nodes in group cycle
-            const nodes=getNodesIDPlacedInGroupCycle(subgraphNetwork,cycleGroupId);
+            const nodes=await getNodesIDPlacedInGroupCycle(subgraphNetwork,cycleGroupId);
             // sort nodes of the group cycle by x
             if (xSort){
                 nodes.sort((nodeIdA, nodeIdB) => {
@@ -109,12 +109,12 @@ export function neighborsGroupCycle(subgraphNetwork:SubgraphNetwork,cycleGroupId
             }
             if (parentOrChild==="parent"){
                 // get parent nodes
-                const parentsDoubleArray = parentNodeNotInCycle(subgraphNetwork, nodes,xSort);
+                const parentsDoubleArray = await parentNodeNotInCycle(subgraphNetwork, nodes,xSort);
                 const parentCycles = Array.from(new Set(parentsDoubleArray.flat()));
                 return parentCycles;
             } else {
                 // get child nodes
-                const childrenDoubleArray = childNodeNotInCycle(subgraphNetwork, nodes,xSort);
+                const childrenDoubleArray = await childNodeNotInCycle(subgraphNetwork, nodes,xSort);
                 const childCycles = Array.from(new Set(childrenDoubleArray.flat()));
                 return childCycles;
             }
@@ -133,9 +133,9 @@ export function neighborsGroupCycle(subgraphNetwork:SubgraphNetwork,cycleGroupId
  * @param subgraphNetwork - The subgraph network object.
  * @param listNodes - The list of nodes to check for parent nodes.
  * @param sort - Optional. Specifies whether to sort the parent nodes (for each node) by their x position. Defaults to false.
- * @returns An array of arrays : each array are the parents of a node in the lists
+ * @returns Promise of an array of arrays : each array are the parents of a node in the lists
  */
-export function parentNodeNotInCycle(subgraphNetwork: SubgraphNetwork, listNodes: string[],sort:boolean=false): string[][] {
+export async function parentNodeNotInCycle(subgraphNetwork: SubgraphNetwork, listNodes: string[],sort:boolean=false): Promise<string[][]> {
     const parentNodes = listNodes.map((node: string) => {
         let parentNodesI = subgraphNetwork.network.links
             .filter(link => link.target.id === node) // get link with those node as child
@@ -160,9 +160,9 @@ export function parentNodeNotInCycle(subgraphNetwork: SubgraphNetwork, listNodes
  * @param subgraphNetwork - The subgraph network object.
  * @param listNodes - The list of nodes to check for child nodes.
  * @param sort - Optional. Specifies whether to sort the child nodes (for each node) by their x position. Defaults to false.
- * @returns An array of arrays containing the child nodes that are not part of any cycle.
+ * @returns Promise of an array of arrays containing the child nodes that are not part of any cycle.
  */
-export function childNodeNotInCycle(subgraphNetwork: SubgraphNetwork, listNodes: string[],sort:boolean=false): string[][] {
+export async function childNodeNotInCycle(subgraphNetwork: SubgraphNetwork, listNodes: string[],sort:boolean=false): Promise<string[][]> {
     const childNodes = listNodes.map((node: string) => {
         let childNodesI = subgraphNetwork.network.links
             .filter(link => link.source.id === node) // get link with those node as parent
@@ -189,9 +189,9 @@ export function childNodeNotInCycle(subgraphNetwork: SubgraphNetwork, listNodes:
  * 
  * @param subgraphNetwork - The subgraph network containing the group cycles.
  * @param groupCycleID - The ID of the group cycle to retrieve the nodes from.
- * @returns An array of strings representing the IDs of the nodes placed in the group cycle.
+ * @returns Promise of an array of strings representing the IDs of the nodes placed in the group cycle.
  */
-export function getNodesIDPlacedInGroupCycle(subgraphNetwork:SubgraphNetwork,groupCycleID:string):string[]{
+export async function getNodesIDPlacedInGroupCycle(subgraphNetwork:SubgraphNetwork,groupCycleID:string):Promise<string[]>{
     if (subgraphNetwork[TypeSubgraph.CYCLEGROUP] && groupCycleID in subgraphNetwork[TypeSubgraph.CYCLEGROUP]){
         const groupCycle =subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleID];
         if (groupCycle.precalculatedNodesPosition){
@@ -289,7 +289,6 @@ export function getNodesPlacedInGroupCycleAsObject(subgraphNetwork:SubgraphNetwo
  * @throws {Error} If tail or head is undefined.
  */
 export function cycleMetanodeLink(link:LinkLayout, cycle:boolean=true):{inCycle:string[],tail:string,head:string}{
-    
     let inCycle:string[]=[];
     let tail:string;
     let head:string;
@@ -325,19 +324,21 @@ export function cycleMetanodeLink(link:LinkLayout, cycle:boolean=true):{inCycle:
  * 
  * @param subgraphNetwork - The subgraph network.
  * @param orderChange - A boolean indicating whether to change the order with group cycle. Default is false.
- * @returns The subgraphNetwork and an array of sorted links.
+ * @returns Promise of the subgraphNetwork and an array of sorted links.
  */
-export function sortLinksWithAllGroupCycle(subgraphNetwork:SubgraphNetwork,orderChange:boolean=false):{subgraphNetwork:SubgraphNetwork,linksOrdered:LinkLayout[]}{
+export async function sortLinksWithAllGroupCycle(subgraphNetwork:SubgraphNetwork,orderChange:boolean=false):Promise<{subgraphNetwork:SubgraphNetwork,linksOrdered:LinkLayout[]}>{
     let links:Link[]=[];
 
     // change ordre with group cycle
     if (orderChange  && subgraphNetwork[TypeSubgraph.CYCLEGROUP]){
         // adding edge in right order for each group cycle
-        Object.keys(subgraphNetwork[TypeSubgraph.CYCLEGROUP]).forEach( (groupCycle) => {
-            const resultSorting=sortLinksWithGroupCycle(subgraphNetwork,groupCycle);
-            subgraphNetwork=resultSorting.subgraphNetwork;
-            links=links.concat(resultSorting.linksOrdered);
-        });
+        const allGroupCycle=Object.keys(subgraphNetwork[TypeSubgraph.CYCLEGROUP]);
+        for (const groupCycle of allGroupCycle) {
+            const resultSorting = await sortLinksWithGroupCycle(subgraphNetwork, groupCycle);
+            subgraphNetwork = resultSorting.subgraphNetwork;
+            links = links.concat(resultSorting.linksOrdered);
+        }
+
         // add other links
         Object.values(subgraphNetwork.network.links).forEach((link) => {
             if (!links.includes(link)){
@@ -358,15 +359,15 @@ export function sortLinksWithAllGroupCycle(subgraphNetwork:SubgraphNetwork,order
  * 
  * @param subgraphNetwork - The subgraph network containing the cycles group.
  * @param groupCycle - The group cycle id to sort the links.
- * @returns The subgraphNetwork and an array of sorted links.
+ * @returns Promise of the subgraphNetwork and an array of sorted links.
  */
-function sortLinksWithGroupCycle(subgraphNetwork:SubgraphNetwork,groupCycle:string):{subgraphNetwork:SubgraphNetwork,linksOrdered:LinkLayout[]}{
+async function sortLinksWithGroupCycle(subgraphNetwork:SubgraphNetwork,groupCycle:string):Promise<{subgraphNetwork:SubgraphNetwork,linksOrdered:LinkLayout[]}>{
     let links:LinkLayout[]=[];
     if( subgraphNetwork[TypeSubgraph.CYCLEGROUP] && groupCycle in subgraphNetwork[TypeSubgraph.CYCLEGROUP]){
         // sort parent of cycle by x of the child in the cycle
         // (first : parent of the left node of group cycle)
-        const parents= neighborsGroupCycle(subgraphNetwork,groupCycle,"parent",true);
-        const children= neighborsGroupCycle(subgraphNetwork,groupCycle,"child",true);
+        const parents= await neighborsGroupCycle(subgraphNetwork,groupCycle,"parent",true);
+        const children= await neighborsGroupCycle(subgraphNetwork,groupCycle,"child",true);
 
         let nodeOrder:string[]=[];
         let source:"node"|"groupCycle";
@@ -384,15 +385,15 @@ function sortLinksWithGroupCycle(subgraphNetwork:SubgraphNetwork,groupCycle:stri
         }
 
         // get links between the parent (or children) and the group cycle in the right order
-        nodeOrder.forEach((nodeId) => {
+        for (const nodeId of nodeOrder){
             // get links for each node
-            const newLinksOrder = getLinksNodeGroupCycle(subgraphNetwork,nodeId,groupCycle,source);
+            const newLinksOrder = await getLinksNodeGroupCycle(subgraphNetwork,nodeId,groupCycle,source);
             // add links
             newLinksOrder.forEach((newLink) => {
                 links.push(newLink);
             });
 
-        });
+        };
         return { subgraphNetwork:subgraphNetwork,linksOrdered:links };
     }else{
         return { subgraphNetwork:subgraphNetwork,linksOrdered:[] };
@@ -410,7 +411,7 @@ function sortLinksWithGroupCycle(subgraphNetwork:SubgraphNetwork,groupCycle:stri
  * @param source "node" if the parent links are needed, "groupCycle" if the child links are needed
  * @returns links that are child or parent of a group cycle
  */
-function getLinksNodeGroupCycle(subgraphNetwork:SubgraphNetwork,nodeId:string,groupCycleId:string,source:"node"|"groupCycle"):LinkLayout[]{
+async function getLinksNodeGroupCycle(subgraphNetwork:SubgraphNetwork,nodeId:string,groupCycleId:string,source:"node"|"groupCycle"):Promise<LinkLayout[]>{
     if (source==="node"){
         // node to group cycle
         return Object.values(subgraphNetwork.network.links).filter((link) => {
diff --git a/src/composables/CalculateSize.ts b/src/composables/CalculateSize.ts
index e4056b597a74e2cee8829cd31f7276580715095a..24f3957b4e8c889b98c82833487f8bef79f6a67f 100644
--- a/src/composables/CalculateSize.ts
+++ b/src/composables/CalculateSize.ts
@@ -1,17 +1,12 @@
 // Type imports
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Node } from "@metabohub/viz-core/src/types/Node";
+import { Network, Node, GraphStyleProperties } from  "../types/TypeVizCore";
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
 import { Subgraph, TypeSubgraph } from "../types/Subgraph";
 import { Coordinate, Size } from "../types/CoordinatesSize";
 
 // Composable imports
-import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
 import { inCycle, isSideCompound } from "./GetSetAttributsNodes";
 
-// General imports
-
-
 
 /**
  * This file contains functions to calculate the size of nodes, edges and subgraphs. Anf function to shift coordinates depending on node size.
@@ -123,7 +118,6 @@ export function getSizeNodePixel(node:Node,styleNetwork:GraphStyleProperties):Si
             }
         });
     }
-
     return {height:height,width:width};
 }
 
@@ -389,7 +383,7 @@ function getSizeGroupCycles(subgraphNetwork:SubgraphNetwork,groupCycle:Subgraph)
  * @param style - The style properties used to calculate the top left coordinate.
  * @param moveCycleToo - Optional parameter indicating whether to move nodes in cycles as well. Defaults to true.
  */
-export function shiftAllToGetTopLeftCoord(network:Network,style:GraphStyleProperties,moveCycleToo:boolean=true) {
+export function shiftAllToGetTopLeftCoord(network:Network,style:GraphStyleProperties,moveCycleToo:boolean=true):void {
     Object.values(network.nodes).forEach(node=>{
         if( moveCycleToo || !inCycle(network,node.id)){
             const {x,y}=getTopLeftCoordFromCenter(node,style);
@@ -408,7 +402,11 @@ export function shiftAllToGetTopLeftCoord(network:Network,style:GraphStyleProper
  */
 export function getTopLeftCoordFromCenter(node:Node,style:GraphStyleProperties):Coordinate{
     const size = getSizeNodePixel(node,style);
-    return {x:node.x-size.width/2,y:node.y-size.height/2}
+    let x = node.x-size.width/2;
+    let y = node.y-size.height/2;
+    x=parseFloat(x.toFixed(2));
+    y=parseFloat(y.toFixed(2));
+    return {x:x,y:y}
 }
 
 /**
@@ -420,5 +418,9 @@ export function getTopLeftCoordFromCenter(node:Node,style:GraphStyleProperties):
  */
 export function getCenterCoordFromTopLeft(node:Node,style:GraphStyleProperties):Coordinate{
     const size = getSizeNodePixel(node,style);
-    return {x:node.x+size.width/2,y:node.y+size.height/2}
+    let x = node.x+size.width/2;
+    let y = node.y+size.height/2;
+    x=parseFloat(x.toFixed(2));
+    y=parseFloat(y.toFixed(2));
+    return {x:x,y:y}
 }
\ No newline at end of file
diff --git a/src/composables/CalculateStartNodes.ts b/src/composables/CalculateStartNodes.ts
index c56a1f854f2afc810df6a1869b99c63e041b9d72..c37bb57289201e628db72dbb7832c3febd1a8fc5 100644
--- a/src/composables/CalculateStartNodes.ts
+++ b/src/composables/CalculateStartNodes.ts
@@ -1,6 +1,6 @@
 // Types imports
 import { StartNodesType } from "../types/EnumArgs";
-import { Network } from "@metabohub/viz-core/src/types/Network";
+import { Network } from  "../types/TypeVizCore";
 import { NetworkLayout, NodeLayout } from "../types/NetworkLayout";
 
 // Composable imports
diff --git a/src/composables/CheckNetwork.ts b/src/composables/CheckNetwork.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aa98a7b859f99cc3e75a488cf1d8cbd1681b02ac
--- /dev/null
+++ b/src/composables/CheckNetwork.ts
@@ -0,0 +1,302 @@
+// Type imports
+import {Network, Node, Link, GraphStyleProperties} from '../types/TypeVizCore';
+
+/**
+ * This file contains functions to validate the format of network objects, nodes, and links.
+ * 
+ * -> checkNetworkFormat: 
+ *      Validates the format of a network object.
+ * 
+ * -> checkNodeFormat:
+ *      Validates the format of a node object.
+ * 
+ * -> checkValidIdForViz:
+ *      Validates the given string `id` against several patterns to determine if it is a valid identifier for visualization.
+ * 
+ * -> checkLinkFormat:
+ *      Validates the format of a link within a network.
+ *
+ * -> checkNetworkStyleFormat:
+ *      Checks if the provided network style format is consistent with the network structure.
+ */
+
+/**
+ * Validates the format of a network object.
+ *
+ * @param network - The network object to validate.
+ * @param checkExactKeysInterface - If true, ensures the network object contains only the exact keys defined in the interface.
+ * @param checkIDForViz - If true, checks the ID for visualization. Defaults to true.
+ * 
+ * @throws Will throw an error if the network is not an object.
+ * @throws Will throw an error if the network lacks mandatory keys.
+ * @throws Will throw an error if the network has invalid types for mandatory keys.
+ * @throws Will throw an error if the network contains invalid keys when `checkExactKeysInterface` is true.
+ * @throws Will throw an error if the invalid nodes or links.
+ */
+export async function checkNetworkFormat(network: Network, checkExactKeysInterface: boolean,checkIDForViz:boolean=true): Promise<void> {
+
+     // Check if object
+     if(typeof network !== 'object') {
+        throw new Error(`Network is not an object.`);
+    }
+
+    // Check mandatory keys
+    const mandatoryInterfaceKeys :string[]= ['id', 'nodes', 'links'];
+    const mandatoryInterfaceType : string[] = ['string', 'object', 'object'];
+    for (const i in mandatoryInterfaceKeys){
+        const key:string = mandatoryInterfaceKeys[i];
+        if (!Object.keys(network).includes(key)) {
+            throw new Error(`Network lacks key: ${key}`);
+        }
+        const type = mandatoryInterfaceType[i];
+        if (typeof (network as any)[key] !== type) {
+            throw new Error(`Network has an invalid type for key ${key}: expected ${type}, got ${typeof (network as any)[key] }`);
+        }
+    }
+
+    // Check if the network object respects exactly the interface
+    if (checkExactKeysInterface) {
+        const allInterfaceKeys=['id','nodes','links','label', 'type', 'rescale'];
+        Object.keys(network).forEach(key => {
+            if (!allInterfaceKeys.includes(key)) {
+                throw new Error(`Network has an invalid key: ${key}`);
+            }
+        });
+
+    }
+
+    // Check nodes
+    Object.entries(network.nodes).forEach(([nodeId, node]) => {
+        checkNodeFormat(nodeId, node, checkExactKeysInterface,checkIDForViz);
+    });
+
+
+	// Check links
+	network.links.forEach(link => {
+        checkLinkFormat(network, link, checkExactKeysInterface);
+    });
+
+}
+
+/**
+ * Validates the format of a node object based on specified criteria.
+ *
+ * @param nodeId - The identifier of the node.
+ * @param node - The node object to be validated.
+ * @param checkExactKeysInterface - If true, ensures the node has exactly the keys defined in the interface.
+ * @param checkIDForViz - If true, validates the format of the node ID for visualization purposes.
+ * 
+ * @throws Will throw an error if the node is not an object.
+ * @throws Will throw an error if the node lacks mandatory keys or has keys with invalid types.
+ * @throws Will throw an error if the node ID does not match the provided nodeId.
+ * @throws Will throw an error if the node contains invalid keys when `checkExactKeysInterface` is true.
+ * @throws Will throw an error if the node contains the `metadataLayout` key when `checkExactKeysInterface` is false.
+ * @throws Will throw an error if the node ID is invalid for Viz when `checkIDForViz` is true.
+ */
+export function checkNodeFormat(nodeId:string, node: Node, checkExactKeysInterface: boolean,checkIDForViz:boolean=false):void {
+    
+    // Check if object
+    if(typeof node !== 'object') {
+        throw new Error(`Node ${nodeId} is not an object.`);
+    }
+
+    // Check mandatory keys
+    const mandatoryInterfaceKeys :string[]= ['id', 'x', 'y'];
+    const mandatoryInterfaceType : string[] = ['string', 'number', 'number'];
+    for (const i in mandatoryInterfaceKeys){
+        const key:string = mandatoryInterfaceKeys[i];
+        if (!Object.keys(node).includes(key)) {
+            throw new Error(`Node ${nodeId} lacks key: ${key}`);
+        }
+        const type = mandatoryInterfaceType[i];
+        if (typeof (node as any)[key] !== type) {
+            throw new Error(`Node ${nodeId} has an invalid type for key ${key}: expected ${type}, got ${typeof (node as any)[key] }`);
+        }
+    }
+    
+    // Check if the node id matches the key
+    if (node.id !== nodeId) {
+        throw new Error(`Node id and key mismatch: expected ${nodeId} for id, got ${node.id}`);
+    }
+
+    // Check format of id 
+    if(checkIDForViz){
+        checkValidIdForViz(nodeId);
+    }
+
+    // Check if the node respects exactly the interface
+    if (checkExactKeysInterface) {
+        const allInterfaceKeys=['id','x','y','label', 'classes', 'hidden', 'selected', 'metadata'];
+        Object.keys(node).forEach(key => {
+            if (!allInterfaceKeys.includes(key)) {
+                throw new Error(`Node ${nodeId} has an invalid key: ${key}`);
+            }
+        });
+    }
+
+    // If checkExactInterface is false, check if the node has metadataLayout (not allowed has used for algorithm)
+    if (!checkExactKeysInterface &&  Object.keys(node).includes('metadataLayout')) {
+        throw new Error(`Node ${nodeId} contains metadataLayout, which is not allowed.`);
+    }
+}
+
+
+/**
+ * Validates the given string `id` against several patterns to determine if it is a valid identifier for visualization.
+ * 
+ * The function checks if the `id` matches any of the following patterns:
+ * - Alphabetic string with underscores or digits, not starting with a digit.
+ * - Numeral (integer, float, or negative float).
+ * - Double-quoted string with possible escaped quotes.
+ * - HTML string <...>.
+ * 
+ * If the `id` does not match any of these patterns, an error is thrown.
+ * 
+ * @param id - The string to be validated.
+ * @throws {Error} If the `id` does not match any of the valid patterns.
+ */
+export function checkValidIdForViz(id: string): void {
+    // Regular expression for alphabetic string with underscores or digits, not starting with a digit
+    const alphabeticPattern = /^[a-zA-Z_\x80-\xFF][a-zA-Z0-9_\x80-\xFF]*$/;
+    
+    // Regular expression for numeral (integer, float, or negative float)
+    const numeralPattern = /^-?(\d+(\.\d+)?|\.\d+)$/;
+    
+    // Regular expression for double-quoted string with possible escaped quotes
+    const doubleQuotedStringPattern = /^"([^"\\]*(\\["\\])*[^"]*)*"$/;
+    
+    // Regular expression for HTML string
+    const htmlPattern = /^<[^>]*>$/;
+    
+    // Test the input string against all patterns
+    if (
+        !alphabeticPattern.test(id) && 
+        !numeralPattern.test(id) &&
+        !doubleQuotedStringPattern.test(id) &&
+        !htmlPattern.test(id)
+    ) {
+        throw new Error(`Invalid string: ${id}`);
+    }
+}
+
+
+/**
+ * Validates the format of a link within a network.
+ *
+ * @param network - The network object containing nodes.
+ * @param link - The link object to be validated.
+ * @param checkExactKeysInterface - Flag to check if the link respects exactly the interface.
+ * 
+ * @throws Will throw an error if the link is not an object.
+ * @throws Will throw an error if the link lacks mandatory keys.
+ * @throws Will throw an error if the link has an invalid type for any mandatory key.
+ * @throws Will throw an error if the link's source node is not in the network.
+ * @throws Will throw an error if the link's source node pointer is invalid.
+ * @throws Will throw an error if the link's target node is not in the network.
+ * @throws Will throw an error if the link's target node pointer is invalid.
+ * @throws Will throw an error if the link has any invalid keys when `checkExactKeysInterface` is true.
+ */
+export function checkLinkFormat(network:Network,link: Link, checkExactKeysInterface: boolean):void {
+
+    // Check if object
+    if(typeof link !== 'object') {
+        throw new Error(`Link is not an object.`);
+    }
+
+    // Check mandatory keys
+    const mandatoryInterfaceKeys :string[]= ['id', 'source', 'target'];
+    const mandatoryInterfaceType : string[] = ['string', 'object', 'object'];
+    for (const i in mandatoryInterfaceKeys){
+        const key:string = mandatoryInterfaceKeys[i];
+        if (!Object.keys(link).includes(key)) {
+            throw new Error(`Link lacks key: ${key}`);
+        }
+        const type = mandatoryInterfaceType[i];
+        if (typeof (link as any)[key] !== type) {
+            throw new Error(`Link has an invalid type for key ${key}: expected ${type}, got ${typeof (link as any)[key] }`);
+        }
+    }
+
+    // Check source
+    if (!(link.source.id in network.nodes)) {
+        throw new Error(`Link ${link.id} has no source node in the network.`);
+    }
+    if (link.source !== network.nodes[link.source.id]) {
+        throw new Error(`Link ${link.id} has an invalid source node (no pointer).`);
+    }
+
+    // Check target
+    if (!(link.target.id in network.nodes)) {
+        throw new Error(`Link ${link.id} has no target node in the network.`);
+    }
+    if (link.target !== network.nodes[link.target.id]) {
+        throw new Error(`Link ${link.id} has an invalid target node (no pointer).`);
+    }
+    
+
+    // Check if the link respects exactly the interface
+    if (checkExactKeysInterface) {
+        const allInterfaceKeys=['id','source','target','label', 'classes', 'type', 'relation', 'directed','metadata'];
+        Object.keys(link).forEach(key => {
+            if (!allInterfaceKeys.includes(key)) {
+                throw new Error(`Link has an invalid key: ${key}`);
+            }
+        });
+  
+    }
+}
+
+
+
+/**
+ * Checks if the provided network style format is consistent with the network structure.
+ * 
+ * This function verifies that all node and link classes present in the network have corresponding styles
+ * defined in the network style properties. If any class is missing a style, an error is thrown.
+ * 
+ * @param network - The network object containing nodes and links.
+ * @param networkStyle - The style properties for the network, including nodeStyles and linkStyles.
+ * 
+ * @throws Will throw an error if node classes are present in the network but no nodeStyles are provided.
+ * @throws Will throw an error if any node class is missing in networkStyle.nodeStyles.
+ * @throws Will throw an error if link classes are present in the network but no linkStyles are provided.
+ * @throws Will throw an error if any link class is missing in networkStyle.linkStyles.
+ */
+export function checkNetworkStyleFormat(network: Network, networkStyle: GraphStyleProperties):void {
+
+    // Get unique node classes
+	const nodeClasses = new Set<string>();
+	Object.values(network.nodes).forEach(node => {
+		if (node.classes) {
+			node.classes.forEach(nodeClass => nodeClasses.add(nodeClass));
+		}
+	});
+
+	// Check if all node classes are present in nodeStyles
+    if (!networkStyle.nodeStyles && nodeClasses.size > 0) {
+        throw new Error('Node classes are present in the network but no nodeStyles are provided.');
+    }
+	nodeClasses.forEach(nodeClass => {
+		if (networkStyle.nodeStyles && !(nodeClass in networkStyle.nodeStyles)) {
+			throw new Error(`Node class ${nodeClass} is missing in networkStyle.nodeStyles.`);
+		}
+	});
+
+	// Get unique links classes
+	const linkClasses = new Set<string>();
+	network.links.forEach(link => {
+		if (link.classes) {
+			link.classes.forEach(linkClass => linkClasses.add(linkClass));
+		}
+	});
+
+	// Check if all link classes are present in linkStyles
+    if (!networkStyle.linkStyles && linkClasses.size > 0) {
+        throw new Error('Link classes are present in the network but no linkStyles are provided.');
+    }
+	for (const linkClass of linkClasses) {
+		if (networkStyle.linkStyles && !(linkClass in networkStyle.linkStyles)) {
+			throw new Error(`Link class ${linkClass} is missing in networkStyle.linkStyles.`);
+		}
+	}
+}
diff --git a/src/composables/ConvertFromNetwork.ts b/src/composables/ConvertFromNetwork.ts
index b709a7a1d0874608176f13163c89cfa17c6de1c5..861e6448369075b490f239412f29aaaa123165d7 100644
--- a/src/composables/ConvertFromNetwork.ts
+++ b/src/composables/ConvertFromNetwork.ts
@@ -1,11 +1,9 @@
 // Type imports
-import { Network } from '@metabohub/viz-core/src/types/Network';
-import { Subgraph, TypeSubgraph } from '../types/Subgraph';
+import { Network } from  "../types/TypeVizCore";
+import { TypeSubgraph } from '../types/Subgraph';
 import { SubgraphNetwork } from '../types/SubgraphNetwork';
-import { Node } from '@metabohub/viz-core/src/types/Node';
 import { LinkLayout, NetworkLayout, NodeLayout } from '../types/NetworkLayout';
-import { Ordering } from '../types/EnumArgs';
-import { AttributesViz, SubgraphViz } from '../types/VizType';
+import { AttributesViz, SubgraphViz } from '../types/TypeViz';
 
 // Composable imports
 import { addMainChainForViz,subgraphDot } from './SubgraphForViz';
@@ -18,13 +16,6 @@ import { cycleMetanodeLink, sortLinksWithAllGroupCycle } from './CalculateRelati
 //import  dagre  from 'dagrejs/dist/dagre.js';
 import { Graph } from "@viz-js/viz";
 import * as GDS from 'graph-data-structure';
-import { h } from 'vue';
-import { link } from 'fs';
-//import { s } from 'vitest/dist/reporters-1evA5lom';
-import { get } from 'http';
-//import cytoscape, { ElementDefinition,Stylesheet } from 'cytoscape';
-import { layout } from 'dagrejs';
-import { dot } from 'node:test/reporters';
 
 
 
@@ -49,12 +40,6 @@ import { dot } from 'node:test/reporters';
  * *********************************
  * 1.  Layout library
  * 
- * -> networkToDagre
- *     take a network object and return a dagre.graphlib.Graph object containing the same nodes and edge
- * 
- * -> networkToCytoscape
- *      take a network object and return a cytoscape object containing the same nodes and edge
- * 
  * -> networkToDOT
  *      take a network object and return a DOT string representation
  * 
@@ -169,88 +154,6 @@ export function networkToAdjacentObject(network:Network):{[key : string]:string[
 //___________________________________________________1.  Layout library __________________________________________________________________________
 
 
-
-/** 
- * Take a network object and return a dagre.graphlib.Graph object containing the same nodes and edge 
- * @param {Network}  Network object 
- * @param  graphAttributes for dagre layout (see https://github.com/dagrejs/dagre/wiki)
- * @returns {dagre.graphlib.Graph} Return dagre.graphlib.Graph object 
- */
-// export function networkToDagre(network: Network,graphAttributes={}): dagre.graphlib.Graph{
-
-//     // initialisation dagre graph
-//     var g = new dagre.graphlib.Graph();
-//     g.setGraph(graphAttributes);
-//     g.setDefaultEdgeLabel(() => ({}));
-
-//     // insert nodes into graph
-//     Object.values(network.nodes).forEach((node) => {
-//         const { id, label, x, y } = node;
-//         g.setNode(id, { label, width: 100, height: 100, x, y });
-//     });
-
-//     // insert edges into graph
-//     network.links.forEach((link) => {
-//         const { source, target } = link;
-//         g.setEdge(source.id, target.id);
-//     });
-
-//     return g;
-
-// }
-
-
-  
-/**
- * Converts a network object to a Cytoscape object.
- * 
- * @param network - The network object to convert.
- * @param initialPosition - Optional. Specifies whether to initialize the position of the nodes. Default is false.
- * @returns The converted Cytoscape object.
- */
-// export function networkToCytoscape(network: Network, initialPosition:boolean=false): cytoscape.Core {
-
-//     // Convert nodes
-//     const nodes: ElementDefinition[] = Object.values(network.nodes).map(node => ({
-//         data: {
-//           id: node.id,
-//         },
-//         position: {
-//           x: node.x,
-//           y: node.y,
-//         },
-//       }));
-  
-//     // Convert links
-//     const edges: ElementDefinition[] = [];
-//     network.links.forEach(link => {
-//         edges.push({
-//         data: {
-//           id: link.id,
-//           source: link.source.id,
-//           target: link.target.id,
-//         }
-//       });
-//     });
-
-
-//     if (initialPosition){
-//         return cytoscape({
-//             container: undefined, 
-//             elements: {nodes:nodes, edges:edges},
-//             layout: { 
-//               name: 'preset', // to initialize the position of the nodes
-//             },
-//     });
-//     }else{
-//         return cytoscape({
-//         container: undefined, 
-//         elements: {nodes:nodes, edges:edges},
-//         });
-//   }
-// }
-
-
 /**
  * Converts a SubgraphNetwork object to a DOT string representation.
  * 
@@ -259,10 +162,10 @@ export function networkToAdjacentObject(network:Network):{[key : string]:string[
  * @param addNodes - Optional. Specifies whether to include nodes in the DOT string. Default is true.
  * @param groupOrCluster - Optional. Specifies whether to use "group" or "cluster" for grouping nodes. Default is "cluster".
  * @param orderChange - Optional. Specifies whether to change the order of links in the DOT string. Default is false.
- * @returns The DOT string representation of the SubgraphNetwork.
+ * @returns Promise of the DOT string representation of the SubgraphNetwork.
  */
-export function networkToDOT(subgraphNetwork:SubgraphNetwork,cycle:boolean=true, addNodes:boolean=true,groupOrCluster:"group"|"cluster"="cluster",orderChange:boolean=false): string{
-    const graphViz=networkToViz(subgraphNetwork,cycle,addNodes,groupOrCluster,orderChange);
+export async function networkToDOT(subgraphNetwork:SubgraphNetwork,cycle:boolean=true, addNodes:boolean=true,groupOrCluster:"group"|"cluster"="cluster",orderChange:boolean=false): Promise<string>{
+    const graphViz=await networkToViz(subgraphNetwork,cycle,addNodes,groupOrCluster,orderChange);
     const dotString=graphVizToDot(graphViz);
     return dotString;
 }
@@ -272,9 +175,9 @@ export function networkToDOT(subgraphNetwork:SubgraphNetwork,cycle:boolean=true,
  * @param {Network}  Network object 
  * @param  graphAttributes for viz dot layout (see https://graphviz.org/docs/layouts/dot/)
  * @param clusters clusters for viz
- * @returns {Graph} Return graph object for viz
+ * @returns {Graph} Return promise of graph object for viz
  */
-export function networkToViz(subgraphNetwork:SubgraphNetwork,cycle:boolean=true, addNodes:boolean=true,groupOrCluster:"group"|"cluster"="cluster",orderChange:boolean=false): Graph{
+export async function networkToViz(subgraphNetwork:SubgraphNetwork,cycle:boolean=true, addNodes:boolean=true,groupOrCluster:"group"|"cluster"="cluster",orderChange:boolean=false):Promise<Graph>{
 
     if (groupOrCluster==="group" && !addNodes){
         console.warn('Group without nodes in the file not taken into account'); 
@@ -305,7 +208,7 @@ export function networkToViz(subgraphNetwork:SubgraphNetwork,cycle:boolean=true,
     
     // insert link (but with cycle metanode if cycle is true) 
     let links:LinkLayout[]=[];
-    const resultOrdering=sortLinksWithAllGroupCycle(subgraphNetwork,orderChange);   // order of link changed  for cycle group
+    const resultOrdering=await sortLinksWithAllGroupCycle(subgraphNetwork,orderChange);   // order of link changed  for cycle group
     links=resultOrdering.linksOrdered;
     subgraphNetwork=resultOrdering.subgraphNetwork; // BEWARE: do this before adding cycle metanode (because of attribut ordering)
     links.forEach((link)=>{   
@@ -473,7 +376,7 @@ export function graphVizToDot(vizGraph:Graph, subgraphFirst:boolean=true):string
  * @param obj - The object to convert.
  * @returns A string representation of the object with attribute-value pairs.
  */
-function customStringify(obj:AttributesViz|undefined) {
+function customStringify(obj:AttributesViz|undefined):string{
     if (!obj || Object.keys(obj).length === 0) {
         return "[]";
     }
diff --git a/src/composables/ConvertToNetwork.ts b/src/composables/ConvertToNetwork.ts
index 4b0f600e6726d5ca270fd69ac471afd2ef582e6c..995f66dd03fc03463bda6a7604764c560aae9f7c 100644
--- a/src/composables/ConvertToNetwork.ts
+++ b/src/composables/ConvertToNetwork.ts
@@ -1,20 +1,15 @@
 // Type imports
 import { JsonViz } from '../types/FormatJsonViz';
-import { Coordinate } from '../types/CoordinatesSize';
-import { Network } from '@metabohub/viz-core/src/types/Network';
-import type { Node } from "@metabohub/viz-core/src/types/Node";
+import { Network } from  "../types/TypeVizCore";
 import { NetworkLayout } from '../types/NetworkLayout';
 import { SubgraphNetwork } from '../types/SubgraphNetwork';
+import { TypeSubgraph } from '../types/Subgraph';
+
 
 // Composable imports
 import { assignRankOrder } from './CalculateStartNodes';
-import { getSizeNodePixel } from './CalculateSize';
 
-// General imports
-// import cytoscape, { ElementDefinition } from 'cytoscape';
-// import  dagre  from 'dagrejs/dist/dagre.js';
-import { type } from 'os';
-import { TypeSubgraph } from '../types/Subgraph';
+
 
 /**
  * This file contains functions to get or update a network from another format.
@@ -22,9 +17,6 @@ import { TypeSubgraph } from '../types/Subgraph';
  * -> networkLayoutToNetwork :
  *      Convert a network layout object (network with information to calculate layout) into a network object
  * 
- * -> changeNetworkFromDagre :
- *      Take dagre.graphlib.Graph object and the network associated (with the graph) : change the position and metadata (rank and order) of network's node by the one of the graph.
- * 
  * -> changeNetworkFromViz :
  *      Take a json of a viz graph and the network associated (with the json) : change the position and metadata (rank and order) of network's node by the one of the json.
  * 
@@ -53,33 +45,6 @@ export function networkLayoutToNetwork(networkLayout: NetworkLayout): Network {
 }
 
 
-// /**
-//  * Take dagre.graphlib.Graph object and the network associated (with the graph) : change the position and metadata (rank and order) of network's node by the one of the graph.
-//  * The graph and network need to have the same nodes !
-//  * @param {dagre.graphlib.Graph}  dagre.graphlib.Graph object 
-//  * @param {Network} Network object (value of pointer)
-//  */
-// export async function changeNetworkFromDagre(graph: dagre.graphlib.Graph,network: NetworkLayout): Promise<void>{
-//     Object.entries(graph["_nodes"]).forEach(([node, nodeData]:[string, dagre.graphlib.Node]) => {
-//         if (!network.nodes[node].metadataLayout) {
-//             network.nodes[node].metadataLayout = {};
-//         }
-//         const { x, y, _order,_rank  } = nodeData;
-//         // if there is some position x and y : network is updated
-//         if (x !== undefined && y !== undefined){
-//             if (network.nodes[node]) {
-//                 network.nodes[node].x = x;
-//                 network.nodes[node].y = y;
-//             } else {
-//                 throw new Error(`Node '${node}' not found in the network.`);
-//             }
-//             network.nodes[node].metadataLayout.order = _order;
-//             network.nodes[node].metadataLayout.rank = _rank / 2; // because rank 0 is 0, and the next is 2, 4, ...
-//         }
-//     });
-// }
-
-
 /**
  * Take a json of a viz graph and the network associated (with the json) : change the position and metadata (rank and order) of network's node by the one of the json.
  * The json and network need to have the same nodes !
@@ -129,24 +94,5 @@ export async function changeNetworkFromViz(json: JsonViz, subgraphNetwork: Subgr
 }
 
 
-// /**
-//  * Updates the positions of nodes in the network based on the provided Cytoscape JSON.
-//  * 
-//  * @param jsonCytoscape - The Cytoscape JSON containing the elements and their positions.
-//  * @param network - The network to update.
-//  */
-// export function changeNetworkFromCytoscape(jsonCytoscape: {elements:  { nodes:ElementDefinition[] } }, network:Network) : void {
-
-//     jsonCytoscape.elements.nodes.forEach((node: any) => {
-//         const idNode= node.data.id;
-//         if (Object.keys(network.nodes).includes(idNode)) {
-//             network.nodes[idNode].x = node.position.x;
-//             network.nodes[idNode].y = node.position.y;
-//         }else{
-//             throw new Error(`Node '${idNode}' not found in the network.`);
-//         }
-//     });
-// }
-
 
 
diff --git a/src/composables/GetSetAttributsNodes.ts b/src/composables/GetSetAttributsNodes.ts
index 711f6d37c5a53f08b87b3335b5181e855008575f..0b94c7944cce3c35dbbf65e1cad4e3fe44787fbe 100644
--- a/src/composables/GetSetAttributsNodes.ts
+++ b/src/composables/GetSetAttributsNodes.ts
@@ -1,8 +1,6 @@
 // Type imports
 import { TypeSubgraph } from "../types/Subgraph";
-import { Node } from "@metabohub/viz-core/src/types/Node";
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Link } from "@metabohub/viz-core/src/types/Link";
+import { Node, Network, Link } from  "../types/TypeVizCore";
 import { NetworkLayout } from "../types/NetworkLayout";
 
 /**
@@ -28,9 +26,6 @@ import { NetworkLayout } from "../types/NetworkLayout";
  * *********************************
  * 2. Reversible
  * 
- * -> addMetadataReversibleWithClass :
- *         Adds the reversible attribute to the given node in the network.
- * 
  * -> addReversibleNetwork :
  *       Adds the reversible attribute to the given node in the network.
  * 
@@ -53,6 +48,8 @@ import { NetworkLayout } from "../types/NetworkLayout";
  * *********************************
  * 3.  Cycle
  * 
+ * -> inCycle :
+ *     Checks if a node is part of a cycle in the network.
  * 
  */
 
@@ -111,22 +108,9 @@ export function isDuplicate(network:Network,nodeID:string):boolean{
 //___________________________________________________2.  Reversible __________________________________________________________________________
 
 export const classReversible="reversible";
-export const reversibleAttribute="reversible";
+export const reversibleAttribute="isReversible";
 export const reactionClass="reaction";
 
-/**
- * Checks if a node in the network is reversible by checking its classes.
- * => done for my type of file, not necessaty if reversible information already in the metadata
- * @param network - The network object.
- */
-export async function addMetadataReversibleWithClass(network:Network):Promise<void>{
-    Object.values(network.nodes).forEach((node) => {
-      if(node.classes && node.classes.includes(classReversible)){
-        addReversibleNetwork(network,node.id);
-      }
-    });
-  }
-
 
 /**
  * Adds the reversible attribute to the given node in the network.
diff --git a/src/composables/LayoutDrawCycle.ts b/src/composables/LayoutDrawCycle.ts
index 94e8ac65d2e67077bc123faa471259f0f6ef6fee..958977730ddc2bc18b981de473a17929d730eb75 100644
--- a/src/composables/LayoutDrawCycle.ts
+++ b/src/composables/LayoutDrawCycle.ts
@@ -1,10 +1,7 @@
 // Type imports
 import { Subgraph, TypeSubgraph } from "../types/Subgraph";
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
-import { Link } from "@metabohub/viz-core/src/types/Link";
-import { Node } from "@metabohub/viz-core/src/types/Node";
+import { Network ,GraphStyleProperties} from "../types/TypeVizCore";
 import { Coordinate, CoordinateNull } from "../types/CoordinatesSize";
 import { NodeLayout } from "../types/NetworkLayout";
 
@@ -18,11 +15,8 @@ import { updateNodeMetadataSubgraph } from "./SubgraphForSubgraphNetwork";
 
 
 // General imports
-import { group } from "console";
-import { start } from "repl";
 import * as d3 from 'd3';
-import { link } from "fs";
-import { emit } from "process";
+
 
 /**
  * This file contains functions to calculate the coordinates of nodes to draw them as circle.
@@ -76,6 +70,12 @@ import { emit } from "process";
  * 
  * 2. Utilitary functions for cycle coordinate
  * 
+ * -> scoreSortingCycleForDrawing :
+ *     calculate score for sorting function to know order of cycle drawing.
+ * 
+ * -> calculateAllScoresForSubgraphs :
+ *      Calculate the scores for all subgraphs in the network.
+ * 
  * -> sortingCycleForDrawing :
  *      Sorting function for knowing order of cycle drawing. 
  * 
@@ -146,9 +146,9 @@ export async function coordinateAllCycles(subgraphNetwork:SubgraphNetwork,allowI
         const parentCycles = cycles.filter(cycle => !cycle.parentSubgraph || cycle.parentSubgraph.type !== TypeSubgraph.CYCLE);
         if (parentCycles.length === 0) throw new Error("No cycle found without a parent subgraph of type cycle : review implementation");
             
-        parentCycles.sort( (a, b) => sortingCycleForDrawing(subgraphNetwork,a,b,true));
+        const scores = await calculateAllScoresForSubgraphs(subgraphNetwork, parentCycles, true);
+        parentCycles.sort( (a, b) => sortingCycleForDrawing(scores[a.name],scores[b.name],true));
         const largestParentCycle = parentCycles[0]; // get largest cycle
-
         cycleGroups[groupName].nodes.push(largestParentCycle.name); // add it to the current group of cycle
         await coordinateCycle(subgraphNetwork, largestParentCycle.name,groupName); // give coordinate for largest cycle
 
@@ -173,7 +173,8 @@ export async function coordinateAllCycles(subgraphNetwork:SubgraphNetwork,allowI
         while (remainingCycles.length > 0 ) {
 
             // sort cycles by number of fixed node (and then by size)
-            remainingCycles.sort((a, b) => sortingCycleForDrawing(subgraphNetwork,a,b,newGroup));
+            const scores = await calculateAllScoresForSubgraphs(subgraphNetwork, remainingCycles, newGroup);
+            remainingCycles.sort( (a, b) => sortingCycleForDrawing(scores[a.name],scores[b.name],newGroup));
 
             const cycleToDraw = remainingCycles[0]; // the cycle with the most fixed nodes (or constraints)
             // if groupcycle do not exist : add one
@@ -254,7 +255,6 @@ async function coordinateCycle(subgraphNetwork:SubgraphNetwork, cycleToDrawID:st
         
             
     } else { // several node in common with other cycle(s) ----------------------------------------------------------------------------------
-
         subgraphNetwork= await lineCycleCoordinates(subgraphNetwork,cycleToDrawID,groupCycleName);
     }
 
@@ -307,16 +307,19 @@ async function independentCycleCoordinates(subgraphNetwork:SubgraphNetwork,cycle
  */
 async function tangentCycleCoordinates(subgraphNetwork:SubgraphNetwork,cycleToDrawID:string,groupCycleName:string,nodeFixed:NodeLayout,nodesPlaced:string[],allowInterncircle:boolean=false):Promise<SubgraphNetwork>{
     const network = subgraphNetwork.network;
+
+    // if cycle to draw not in object or fixed nodes lack information : throw error
     if (!subgraphNetwork[TypeSubgraph.CYCLE] || !subgraphNetwork[TypeSubgraph.CYCLE][cycleToDrawID]) throw new Error("cycle not in subgraphNetwork");
     const cycleNodes=subgraphNetwork.cycles[cycleToDrawID].nodes;
+    if (!nodeFixed.metadataLayout || !nodeFixed.metadataLayout.fixedInCircle) throw new Error("fixed node for tangent drawing not in a circle");
+
 
     // get fixed node coordinates (in the group cycle)
-    if (!nodeFixed.metadataLayout || !nodeFixed.metadataLayout[TypeSubgraph.CYCLEGROUP]) throw new Error("node not a group cycle");
-    const groupCycleFixed=nodeFixed.metadataLayout[TypeSubgraph.CYCLEGROUP];
-    if (!subgraphNetwork[TypeSubgraph.CYCLEGROUP] || !subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleFixed] ||
-         !subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleFixed].precalculatedNodesPosition || 
-         !subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleFixed].precalculatedNodesPosition[nodeFixed.id]) throw new Error("fixed node not in group cycle, or no precalculated position");
-    const getCoordNodeFixed=subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleFixed].precalculatedNodesPosition[nodeFixed.id];
+    if (!subgraphNetwork[TypeSubgraph.CYCLEGROUP] || !subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleName] ||
+         !subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleName].precalculatedNodesPosition || 
+         !subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleName].precalculatedNodesPosition[nodeFixed.id]) throw new Error("fixed node not in group cycle, or no precalculated position");
+    const getCoordNodeFixed=subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleName].precalculatedNodesPosition[nodeFixed.id];
+    
     if (getCoordNodeFixed.x==null || getCoordNodeFixed.y==null) throw new Error("fixed node position not defined");
     const coordNodeFixed={x:getCoordNodeFixed.x,y:getCoordNodeFixed.y};
 
@@ -330,8 +333,7 @@ async function tangentCycleCoordinates(subgraphNetwork:SubgraphNetwork,cycleToDr
     subgraphNetwork[TypeSubgraph.CYCLE][cycleToDrawID].radiusCycle=radius;
 
     //centroid depending on fixed cycle
-    if (!nodeFixed.metadataLayout.fixedInCircle) throw new Error("fixed node for tangent drawing not in a circle");
-    const circleAlreadyDrawn=nodeFixed.metadataLayout.fixedInCircle as string;
+    const circleAlreadyDrawn=nodeFixed.metadataLayout.fixedInCircle;
     if (!subgraphNetwork[TypeSubgraph.CYCLE] || !subgraphNetwork[TypeSubgraph.CYCLE][circleAlreadyDrawn]) throw new Error("fixed node for tangent drawing not in a circle");
 
     const radiusFixedCycle=subgraphNetwork[TypeSubgraph.CYCLE][circleAlreadyDrawn].radiusCycle;
@@ -354,6 +356,8 @@ async function tangentCycleCoordinates(subgraphNetwork:SubgraphNetwork,cycleToDr
     }
     centroidX = centroidFixedCycle.x + d * Math.cos(fixedAngle);
     centroidY = centroidFixedCycle.y + d * Math.sin(fixedAngle);
+    centroidX=Number(centroidX.toFixed(2));
+    centroidY=Number(centroidY.toFixed(2));
     subgraphNetwork[TypeSubgraph.CYCLE][cycleToDrawID].centroidCycle={x:centroidX,y:centroidY};
     
 
@@ -394,7 +398,7 @@ async function lineCycleCoordinates(subgraphNetwork:SubgraphNetwork,cycleToDrawI
 
     let cycleAsLine:string[]=[];
 
-    unfixedInterval.forEach(async interval=>{
+    for (const interval of unfixedInterval){
         const startNode=cycleNodes[(interval[0]-1+ cycleNodes.length) % cycleNodes.length];
         const endNode=cycleNodes[(interval[1]+1+ cycleNodes.length) % cycleNodes.length];
 
@@ -416,7 +420,7 @@ async function lineCycleCoordinates(subgraphNetwork:SubgraphNetwork,cycleToDrawI
         subgraphNetwork=lineCoord.subgraphNetwork;
         const positionBefore=lineCoord.positionBefore;
         subgraphNetwork=undoIfCreateOverlap(subgraphNetwork,groupCycleName,positionBefore);
-    });
+    };
     return subgraphNetwork;
 }
 
@@ -444,9 +448,11 @@ async function cycleNodesCoordinates(cycleName:string,cycle:string[],centroidX:n
         const nodeNetwork=network.nodes[node];
         // coordinates of the node
         // positive shift angle rotate cycle to the right, negative to the left
-        const x = centroidX + radius * Math.cos(2 * Math.PI * i / cycle.length + shiftAngle );
-        const y = centroidY + radius * Math.sin(2 * Math.PI * i / cycle.length  + shiftAngle );
-        
+        let x = centroidX + radius * Math.cos(2 * Math.PI * i / cycle.length + shiftAngle );
+        let y = centroidY + radius * Math.sin(2 * Math.PI * i / cycle.length  + shiftAngle );
+        x=Number(x.toFixed(2));
+        y=Number(y.toFixed(2));
+
         // Give position if not fixed in circle
         if(!nodeNetwork.metadataLayout || !nodeNetwork.metadataLayout.fixedInCircle){
 
@@ -456,9 +462,9 @@ async function cycleNodesCoordinates(cycleName:string,cycle:string[],centroidX:n
             positionBefore[node]=assignedCoordinates.positionBefore;
 
             // Fix the nodes 
-            if (!nodeNetwork.metadata) nodeNetwork.metadata={};
-            nodeNetwork.metadata.fixedInCycle= true;
-            nodeNetwork.metadata.fixedCycle= cycleName;
+            if (!nodeNetwork.metadataLayout) nodeNetwork.metadataLayout={};
+            nodeNetwork.metadataLayout.isFixed= true;
+            nodeNetwork.metadataLayout.fixedInCircle= cycleName;
         }
         
     });
@@ -500,8 +506,10 @@ async function lineNodesCoordinates(start: {x: number, y: number}, end: {x: numb
 
         // coordinates of the node
         let d = nodeDistance * (i + 1);
-        const x= start.x + ux * d;
-        const y = start.y + uy * d;
+        let x= start.x + ux * d;
+        let y = start.y + uy * d;
+        x=Number(x.toFixed(2));
+        y=Number(y.toFixed(2));
         
         // assign coordinates to the node, and get the position before
         const assignedCoordinates= assignCoordinateToNode(subgraphNetwork,node,x,y,groupCycleName);
@@ -533,8 +541,8 @@ async function forceGroupCycle(subgraphNetwork:SubgraphNetwork, groupCycleName:s
 
     // get subgraph for groupCycle
     const graph =getListNodeLinksForCycleGroupAsArray(subgraphNetwork,groupCycleName,true);
-
     // need to apply force ?
+    if (!graph.nodes || graph.nodes.length===0) return subgraphNetwork;
     const nullNode= graph.nodes.filter(node=>node.fx==undefined || node.fy==undefined); // node not fixed (?)
     if (nullNode.length==0){
         return subgraphNetwork;
@@ -548,9 +556,6 @@ async function forceGroupCycle(subgraphNetwork:SubgraphNetwork, groupCycleName:s
     const simulation = d3.forceSimulation(graph.nodes)
     .force('link', d3.forceLink().id((d: any) => {return d.id;}).links(graph.links).distance(distanceLinks).strength(0.3))
     .force('charge', d3.forceManyBody().strength(strengthManyBody))
-    //.force("collide", d3.forceCollide(distanceLinks/2))
-    //.force('center', d3.forceCenter(0,0))
-    //.force("radial", d3.forceRadial(0,0))
     .alphaMin(0.4)
     .stop();
     
@@ -565,8 +570,10 @@ async function forceGroupCycle(subgraphNetwork:SubgraphNetwork, groupCycleName:s
     // get the new position of the nodes
     graph.nodes.forEach(node => {
         if(node.x!==undefined && isFinite(node.x) && node.y!==undefined && isFinite(node.y)){
+            // update x,y if not fixed
             precalculatedNodesPosition[node.id] = { x: node.x, y: node.y };
-        }else{
+        }else if (node.fx==undefined && node.fy==undefined) {
+            // if no x,y and not fixed : problem
             throw new Error("error in node coordinates after force layout");
         }
     });
@@ -595,7 +602,7 @@ async function findTopCycleNode(subgraphNetwork: SubgraphNetwork, cycleNodes:str
 
     // find node with the highest parent (smaller y)
         // get parent nodes of the cycle
-    const cycleNodesParent =  parentNodeNotInCycle(subgraphNetwork, cycleNodes);
+    const cycleNodesParent =  await parentNodeNotInCycle(subgraphNetwork, cycleNodes);
         // get the one with highest parent
     const indexAssociatedMinY= await getIndexNodesAssociatedMinY(subgraphNetwork, cycleNodesParent)
     const withHighestParent= indexAssociatedMinY.map(i=>cycleNodes[i]);
@@ -622,12 +629,10 @@ async function findTopCycleNode(subgraphNetwork: SubgraphNetwork, cycleNodes:str
         let bottomNode:number;
         // find node with the lowest child (bigger y)
             // get child nodes of the cycle
-        const cycleNodesChild =  childNodeNotInCycle(subgraphNetwork, cycleNodes);
-        
+        const cycleNodesChild =  await childNodeNotInCycle(subgraphNetwork, cycleNodes);
             // get the one with lowest child
         const indexAssociatedMaxY=await getIndexNodesAssociatedMaxY(subgraphNetwork, cycleNodesChild)
         const withLowestChild = indexAssociatedMaxY.map(i=>cycleNodes[i]); 
-
         if (withLowestChild.length>=1){
             if(withLowestChild.length==1){
                 bottomNode=cycleNodes.indexOf(withLowestChild[0]);
@@ -655,7 +660,7 @@ async function findTopCycleNode(subgraphNetwork: SubgraphNetwork, cycleNodes:str
  * 
  * @param subgraphNetwork - The subgraph network object.
  * @param associatedListNodes - The list of list of nodes.
- * @returns An array of indices representing lists containing minimum y-coordinate nodes.
+ * @returns An array of indices representing nodes containing minimum y-coordinate nodes.
  */
 async function getIndexNodesAssociatedMinY(subgraphNetwork: SubgraphNetwork, associatedListNodes: string[][]): Promise<number[]> {
     const network=subgraphNetwork.network;
@@ -683,7 +688,7 @@ async function getIndexNodesAssociatedMinY(subgraphNetwork: SubgraphNetwork, ass
  * 
  * @param subgraphNetwork - The subgraph network object.
  * @param associatedListNodes - The list of list of nodes.
- * @returns An array of indices representing lists containing maximum y-coordinate nodes.
+ * @returns An array of indices representing nodes containing maximum y-coordinate nodes.
  */
 async function getIndexNodesAssociatedMaxY(subgraphNetwork: SubgraphNetwork, associatedListNodes: string[][]): Promise<number[]> {
     const network=subgraphNetwork.network;
@@ -733,47 +738,103 @@ async function nodeMedianX(subgraphNetwork: SubgraphNetwork, listNodes: string[]
 /*******************************************************************************************************************************************************/
 //___________________________________________________2. Utilitary functions for cycle coordinate ________________________________________________________________
 
+/**
+ * Score a subgraph for sorting.
+ * First get number of circle fixed nodes (nodes fixed in a circle drawing), then size,
+ * then if full counstraint is true : number of parent nodes (of the cycle), and finally number of child nodes (of the cycle).
+ * @param subgraphNetwork - The subgraph network.
+ * @param subgraph - The first cycle to compare.
+ * @param fullConstraint - A flag indicating whether to consider the full constraint (default is false).
+ * @returns The different value calculated.
+ */
+ async function scoreSortingCycleForDrawing(subgraphNetwork:SubgraphNetwork,subgraph:Subgraph,fullConstraint:boolean=false):Promise<{fixedNodes:number,size:number,numberParent?:number,numberChild?:number}>{
+    const network=subgraphNetwork.network;
+    
+    if (subgraph.nodes.length===0) throw new Error("no node in cycle");
+
+    // number of fixed nodes
+    const fixedNodesA = subgraph.nodes.filter(node => network.nodes[node] && network.nodes[node].metadataLayout && network.nodes[node].metadataLayout.fixedInCircle).length;
+    // size
+    const size= subgraph.nodes.length;
+
+    if (fullConstraint){
+        const numberParent =  (await parentNodeNotInCycle(subgraphNetwork, subgraph.nodes)).flat().length;
+        const numberChild = (await childNodeNotInCycle(subgraphNetwork, subgraph.nodes)).flat().length;
+        return {fixedNodes:fixedNodesA,size:size,numberParent:numberParent,numberChild:numberChild};
+    }else{
+        return {fixedNodes:fixedNodesA,size:size};
+    }                     
+}
+
+/**
+ * Calculates scores for all subgraphs in the given subgraphNetwork.
+ *
+ * @param subgraphNetwork - The network of subgraphs to calculate scores for.
+ * @param subgraphs - An array of subgraphs to calculate scores for.
+ * @param fullConstraint - A boolean indicating whether to apply full constraints during score calculation. Defaults to false.
+ * @returns A promise that resolves to an object where each key is a subgraph name and the value is an object containing:
+ *   - `fixedNodes`: The number of fixed nodes in the subgraph.
+ *   - `size`: The size of the subgraph.
+ *   - `numberParent` (if fullConstraint): The number of parent nodes in the subgraph.
+ *   - `numberChild` (if fullConstraint): The number of child nodes in the subgraph.
+ */
+async function calculateAllScoresForSubgraphs(
+    subgraphNetwork: SubgraphNetwork, 
+    subgraphs: Array<Subgraph>, 
+    fullConstraint: boolean = false
+): Promise<{ [key: string]: { fixedNodes: number, size: number, numberParent?: number, numberChild?: number } }> {
+
+    const scores = await Promise.all(subgraphs.map(async (subgraph: Subgraph) => {
+        const score = await scoreSortingCycleForDrawing(subgraphNetwork, subgraph, fullConstraint);
+        return { [subgraph.name]: score }; 
+    }));
+    
+    return scores.reduce((acc, score) => ({ ...acc, ...score }), {});
+}
+
 /**
  * Sorting function for knowing order of cycle drawing. 
  * First sort by number of circle fixed nodes (nodes fixed in a circle drawing), then by size,
  * then if full counstraint is true : by number of parent nodes (of the cycle), and finally by number of child nodes (of the cycle).
- * @param subgraphNetwork - The subgraph network.
  * @param a - The first cycle to compare.
  * @param b - The second cycle to compare.
  * @param fullConstraint - A flag indicating whether to consider the full constraint (default is false).
  * @returns A number indicating the sorting order.
  */
- function sortingCycleForDrawing(subgraphNetwork:SubgraphNetwork,a:Subgraph,b:Subgraph,fullConstraint:boolean=false):number{
-    const network=subgraphNetwork.network;
-
-    // first sort by number of fixed nodes
-    const fixedNodesA = a.nodes.filter(node => network.nodes[node].metadataLayout && network.nodes[node].metadataLayout.fixedInCircle).length;
-    const fixedNodesB = b.nodes.filter(node => network.nodes[node].metadataLayout && network.nodes[node].metadataLayout.fixedInCircle).length;
-    if (fixedNodesA !== fixedNodesB){
-        return fixedNodesB - fixedNodesA;
-    }else{
-        // sort by size
-        if ( !fullConstraint || b.nodes.length !== a.nodes.length ){
-            return b.nodes.length - a.nodes.length;
-        }else{
-            // then by number of parent nodes
-            const totalParentNodesA =  parentNodeNotInCycle(subgraphNetwork, a.nodes)
-                .flat().length;
-            const totalParentNodesB =  parentNodeNotInCycle(subgraphNetwork, b.nodes)
-                .flat().length;
-            if (totalParentNodesA !== totalParentNodesB){
-                return totalParentNodesB - totalParentNodesA;
-            }else{
-                // then by number of child nodes
-                const totalChildNodesA =  childNodeNotInCycle(subgraphNetwork, a.nodes)
-                    .flat().length;
-                const totalChildNodesB =  childNodeNotInCycle(subgraphNetwork, b.nodes)
-                    .flat().length;
-               
-                return totalChildNodesB - totalChildNodesA;
+function sortingCycleForDrawing(aScore:{fixedNodes:number,size:number,numberParent?:number,numberChild?:number},
+    bScore:{fixedNodes:number,size:number,numberParent?:number,numberChild?:number},
+    fullConstraint:boolean=false):number{
+        if (!aScore || !bScore) {
+            throw new Error("score of subgraph cycle group must be defined");
+        }
+    
+        // fixedNodes
+        if (aScore.fixedNodes !== bScore.fixedNodes) {
+            return bScore.fixedNodes - aScore.fixedNodes;
+        }
+    
+        //size
+        if ( !fullConstraint || aScore.size !== bScore.size) {
+            return bScore.size - aScore.size;
+        }
+    
+        // if fullConstraint 
+        if (fullConstraint) {
+            // numberParent
+            if (aScore.numberParent==undefined || bScore.numberParent==undefined)  throw new Error("numberParent must be defined if full constraint is true");
+            if (aScore.numberParent !== bScore.numberParent) {
+                return (bScore.numberParent || 0) - (aScore.numberParent || 0);
             }
-        }                   
-    }
+    
+            // numberChild
+            if (aScore.numberChild==undefined || bScore.numberChild==undefined)  throw new Error("numberChild must be defined if full constraint is true");
+            if (aScore.numberChild !== bScore.numberChild) {
+                return (bScore.numberChild || 0) - (aScore.numberChild || 0);
+            }
+        }
+    
+        return 0;
+
 }
 
 
@@ -816,10 +877,9 @@ function addNewCycleGroup(subgraphNetwork:SubgraphNetwork, groupName:string):Sub
 async function updateGroupCycles(remainingCycles: Subgraph[], subgraphNetwork: SubgraphNetwork, group: number, groupCycleName: string): Promise<{subgraphNetwork: SubgraphNetwork, group: number}> {
     if (! subgraphNetwork[TypeSubgraph.CYCLEGROUP] || ! subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleName]) throw new Error("Group cycle not in subgraphNetwork");
     const cycleGroup=subgraphNetwork[TypeSubgraph.CYCLEGROUP][groupCycleName];
-
     // check if group cycle is drawn, that is, no fixed nodes for other cycles (other cycle independant)
     const groupCycleIsDraw = isRemainingCycleIndepOfDrawing(remainingCycles, subgraphNetwork);
-
+    
     if (groupCycleIsDraw && cycleGroup.precalculatedNodesPosition) {
         
         // force algo for node that have null position
@@ -855,11 +915,11 @@ function isRemainingCycleIndepOfDrawing(remainingCycles:Subgraph[], subgraphNetw
 
     const network = subgraphNetwork.network;
 
-    if (remainingCycles.every(cycle => 
-        cycle.nodes.every(node => 
-            !network.nodes[node].metadataLayout || !network.nodes[node].metadataLayout.isFixed
-        )
-    )) {
+    const isAllNodeUnfixed=remainingCycles.every(
+        cycle => (
+        cycle.nodes.every(node =>  !network.nodes[node].metadataLayout || !network.nodes[node].metadataLayout.isFixed)
+    ));
+    if (isAllNodeUnfixed) {
         //  All nodes in all remaining cycles are unfixed
         return true;
     } else {
@@ -878,7 +938,8 @@ function isRemainingCycleIndepOfDrawing(remainingCycles:Subgraph[], subgraphNetw
 async function getRadiusSize(cycle:string[],network:Network,styleNetwork:GraphStyleProperties):Promise<number>{
     const nodes=Object.values(network.nodes).filter(node=>cycle.includes(node.id));
     const meanSize=await getMeanNodesSizePixel(nodes,styleNetwork);
-    return cycle.length*(meanSize.height+meanSize.width)/2;
+    const radius= cycle.length*(meanSize.height+meanSize.width)/2;
+    return Number(radius.toFixed(2));
 }
 
 
@@ -958,9 +1019,8 @@ function undoIfCreateOverlap(subgraphNetwork:SubgraphNetwork,groupCycleName:stri
             if (!groupCycle.precalculatedNodesPosition) groupCycle.precalculatedNodesPosition={};
             const xBefore=positionBefore[nodeID].x;
             const yBefore=positionBefore[nodeID].y;
-
             if (!groupCycle.precalculatedNodesPosition[nodeID]){
-                groupCycle.precalculatedNodesPosition[nodeID]={x:xBefore,y:yBefore};
+                throw new Error("node supposed to have precalculated position in group cycle, because cause overlap");
             } else {
                 const node=groupCycle.precalculatedNodesPosition[nodeID];
                 node.x = xBefore;
@@ -1022,7 +1082,7 @@ async function getUnfixedIntervals(nodes:string[],subgraphNetwork:SubgraphNetwor
     const network=subgraphNetwork.network;
     nodes.forEach((nodeID,i) => {
         const node=network.nodes[nodeID];
-        if (node.metadataLayout && !node.metadataLayout.fixedInCircle) {
+        if (!node.metadataLayout || !node.metadataLayout.fixedInCircle) {
             if (start === null) {
                 start = i;
             }
@@ -1099,500 +1159,3 @@ function drawCycleGroup(cycleGroup:string,subgraphNetwork:SubgraphNetwork):void{
     }
 }
 
-
-// ________________________Method 2________________________________________________________
-
-// export function coordinateAllCycles(subgraphNetwork:SubgraphNetwork):Promise<SubgraphNetwork>{
-//     return new Promise((resolve) => {
-//         // creation of group cycle and placement of first cycle
-//         subgraphNetwork=firstStepGroupCycles(subgraphNetwork);
-//         // if there are group cycle : continue to place the other cycles
-//         if (subgraphNetwork.cyclesGroup && Object.keys(subgraphNetwork.cyclesGroup).length>0){
-//             Promise.all(
-//                 Object.keys(subgraphNetwork.cyclesGroup).map(groupCycleName => { 
-//                     forceGroupCycle(subgraphNetwork, groupCycleName)
-//                 })
-//             ).then(() => {
-//                 subgraphNetwork=getSizeAllGroupCycles(subgraphNetwork);
-//                 resolve(subgraphNetwork);
-//             });
-//         }
-//     });
-// }
-
-// function firstStepGroupCycles(subgraphNetwork:SubgraphNetwork):SubgraphNetwork {
-//     let cycles = subgraphNetwork.cycles? Object.values(subgraphNetwork.cycles):undefined;
-//     let i=0;
-//     let group=-1;
-//     let groupName:string="";
-//     let newGroup=true;
-
-//     while (cycles && cycles.length > 0) {
-        
-//         if (newGroup){
-//             // if first cycle of a group cycle
-//             // creation of a new group cycle
-//             group+=1;
-//             groupName=cycleGroupName(String(group));
-//             subgraphNetwork=addNewCycleGroup(subgraphNetwork,groupName);
-//             // find biggest cycle, or the one with most constraint
-//                 // cycles that are not subgraph of a cycle
-//             const parentCycles = cycles.filter(cycle => !cycle.forSubgraph || cycle.forSubgraph.type !== TypeSubgraph.CYCLE);
-//             if (parentCycles.length === 0) {
-//                 console.error("No cycle found without a forSubgraph of type cycle");
-//                 return;
-//             }
-//             parentCycles.sort((a, b) => sortCycleSizeRelation(subgraphNetwork,a,b,true));
-//             const largestParentCycle = parentCycles[0];
-
-//             // add it to the group cycle and remove it from the list of cycle to process
-//             subgraphNetwork.cyclesGroup[groupName].nodes.push(largestParentCycle.name); 
-//             cycles = cycles.filter(cycle => cycle.name !== largestParentCycle.name);
-//             // give it coordinates      
-//             subgraphNetwork=coordinateCycle(subgraphNetwork, largestParentCycle.name,groupName,true); 
-
-//         }else{
-//             // if not first cycle of a group cycle
-//             // find all cycles with common nodes (fixed nodes)
-//             const dependantCyclesList=dependantCycles(cycles,subgraphNetwork);
-              
-//             dependantCyclesList.forEach(dependantCycle => {
-//                 // add them to the group cycle
-//                 subgraphNetwork.cyclesGroup[groupName].nodes.push(dependantCycle); 
-//                 // fix the nodes (to (0,0))
-//                 const nodes=subgraphNetwork.cycles[dependantCycle].nodes;
-//                 subgraphNetwork=coordinateCycle(subgraphNetwork, dependantCycle,groupName,false);
-//             });
-
-//             // remove them from the list of cycle to process
-//             cycles = cycles.filter(cycle => !dependantCyclesList.includes(cycle.name));
-            
-//         }
-
-//         // check all cycles of the group cycle are processed 
-//         newGroup=isRemainingCycleIndepOfDrawing(cycles, subgraphNetwork);
-
-//     }
-
-//     return subgraphNetwork;
-// }
-
-
-
-
-// function coordinateCycle(subgraphNetwork:SubgraphNetwork, cycleToDrawID:string,groupCycleName:string,asCircle:boolean=true):SubgraphNetwork{
-//     const network = subgraphNetwork.network.value;
-//     let centroidX :number=0;
-//     let centroidY :number=0;
-    
-//     // Get nodes to place
-//     let cycle:string[]=[];
-//     if (cycleToDrawID in subgraphNetwork.cycles){
-//         cycle=subgraphNetwork.cycles[cycleToDrawID].nodes;
-//         subgraphNetwork.cycles[cycleToDrawID].metadata={};
-//     }else{  
-//         console.log('cycle not in subgraph network');
-//     }
-
-//     // Check existence of all nodes
-//     const cycleExist = cycle.every(node => node in network.nodes);
-
-
-//     // If cycle exist: place his nodes
-//     if (cycleExist && cycle.length>0){
-
-//         // Update node metadata to place them in cycleGroup
-//         cycle.forEach(node=>{
-//             network.nodes[node].metadata[TypeSubgraph.CYCLEGROUP]=groupCycleName;
-//         });
-
-//         // if the cycle has to be drawn as a circle
-//         if (asCircle){
-//             // radius and centroid
-//             const radius = getRadiusSize(cycle,network,subgraphNetwork.networkStyle.value);
-//             subgraphNetwork.cycles[cycleToDrawID].metadata.radius=radius;   
-//             subgraphNetwork.cycles[cycleToDrawID].metadata.centroid={x:centroidX,y:centroidY};         
-         
-//             // Shift cycle 
-//             const topIndex = findTopCycleNode(subgraphNetwork,cycle); // first node of list is the top 
-//             const cycleCopy= cycle.slice();
-//             const shiftedCycle = cycleCopy.splice(topIndex).concat(cycleCopy);
-
-//             // Give position to each node
-//             subgraphNetwork=cycleNodesCoordinates(cycleToDrawID,shiftedCycle,centroidX,centroidY,radius,subgraphNetwork,-Math.PI/2,groupCycleName);
-//         } else {
-//             subgraphNetwork=fixedCycleNodesToOrigin(cycle,subgraphNetwork,groupCycleName);
-//         }
-//     }
-
-//     return subgraphNetwork;
-// }
-
-
-// function sortCycleSizeRelation(subgraphNetwork:SubgraphNetwork,a:Subgraph,b:Subgraph,byRelation:boolean=false):number{
-//     // sort by size
-//     if ( !byRelation || b.nodes.length !== a.nodes.length ){
-//         return b.nodes.length - a.nodes.length;
-//     }else{
-//         // then by number of parent nodes
-//         const totalParentNodesA = parentNodeNotInCycle(subgraphNetwork, a.nodes)
-//             .flat().length;
-//         const totalParentNodesB = parentNodeNotInCycle(subgraphNetwork, b.nodes)
-//             .flat().length;
-//         if (totalParentNodesA !== totalParentNodesB){
-//             return totalParentNodesB - totalParentNodesA;
-//         }else{
-//             // then by number of child nodes
-//             const totalChildNodesA = childNodeNotInCycle(subgraphNetwork, a.nodes)
-//                 .flat().length;
-//             const totalChildNodesB = childNodeNotInCycle(subgraphNetwork, b.nodes)
-//                 .flat().length;
-            
-//             return totalChildNodesB - totalChildNodesA;
-//         }
-//     }                   
-// }
-
-
-
-
-
-
-// function fixedCycleNodesToOrigin(cycle:string[],subgraphNetwork:SubgraphNetwork,groupcycle:string,):SubgraphNetwork{
-//     const network=subgraphNetwork.network.value;
-//     cycle.forEach((node) => {
-//         const nodeNetwork=network.nodes[node];        
-//         // Give position if not fixed
-//         if(network.nodes[node].metadata && !network.nodes[node].metadata.fixedCycle){
-//             if (groupcycle in subgraphNetwork.cyclesGroup){
-//                 if (!subgraphNetwork.cyclesGroup[groupcycle].metadata[node]){
-//                     subgraphNetwork.cyclesGroup[groupcycle].metadata[node] = {};
-//                 }
-//                 subgraphNetwork.cyclesGroup[groupcycle].metadata[node]["x"]=0;
-//                 subgraphNetwork.cyclesGroup[groupcycle].metadata[node]["y"]=0;
-
-//                 // Fix the nodes 
-//                 if (!nodeNetwork.metadata) nodeNetwork.metadata={};
-//                 nodeNetwork.metadata.fixedInCycle= true;
-//             } else {
-//                 console.error("CycleGroup not in subgraphNetwork");
-//             }
-//         } 
-//     });
-
-//     return subgraphNetwork;
-// }
-
-
-// function dependantCycles(remainingCycles:Subgraph[], subgraphNetwork:SubgraphNetwork):Array<string>{
-
-//     const network = subgraphNetwork.network.value;
-
-//     const fixedCycleIds =  remainingCycles.filter(cycle => 
-//         cycle.nodes.some(node => 
-//             network.nodes[node].metadata && network.nodes[node].metadata.fixedInCycle
-//         )
-//     ).map(cycle => cycle.name);
-
-//     return fixedCycleIds;
-// }
-
-
-// function centroidFromNodes(nodesList:string[],subgraphNetwork:SubgraphNetwork):{x:number,y:number}{
-//     if (nodesList.length>0){
-//         const network=subgraphNetwork.network.value;
-//         let centroid={x:0,y:0}
-//         nodesList.forEach(node=> {
-//             if ("x" in network.nodes[node] && "y" in network.nodes[node]){
-//                 centroid.x += network.nodes[node].x;
-//                 centroid.y += network.nodes[node].y;
-//             }    
-//         });
-//         return {x:centroid.x/nodesList.length,y:centroid.y/nodesList.length};
-//     }
-//     return {x:0,y:0};
-// }
-
-
-
-// function euclideanDistance(point1: {x: number, y: number}, point2: {x: number, y: number}): number {
-//     let dx = point2.x - point1.x;
-//     let dy = point2.y - point1.y;
-//     return Math.sqrt(dx * dx + dy * dy);
-// }
-
-
-// function totalIntervals(startArc: {x: number, y: number}, endArc: {x: number, y: number}, centroidArc: {x: number, y: number}, nodesInArc: number): number {
-//     // Calculate distances
-//     let a = euclideanDistance(startArc, endArc);
-//     let b = euclideanDistance(startArc, centroidArc);
-//     let c = euclideanDistance(endArc, centroidArc);
-
-//     // Calculate angle of arc using law of cosines
-//     let angle = Math.acos((b*b + c*c - a*a) / (2 * b * c));
-
-//     // Calculate total intervals in full circle
-//     let totalIntervals = Math.round(2 * Math.PI / angle) * nodesInArc;
-
-//     return totalIntervals;
-// }
-
-// function centroidOneFixedCycleNode(subgraphNetwork:SubgraphNetwork,nodeFixedID:string,radius:number):{x:number,y:number}{
-//     const nodeFixed=subgraphNetwork.network.value.nodes[nodeFixedID];
-//     const radiusFixedCycle=subgraphNetwork.cycles[nodeFixed.metadata.fixedCycle as string].metadata.radius as number;
-//     const centroidFixedCycle=subgraphNetwork.cycles[nodeFixed.metadata.fixedCycle as string].metadata.centroid;
-//     const fixedAngle = Math.atan2(nodeFixed.y - centroidFixedCycle["y"], nodeFixed.x - centroidFixedCycle["x"]);
-//     const d = radius + radiusFixedCycle; 
-//     const centroidX = centroidFixedCycle["x"] + d * Math.cos(fixedAngle);
-//     const centroidY = centroidFixedCycle["y"] + d * Math.sin(fixedAngle);
-//     return {x:centroidX,y:centroidY}
-// }
-
-
-
-// function pushFromIndepGroupCycles(subgraphNetwork:SubgraphNetwork, groupCyclesID:string[],allGroupCycleDrawn:string[][]):void{
-
-//     console.log('--------------------------------------------------------------------');
-//     // nodes in the group of cycle that won't move (others nodes will be pushed deprending on their positions)
-//     const nodesCycles = groupCyclesID
-//     .filter(cycleID => cycleID in subgraphNetwork.cycles) // Check if cycleID exists
-//     .flatMap(cycleID => subgraphNetwork.cycles[cycleID].nodes) // get all nodes from all cycles
-//     .reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []); // remove duplicates
-
-//     // centroid of the group
-//     const centroid = centroidFromNodes(nodesCycles,subgraphNetwork);
-
-//     const radius=subgraphNetwork.cycles[groupCyclesID[0]].metadata.radius as number; // TO CHANGE when several nodes 
-
-//     // get list of nodes to push : all but the cycle with its shortcut
-//     // and group of cycle already draw considered as a node
-//     const network = subgraphNetwork.network.value;
-//     const nodesNetwork = Object.keys(network.nodes).filter(node => !nodesCycles.includes(node));
-//     const nodesGroupCycleDrawn=allGroupCycleDrawn.flatMap(groupCycle=>groupCycle)
-//         .flatMap(cycleID=>subgraphNetwork.cycles[cycleID].nodes) // get all nodes from all cycles
-//         .reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []); // remove duplicates
-//     const nodesNotInDrawCycle=nodesNetwork.filter(node => !nodesGroupCycleDrawn.includes(node)); 
-//     let nodeToPush=nodesNotInDrawCycle.filter(node => !nodesGroupCycleDrawn.includes(node)); 
-//     allGroupCycleDrawn.forEach(groupCycle=>{
-//         nodeToPush.push(groupCycle[0]); // metanode of cycle group 
-//     });
-    
-    
-//     // Need to push ?
-
-//     const needPush=nodesInsideMetanode(groupCyclesID,nodesNetwork,subgraphNetwork);
-//     console.log(needPush);
-
-//     // push nodes
-
-//     if (needPush){
-//         nodeToPush.forEach(nodeID =>{
-            
-//             if (nodeID in subgraphNetwork.cycles){ // if in a cycle
-//                 // get connected cycle group 
-//                 const fullGroupCycle=allGroupCycleDrawn.filter(groupCycle=> groupCycle.includes(nodeID))[0];
-//                 const nodesAsMetanode=fullGroupCycle.flatMap(cycleID=>subgraphNetwork.cycles[cycleID].nodes)
-//                     .reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []); // remove duplicates
-//                 const metanodeCentroid=centroidFromNodes(nodesAsMetanode,subgraphNetwork);
-
-//                 const distanceCentroidToMetanode=euclideanDistance(centroid,metanodeCentroid);
-//                 const distanceToMoveCentroid=(distanceCentroidToMetanode/radius+1)*radius;
-//                 pushMetanode(nodesAsMetanode,centroid,distanceToMoveCentroid,subgraphNetwork);
-
-
-//             }else if (nodeID in network.nodes){ // if classic node
-
-//                 const distanceCentroidToNode=euclideanDistance(centroid,network.nodes[nodeID]);
-//                 const distanceToMove=(distanceCentroidToNode/radius+1)*radius;
-//                 pushMetanode([nodeID],centroid,distanceToMove,subgraphNetwork);
-
-//             }
-
-//         });
-//     }
-    
-// }
-
-// function pushMetanode(metanode:string[],centroidToPushfrom:{x:number,y:number},radius:number=1,subgraphNetwork:SubgraphNetwork):void{
-//     const network = subgraphNetwork.network.value;
-//     if (metanode.length===1){
-//         const node=network.nodes[metanode[0]];
-//         let dx = node.x - centroidToPushfrom.x;
-//         let dy = node.y - centroidToPushfrom.y;
-//         let angle = Math.atan2(dy, dx);
-//         node.x = centroidToPushfrom.x + radius * Math.cos(angle);
-//         node.y = centroidToPushfrom.y + radius * Math.sin(angle);
-//     }else{
-
-//         // MARCHE PAS
-
-//         // const centroidMetanode=centroidFromNodes(metanode,subgraphNetwork);
-//         // let dx = centroidMetanode.x - centroidToPushfrom.x;
-//         // let dy = centroidMetanode.y - centroidToPushfrom.y;
-//         // let angle = Math.atan2(dy, dx);
-//         // const newCentroid={x : centroidToPushfrom.x + radius * Math.cos(angle),
-//         //                     y : centroidToPushfrom.y + radius * Math.sin(angle)};
-
-//         // metanode.forEach(nodeID=>{
-//         //     const node=network.nodes[nodeID];
-//         //     node.x += newCentroid.x - centroidMetanode.x;
-//         //     node.y += newCentroid.y - centroidMetanode.y;
-//         // });
-//     } 
-// }
-
-// function nodesInsideMetanode(groupCyclesID:string[],nodeToCheck:string[],subgraphNetwork:SubgraphNetwork):boolean{
-
-
-//     const cycles=groupCyclesID.filter(cycleID => cycleID in subgraphNetwork.cycles && subgraphNetwork.cycles[cycleID].metadata 
-//         && "radius" in subgraphNetwork.cycles[cycleID].metadata && subgraphNetwork.cycles[cycleID].metadata.radius !== undefined
-//         && "centroid" in subgraphNetwork.cycles[cycleID].metadata &&  subgraphNetwork.cycles[cycleID].metadata.centroid 
-//         && subgraphNetwork.cycles[cycleID].metadata.centroid["x"] !== undefined
-//         && typeof subgraphNetwork.cycles[cycleID].metadata.centroid["y"] !== undefined
-//     ) 
-    
-//     let i=0;
-//     let flag=true;
-//     while (flag && i<cycles.length){
-//         flag=!nodesInsideCircle(cycles[i],nodeToCheck,subgraphNetwork);
-//         i++;
-//     }
-//     return !flag;
-// }
-
-// function nodesInsideCircle(cycleID:string,nodeToCheck:string[],subgraphNetwork:SubgraphNetwork):boolean{
-//     const centroid=subgraphNetwork.cycles[cycleID].metadata.centroid as {x:number,y:number};
-//     const radius=subgraphNetwork.cycles[cycleID].metadata.radius as number;
-
-
-//     let i=-1;
-//     let flag=true;
-//     while (flag && i<nodeToCheck.length){
-//         i++;
-//         if( nodeToCheck[i] && Object.keys(subgraphNetwork.network.value.nodes).includes(nodeToCheck[i]) ){
-            
-//             const node=subgraphNetwork.network.value.nodes[nodeToCheck[i]];
-//             const distance=euclideanDistance(node,centroid);
-//             if (distance<=radius){
-//                 flag=false;
-//             }
-            
-//         }else{
-//             //console.log('node '+nodeToCheck[i]+' not in network'); // PROBLEM !!!
-//         }
-        
-        
-//     }
-//     return !flag;
-// }
-
-
-
-// function drawCycle(subgraphNetwork:SubgraphNetwork,cycleToDrawID:string,radius:number|undefined=undefined,radiusFactor:number=15):void {
-
-//     console.log('drawing '+cycleToDrawID);
-    
-//     let cycle:string[]=[];
-//     let centroidX :number;
-//     let centroidY :number;
-//     if (!subgraphNetwork.cycles[cycleToDrawID].metadata)  subgraphNetwork.cycles[cycleToDrawID].metadata={};
-//     subgraphNetwork.cycles[cycleToDrawID].metadata["radius"]=undefined;
-//     subgraphNetwork.cycles[cycleToDrawID].metadata["centroid"]=undefined;
-    
-
-//     if (cycleToDrawID in subgraphNetwork.cycles){
-//         cycle=subgraphNetwork.cycles[cycleToDrawID].nodes;
-//     }else{  
-//         console.log('argument cycleToDraw invalid');
-//     }
-
-//     // Check if the node are present in the graph, and see if position is fixed in another cycle
-//     const network = subgraphNetwork.network.value;
-//     let cycleExist = true;
-//     const nodesFixed:string[]=[];
-//     cycle.forEach(node=>{
-//         if (!(node in network.nodes)){
-//             cycleExist=false;
-//         } else if (network.nodes[node].metadata && network.nodes[node].metadata.fixedInCycle){
-//             nodesFixed.push(node);
-//         }
-//     });
-
-
-//     if (cycleExist && cycle.length>0){
-
-//         if (nodesFixed.length===0){ // if independant cycle ----------------------------------------------------------------------------------
-
-//             // radius
-//             if (radius === undefined){
-//                 radius = getRadiusSize(cycle,radiusFactor);
-//             }
-//             subgraphNetwork.cycles[cycleToDrawID].metadata.radius=radius;
-
-//             // centroid
-//             if (subgraphNetwork.cycles[cycleToDrawID].metadata && subgraphNetwork.cycles[cycleToDrawID].metadata["x"] && subgraphNetwork.cycles[cycleToDrawID].metadata["y"]){
-//                 centroidX=subgraphNetwork.cycles[cycleToDrawID].metadata["x"] as number;
-//                 centroidY=subgraphNetwork.cycles[cycleToDrawID].metadata["y"] as number;
-//             }else {
-//                 const centroid=centroidFromNodes(cycle,subgraphNetwork);
-//                 centroidX=centroid.x;
-//                 centroidY=centroid.y;
-//             }
-//             subgraphNetwork.cycles[cycleToDrawID].metadata.centroid={x:centroidX,y:centroidY};
-
-            
-//             // Shift cycle 
-//             const topIndex = findTopCycleNode(subgraphNetwork,cycle); // first node of list is the top 
-
-//             const cycleCopy= cycle.slice();
-//             const shiftedCycle = cycleCopy.splice(topIndex).concat(cycleCopy);
-
-//             // Give position to each node
-//             cycleNodesCoordinates(cycleToDrawID,shiftedCycle,centroidX,centroidY,radius,subgraphNetwork,-Math.PI/2);
-
-//         } else if (nodesFixed.length===1){ // if cycle linked to another cycle by one node ----------------------------------------------------------------------------------
-//             const nodeFixed=network.nodes[nodesFixed[0]];
-
-//              // first node is the one fixed :
-//              const cycleCopy= cycle.slice();
-//              const firstIndex=cycle.indexOf(nodesFixed[0]);
-//              const shiftedCycle = cycleCopy.splice(firstIndex).concat(cycleCopy);
-
-//             // radius
-//             if (radius === undefined){
-//                 radius = getRadiusSize(cycle,radiusFactor);
-//             }
-//             subgraphNetwork.cycles[cycleToDrawID].metadata.radius=radius;
-
-//             //centroid depending on fixed cycle
-//             const radiusFixedCycle=subgraphNetwork.cycles[nodeFixed.metadata.fixedCycle as string].metadata.radius as number;
-//             const centroidFixedCycle=subgraphNetwork.cycles[nodeFixed.metadata.fixedCycle as string].metadata.centroid;
-//             const fixedAngle = Math.atan2(nodeFixed.y - centroidFixedCycle["y"], nodeFixed.x - centroidFixedCycle["x"]);
-//             const d = radius + radiusFixedCycle; 
-//             const centroidX = centroidFixedCycle["x"] + d * Math.cos(fixedAngle);
-//             const centroidY = centroidFixedCycle["y"] + d * Math.sin(fixedAngle);
-//             subgraphNetwork.cycles[cycleToDrawID].metadata.centroid={x:centroidX,y:centroidY};
-            
-
-//             // shift of start angle (default:pi/2) : angle of fixed node in the new cycle (with centroid calculted before)
-//             const shiftAngle = Math.atan2(nodeFixed.y - centroidY, nodeFixed.x - centroidX);
-            
-//             // drawing :
-//             cycleNodesCoordinates(cycleToDrawID,shiftedCycle,centroidX,centroidY,radius,subgraphNetwork,shiftAngle);
-             
-//         } else { // several node in common with other cycle(s) ----------------------------------------------------------------------------------
-
-//             const unfixedInterval=getUnfixedIntervals(cycle,subgraphNetwork);
-//             unfixedInterval.forEach(interval=>{
-
-//                 const startNode=cycle[(interval[0]-1+ cycle.length) % cycle.length];
-//                 const endNode=cycle[(interval[1]+1+ cycle.length) % cycle.length];
-//                 lineNodesCoordinates(network.nodes[startNode],network.nodes[endNode],cycle.slice(interval[0],interval[1]+1),subgraphNetwork);
-
-//             });
-
-//         }
-//     }
-
-// }
-
diff --git a/src/composables/LayoutFindCycle.ts b/src/composables/LayoutFindCycle.ts
index 23e66ee39ce760132a813720f1c0cab83ac916dd..8159995846ab2d370e92e11e61f3491db77999b6 100644
--- a/src/composables/LayoutFindCycle.ts
+++ b/src/composables/LayoutFindCycle.ts
@@ -1,7 +1,8 @@
 // Type imports
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { Network } from "@metabohub/viz-core/src/types/Network";
+import { Network } from  "../types/TypeVizCore";
 import { Subgraph, TypeSubgraph } from "../types/Subgraph";
+import { NetworkLayout } from "../types/NetworkLayout";
 
 
 // Composable imports
@@ -75,7 +76,6 @@ export function addDirectedCycleToSubgraphNetwork(subgraphNetwork:SubgraphNetwor
             // remove reversible version of node in cycle, to only keep the one in the direction of cycle
             const toRename=keepFirstReversibleNode(subgraphNetwork,cycle[1],false) as {[key: string]: string};
             nodeToRename=Object.assign(nodeToRename, toRename);
-            
 
             // has common nodes with a cycle in subgraphNetwork ?
             let networkCycles = Object.values(subgraphNetwork[TypeSubgraph.CYCLE] as {[key:string]:Subgraph});
@@ -101,17 +101,9 @@ export function addDirectedCycleToSubgraphNetwork(subgraphNetwork:SubgraphNetwor
                 if (sizeCycle<=sizeCommonCycle){ // if sorting worked : it is supposed to always be the case
                         subgraphNetwork[TypeSubgraph.CYCLE][cycle[0]].parentSubgraph={name:networkCycles[i].name,type:TypeSubgraph.CYCLE};
                         updateParentSubgraphOf(subgraphNetwork,subgraphNetwork[TypeSubgraph.CYCLE][cycle[0]]);
-                        // if(! subgraphNetwork[TypeSubgraph.CYCLE][networkCycles[i].name].childrenSubgraphs){
-                        //     subgraphNetwork[TypeSubgraph.CYCLE][networkCycles[i].name].childrenSubgraphs=[];
-                        // }
-                        // subgraphNetwork[TypeSubgraph.CYCLE][networkCycles[i].name].childrenSubgraphs.push({name:cycle[0],type:TypeSubgraph.CYCLE});
                     }else{
                         subgraphNetwork[TypeSubgraph.CYCLE][networkCycles[i].name].parentSubgraph={name:cycle[0],type:TypeSubgraph.CYCLE};
                         updateParentSubgraphOf(subgraphNetwork,subgraphNetwork[TypeSubgraph.CYCLE][networkCycles[i].name]);
-                        // if(! subgraphNetwork[TypeSubgraph.CYCLE] [cycle[0]].childrenSubgraphs){
-                        //     subgraphNetwork[TypeSubgraph.CYCLE] [cycle[0]].childrenSubgraphs=[];
-                        // }
-                        // subgraphNetwork[TypeSubgraph.CYCLE] [cycle[0]].childrenSubgraphs.push({name:networkCycles[i].name,type:TypeSubgraph.CYCLE});
                     }
                 }
             }
@@ -179,7 +171,7 @@ function graphForJohnson(network:Network, list_nodes:string[], onlyDirectedCycle
  * 
  * @throws Will throw an error if there is a null value in the stack, indicating a problem with stackTop.
  */
-export function JohnsonAlgorithm(graph: number[][], list_nodes:string[],flag: "Single" | "All"="All",onlyDirectedCycle:boolean=true,minsize:number=4,network?:Network): {[key:string]:string[]} {
+function JohnsonAlgorithm(graph: number[][], list_nodes:string[],flag: "Single" | "All"="All",onlyDirectedCycle:boolean=true,minsize:number=4,network?:NetworkLayout): {[key:string]:string[]} {
     const nVertices: number = graph.length;
     let nbcycle:number=0;
     let start: number = 0;
@@ -229,9 +221,9 @@ export function JohnsonAlgorithm(graph: number[][], list_nodes:string[],flag: "S
             // if network : node w not taken into account if reversible version in the stack (cycle with only one of the version)
             if(network){ 
                 const wNode=network.nodes[list_nodes[w]];
-                if( wNode.metadata && "reversibleVersion" in wNode.metadata){
+                if( wNode.metadataLayout && wNode.metadataLayout.reversibleNodeVersion){
                     const stackCopy = stack.slice(0, stackTop);
-                    const reactionRev =wNode.metadata["reversibleVersion"] as string;
+                    const reactionRev =wNode.metadataLayout.reversibleNodeVersion;
                     const reversibleNumber=list_nodes.indexOf(reactionRev);
                     if(stackCopy.includes(reversibleNumber)){
                         continue; // the reversible reaction is not processed as the original version is already in the stack
@@ -255,14 +247,11 @@ export function JohnsonAlgorithm(graph: number[][], list_nodes:string[],flag: "S
                         }
                     });
                     //adding check that not already found in the case of undirected cycle
-                    if (!onlyDirectedCycle && !Object.values(result).some(existingCycle => arePermutations(existingCycle, cycleID))) {
-                        result["cycle_"+String(nbcycle)]=cycleID;
-                        nbcycle+=1;
-                    }
-                    else if (onlyDirectedCycle) {
+                    if (!Object.values(result).some(existingCycle => arePermutations(existingCycle, cycleID))) {
                         result["cycle_"+String(nbcycle)]=cycleID;
                         nbcycle+=1;
                     }
+                    
                 }
                 f = true;
             } else if (!blocked[w]) { // If w is not blocked, find a cycle starting from w (dfs principle)
@@ -314,9 +303,7 @@ export function JohnsonAlgorithm(graph: number[][], list_nodes:string[],flag: "S
     }
 
     start = 0;
-    // for (let i = 0; i < nVertices; i++) {
-    //     console.log(String(i)+" "+String(list_nodes[i]));
-    // }
+
     while (start < nbNodeToRun) {
         for (let i = 0; i < nVertices; i++) {
             blocked[i] = false;
@@ -337,7 +324,6 @@ export function JohnsonAlgorithm(graph: number[][], list_nodes:string[],flag: "S
  */
 function arePermutations(arr1: string[], arr2: string[]): boolean {
     if (arr1.length !== arr2.length) return false;
-
     const sortedArr1 = arr1.slice().sort();
     const sortedArr2 = arr2.slice().sort();
 
diff --git a/src/composables/LayoutMain.ts b/src/composables/LayoutMain.ts
index 8e579ab2babd06ee35a67632fa8bff1fd51c7158..a9dcb2e203e812d92423df4e2042900360f3fece 100644
--- a/src/composables/LayoutMain.ts
+++ b/src/composables/LayoutMain.ts
@@ -1,11 +1,10 @@
 // Type imports
 import { defaultParameters,Parameters } from "../types/Parameters";
-import { StartNodesType } from "../types/EnumArgs";
+import { PathType, StartNodesType } from "../types/EnumArgs";
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
 import { TypeSubgraph } from "../types/Subgraph";
-import { Network } from "@metabohub/viz-core/src/types/Network";
+import { Network , GraphStyleProperties} from  "../types/TypeVizCore";
 import { NetworkLayout } from "../types/NetworkLayout";
-import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
 
 // Composable imports
 import { putDuplicatedSideCompoundAside, reinsertionSideCompounds } from "./LayoutManageSideCompounds";
@@ -19,16 +18,16 @@ import { shiftAllToGetTopLeftCoord } from "./CalculateSize";
 import { getStartNodes } from "./CalculateStartNodes";
 import { networktoNetworkLayout } from "./ConvertFromNetwork";
 import { networkLayoutToNetwork } from "./ConvertToNetwork";
+import { checkNetworkFormat } from "./CheckNetwork";
+
 
-// General imports
-import { ref } from "vue";
 
 
 
 /*******************************************************************************************************************************************************
  * This file contains the main function of the algorithm (that is to change the coordinates of a network => application of the layout).
  * 
- * -> algorithmOnNetwork : 
+ * -> layoutOnNetwork : 
  *      change the nodes coordinates of network
  * -> allSteps : 
  *      apply all steps of the algorithm to change node coordinates of a network
@@ -43,41 +42,30 @@ import { ref } from "vue";
  * @param parameters - The optional parameters for the algorithm.
  * @returns A promise that resolves to the modified network after applying the algorithm.
  * @throws An error if the network or networkStyle is not defined or empty.
+ * @throws An error if the network is not in the correct format.
  */
-export async function algorithmOnNetwork(network:Network,networkStyle:GraphStyleProperties,parameters:Parameters=defaultParameters):Promise<Network>{
+export async function layoutOnNetwork(network:Network,networkStyle:GraphStyleProperties={},parameters:Parameters=defaultParameters):Promise<Network>{
 
-  // check if the network is not empty
-  if ( !network || Object.keys(network.nodes).length===0){
-    console.warn('The network is not defined or has no nodes : the algorithm will not be executed');
-    throw new Error('The network is not defined or has no nodes : the algorithm will not be executed');
-  }
+  // check if the network has the correct format
+  await checkNetworkFormat(network,false, true);
 
-  // check if the networkStyle is not empty
-  if ( !networkStyle || Object.keys(networkStyle).length===0){
-    console.warn('The networkStyle is not defined or has no properties : the algorithm will not be executed');
-    throw new Error('The networkStyle is not defined or has no properties : the algorithm will not be executed');
+  // check if the network is not empty
+  if ( !network || Object.keys(network.nodes).length===0 || network.links.length===0){
+    throw new Error('The network is not defined, has no nodes or no links : the algorithm will not be executed');
   }
 
   // convert network to networkLayout
   let networkLayout:NetworkLayout=networktoNetworkLayout(network);
-
   // initialize the subgraphNetwork object
   let subgraphNetwork:SubgraphNetwork={
     network:networkLayout,
-    networkStyle:networkStyle
+    networkStyle:networkStyle,
   }
 
- 
-  try {
-     // change coordinates of the network with the algorithm
-    await allSteps(subgraphNetwork,parameters,true,true);
-    // convert networkLayout to network
-    return networkLayoutToNetwork(subgraphNetwork.network);
-    
-  } catch(err){
-    console.log(" Error during execution of algorithm : " + err);
-    throw err;
-  }
+    // change coordinates of the network with the algorithm
+  await allSteps(subgraphNetwork,parameters,false);
+  // convert networkLayout to network
+  return networkLayoutToNetwork(subgraphNetwork.network); 
 
 }
 
@@ -86,11 +74,10 @@ export async function algorithmOnNetwork(network:Network,networkStyle:GraphStyle
  * Apply all steps of the algorithm to change node coordinates of a network. SubgraphNetwork is an object that contains the network to change and all the information needed during the steps.
  * @param subgraphNetwork object that contains the network, network style, attributs for viz, subgraph information and side compounds
  * @param parameters parameters for the algorithm
- * @param shiftCoord change the coordinates to have the one of the top left corner of nodes, if false, the coordinates are the centers
  * @param printNameStep print the name of the steps during execution
  * @returns a promise of the subgraphNetwork 
  */
-export async function allSteps(subgraphNetwork: SubgraphNetwork,parameters:Parameters,shiftCoord:boolean=true,printNameStep:boolean=false):Promise<SubgraphNetwork> {
+export async function allSteps(subgraphNetwork: SubgraphNetwork,parameters:Parameters,printNameStep:boolean=false):Promise<SubgraphNetwork> {
 
     let network=subgraphNetwork.network;
     let networkStyle=subgraphNetwork.networkStyle;
@@ -102,10 +89,9 @@ export async function allSteps(subgraphNetwork: SubgraphNetwork,parameters:Param
       console.log('---------------');
     }
   
-  
     // duplicate side compounds and put them aside
     if (printNameStep) console.log('SideCompound duplication and put aside');
-    await putDuplicatedSideCompoundAside(subgraphNetwork,parameters.doDuplicateSideCompounds,parameters.doPutAsideSideCompounds,true,"/sideCompounds.txt").then(
+    await putDuplicatedSideCompoundAside(subgraphNetwork,parameters.doDuplicateSideCompounds,parameters.doPutAsideSideCompounds).then(
       (subgraphNetworkModified)=>{
           subgraphNetwork=subgraphNetworkModified;
       }
@@ -136,7 +122,7 @@ export async function allSteps(subgraphNetwork: SubgraphNetwork,parameters:Param
     ).then(
       () => {
         // if no cycle, we don't need to do the cycle step
-        if (parameters.doCycle && subgraphNetwork[TypeSubgraph.CYCLE] && Object.keys(subgraphNetwork[TypeSubgraph.CYCLE]).length===0){
+        if (parameters.doCycle && (!subgraphNetwork[TypeSubgraph.CYCLE] || Object.keys(subgraphNetwork[TypeSubgraph.CYCLE]).length===0)){
           parameters.doCycle=false;
           console.warn('doCycle is true but no cycle found : doCycle set to false');
         }
@@ -155,6 +141,9 @@ export async function allSteps(subgraphNetwork: SubgraphNetwork,parameters:Param
         // get main chains
         if (parameters.doMainChain){
           if (printNameStep) console.log('Find main chain');
+          if(parameters.pathType===PathType.ALL && !parameters.merge){
+            console.warn('PathType is ALL, but because merge is false, only longest keeped when no merge : use LONGEST instead or set merge to true');
+          }
           const sources=await getStartNodes(network,parameters.startNodeTypeMainChain);
           await addMainChainFromSources(subgraphNetwork, sources,parameters.getSubgraph, parameters.merge,parameters.pathType);
         }
@@ -212,18 +201,13 @@ export async function allSteps(subgraphNetwork: SubgraphNetwork,parameters:Param
     ).then(
       () => {
         // shift coordinates to have top left corner coordinate (because of svg drawing)
-        if (shiftCoord){
+        if (parameters.shiftCoord){
           if (printNameStep) console.log('Shift coordinates nodes to have center at the old coordinates');
           shiftAllToGetTopLeftCoord(network,networkStyle);
         }
       }
-    ).then(
-      () => {
-        // add color to link (optional : for debug)
-        //subgraphNetwork = addBoldLinkMainChain(subgraphNetwork);
-        //subgraphNetwork=addRedLinkcycleGroup(subgraphNetwork);
-      }
     );
+    
     return subgraphNetwork;
   
 }
diff --git a/src/composables/LayoutMainChain.ts b/src/composables/LayoutMainChain.ts
index 688ccaa303e2f3e1f17b5712d9a2e3614a87a0b9..f0b06da29112eeeb377bed7f16d362d08d9c4156 100644
--- a/src/composables/LayoutMainChain.ts
+++ b/src/composables/LayoutMainChain.ts
@@ -2,14 +2,15 @@
 import { PathType, StartNodesType } from "../types/EnumArgs";
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
 import {TypeSubgraph, type Subgraph} from "../types/Subgraph";
-import { Network } from "@metabohub/viz-core/src/types/Network";
+import { Network } from  "../types/TypeVizCore";
 
 // Composable imports
-import { DFSWithSources, DFSsourceDAG } from "./AlgorithmDFS";
+import { DFSsourceDAG } from "./AlgorithmDFS";
 import { networkToGDSGraph } from "./ConvertFromNetwork";
 import { getStartNodes } from "./CalculateStartNodes";
 import { BFS } from "./AlgorithmBFS";
-import { addSubgraphToNetwork, createSubgraph, updateNodeMetadataSubgraph } from './SubgraphForSubgraphNetwork';
+import { addSubgraphToNetwork, createSubgraph } from './SubgraphForSubgraphNetwork';
+
 
 /**
  * This file contains functions find and add main chains and mini-branch (form main chain) in a subgraphNetwork.
@@ -93,11 +94,7 @@ export async function addMainChainFromSources(subgraphNetwork:SubgraphNetwork, s
             // create subgraph and add it
             const newMainChainId="mainChain__"+mainChainID;
             const newMainChain= createSubgraph(newMainChainId, mainChain.nodes,[],TypeSubgraph.MAIN_CHAIN);
-            mainChains[newMainChainId]=newMainChain;
-            // add metadata for node in cluster
-            mainChain.nodes.forEach(nodeID=>{
-                updateNodeMetadataSubgraph(network, nodeID, newMainChainId, TypeSubgraph.MAIN_CHAIN);
-            });
+            subgraphNetwork=addSubgraphToNetwork(subgraphNetwork,newMainChain,TypeSubgraph.MAIN_CHAIN);
         }
     });
 
@@ -163,12 +160,10 @@ export async function addMiniBranchToMainChain(subgraphNetwork:SubgraphNetwork):
  */
 export async function getPathSourcesToTargetNode(network:Network, sources:string[],merge:boolean=true,pathType:PathType=PathType.ALL_LONGEST):Promise<{[key:string]:{nodes:Array<string>, height:number}}>{
 
-    //console.log('DAG_Dijkstra');
-
     let pathsFromSources:{[key:string]:{nodes:Array<string>, height:number}}={};
 
     // for each source : do an independant dfs
-    sources.forEach(async source=>{
+    for (const source of sources){
         // DFS to get a DAG from this source, and get topological sort
         const {dfs,graph}=await DFSsourceDAG(network,[source]);
         // get max distance from source node for all nodes, and by which parent nodes the node had been accessed
@@ -177,21 +172,21 @@ export async function getPathSourcesToTargetNode(network:Network, sources:string
         const targetNodes=findMaxKeys(distances);
         // for each target node : (if several path wanted)
         if (pathType==PathType.ALL_LONGEST || pathType==PathType.ALL){
-            targetNodes.key.forEach(async target => {
+            for (const target of targetNodes.key){
                 // get the parents that goes from source to target node 
                 const nodesBetweenSourceTarget=BFS(parents,target);
                 // merge with an existing path if node in common
                 // height is the max distance +1 
                 pathsFromSources=await mergeNewPath(source,{nodes:nodesBetweenSourceTarget, height:targetNodes.max+1},pathsFromSources,merge);
-            });
+            };
         } else  if(pathType==PathType.LONGEST){ // if only one path wanted : take the first
             // get the parents that goes from source to target node 
             const nodesBetweenSourceTarget=BFS(parents,targetNodes.key[0]);
             // merge with an existing path if node in common
-            pathsFromSources= await mergeNewPath(source,{nodes:nodesBetweenSourceTarget, height:targetNodes.max},pathsFromSources,merge);
+            pathsFromSources= await mergeNewPath(source,{nodes:nodesBetweenSourceTarget, height:targetNodes.max+1},pathsFromSources,merge);
         }
             
-    });      
+    }    
     return pathsFromSources;
 }
 
@@ -245,7 +240,6 @@ async function DistanceFromSourceDAG(graph:{[key:string]:Function}, topologicalO
             }
         })
     });
-
     return {distances:distanceFromSource, parents:parentsFromSource};
 }
 
@@ -282,150 +276,49 @@ function findMaxKeys(obj: { [key: string]: number }): {key:string[],max:number}
  */
 async function mergeNewPath(source:string,newPath:{nodes:Array<string>, height:number},pathsFromSources:{[key:string]:{nodes:Array<string>, height:number}}, merge:boolean=true):Promise<{[key:string]:{nodes:Array<string>, height:number}}>{
     const keys=Object.keys(pathsFromSources).sort();
-    let hasmerged=false;
-    if (merge) {
-        keys.forEach(key=>{
-            const pathNodes = pathsFromSources[key].nodes;
-            // Check for common nodes, but target nodes
-            const commonNodes = pathNodes.find(node => newPath.nodes.includes(node));
-            if (commonNodes) {
+
+    // if no path in the object : add the new path
+    if (keys.length===0){
+        pathsFromSources[source]=newPath;
+        return pathsFromSources;
+    }
+
+    // for each path in the object
+    keys.forEach(key=>{
+        const pathNodes = pathsFromSources[key].nodes;
+        // Check for common nodes
+        const commonNodes = pathNodes.find(node => newPath.nodes.includes(node));
+        if (commonNodes && commonNodes.length>0){
+            if(merge){
                 // Merge paths
                 const mergedPath = Array.from(new Set(pathNodes.concat(newPath.nodes)));
-                // Create new key
-                const newKey = `${key}__${source}`;
+                // Create new key if necessary
+                let newKey:string = key;
+                const sourceAlreadyInKey=key.split('__').includes(source);
+                if(!sourceAlreadyInKey){ 
+                    newKey= `${key}__${source}`;
+                }
                 // Update pathsFromSources object
                 const newheight=newPath.height>pathsFromSources[key].height?newPath.height:pathsFromSources[key].height;
                 pathsFromSources[newKey] = {nodes:mergedPath,height:newheight};
-                // Remove old key
-                delete pathsFromSources[key];
-                hasmerged=true;
+                
+                // Remove old key if the name has changed
+                if(!sourceAlreadyInKey){
+                    delete pathsFromSources[key];
+                }
+            }else{
+                // Highest path is kept
+                if(newPath.height>pathsFromSources[key].height){
+                    delete pathsFromSources[key];
+                    pathsFromSources[source]=newPath;
+                }
             }
-        });
-    }
-    // if no merge : added on it's own
-    if (!hasmerged){
-        pathsFromSources[source]=newPath;
-    }
+        }else{
+            // If no common nodes : path added on it's own
+            if(pathsFromSources[source]) throw new Error('source already in pathsFromSources, but supposed to have no common nodes');
+            pathsFromSources[source]=newPath;
+        }
+    });
     return pathsFromSources;
 }
 
-
-
-// // ----------------------------------------------------------------------------------------------------------------------------------------------
-// // ---------------------------------------------- Method 1 of getCluster for main chains ---------------------------------------------------------
-// // ----------------------------------------------------------------------------------------------------------------------------------------------
-
-
-// /**
-//  * Get a long path from sources using a DFS. The path isn't the longest if there some undirected cycle.
-//  * @param network 
-//  * @param sources to use for DFS
-//  * @returns some node clusters with id
-//  */
-// export function getLongPathDFS(network:Network,sources:string[]):{[key:string]:{nodes:Array<string>, height:number}}{ 
-//     //console.log('DFS long path');
-//     // create graph for library from network 
-//     const graph=networkToGDSGraph(network);  
-//     // DFS
-//     const dfs=DFSWithSources(network, sources);
-//     // get new clusters : 'longest' paths from sources with DFS
-//     return longestPathFromDFS(graph,dfs,sources as string[]);
-// }
-
-
-// /**
-//  * The 'longest' (not the longest if undirected or directed cycle) path associated with each source with the DFS is found. BEWARE : the order of the id can change the result.
-//  * @param graph object for graph-data-structure library
-//  * @param dfs the return string (of nodes id) of a dfs (logically obtained with same sources as the sources for this functions)
-//  * @param sources array of node ID or a type of method to get sources automatically
-//  * RANK_ONLY : sources are nodes of rank 0
-//  * SOURCE_ONLY : sources are topological sources of the network (nul indegree)
-//  * RANK_SOURCE : sources are node of rank 0, then source nodes
-//  * ALL : sources are all nodes
-//  * SOURCE_ALL : sources are topological sources, then all the others nodes
-//  * RANK_SOURCE_ALL : sources are node of rank 0, then topological sources, then all the other nodes
-//  * For this function, the advised choice is either RANK_ONLY, SOURCE_ONLY or RANK_SOURCE.
-//  * 
-//  * @returns an object for the different path, the key is the source of the path
-//  */
-// function longestPathFromDFS(graph:{[key:string]:Function},DFSreversed:Array<string>,sources:Array<string>):{[key:string]:{nodes:Array<string>, height:number}}{
-//     let dfs = Array.from(DFSreversed).reverse(); // the code has been done whith a backward reading of dfs
-
-//     let longestPaths:{[key:string]:{nodes:Array<string>, height:number}}={};
-//     let path:Array<string>;
-//     let source:string=undefined;
-//     let i=dfs.length-1; // index of node in dfs array
-//     let add=false;
-
-//     while( i !== -1 ){ // dfs nodes are read backwards
-//         const visitedNode=dfs[i];
-//         const previousNode: string = (dfs.length - 1 >= i + 1) ? dfs[i + 1] : undefined;
-        
-//         // if visited node is source
-//         if( sources.includes(visitedNode) ){
-            
-//             if (source!==undefined){
-//                 // end the path (of the previous source, if one)
-//                 longestPaths=endPath(source,longestPaths,path);
-//                 // suppress nodes after the current node (those already analysed in while loop, because backward reading)
-//                 dfs.splice(i + 1);
-//             }
-
-//             // define new source and add to path
-//             source = visitedNode;
-//             longestPaths[source]={nodes:[source],height:1};
-//             add=true;
-//             path=[source];
-        
-//         // if there is a previous node
-//         } else if (previousNode){
-//             // if visited node is child of the previous visited node in dfs : add to path
-//             if (nodeIsChildOf(graph,visitedNode,previousNode)){       
-//                 add=true;
-//                 path.push(visitedNode);
-//             }else{
-//                 // end the path if a node has been added in the last pass of the loop
-//                 if (add && source!==undefined){
-//                     longestPaths=endPath(source,longestPaths,path);
-//                 }
-//                 // remove previous visited node if this node is not the parent of current node
-//                 dfs.splice(i+1,1);
-//                 path.splice(path.length-1);
-//                 i++; // next loop pass will be on the same visited node (because the parent of the visited node wasn't found)
-//                 add=false; // no node has been added
-//             }
-//         }
-
-//         i--; //backward reading
-//     }
-//     return longestPaths;
-// }
-
-// /**
-//  * Is the node a child of the parent node ?
-//  * @param graph object that contains function to get children of a node
-//  * @param node is this node a child of the parent?
-//  * @param parentNode the parent node
-//  * @returns boolean
-//  */
-// function nodeIsChildOf(graph:{[key:string]:Function},node:string, parentNode:string):boolean{
-//     return graph.adjacent(parentNode).includes(node);
-// }
-
-// /**
-//  * Check if the given path is longer than the one in the longest, if it is : update the path to keep the longest of the two
-//  * @param source source of the path (first node)
-//  * @param longestPaths 
-//  * @param path the path to check
-//  * @returns the new longest paths
-//  */
-// function endPath(source:string, longestPaths:{[key:string]:{nodes:Array<string>, height:number}},path:Array<string>):{[key:string]:{nodes:Array<string>, height:number}}{
-//     if (source in longestPaths){
-//         if(longestPaths[source].height < path.length){
-//             longestPaths[source]={nodes:path.slice(),height:path.length};
-//         }
-//     }else{
-//         console.error("source key not in object")
-//     }
-//     return longestPaths;
-// }
diff --git a/src/composables/LayoutManageSideCompounds.ts b/src/composables/LayoutManageSideCompounds.ts
index 34416e9897899500b434cf1dca9b89d95bc66f2d..680cdbb1b19cb654f64ba373ea5a1ec406bc33f1 100644
--- a/src/composables/LayoutManageSideCompounds.ts
+++ b/src/composables/LayoutManageSideCompounds.ts
@@ -1,23 +1,14 @@
 // Type imports
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Node } from "@metabohub/viz-core/src/types/Node";
+import { Node } from  "../types/TypeVizCore";
 import { MetaboliteType, Reaction, ReactionInterval } from "../types/Reaction";
 import { VizArgs } from "../types/EnumArgs";
 import { Coordinate } from "../types/CoordinatesSize";
-import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
 
 // Composable imports
-import { removeAllSelectedNodes , duplicateAllNodesByAttribut} from "@metabohub/viz-core";
-import { getMeanNodesSizePixel, inchesToPixels, minEdgeLength as minEdgeLength, pixelsToInches } from "./CalculateSize";
-import { sideCompoundAttribute,isDuplicate, isReaction, isSideCompound, setAsSideCompound } from "./GetSetAttributsNodes";
-
-// General imports
-//import { e, S } from "vitest/dist/reporters-1evA5lom";
-import { c } from "vite/dist/node/types.d-aGj9QkWt";
-import { resolve } from "path";
-import { error } from "console";
-
+import { removeAllSelectedNodes , duplicateAllNodesByAttribut} from "./VizCoreFunctions";
+import { getMeanNodesSizePixel, inchesToPixels, minEdgeLength, pixelsToInches } from "./CalculateSize";
+import { sideCompoundAttribute,isDuplicate, isSideCompound, setAsSideCompound } from "./GetSetAttributsNodes";
 
 
 
@@ -25,28 +16,11 @@ import { error } from "console";
 /*******************************************************************************************************************************************************
  * 
  * This file contains the functions to manage side compounds.
- * 
- * *********************************
- * 
- * 0. Declare side compounds
- * 
- * -> addSideCompoundAttributeFromList :
- *       add attribute of side compound to all nodes in network from a list
- * 
- * -> getIDSideCompoundsInNetworkFromFile :
- *      return the list of id of side compounds in the network
- * 
- * -> getIDSideCompoundsFromFile :
- *      return the list of id of side compounds from a file
- * 
- * -> getContentFromURL :
- *     fetch url to return data
- * 
- * 
+ *  
  **********************************
  * 
  * 
- * 1. Duplicate and remove side compounds
+ * 0. Duplicate and remove side compounds
  * 
  * 
  * -> putDuplicatedSideCompoundAside :
@@ -65,7 +39,7 @@ import { error } from "console";
  * *********************************
  * 
  * 
- * 2. Reinsert side compounds
+ * 1. Reinsert side compounds
  * 
  * -> reinsertionSideCompounds :
  *      reinsert side compounds in the network
@@ -79,6 +53,8 @@ import { error } from "console";
  * -> motifStampSideCompound :
  *       applies a motif stamp to place side compound for a reaction
  * 
+ ****** 1.0  Stamp motif : initialization
+ * 
  * -> initializeReactionSideCompounds :
  *      initializes a reaction for side compounds motif
  * 
@@ -88,6 +64,8 @@ import { error } from "console";
  * -> angleRadianSegment :
  *      calculates the angle in radians between two points
  * 
+ * ***** 1.1  Stamp motif : find intervals
+ * 
  * -> addSideCompoundsIntervals :
  *      finds the cofactor intervals for a given reaction
  * 
@@ -103,9 +81,13 @@ import { error } from "console";
  * -> sizeInterval :
  *      calculates the size of an interval (between two metabolites) in a reaction
  * 
+ * ***** 1.2  Stamp motif : find spacing
+ * 
  * -> findSpacingSideCompounds :
  *      finds spacing between side compounds
  * 
+ * ***** 1.3  Stamp motif : give coordinates
+ * 
  * -> giveCoordAllSideCompounds :
  *      calculates the coordinates for all side compounds in a subgraph network
  * 
@@ -121,6 +103,7 @@ import { error } from "console";
  * -> giveCoordSideCompound :
  *     calculates the coordinates for a side compound 
  * 
+ * ***** 1.4  Stamp motif : insert side compounds
  * -> insertAllSideCompoundsInNetwork :
  *      inserts all side compounds in the network
  * 
@@ -128,93 +111,13 @@ import { error } from "console";
  *      inserts a side compound in the network
  * 
  * 
- * 
  *      
  * *******************************************************************************************************************************************************/
 
 
 
-
-
 /*******************************************************************************************************************************************************/
-//___________________________________________________0.  Declare side compounds__________________________________________________________________________
-
-
-
-
-/**
- * Add attribute of side compound to all nodes in network from a list 
- * @param network 
- * @param pathListSideCompounds path to the list of id of side compounds
- */
-export async function addSideCompoundAttributeFromList(subgraphNetwork:SubgraphNetwork, pathListSideCompounds:string):Promise<void>{
-    const listIDSideCompounds = await getIDSideCompoundsInNetworkFromFile(subgraphNetwork,pathListSideCompounds);
-    listIDSideCompounds.forEach((sideCompoundID) => {
-        setAsSideCompound(subgraphNetwork.network,sideCompoundID);
-    });
-}
-
-/**
- * Return the list of id of side compounds in the network
- * @param subgraphNetwork 
- * @param pathListSideCompounds path to the list of id of side compounds
- * @returns list of id of side compounds in the network
- */
-async function getIDSideCompoundsInNetworkFromFile(subgraphNetwork:SubgraphNetwork,pathListSideCompounds:string):Promise<string[]>{
-    let listIDSideCompounds:string[];
-    const network = subgraphNetwork.network;
-    try {
-        listIDSideCompounds = await getIDSideCompoundsFromFile(pathListSideCompounds);
-        const sideCompoundInNetwork = Object.keys(network.nodes).filter(id => listIDSideCompounds.includes(id));
-        return sideCompoundInNetwork;
-    } catch (error) {
-        throw error;
-    }   
-}
-
-/**
- * Return the list of id of side compounds from a file
- * @param pathListSideCompounds path to the list of id of side compounds
- * @returns list of id of side compounds
- */
-async function getIDSideCompoundsFromFile(pathListSideCompounds:string):Promise<string[]>{
-    try {
-        const sideCompoundsFile=pathListSideCompounds;
-        const sideCompoundsString = await getContentFromURL(sideCompoundsFile);
-        const lines = sideCompoundsString.split('\n');
-        const listId: Array<string> = [];
-        lines.forEach((line: string) => {
-        listId.push(line.split('\t')[0]);
-        })
-        return listId;
-    }catch (error) {
-        throw error;
-    }
-}
-
-/**
- * Fetch url to return data
- * @param url URL to fetch 
- * @returns Return response
- */
-export async function getContentFromURL(url: string): Promise<string> {
-	try {
-	  const response = await fetch(url);
-	  if (!response.ok) {
-		throw new Error('La requête a échoué avec le statut ' + response.status);
-	  }
-	  const content = await response.text();
-	  return content;
-	} catch (error) {
-	  console.error('Une erreur s\'est produite lors de la récupération du contenu du fichier :', error);
-	  throw error;
-	}
-  }
-  
-
-
-/*******************************************************************************************************************************************************/
-//___________________________________________________1.  Duplicate and remove side compounds__________________________________________________________________________
+//___________________________________________________0.  Duplicate and remove side compounds__________________________________________________________________________
 
 
 
@@ -227,16 +130,13 @@ export async function getContentFromURL(url: string): Promise<string> {
  * @param pathListSideCompounds path to the list of id of side compounds
  * @returns subgraphNetwork with updated network and sideCompounds
  */
-export async function putDuplicatedSideCompoundAside(subgraphNetwork:SubgraphNetwork, doDuplicateSideCompounds:boolean,doPutAsideSideCompounds:boolean, addSideCompoundAttribute:boolean=true, pathListSideCompounds:string):Promise<SubgraphNetwork>{
+export async function putDuplicatedSideCompoundAside(subgraphNetwork:SubgraphNetwork, doDuplicateSideCompounds:boolean,doPutAsideSideCompounds:boolean):Promise<SubgraphNetwork>{
     try {
-        // finding side compounds in network
-        if (addSideCompoundAttribute){
-            await addSideCompoundAttributeFromList(subgraphNetwork,pathListSideCompounds);
-        }
         // duplication of side compounds
         if (doDuplicateSideCompounds){
             await duplicateSideCompound(subgraphNetwork);
         }
+
         // remove side compounds from network, they are keeped aside in subgraphNetwork.sideCompounds
         if (doPutAsideSideCompounds){
             return removeSideCompoundsFromNetwork(subgraphNetwork);
@@ -255,7 +155,7 @@ export async function putDuplicatedSideCompoundAside(subgraphNetwork:SubgraphNet
  * @param subgraphNetwork - The subgraph network containing the side compounds to be duplicated.
  * @returns void
  */
-export async function duplicateSideCompound(subgraphNetwork:SubgraphNetwork):Promise<void>{
+async function duplicateSideCompound(subgraphNetwork:SubgraphNetwork):Promise<void>{
     const network = subgraphNetwork.network;
     const networkStyle = subgraphNetwork.networkStyle;
     // duplication of side compounds
@@ -321,7 +221,7 @@ function removeSideCompoundsFromNetwork(subgraphNetwork:SubgraphNetwork): Subgra
 }
 
 /*******************************************************************************************************************************************************/
-//___________________________________________________2.  Reinsert side compounds__________________________________________________________________________
+//___________________________________________________1.  Reinsert side compounds__________________________________________________________________________
 
 
 /**
@@ -332,7 +232,9 @@ function removeSideCompoundsFromNetwork(subgraphNetwork:SubgraphNetwork): Subgra
  * @returns subgraphNetwork with updated network and sideCompounds
  */
 export async function reinsertionSideCompounds(subgraphNetwork:SubgraphNetwork,factorMinEdgeLength:number=1/2,doReactionReversible:boolean):Promise<SubgraphNetwork>{
-    if(subgraphNetwork.sideCompounds){
+    if(!subgraphNetwork.sideCompounds){
+        return subgraphNetwork;
+    }else {
         const sideCompounds = subgraphNetwork.sideCompounds 
         // get information for length of edge for side compounds :
         // get the min length of edge in the network (if not, use default value)
@@ -352,12 +254,13 @@ export async function reinsertionSideCompounds(subgraphNetwork:SubgraphNetwork,f
         }
 
         // for each reaction, apply motif stamp
-        Object.keys(sideCompounds).forEach( async (reactionID)=>{
-            subgraphNetwork= await motifStampSideCompound(subgraphNetwork,reactionID,factorMinEdgeLength);
-        });       
-    }
-    return subgraphNetwork;
+        for (const reactionID of Object.keys(sideCompounds)) {
+            subgraphNetwork = await motifStampSideCompound(subgraphNetwork, reactionID, factorMinEdgeLength);
+        }   
 
+        return subgraphNetwork;   
+    }
+    
 }
 
 /**
@@ -391,7 +294,7 @@ async function updateSideCompoundsReversibleReaction(subgraphNetwork:SubgraphNet
     if (subgraphNetwork.sideCompounds){
         let sideCompounds=subgraphNetwork.sideCompounds;
         Object.keys(sideCompounds).forEach((reactionID)=>{
-            if (!(reactionID in network.nodes)) throw new Error("Reaction not in subgraphNetwork")
+            if (!(reactionID in network.nodes)) throw new Error("Reaction in side compounds but not in network")
             // if reaction has been reversed : exchange products and reactants
             if(network.nodes[reactionID].metadataLayout && network.nodes[reactionID].metadataLayout.isReversedVersion){
                 const products=sideCompounds[reactionID].products;
@@ -414,7 +317,7 @@ async function updateSideCompoundsReversibleReaction(subgraphNetwork:SubgraphNet
  * @returns The subgraphNetwork with the motif stamp applied for the reaction.
  */
 async function motifStampSideCompound(subgraphNetwork:SubgraphNetwork,reactionID:string,factorMinEdgeLength:number=1/2):Promise<SubgraphNetwork>{
-    //try {
+    try {
         // initialize reaction stamp
         let reaction= await initializeReactionSideCompounds(subgraphNetwork,reactionID);
         // find intervals between reactants and products
@@ -430,15 +333,15 @@ async function motifStampSideCompound(subgraphNetwork:SubgraphNetwork,reactionID
         subgraphNetwork= await giveCoordAllSideCompounds(subgraphNetwork,reaction,factorMinEdgeLength);
         // insert side compounds in network
         insertAllSideCompoundsInNetwork(subgraphNetwork,reaction);
-    // } catch (error) {
-    //     throw new Error("Error in motifStampSideCompound, reaction : "+ reactionID+ "\n"+error);
-    // }
-    return subgraphNetwork;
+        return subgraphNetwork;
+    } catch (error) {
+        throw new Error("Error in motifStampSideCompound, reaction : "+ reactionID+ "\n"+error);
+    }
 }
 
 
 /***********************************************************************/
-//______________2.1  Stamp motif : initialization
+//______________1.0  Stamp motif : initialization
 
 
 /**
@@ -514,7 +417,6 @@ async function getMetaboliteFromReaction(subgraphNetwork: SubgraphNetwork, idRea
  */
 function angleRadianSegment(x1:number,y1:number,x2:number,y2:number,clockwise:boolean=true):number{
     if (!isFinite(x1) || !isFinite(y1) || !isFinite(x2) || !isFinite(y2)) {
-        //console.error("Invalid coordinates for angle : one or more coordinates are not finite numbers.");
         throw new Error("Invalid coordinates for angle : one or more coordinates are not finite numbers."); 
     }
 
@@ -535,7 +437,7 @@ function angleRadianSegment(x1:number,y1:number,x2:number,y2:number,clockwise:bo
 }
 
 /***********************************************************************/
-//______________2.2  Stamp motif : find intervals
+//______________1.1  Stamp motif : find intervals
 
 
 
@@ -548,6 +450,16 @@ function angleRadianSegment(x1:number,y1:number,x2:number,y2:number,clockwise:bo
 async function addSideCompoundsIntervals(reaction: Reaction):Promise<Reaction> {
 
     try {
+        // if no reactant or product
+        if (Object.keys(reaction.metabolitesAngles).length===0) {
+            reaction.intervalsAvailables =[{
+                typeInterval: 0, 
+                reactant: undefined,
+                product: undefined,
+            }];
+            return reaction;
+        }
+
         // Sort metabolites by angle
         const sortedMetabolites = Object.entries(reaction.metabolitesAngles)
         .map(([id, {angle, type}]) => ({id, angle, type}))
@@ -582,7 +494,6 @@ async function addSideCompoundsIntervals(reaction: Reaction):Promise<Reaction> {
                 product: undefined,
             }];
         }
-
         return reaction;
     } catch(error){
         throw error;
@@ -703,20 +614,21 @@ function sizeInterval(reaction:Reaction,intervalIndex:number):number{
 }
 
 /***********************************************************************/
-//______________2.3  Stamp motif : find spacing
+//______________1.2  Stamp motif : find spacing
 
 
 async function findSpacingSideCompounds(reaction:Reaction,sizeInterval:number):Promise<{reactant:number|undefined,product:number|undefined}>{
     const reactantNumber=reaction.sideCompoundsReactants.length;
     const productNumber=reaction.sideCompoundsProducts.length;
+    if (reactantNumber<0 && productNumber<0) throw new Error("Number of side compounds negative");
     return {
-        reactant: reactantNumber === 0 ? undefined : sizeInterval / (2 * (reactantNumber+1)),
-        product: productNumber === 0 ? undefined : sizeInterval / (2 * (productNumber+1))
+        reactant: reactantNumber === 0 ? undefined :  Number((sizeInterval / (2 * (reactantNumber+1))).toFixed(3)),
+        product: productNumber === 0 ? undefined : Number((sizeInterval / (2 * (productNumber+1))).toFixed(3))
     };
 }
 
 /***********************************************************************/
-//______________2.4  Stamp motif : give coordinates
+//______________1.3  Stamp motif : give coordinates
 
 
 /**
@@ -780,15 +692,14 @@ async function placeSideCompounds(sideCompounds: Array<Node>, reaction: Reaction
     }
     const interval = reaction.intervalsAvailables[0];
     const startSideCompound = placeReactants ? interval.reactant : interval.product;
-    if (!startSideCompound) {
-        console.error("No start side compound found");
-        return;
+    let startAngle:number=0;
+    if (startSideCompound) {
+        startAngle = startSideCompound ? reaction.metabolitesAngles[startSideCompound].angle : 0;
     }
-    let startAngle = startSideCompound ? reaction.metabolitesAngles[startSideCompound].angle : 0;
+   
     const angleSpacing = placeReactants ? reaction.angleSpacingReactant : reaction.angleSpacingProduct;
-    if (! angleSpacing! || isFinite(angleSpacing)) {
-        console.error("No angle spacing found");
-        return;
+    if (angleSpacing===undefined || isNaN(angleSpacing) || angleSpacing===null){ 
+        throw new Error("No angle spacing found");
     }
 
     sideCompounds.forEach((sideCompoundNode, i) => {
@@ -826,14 +737,14 @@ function determineDirection(typeInterval: number, placeReactants: boolean): numb
  * @returns The side compound node with updated coordinates.
  */
 function giveCoordSideCompound(sideCompound:Node,angle:number,center:{x:number,y:number},distance:number):Node{
-    sideCompound.x = center.x + distance * Math.cos(angle);
-    sideCompound.y = center.y + distance * Math.sin(angle);
+    sideCompound.x = Number((center.x + distance * Math.cos(angle)).toFixed(3));
+    sideCompound.y = Number((center.y + distance * Math.sin(angle)).toFixed(3));
     return sideCompound;
 }
 
 
 /***********************************************************************/
-//______________2.4  Stamp motif : insertion in network
+//______________1.4  Stamp motif : insertion in network
 
 
 /**
diff --git a/src/composables/LayoutReversibleReactions.ts b/src/composables/LayoutReversibleReactions.ts
index e5704760e7337fcd7ddb6f2daed1bdc19372971b..cc326725ede5fff81d54773965e117514b5bc114 100644
--- a/src/composables/LayoutReversibleReactions.ts
+++ b/src/composables/LayoutReversibleReactions.ts
@@ -1,20 +1,15 @@
 // Type imports
-import { Link } from "@metabohub/viz-core/src/types/Link";
-import { Node } from "@metabohub/viz-core/src/types/Node";
-import { Network } from "@metabohub/viz-core/src/types/Network";
+import { Link, Node, Network } from  "../types/TypeVizCore";
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
 import { TypeSubgraph } from "../types/Subgraph";
 import { StartNodesType } from "../types/EnumArgs";
 import { NetworkLayout, NodeLayout } from "../types/NetworkLayout";
 
 // Composable imports
-import { removeAllSelectedNodes } from "@metabohub/viz-core";
+import { removeAllSelectedNodes } from "./VizCoreFunctions";
 import { BFSWithSources } from "./AlgorithmBFS";
-import { addLinkClassReversible, addMetadataReversibleWithClass, isReaction, isReversible } from "./GetSetAttributsNodes";
+import { addLinkClassReversible, isReaction, isReversible } from "./GetSetAttributsNodes";
 
-// General imports
-//import { e } from "vitest/dist/reporters-1evA5lom";
-import { l } from "vite/dist/node/types.d-aGj9QkWt";
 
 
 
@@ -76,9 +71,6 @@ import { l } from "vite/dist/node/types.d-aGj9QkWt";
 export async function duplicateReversibleReactions(networkLayout:NetworkLayout):Promise<void> {
 
   try {
-    // add metadata "reversible" to nodes
-    console.warn("add metadata reversible if in the class. Not necessary if file with correct format (done bcs of the file I have) => to remove ?");
-    await addMetadataReversibleWithClass(networkLayout);
 
     const newLinks: Array<Link> = []; //links associated with new reactions nodes
     
@@ -195,25 +187,9 @@ async function reversibleNodeReaction(node: NodeLayout, suffix: string = "_rev")
     newNodeReversed=true;
   }
   
-  //const newLabel = label.endsWith(suffix) ? label.slice(0, -suffix.length) : label + suffix;
-
-  //const newClasses: string[] = [];
-  // add classes of original reaction, 
-  // and add class reversibleVersion if not present, removed if present
-  // classes.forEach(item =>{
-  //   newClasses.push(item)
-  // });
-  // const revIndex = newClasses.indexOf("reversibleVersion");
-  // if (revIndex !== -1) {
-  //   newClasses.splice(revIndex, 1);
-  // }else{
-  //   newClasses.push("reversibleVersion");
-  // }
-  
   const newNode: NodeLayout = {
     ...node,
     id: newId,
-    //metadata: {...node.metadata, reversibleVersion: id},  // to remove : doest work
     metadataLayout: {reversibleNodeVersion:id,isReversedVersion:newNodeReversed},
   };
   return newNode;
@@ -325,7 +301,7 @@ export function keepFirstReversibleNode(subgraphNetwork:SubgraphNetwork,nodeOrde
   // remove one version of the reaction
   removeAllSelectedNodes(reactionToRemove,network);
   // rename the other if it was the reversible version that is keeped
-  console.warn("need to check if subgraph still exist ?")
+  
   if(doRename){
     const subgraphNetworkRename=renameAllIDNode(subgraphNetwork,nodeToRename);
     return  subgraphNetworkRename// return object renamed
@@ -357,16 +333,6 @@ export function renameAllIDNode(subgraphNetwork:SubgraphNetwork,nodesToRename:{[
     }
   });
 
-  // Modify edges -> not necessary because pointer for links (not id of node)
-  // network.links.forEach(link => {
-  //   if (nodesToRename[link.source.id]) {
-  //     link.source = network.nodes[nodesToRename[link.source.id]];
-  //   }
-  //   if (nodesToRename[link.target.id]) {
-  //     link.target = network.nodes[nodesToRename[link.target.id]];
-  //   }
-  // });
-
   // Modify subgraphs
   // in cycles
   renameAllInSubgraph(subgraphNetwork,TypeSubgraph.CYCLE,nodesToRename);
@@ -387,77 +353,15 @@ export function renameAllIDNode(subgraphNetwork:SubgraphNetwork,nodesToRename:{[
  * @param typeSubgraph - The type of subgraph.
  * @param nodesToRename - The mapping of nodes to their new names.
  */
-function renameAllInSubgraph(subgraphNetwork:SubgraphNetwork, typeSubgraph:TypeSubgraph, nodesToRename:{[key: string]: string}){
+function renameAllInSubgraph(subgraphNetwork:SubgraphNetwork, typeSubgraph:TypeSubgraph, nodesToRename:{[key: string]: string}):void{
   const subgraphs = subgraphNetwork[typeSubgraph] ? subgraphNetwork[typeSubgraph] : {};
   Object.entries(subgraphs).forEach(([ID, subgraph]) => {
     subgraph.nodes = subgraph.nodes.map(node => {
       if(nodesToRename[node]){
-        // change metadata of node to know in which subgraph it is
-        //console.warn("pk fonction ici ?");
-        //updateNodeMetadataSubgraph(subgraphNetwork.network.value, nodesToRename[node], ID, typeSubgraph);
         // change the name of the node in the subgraph
         return nodesToRename[node];
       }
       return node;
     });
   });
-}
-
-
-
-
-// export function renameIDNode(subgraphNetwork:SubgraphNetwork,oldName:string,newName:string):SubgraphNetwork{
-//   const network = subgraphNetwork.network.value;
-//   if(oldName in network.nodes && !(newName in network.nodes)){
-
-//     // modify node :
-//     // insert new node with new name
-//     network.nodes[newName]=network.nodes[oldName];
-//     const newNode=network.nodes[newName];
-//     newNode.id=newName;
-//     // delete old node
-//     delete network.nodes[oldName];
-
-//     // modify edges :
-//     // when the node is source
-//     const linksOldNodeAsSource = Object.values(network.links).filter((link) => {
-//       return link.source.id === oldName;
-//     });
-//     linksOldNodeAsSource.forEach((link) => {
-//       link.source = newNode;
-//     });
-//     // when the node is target
-//     const linksOldNodeAsTarget = Object.values(network.links).filter((link) => {
-//       return link.target.id === oldName;
-//     });
-//     linksOldNodeAsTarget.forEach((link) => {
-//       link.target = newNode;
-//     });
-
-//     // modify subgraphs :
-//     // in cycles
-//     renameInSubgraph(subgraphNetwork,TypeSubgraph.CYCLE,oldName,newName);
-//     // in main chains
-//     renameInSubgraph(subgraphNetwork,TypeSubgraph.MAIN_CHAIN,oldName,newName);
-//     // in secondary chains
-//     renameInSubgraph(subgraphNetwork,TypeSubgraph.SECONDARY_CHAIN,oldName,newName);
-
-//     return subgraphNetwork;
-
-//   }else{
-//     console.log("Error : impossible to rename node "+oldName+" to "+newName+", node already exist or not found in network.");
-//   }
-// }
-
-// function renameInSubgraph(subgraphNetwork:SubgraphNetwork,typeSubgraph:TypeSubgraph,oldName:string,newName:string){
-//   const subgraphs = subgraphNetwork[typeSubgraph]? subgraphNetwork[typeSubgraph]:{};
-//     Object.entries(subgraphs).forEach(([ID,subgraph])=>{
-//       if(subgraph.nodes.includes(oldName)){
-//         // change the name of the node in the subgraph
-//         subgraph.nodes = subgraph.nodes.map(node => node === oldName ? newName : node);
-//         // change metadata of node to know in which subgraph it is
-//         updateNodeMetadataSubgraph(subgraphNetwork.network.value, newName, ID,typeSubgraph); //newName because the node has been renamed
-//       }
-//     });
-// }
-
+}
\ No newline at end of file
diff --git a/src/composables/LayoutSugiyama.ts b/src/composables/LayoutSugiyama.ts
index 3d8725d23c53c3994749047bb152d53abf8b1e2d..f5cee69119f4e284f18064dad3218c97c65f1e8d 100644
--- a/src/composables/LayoutSugiyama.ts
+++ b/src/composables/LayoutSugiyama.ts
@@ -1,9 +1,6 @@
 // Type imports
-import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
 import { JsonViz } from "../types/FormatJsonViz";
-import { Subgraph } from "../types/Subgraph";
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { Network } from "@metabohub/viz-core/src/types/Network";
 
 // Composable imports
 import { getSepAttributesInches } from "./CalculateSize";
@@ -11,21 +8,12 @@ import {  networkToDOT } from './ConvertFromNetwork';
 import {  changeNetworkFromViz } from './ConvertToNetwork';
 
 // General imports
-//import * as d3 from 'd3';
-import { reactive } from "vue";
-// import cytoscape from 'cytoscape';
-// import fcose from 'cytoscape-fcose';
-// import cosebilkent from 'cytoscape-cose-bilkent';
-import dagre from 'dagrejs';
-import { Graph, instance } from "@viz-js/viz";
+import { instance } from "@viz-js/viz";
 
 
 /**
  * This file contains functions to apply layout algorithms to a network.
  * 
- * -> dagreLayout :
- *      Take a network object and change the (x,y) position of the node with dagre lib
- * 
  * -> vizLayout :
  *      Take a network object and change the (x,y) position of the node with viz lib
  * 
@@ -35,26 +23,6 @@ import { Graph, instance } from "@viz-js/viz";
 
 
 
-
-/** 
- * Take a network object and change the (x,y) position of the node with dagre lib
- * @param {Network}  Network object 
- * @param  graphAttributes for dagre layout (see https://github.com/dagrejs/dagre/wiki)
- * @param [callbackFunction=() => {}] function to do after the layout is done
- */
-// export function dagreLayout(network: Network,graphAttributes={},callbackFunction = () => {}):void {
-
-//     setTimeout(async function() {
-//         let graphDagre = networkToDagre(network,graphAttributes);
-//         dagre.layout(graphDagre);
-//         changeNetworkFromDagre(graphDagre, network).then(() => {
-//             callbackFunction();
-//         });
-//     }, 1);
-        
-// }
-
-
 /** 
  * Take a network object and change the (x,y) position of the node with viz lib
  * @param {Network}  Network object
@@ -65,12 +33,11 @@ import { Graph, instance } from "@viz-js/viz";
  */
 export async function vizLayout(subgraphNetwork:SubgraphNetwork,assignRank:boolean=false, cycle:boolean=true,addNodes:boolean=true,
     groupOrCluster:"group"|"cluster"="cluster",orderChange:boolean=false,printDot:boolean=false,dpi:number=72,factorLenghtEdge:number=3,callbackFunction = () => {}): Promise<SubgraphNetwork> {
-
         await instance().then( async viz => {
         // attributes for viz
         const sep =await getSepAttributesInches(subgraphNetwork.network,subgraphNetwork.networkStyle,factorLenghtEdge);
         subgraphNetwork.attributs={rankdir: "BT" , newrank:true, compound:true,splines:false,ranksep:sep.rankSep,nodesep:sep.nodeSep,dpi:dpi};
-        const dot=networkToDOT(subgraphNetwork,cycle,addNodes,groupOrCluster,orderChange);
+        const dot=await networkToDOT(subgraphNetwork,cycle,addNodes,groupOrCluster,orderChange);
         if(printDot) console.log(dot);
         const json=viz.renderJSON(dot) as JsonViz;
         subgraphNetwork= await changeNetworkFromViz(json,subgraphNetwork,assignRank);
@@ -78,146 +45,3 @@ export async function vizLayout(subgraphNetwork:SubgraphNetwork,assignRank:boole
     });
     return subgraphNetwork;
 }
-
-
-
-/**
- * Applies the force-directed layout algorithm to the given network.
- * Use cytoscapes' cose-bilkent layout.
- * 
- * @param network - The network to apply the layout to.
- * @param networkStyle - The style properties of the network.
- * @param shiftCoord - Optional. Specifies whether to shift the coordinates of the nodes to the top-left corner. Defaults to false.
- * @returns A Promise that resolves to the updated network after applying the layout.
- */
-// export async function forceLayout(network: Network, networkStyle:GraphStyleProperties, shiftCoord: boolean = false): Promise<Network> {
-
-//     //cytoscape.use(fcose);
-//     cytoscape.use(cosebilkent);
-
-//     const size=await getMeanNodesSizePixel(Object.values(network.nodes), networkStyle,false);
-//     const edgeFactor=3;
-//     const edgeLength = Math.max(size.height, size.width) * edgeFactor;
-
-//     const layout ={
-//         name:"cose-bilkent", //fcose
-//         animate: false,
-//         randomize: false,
-//         idealEdgeLength: edgeLength,
-//         nodeRepulsion: 70000, // high number if randomize = false
-//         gravity : 0.001,
-//         numIter: 3000
-
-//     }
-
-//     let cyto = networkToCytoscape(network,true);
-
-//     await new Promise<void>((resolve) => {
-//         cyto.ready(function () {
-//             setTimeout(function () {
-//                 cyto.elements().layout(layout).run();
-//                 resolve();
-//             }, 5000);
-//         });
-//     });
-
-//     if (shiftCoord) {
-//         shiftAllToGetTopLeftCoord(network, networkStyle);
-//     }
-
-//     const json = cyto.json();
-//     changeNetworkFromCytoscape(json, network);
-
-//     return network;
-// }
-  
-  
-
-
-//   /**
-//    * Take a network and apply a d3 force layout algorithm on WITHOUT simulation
-//    * @param network Network object
-//    * @returns {Network} Network object with d3 force layout apply on
-//    */
-//   export async function forceLayout3(network: Network, autoRescale: Boolean = false): Promise<Network> {
-//     const seuil = 0.04;
-//     const maxiter = 1000;
-//     const minMovement = 0.01; 
-//     const listNodesID=Object.keys(network.nodes);
-//     let svgHeight = screen.height;
-//     let svgWidth = screen.width;
-
-//     const simulation = d3.forceSimulation(Object.values(network.nodes))
-//         .force('link', d3.forceLink()
-//             .id((d: any) => d.id)
-//             .links(network.links)
-//         )
-//         .force('charge', d3.forceManyBody())
-//         .velocityDecay(0.1)
-//         .force('center', d3.forceCenter(svgWidth / 2, svgHeight / 2))
-//         .stop();
-
-//     await sendTick();
-
-//     async function sendTick() {
-//         let iter=0;
-//         let lastPositions = new Map(Object.values(network.nodes).map(node => [node.id, { x: node.x, y: node.y }]));
-//         while (iter < maxiter) {
-//             iter++;
-//             simulation.tick();
-
-//             let maxMovement = 0;
-//             for (let nodeID of listNodesID) {
-//                 const node=network.nodes[nodeID];
-//                 const lastPos = lastPositions.get(nodeID);
-//                 const dx = node.x - lastPos.x;
-//                 const dy = node.y - lastPos.y;
-//                 const distance = Math.sqrt(dx * dx + dy * dy);
-
-//                 if (distance > maxMovement) {
-//                     maxMovement = distance;
-//                 }
-
-//                 lastPositions.set(node.id, { x: node.x, y: node.y });
-//             }
-
-//             if (maxMovement < minMovement) {
-//                 console.log('Force layout converged after ' + iter + ' iterations');
-//                 break;
-//             }else{
-//                 console.log(iter);
-//             }
-//         }
-//     }
-
-//     return network;
-// }
-
-  
-// export async function forceLayout2(network: Network, autoRescale: Boolean = false): Promise<Network> {
-//     let svgHeight = screen.height;
-//     let svgWidth = screen.width;
-  
-//     const simulation = d3.forceSimulation(Object.values(network.nodes))
-//       .force('link', d3.forceLink()
-//         .id((d: any) => {
-//           return d.id;
-//         })
-//         .links(network.links)
-//       )
-//       .force('charge', d3.forceManyBody())
-//       .force('center', d3.forceCenter(svgWidth / 2, svgHeight / 2))
-//       .alphaMin(0.4)
-//       .stop();
-  
-//     await sendTick();
-  
-//     async function sendTick() {
-//       for (let i = simulation.alpha(); i > 0.4; i = simulation.alpha()) {
-//         simulation.tick();
-//       }
-//     }
-  
-//     return network;
-  
-//   }
diff --git a/src/composables/MetricsApplication.ts b/src/composables/MetricsApplication.ts
deleted file mode 100644
index 7a6b41be71e258815596a333117dcd2e4b367701..0000000000000000000000000000000000000000
--- a/src/composables/MetricsApplication.ts
+++ /dev/null
@@ -1,329 +0,0 @@
-// import { ref } from "vue";
-// import { getContentFromURL, importNetworkFromURL } from "./importNetwork";
-// import { Network } from "@metabohub/viz-core/src/types/Network";
-// import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
-// import { SubgraphNetwork } from "../types/SubgraphNetwork";
-// import { addSideCompoundAttributeFromList, duplicateSideCompound, putDuplicatedSideCompoundAside } from "./LayoutManageSideCompounds";
-// import { createStaticForceLayout } from "@metabohub/viz-core";
-// import { Parameters,defaultParameters } from "../types/Parameters";
-// import { forceLayout, vizLayout } from "./LayoutSugiyamaForce";
-// import { Algo, PathType } from "../types/EnumArgs";
-// import { countIntersectionEdgeNetwork, countOverlapNodeNetwork, countOverlapNodeEdgeNetwork, countDifferentCoordinatesNodeNetwork, countNodes, countEdges, coefficientOfVariationEdgeLength, analyseDirectorVector } from "./MetricsCalculation";
-// import { TypeSubgraph } from "../types/Subgraph";
-// import { networkToGDSGraph } from "./ConvertFromNetwork";
-// import { allSteps } from "./LayoutMain";
-
-
-// export async function analyseAllJSON(pathListJSON: string,algo:Algo=Algo.DEFAULT,metricGraph:boolean=true): Promise<void> {
-//     const jsonFileString = await getContentFromURL(pathListJSON);
-//     const allJson = jsonFileString.split('\n');
-//     let resultGraphAllJSON: Array<Array<number>> = [];
-//     let resultLayoutAllJSON: Array<Array<number>> = [];
-//     let nameMetrics:{graph:string[],layout:string[]}= {graph:[],layout:[]};
-//     let nameFile: string[] = [];
-
-//     // which layout to apply
-//     let applyLayout: (subgraph: SubgraphNetwork) => Promise<SubgraphNetwork> =defaultApplyLayout;
-//     switch (algo) {
-//         case Algo.FORCE:
-//             console.log('apply Force');
-//             applyLayout = applyForceLayout;
-//             console.warn('Use of timeout so exec time is not accurate (no comparison possible)');
-//             break;
-//         case Algo.VIZ:
-//             console.log('apply Viz');
-//             applyLayout = applyVizLayout;
-//             break;
-//         case Algo.ALGO:
-//             console.log('applyAlgo : default');
-//             applyLayout = applyAlgo;
-//             break;
-//         case Algo.ALGO_V0:
-//             console.log('applyAlgo_V0: no main chain');
-//             applyLayout = applyAlgo_V0;
-//             break;
-//         case Algo.ALGO_V1:
-//             console.log('applyAlgo_V1 : longuest');
-//             applyLayout = applyAlgo_V1;
-//             break;
-//         case Algo.ALGO_V3:
-//             console.log('applyAlgo_V3 : all');
-//             applyLayout = applyAlgo_V3;
-//             break;
-//         default:
-//             console.log('no change');
-//             applyLayout = defaultApplyLayout;
-//             break;
-//     }
-//     let firstJSON=true;
-//     for (const json of allJson) {
-//         console.log(json);
-//         const resultJSON= await analyseJSON(json,metricGraph,applyLayout,false);
-//         if (firstJSON){
-//             nameMetrics.graph=resultJSON.graph.nameMetrics;
-//             nameMetrics.layout=resultJSON.layout.nameMetrics;
-//             firstJSON=false;
-//         }
-//         if (resultJSON.graph !== undefined){
-//             resultGraphAllJSON.push(resultJSON.graph.result);
-//         }
-//         if (resultJSON.layout !== undefined){
-//             nameFile.push(json);
-//             resultLayoutAllJSON.push(resultJSON.layout.result);
-//         }
-       
-//     }  
-
-//     if (metricGraph){
-//         print1DArray(nameMetrics.graph);
-//         print2DArray(resultGraphAllJSON);
-//     }
-//     print1DArray(nameMetrics.layout);
-//     print2DArray(resultLayoutAllJSON);
-
-//     console.warn("If apply metrics on another layout : refresh the page, else results are the same than last time (idk why)");
-//     console.warn('Some metrics are calculated without side compounds');
-// }
-
-
-// async function analyseJSON(json: string, metricGraph:boolean=true, applyLayout: (subgraph: SubgraphNetwork) => Promise<SubgraphNetwork> =defaultApplyLayout,printColumnName:boolean=true):
-//  Promise<{graph:{nameMetrics:string[],result:number[]},layout:{nameMetrics:string[],result:number[]}} | undefined> {
-
-//     // initialize objects
-//     const networkForJSON = ref<Network>({ id: '', nodes: {}, links: [] });
-//     const networkStyleforJSON = ref<GraphStyleProperties>({
-//         nodeStyles: {},
-//         linkStyles: {}
-//     });
-//     let startTime:number;
-//     let endTime:number;
-//     let subgraphNetwork:SubgraphNetwork;
-//     let resultGraph: {nameMetrics:string[],result:number[]}= {nameMetrics:[],result:[]};
-//     let resultLayout:{nameMetrics:string[],result:number[]}= {nameMetrics:[],result:[]};
-
-//     // import network from JSON, and process it
-//     try {
-//         await new Promise<void>((resolve, reject) => {
-//             try {
-//                 importNetworkFromURL(json, networkForJSON, networkStyleforJSON, () => {
-//                     //// Callback function (after network imported) :
-
-//                     // set style (same for all)
-//                     changeNodeStyles(networkStyleforJSON.value);
-//                     // create subgraphNetwork object
-//                     subgraphNetwork={network:networkForJSON,networkStyle:networkStyleforJSON,attributs:{},mainChains:{}};
-//                     // duplicate side compounds 
-//                     addSideCompoundAttributeFromList(subgraphNetwork,"/sideCompounds.txt").then(
-//                         ()=>{
-//                         duplicateSideCompound(subgraphNetwork);
-//                         }
-//                     ).then(
-//                         ()=>{
-//                         // calculate metrics of graph 
-//                         if (metricGraph) {
-//                             const metricsGraph=applyMetricsGraph(subgraphNetwork.network.value,printColumnName); 
-//                             resultGraph.result=metricsGraph.metrics
-//                             resultGraph.nameMetrics=metricsGraph.nameMetrics;
-//                         }
-//                         }
-//                     ).then(
-//                          ()=>{                       
-//                             startTime = performance.now();
-//                         }
-//                     ).then(
-//                         async ()=>{                       
-//                         // apply layout
-//                         subgraphNetwork=await applyLayout(subgraphNetwork);
-//                         }
-//                     ).then(
-//                          ()=>{                       
-//                             endTime = performance.now();
-//                         }
-//                     ).then(
-//                         ()=>{
-//                         // calculate metrics on resulting layout
-//                         const metricsLayout=applyMetricsLayout(subgraphNetwork,true,printColumnName);     
-//                         resultLayout.result= metricsLayout.metrics; 
-//                         resultLayout.nameMetrics=metricsLayout.nameMetrics;          
-//                         resolve();
-//                         }
-//                     );
-                    
-//                 });
-//             } catch (error) {
-//                 reject(error);
-//             }
-//         });
-//     } catch (error) {
-//         console.error("error file : " + json + "\n" + error);
-//         return undefined;
-//     }
-//     // add execution time of layout only (not duplication side compounds)
-//     const executionTime = parseFloat((endTime - startTime).toFixed(3));
-//     if (executionTime) {
-//         resultLayout.result.push(executionTime);
-//         resultLayout.nameMetrics.push('execution time (ms)');
-//     }
-    
-//     return {graph:resultGraph,layout:resultLayout};
-// }
-
-
-// function changeNodeStyles(networkStyle:GraphStyleProperties):void{
-// 	networkStyle.nodeStyles = {
-// 		metabolite: {
-// 			width: 25,
-// 			height: 25,
-// 			fill:  '#FFFFFF',
-// 			shape: 'circle'
-// 		},
-//     sideCompound: {
-// 			width: 12,
-// 			height: 12,
-// 			fill:  '#f0e3e0',
-// 			shape: 'circle'
-// 		},
-// 		reaction: {
-// 			width: 15,
-// 			height: 15,
-// 			fill: "grey",
-// 			shape: 'rect'
-// 		},
-// 		// reversible : {
-// 		// 	fill : "green",
-// 		// 	shape:"inverseTriangle"
-// 		// },
-// 		// reversibleVersion:{
-// 		// 	fill:"red",
-// 		// 	shape: "triangle"
-// 		// }
-
-// 	}
-// }
-
-// function print1DArray(data: Array<string|number|boolean>): void {
-//     const stringData = data.join(',');
-//     console.log(stringData);
-// }
-
-// function print2DArray(data: Array<Array<string|number|boolean>>): void {
-//     const stringData = data.map(row => row.join(',')).join('\n');
-//     console.log(stringData);
-// }
-
-
-
-// const defaultApplyLayout = async (subgraphNetwork: SubgraphNetwork): Promise<SubgraphNetwork> => {
-//     return subgraphNetwork;
-// };
-
-// const applyForceLayout = (subgraphNetwork: SubgraphNetwork): Promise<SubgraphNetwork> => {
-//     const network=subgraphNetwork.network.value;
-//     const styleNetwork= subgraphNetwork.networkStyle.value;
-//     const subgraphNetworkPromise = new Promise<SubgraphNetwork>(async (resolve, reject) => {
-//         try {
-//             await forceLayout(network, styleNetwork, false);
-//             resolve(subgraphNetwork);
-//         } catch (error) {
-//             reject(error);
-//         }
-//     });
-//     return subgraphNetworkPromise;
-// };
-
-// const applyVizLayout = async (subgraphNetwork: SubgraphNetwork): Promise<SubgraphNetwork> => {
-//     let parameters: Parameters = defaultParameters;
-//     const subgraphNetworkPromise = new Promise<SubgraphNetwork>((resolve, reject) => {
-//         resolve(vizLayout(subgraphNetwork, false, false, parameters.addNodes, parameters.groupOrCluster, false, false, parameters.dpi, parameters.numberNodeOnEdge))
-//     })
-//     return subgraphNetworkPromise;
-// };
-
-// const applyAlgo = async (subgraphNetwork: SubgraphNetwork): Promise<SubgraphNetwork> => {
-//     let parameters: Parameters=defaultParameters;
-//     const subgraphNetworkPromise = new Promise<SubgraphNetwork>((resolve, reject) => {
-//         resolve(allSteps(subgraphNetwork,parameters,false));
-//     })
-//     return subgraphNetworkPromise;
-// };
-
-// const applyAlgo_V0 = async (subgraphNetwork: SubgraphNetwork): Promise<SubgraphNetwork> => {
-//     let parameters: Parameters=defaultParameters;
-//     parameters.doMainChain=false;
-//     const subgraphNetworkPromise = new Promise<SubgraphNetwork>((resolve, reject) => {
-//         resolve(allSteps(subgraphNetwork,parameters,false));
-//     })
-//     return subgraphNetworkPromise;
-// };
-
-// const applyAlgo_V1 = async (subgraphNetwork: SubgraphNetwork): Promise<SubgraphNetwork> => {
-//     let parameters: Parameters=defaultParameters;
-//     parameters.pathType=PathType.LONGEST;
-//     const subgraphNetworkPromise = new Promise<SubgraphNetwork>((resolve, reject) => {
-//         resolve(allSteps(subgraphNetwork,parameters,false));
-//     })
-//     return subgraphNetworkPromise;
-// };
-
-// const applyAlgo_V3 = async (subgraphNetwork: SubgraphNetwork): Promise<SubgraphNetwork> => {
-//     let parameters: Parameters=defaultParameters;
-//     parameters.pathType=PathType.ALL;
-//     const subgraphNetworkPromise = new Promise<SubgraphNetwork>((resolve, reject) => {
-//         resolve(allSteps(subgraphNetwork,parameters,false));
-//     })
-//     return subgraphNetworkPromise;
-// };
-
-
-
-
-// export function applyMetricsGraph(network: Network,printColumnName:boolean=true): {nameMetrics:string[],metrics:number[]} {
-//     const networkGDS=networkToGDSGraph(network);
-//     const result: number[]=[];
-
-//     const nameColumnGraph: string[] = ['nodes', 'node not side compound','edges','edge  not side compound', 'hasDirectedCycle' ];
-//     if (printColumnName) print1DArray(nameColumnGraph);
-
-//     // number of nodes
-//     result.push(countNodes(network,true));
-//     // number of nodes not side compounds
-//     result.push(countNodes(network,false));
-//     // number of edges
-//     result.push(countEdges(network,true));
-//     // number of edges not side compounds
-//     result.push(countEdges(network,false));
-//     // has directed cycle
-//     result.push(Number(networkGDS.hasCycle()));
-
-//     return {nameMetrics:nameColumnGraph,metrics:result};
-// }
-
-// export function applyMetricsLayout(subgraphNetwork: SubgraphNetwork, coordAreCenter:boolean=true, printColumnName:boolean=true): {nameMetrics:string[],metrics:number[]} {
-//     const network=subgraphNetwork.network.value;
-//     const networkStyle=subgraphNetwork.networkStyle.value;
-//     const networkGDS=networkToGDSGraph(network);
-//     const result: number[]=[];
-
-//     const nameColumnLayout: string[] = ['node overlap', 'edge node overlap', 'different x (not SD)' ,'different y (not SD)','edge intersections','coef var edge length (no SD)','% colineat axis (not SD)', 'coef var vect dir (not SD)'];
-//     if (printColumnName) print1DArray(nameColumnLayout);
-
-
-//     //number of node overlap
-//     result.push(countOverlapNodeNetwork(network,networkStyle,coordAreCenter));
-//     // number of edge node overlap
-//     result.push(countOverlapNodeEdgeNetwork(network,networkStyle,coordAreCenter));
-//     // number of different x and y coordinates (without side compounds)
-//     const countDiffCoord=countDifferentCoordinatesNodeNetwork(network,networkStyle,coordAreCenter,false);
-//     result.push(countDiffCoord.x);
-//     result.push(countDiffCoord.y);
-//     // number of edges intersections
-//     result.push(countIntersectionEdgeNetwork(network,networkStyle,coordAreCenter));
-//     // variance edge length (without side compounds?)
-//     result.push(coefficientOfVariationEdgeLength(network,networkStyle,coordAreCenter,false));
-//     // direction edge : % of edge colinear to axis and coef of variaton of angle
-//     const resultDirection=analyseDirectorVector(network,networkStyle,coordAreCenter,true,false);
-//     result.push(resultDirection.colinearAxis)
-//     result.push(resultDirection.coefVariation)
-
-//     return {nameMetrics:nameColumnLayout,metrics:result};
-// }
diff --git a/src/composables/MetricsCalculation.ts b/src/composables/MetricsCalculation.ts
deleted file mode 100644
index 522a6d35cd721be8544dae2f33c46497d2a712d7..0000000000000000000000000000000000000000
--- a/src/composables/MetricsCalculation.ts
+++ /dev/null
@@ -1,448 +0,0 @@
-// import { Link } from "@metabohub/viz-core/src/types/Link";
-// import { Network } from "@metabohub/viz-core/src/types/Network";
-// import { Node } from "@metabohub/viz-core/src/types/Node";
-// import { getTopLeftCoordFromCenter, getSizeNodePixel, getCenterCoordFromTopLeft } from "./CalculateSize";
-// import { checkIntersection } from "line-intersect";
-// import { Coordinate,Size } from "../types/CoordinatesSize";
-// import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
-
-// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// //---------------------------------------------------- Utilitary Functions -----------------------------------------------------------//
-// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-// export function getCenterNode(node: Node,networkStyle:GraphStyleProperties,coordAreCenter:boolean=false): Coordinate {
-//     let nodeCenter: {x:number,y:number};
-
-//     if (coordAreCenter) {
-//         nodeCenter={x:node.x,y:node.y};
-//     }else{
-//         nodeCenter=getCenterCoordFromTopLeft(node,networkStyle);
-//     }
-//     return nodeCenter;
-// }
-
-
-// function commonNodeBetween2Links(link1: Link,link2: Link): boolean {
-//     if (link1.source==link2.source || link1.source==link2.target || link1.target==link2.source || link1.target==link2.target) {
-//         return true;
-//     }else {
-//         return false;
-//     }
-// } 
-
-// export function countNodes(network: Network, countSideCompound: boolean = true): number {
-//     if (countSideCompound) {
-//         return Object.keys(network.nodes).length;
-//     } else {
-//         let nodes = 0;
-//         Object.keys(network.nodes).forEach((nodeID) => {
-//             const node = network.nodes[nodeID];
-//             if (!(node.metadata && node.metadata["isSideCompound"])) {
-//                 nodes += 1;
-//             }
-//         });
-//         return nodes;
-//     }
-// }
-
-// export function countEdges(network: Network, countSideCompound: boolean = true): number {
-//     if (countSideCompound) {
-//         return network.links.length;
-//     } else {
-//         let links = 0;
-//         network.links.forEach(link => {
-//             if (!(link.source.metadata && link.source.metadata["isSideCompound"]) && !(link.target.metadata && link.target.metadata["isSideCompound"])) {
-//                 links += 1;
-//             }
-//         });
-//         return links;
-//     }
-// }
-
-// function getNormalizedDirectorVector(link: Link, style: GraphStyleProperties, coordAreCenter: boolean = false): Coordinate {
-
-//     const sourceCenter = getCenterNode(link.source, style, coordAreCenter);
-//     const targetCenter = getCenterNode(link.target, style, coordAreCenter);
-
-//     const dx = targetCenter.x - sourceCenter.x;
-//     const dy = targetCenter.y - sourceCenter.y;
-
-//     const length = edgeLength(link, style, coordAreCenter);
-
-//     if (length === 0) {
-//         return { x: 0, y: 0 }; // Handle case with zero length
-//     }
-
-//     return {
-//         x: parseFloat((dx / length).toFixed(2)),
-//         y:  parseFloat((dy / length).toFixed(2))
-//     };
-// }
-
-// function linkOfSideCompound(link:Link):boolean{
-//     return (link.source.metadata && (link.source.metadata["isSideCompound"]) as boolean) || (link.target.metadata && (link.target.metadata["isSideCompound"]) as boolean);
-// }
-
-
-// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// //-------------------------------------------------------- Node Metrics --------------------------------------------------------------//
-// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-
-// /////////////////////////////////////////////////////
-// // ------------------------- Node overlap
-
-
-// export function countOverlapNodeNetwork(network: Network,networkStyle:GraphStyleProperties,coordAreCenter:boolean=false): number {
-//     let nb=0;
-//     const nodesID=Object.keys(network.nodes);
-
-//     for (let i=0 ; i<nodesID.length ; i++) {
-//         for (let j=i+1 ; j<nodesID.length ; j++) {
-//             // node1
-//             const node1=network.nodes[nodesID[i]];
-//             const coordNode1=getCenterNode(node1,networkStyle,coordAreCenter);
-//             const sizeNode1=getSizeNodePixel(node1,networkStyle);
-//             // node2
-//             const node2=network.nodes[nodesID[j]];
-//             const coordNode2=getCenterNode(node2,networkStyle,coordAreCenter);
-//             const sizeNode2=getSizeNodePixel(node2,networkStyle);
-
-//             if (nodesOverlap(coordNode1,sizeNode1,coordNode2,sizeNode2)){
-//                 nb+=1;
-//             }
-//         }
-//     }
-//     return nb;
-// }
-
-
-
-// function nodesOverlap(coord1: Coordinate, size1: Size, coord2: Coordinate, size2: Size): boolean {
-
-//     // coordinate are center
-
-//     if ( !size1.width || !size1.height || !size2.width || !size2.height || !coord1.x || !coord1.y || !coord2.x || !coord2.y) {
-//         // Handle null or undefined inputs appropriately
-//         return false;
-//     }
-
-//     // rectangle 1
-//     const left1 = coord1.x - size1.width / 2;
-//     const right1 = coord1.x + size1.width / 2;
-//     const top1 = coord1.y - size1.height / 2;
-//     const bottom1 = coord1.y + size1.height / 2;
-
-//     // rectangle 2
-//     const left2 = coord2.x - size2.width / 2;
-//     const right2 = coord2.x + size2.width / 2;
-//     const top2 = coord2.y - size2.height / 2;
-//     const bottom2 = coord2.y + size2.height / 2;
-
-//     // overlap?
-//     const overlapX = left1 < right2 && right1 > left2;
-//     const overlapY = top1 < bottom2 && bottom1 > top2;
-
-//     return overlapX && overlapY;
-// }
-
-
-// /////////////////////////////////////////////////////
-// // ------------------------- Node on edge
-
-
-
-// export function countOverlapNodeEdgeNetwork(network: Network,networkStyle:GraphStyleProperties,coordAreCenter:boolean=false): number {
-//     let nb=0;
-//     const nodesID=Object.keys(network.nodes);
-//     nodesID.forEach( (nodeID) =>{
-
-//         const node=network.nodes[nodeID];
-//         const coordNode1=getCenterNode(node,networkStyle,coordAreCenter);
-//         const sizeNode=getSizeNodePixel(node,networkStyle);
-//         nb += countOverlapEdgeForNode(network,networkStyle,nodeID,coordNode1,sizeNode,coordAreCenter);
-
-//     });
-
-//     return nb;
-// }
-
-// function countOverlapEdgeForNode(network:Network,networkStyle:GraphStyleProperties,nodeID:string,coordNode:Coordinate,sizeNode:Size,coordAreCenter:boolean=false): number {
-//     let nb=0;
-
-//     network.links.forEach(link => {        
-//         // if node not linked to the edge : check if it is on the edge
-//         if(!(link.source.id==nodeID || link.target.id==nodeID)){
-
-//             let coordSource=getCenterNode(link.source,networkStyle,coordAreCenter);
-//             let coordTarget=getCenterNode(link.target,networkStyle,coordAreCenter);
-
-//             if (nodeEdgeOverlap(coordNode,sizeNode,coordSource,coordTarget)){
-//                 nb+=1;
-//             }
-//         }
-//     });
-//     return nb;
-// }
-
-
-// function nodeEdgeOverlap(centerCoordNode: Coordinate, sizeNode: Size, coordSource: Coordinate, coordTarget: Coordinate): boolean { // CORRIGER !!!!!
-    
-//     // Treat the node as a rectangle (coordinates are center of node)
-//     const rect = {
-//         left: centerCoordNode.x - sizeNode.width / 2,
-//         right: centerCoordNode.x + sizeNode.width / 2,
-//         top: centerCoordNode.y - sizeNode.height / 2,
-//         bottom: centerCoordNode.y + sizeNode.height / 2
-//     };
-
-//     // Check if any of the edge's endpoints is inside the rectangle => same as node overlap (to suppress ?)
-//     const isPointInsideRect = (point: Coordinate) => 
-//         point.x >= rect.left && point.x <= rect.right && point.y >= rect.top && point.y <= rect.bottom;
-
-//     if (isPointInsideRect(coordSource) || isPointInsideRect(coordTarget)) {
-//         return true; // One of the endpoints is inside the rectangle
-//     }
-
-//     // Check for overlap between the edge and the sides of the rectangle
-//     // Convert the sides of the rectangle into line segments
-//     const rectangleEdges = [
-//         { start: { x: rect.left, y: rect.top }, end: { x: rect.right, y: rect.top } }, // Top
-//         { start: { x: rect.right, y: rect.top }, end: { x: rect.right, y: rect.bottom } }, // Right
-//         { start: { x: rect.left, y: rect.bottom }, end: { x: rect.right, y: rect.bottom } }, // Bottom
-//         { start: { x: rect.left, y: rect.top }, end: { x: rect.left, y: rect.bottom } } // Left
-//     ];
-
-//     // Use checkIntersection function to check if two line segments intersect
-//     for (const edge of rectangleEdges) {
-//         const result = checkIntersection(edge.start.x,edge.start.y, edge.end.x,edge.end.y, coordSource.x, coordSource.y,coordTarget.x,coordTarget.y);
-//         if (result.type === "intersecting") {
-//             return true; // There is an overlap
-//         }
-//     }
-
-//     return false; // No overlap detected
-// }
-
-
-// /////////////////////////////////////////////////////
-// // ------------------------- Node different coordinates
-
-// export function countDifferentCoordinatesNodeNetwork(network: Network, networkStyle: GraphStyleProperties, coordAreCenter: boolean = false, countSideCompound:boolean=true,roundAt: number = 2): { x: number, y: number } {
-//     let uniqueX = new Set<number>();
-//     let uniqueY = new Set<number>();
-
-//     Object.keys(network.nodes).forEach((nodeID) => {
-//         const node = network.nodes[nodeID];
-//         // Do not count side compounds if countSideCompound is false
-//         if (countSideCompound ||  !(node.metadata && node.metadata["isSideCompound"])) {
-//             const coordNode = getCenterNode(node, networkStyle, coordAreCenter);
-            
-//             // Round the coordinates based on roundAt
-//             const roundedX = parseFloat(coordNode.x.toFixed(roundAt));
-//             const roundedY = parseFloat(coordNode.y.toFixed(roundAt));
-            
-//             uniqueX.add(roundedX);
-//             uniqueY.add(roundedY);
-//         }
-//     });
-
-//     return { x: uniqueX.size, y: uniqueY.size };
-// }
-
-// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// //-------------------------------------------------------- Edge Metrics --------------------------------------------------------------//
-// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-
-// /////////////////////////////////////////////////////
-// // ------------------------- Edge intersection
-// // (overlap not taken into account)
-
-
-// /**
-//  * Counts how many crossings are in a network
-//  * @param network the network
-//  * @returns the number of crossings
-//  */
-// export function countIntersectionEdgeNetwork(network: Network,style:GraphStyleProperties,coordAreCenter:boolean=false): number {
-//     let nb: number = 0;
-//     for (let i=0 ; i<network.links.length ; i++) {
-//         for (let j=i+1 ; j<network.links.length ; j++) {
-//             const link1=network.links[i];
-//             const link2=network.links[j];
-//             if (edgesIntersect(link1, link2,style,coordAreCenter)){
-//                 nb++;
-//             }
-//         }
-//     }
-//     return nb;
-// }
-
-// function edgesIntersect(link1: Link, link2: Link,style:GraphStyleProperties,coordAreCenter:boolean=false): boolean {
-
-//     // Case of common node
-//     if (commonNodeBetween2Links(link1,link2)) {
-//         return false;
-//     }
-
-//     // Get center of node : where the link is attached
-//     const node1Center=getCenterNode(link1.source,style,coordAreCenter);
-//     const node2Center=getCenterNode(link1.target,style,coordAreCenter);
-//     const node3Center=getCenterNode(link2.source,style,coordAreCenter);
-//     const node4Center=getCenterNode(link2.target,style,coordAreCenter);
-
-
-//     // Check intersection
-//     const result = checkIntersection(node1Center.x, node1Center.y, node2Center.x, node2Center.y, node3Center.x, node3Center.y, node4Center.x, node4Center.y);
-//     if (result.type == "intersecting") {
-//         return true;
-//     } else {
-//         return false;
-//     }
-    
-// }
-
-// /////////////////////////////////////////////////////
-// // ------------------------- Edge length
-
-
-// export function coefficientOfVariationEdgeLength(network: Network,style:GraphStyleProperties,coordAreCenter:boolean=false,includeSideCompounds:boolean=true): number {
-
-//     let links = network.links;
-
-//     if (!includeSideCompounds) {
-//         links = links.filter(link => 
-//             !(link.source.metadata && link.source.metadata["isSideCompound"]) && 
-//             !(link.target.metadata && link.target.metadata["isSideCompound"])
-//         );
-//     }
-
-//     if (links.length === 0) {
-//         return 0; // Handle case with no edge 
-//     }
-
-//     const lengths = links.map(link => edgeLength(link, style, coordAreCenter));
-    
-//     const mean = lengths.reduce((a, b) => a + b, 0) / lengths.length;
-//     if (mean === 0) {
-//         return 0; // Handle case with no edge lengths
-//     }
-//     const variance = lengths.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / lengths.length;
-//     const stdDeviation = Math.sqrt(variance);
-//     const coefVariation = stdDeviation / Math.abs(mean);
-//     return parseFloat(coefVariation.toFixed(3));
-// }
-
-// function edgeLength(link: Link,style:GraphStyleProperties,coordAreCenter:boolean=false): number {
-//     const sourceCenter=getCenterNode(link.source,style,coordAreCenter);
-//     const targetCenter=getCenterNode(link.target,style,coordAreCenter);
-
-//     const dx = sourceCenter.x - targetCenter.x;
-//     const dy = sourceCenter.y - targetCenter.y;
-//     return Math.sqrt(dx * dx + dy * dy);
-// }
-
-
-
-// /////////////////////////////////////////////////////
-// // ------------------------- Edge colinear with axis 
-// // => function used with edge direction
-
-// function calculateNormalizedDirectorVectors(links: Link[], style: GraphStyleProperties, coordAreCenter: boolean = false,includeSideCompounds:boolean=true): Coordinate[] {
-//     const vectors: Coordinate[] = [];
-
-//     links.forEach(link => {
-//         if (includeSideCompounds || !linkOfSideCompound(link)){
-//             const normalizedVector = getNormalizedDirectorVector(link, style, coordAreCenter);
-//             vectors.push(normalizedVector);
-//         }
-       
-//     });
-
-//     return vectors;
-// }
-
-// function isColinearAxisNetwork(vector:Coordinate): boolean {
-//         return vector.x === 0 || vector.y === 0;
-// }
-
-// function countEdgeColinearAxisNetwork(vectors:Coordinate[], pourcentage:boolean=false): number {
-
-//     if (vectors.length === 0) {
-//         return 0;
-//     }
-
-//     let count = 0;
-//     vectors.forEach(vector => {
-//         if (isColinearAxisNetwork(vector)) {
-//             count += 1;
-//         }
-//     });
-//     if (pourcentage) {
-//         return parseFloat((count / vectors.length).toFixed(2));
-//     }
-//     return count;
-// }
-
-
-// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// //-------------------------------------------------------- Domain Metrics --------------------------------------------------------------//
-// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-// // WHEN CLEAN : fonction that said if sidecompound or not
-
-// /////////////////////////////////////////////////////
-// // ------------------------- Edge direction
-
-// export function analyseDirectorVector(network: Network, style: GraphStyleProperties, coordAreCenter: boolean = false, pourcentageColinearAxis:boolean=false, includeSideCompounds:boolean=true):{colinearAxis:number,coefVariation:number} { 
-    
-//     const result: { colinearAxis: number, coefVariation: number } = { colinearAxis: undefined, coefVariation: undefined };
-
-//     let links = network.links;
-
-//     if (!includeSideCompounds) {
-//         links = links.filter(link => 
-//             !(link.source.metadata && link.source.metadata["isSideCompound"]) && 
-//             !(link.target.metadata && link.target.metadata["isSideCompound"])
-//         );
-//     }
-    
-//     // get all normalized director vectors
-//     const vectors = calculateNormalizedDirectorVectors(links, style, coordAreCenter,includeSideCompounds);
-//     if (vectors.length==0) return { colinearAxis: 0, coefVariation: 0 }
-
-//     // count colinear with axis
-//     result.colinearAxis = countEdgeColinearAxisNetwork(vectors,pourcentageColinearAxis);
-
-//     // coeficient of variation of angle
-
-//      // calculate angles of vectors
-//      const angles = vectors.map(vector => Math.atan2(vector.y, vector.x));
-
-//      // calculate mean of angles
-//      const mean = angles.reduce((a, b) => a + b, 0) / angles.length;
-//      if (mean === 0) {
-//          result.coefVariation = 0; // Handle case with no angles
-//          return result;
-//      }
- 
-//      // calculate variance of angles
-//      const variance = angles.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / angles.length;
- 
-//      // calculate standard deviation
-//      const stdDeviation = Math.sqrt(variance);
- 
-//      // calculate coefficient of variation
-//      const coefVariation = stdDeviation / mean;
-//      result.coefVariation = parseFloat(coefVariation.toFixed(2));
- 
-//      return result;
-
-// }
-
-
diff --git a/src/composables/SBMLtoJSON.ts b/src/composables/SBMLtoJSON.ts
deleted file mode 100644
index 4a16b9f44e1b8c9f6b7aef8516e35d670a040e66..0000000000000000000000000000000000000000
--- a/src/composables/SBMLtoJSON.ts
+++ /dev/null
@@ -1,160 +0,0 @@
-// import { parseString } from 'xml2js';
-// import type { JSONGraphFormat, XMLSpecies, XMLReactions } from '../types/JSONGraphFormat';
-
-// /**
-//  * Return a number between min (inclusive) and max (inclusive)
-//  * @param min 
-//  * @param max 
-//  * @returns a number
-//  */
-// function getRandomInt(min: number, max: number): number {
-//     min = Math.ceil(min);
-//     max = Math.floor(max);
-//     return Math.floor(Math.random() * (max - min + 1)) + min;
-// }
-
-// /**
-//  * Convert an xml graph into a JSON graph format
-//  * @param sbmlString the xml file as a string
-//  * @returns the graph as a Promise 
-//  */
-// export async function sbml2json(sbmlString: string): Promise<JSONGraphFormat> {
-//     return new Promise((resolve, reject) => {
-//         parseString(sbmlString, { explicitArray: false }, (err, result) => {
-//             if (err) {
-//                 console.log("Error during the parsing of the file");
-//                 console.log(err);
-//                 reject(err);
-//             } else {
-//                 const model = result.sbml.model;
-//                 // graph to return
-//                 const graph: JSONGraphFormat = {
-//                     graph: {
-//                         id: model.$.id,
-//                         type: 'metabolic',
-//                         metadata: {
-//                             style: {
-//                                 nodeStyles: {
-//                                     metabolite: {
-//                                         width: 25,
-//                                         height: 25,
-//                                         strokeWidth: 1,
-//                                         shape: 'circle'
-//                                     },
-//                                     reaction: {
-//                                         width: 15,
-//                                         height: 15,
-//                                         strokeWidth: 0.5,
-//                                         shape: 'rect',
-//                                         fill: 'grey'
-//                                     },
-//                                     reversible: {
-//                                         fill: 'green',
-//                                         shape: 'inverseTriangle'
-//                                     },
-//                                     reversibleVersion: {
-//                                         fill: 'red',
-//                                         shape: 'triangle'
-//                                     }
-//                                 }
-//                             }
-//                         },
-//                         nodes: {},
-//                         edges: []
-//                     }
-//                 };
-
-//                 // Transform species to nodes
-//                 const speciesList = model.listOfSpecies.species;
-//                 // add a metabolite node for each species
-//                 speciesList.forEach((species: XMLSpecies) => {
-//                     graph.graph.nodes[species.$.id] = {
-//                         id: species.$.id,
-//                         metadata: {
-//                             classes: ['metabolite'],
-//                             position: {
-//                                 x: getRandomInt(0, 100),
-//                                 y: getRandomInt(0, 100)
-//                             }
-//                         },
-//                         label: species.$.name
-//                     };
-//                 });
-
-//                 // Transform reactions to nodes and edges
-//                 const reactions = model.listOfReactions.reaction;
-//                 reactions.forEach((reaction: XMLReactions) => {
-//                     const reactionId = reaction.$.id;
-                    
-//                     let classReversible :string;
-//                     const isReversible=reaction.$.reversible;
-//                     if (isReversible==="true"){
-//                         classReversible = "reversible";
-//                     }else{
-//                         classReversible = "irreversible";
-//                     }
-
-//                     // get the reactants and products for every reaction
-//                     const reactants: string[] = [];
-//                     if (reaction.listOfReactants.speciesReference != undefined && (reaction.listOfReactants.speciesReference as Partial<XMLSpecies>[]).length != undefined) {
-//                         // type : array
-//                         (reaction.listOfReactants.speciesReference as Partial<XMLSpecies>[]).forEach((ref: Partial<XMLSpecies>) => {
-//                             reactants.push(ref.$.species);
-//                         });
-//                     } else if (reaction.listOfReactants.speciesReference != undefined) {
-//                         // type : object
-//                         reactants.push((reaction.listOfReactants.speciesReference as Partial<XMLSpecies>).$.species);
-//                     }
-//                     const products: string[] = [];
-//                     if (reaction.listOfProducts.speciesReference != undefined && (reaction.listOfProducts.speciesReference as Partial<XMLSpecies>[]).length != undefined) {
-//                         // type : array
-//                         (reaction.listOfProducts.speciesReference as Partial<XMLSpecies>[]).forEach((ref: Partial<XMLSpecies>) => {
-//                             products.push(ref.$.species);
-//                         });
-//                     } else if (reaction.listOfProducts.speciesReference != undefined) {
-//                         // type : object
-//                         products.push((reaction.listOfProducts.speciesReference as Partial<XMLSpecies>).$.species);
-//                     }
-
-//                     // add the reaction as a node
-//                     graph.graph.nodes[reactionId] = {
-//                         id: reactionId,
-//                         metadata: {
-//                             classes: ['reaction',classReversible],
-//                             position: {
-//                                 x: getRandomInt(0, 100),
-//                                 y: getRandomInt(0, 100)
-//                             }
-//                         },
-//                         label: reaction.$.name
-//                     };
-
-//                     // add the edges for the reaction and its reactants and products
-//                     reactants.forEach((reactant: string) => {
-//                         graph.graph.edges.push({
-//                             id: `${reactant}--${reactionId}`,
-//                             source: reactant,
-//                             target: reactionId,
-//                             metadata: {
-//                                 classes: [classReversible]
-//                             }
-//                         });
-//                     });
-//                     products.forEach((product: string) => {
-//                         graph.graph.edges.push({
-//                             id: `${reactionId}--${product}`,
-//                             source: reactionId,
-//                             target: product,
-//                             metadata: {
-//                                 classes: [classReversible]
-//                             }
-//                         });
-//                     });
-//                 });
-
-//                 // return the graph object
-//                 resolve(graph);
-//             }
-//         });
-//     });
-// }
diff --git a/src/composables/SubgraphForViz.ts b/src/composables/SubgraphForViz.ts
index 428288d3d5258c10eeabd57f89714a293d9fe57d..d63934be39276255dcbc3258c00a16b981cead47 100644
--- a/src/composables/SubgraphForViz.ts
+++ b/src/composables/SubgraphForViz.ts
@@ -1,7 +1,7 @@
 // Type imports
-import {  TypeSubgraph } from "../types/Subgraph";
+import { TypeSubgraph } from "../types/Subgraph";
 import { SubgraphNetwork } from "../types/SubgraphNetwork";
-import { SubgraphViz } from "../types/VizType";
+import { SubgraphViz } from "../types/TypeViz";
 
 
 // General imports
@@ -72,7 +72,6 @@ export function addMainChainForViz(vizGraph: Graph, nameMainChain: string, subgr
         vizGraph.subgraphs = [];
     }
     vizGraph.subgraphs.push(clusterViz);
-
     return vizGraph;
 }
 
@@ -96,7 +95,6 @@ function changeCycleMetanodes(subgraphNetwork:SubgraphNetwork,listNodeBefore:str
         let cycle:string;
         if (network.nodes[node].metadataLayout && network.nodes[node].metadataLayout[TypeSubgraph.CYCLEGROUP]){
             cycle = network.nodes[node].metadataLayout[TypeSubgraph.CYCLEGROUP]; 
-            //cycle=inBiggerCycle(cycle,subgraphNetwork)
             if(!(listNodeAfter.includes(cycle))){
                 // push node cycle
                 listNodeAfter.push(cycle);
diff --git a/src/composables/VizCoreFunctions.ts b/src/composables/VizCoreFunctions.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c4e1928674b92a64d701e0a6b605c6b0fea2eda0
--- /dev/null
+++ b/src/composables/VizCoreFunctions.ts
@@ -0,0 +1,122 @@
+// Type imports
+import { GraphStyleProperties, Network, Node } from  "../types/TypeVizCore";
+
+
+
+/*******************************************************************************************************************************************************/
+//___________________________________________________0.  Node duplication _________________________________________________________________________
+
+
+/**
+ * Duplicate all nodes according to a specific metadata attribut
+ * @param network Network object that contains all nodes
+ * @param attribut Metadata attribut of node. Must be a boolean
+ */
+export function duplicateAllNodesByAttribut(network: Network, networkStyle: GraphStyleProperties, attribut: string): void {
+    Object.keys(network.nodes).forEach((nodeID: string) => {
+      const node = network.nodes[nodeID] as Node;
+      if (node.metadata && node.metadata[attribut]) {
+        const checkAtt = node.metadata[attribut] as boolean;
+        if (checkAtt) {
+          duplicateNode(nodeID, network, networkStyle);
+        }
+      }
+    });
+  }
+
+
+  /**
+ * Duplicate specific node in network object
+ * @param nodeId Node id
+ * @param network Network object
+ * @param networkStyle Style object
+ */
+export function duplicateNode(nodeId: string, network: Network, networkStyle: GraphStyleProperties): void {
+    if (network.nodes[nodeId]) {
+      const linksIndex = [] as Array<number>;
+      const originalNode = network.nodes[nodeId];
+  
+      if (networkStyle.nodeStyles) {
+        networkStyle.nodeStyles['duplicate'] = {
+          fill: '#FFFFFF',
+          height: 10,
+          width: 10,
+          shape: 'circle',
+        }
+      } else {
+        networkStyle['nodeStyles'] = {
+          duplicate: {
+            fill: '#FFFFFF',
+            height: 10,
+            width: 10,
+            shape: 'circle',
+          }
+        }
+      }
+  
+      network.links.forEach((link) => {
+        if (link.source.id === nodeId || link.target.id === nodeId) {
+          const index = network.links.indexOf(link);
+          linksIndex.push(index);
+        }
+      });
+  
+      for (let i = 0; i < linksIndex.length; i++) {
+        
+        const newNode: Node = {
+          id: nodeId + i,
+          classes: ['duplicate'],
+          label: originalNode.label,
+          x: 0,
+          y: 0
+        };
+  
+        const index = linksIndex[i];
+  
+        if (network.links[index].source.id === nodeId) {
+          newNode.x = originalNode.x - ((originalNode.x - network.links[index].target.x) / 2);
+          newNode.y = originalNode.y - ((originalNode.y - network.links[index].target.y) / 2);
+          network.links[index].source = newNode;
+        }
+  
+        if (network.links[index].target.id === nodeId) {
+          newNode.x = originalNode.x - ((originalNode.x - network.links[index].source.x) / 2);
+          newNode.y = originalNode.y - ((originalNode.y - network.links[index].source.y) / 2);
+          network.links[index].target = newNode
+        }
+  
+        network.nodes[nodeId+i] = newNode;
+      }
+  
+      delete network.nodes[nodeId];
+    }
+  }
+  
+
+
+/*******************************************************************************************************************************************************/
+//___________________________________________________1.  Node suppresion _________________________________________________________________________
+
+
+/**
+ * Remove a list of nodes from network object
+ * @param listId Array of nodes id
+ * @param network Network object
+ */
+export function removeAllSelectedNodes(listId: Array<string>, network: Network): void {
+    listId.forEach((nodeId: string) => {
+      if (Object.keys(network.nodes).includes(nodeId)) {
+        delete network.nodes[nodeId];
+  
+        const links = network.links.filter((link) => {
+          if (link.source.id !== nodeId && link.target.id !== nodeId) {
+            return link;
+          }
+        });
+    
+        network.links = links;
+      }
+    });
+}
+  
+  
\ No newline at end of file
diff --git a/src/composables/__tests__/AlgorithmBFS.test.ts b/src/composables/__tests__/AlgorithmBFS.test.ts
index c3fb0864225d064b6c16a428060cfda0250776ea..80fc7b7415da5a38ec2801ddcc5d63f289393491 100644
--- a/src/composables/__tests__/AlgorithmBFS.test.ts
+++ b/src/composables/__tests__/AlgorithmBFS.test.ts
@@ -1,6 +1,6 @@
 // Types imports
 import { StartNodesType } from "../../types/EnumArgs";
-import { Network } from "@metabohub/viz-core/src/types/Network";
+import { Network } from  "../../types/TypeVizCore";
 
 // Composable imports
 import * as CalculateStartNodes from "../CalculateStartNodes";
diff --git a/src/composables/__tests__/AlgorithmDFS.test.ts b/src/composables/__tests__/AlgorithmDFS.test.ts
index c9bc05fca11699f843e20990fa190415660d0534..203d358715ef6aa7517affa104ea8af3cf4edd2c 100644
--- a/src/composables/__tests__/AlgorithmDFS.test.ts
+++ b/src/composables/__tests__/AlgorithmDFS.test.ts
@@ -1,7 +1,5 @@
 // Types imports
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Link } from "@metabohub/viz-core/src/types/Link";
-import { Node } from "@metabohub/viz-core/src/types/Node";
+import { Network, Node, Link } from "../../types/TypeVizCore";
 import { StartNodesType } from "../../types/EnumArgs";
 
 
@@ -102,6 +100,7 @@ describe('AlgorithmDFS', () => {
         it('should return a DFS order, when no directed cycle', async () => {
 
             // MOCK
+            const removeEdgeMock = jest.fn();
             const networkToGDSGraphMock = jest.spyOn(ConvertFromNetwork, 'networkToGDSGraph');
             networkToGDSGraphMock.mockImplementation(async () => {
                     return Promise.resolve({
@@ -126,7 +125,7 @@ describe('AlgorithmDFS', () => {
                                     return [];
                             }
                         }),
-                        removeEdge: jest.fn()
+                        removeEdge: removeEdgeMock
                     });
                    
             });
@@ -149,15 +148,14 @@ describe('AlgorithmDFS', () => {
 
             // EXPECT
             expect(result.dfs).toEqual([ 'A', 'C', 'E', 'B', 'D' ]);
-            //expect(true).toBe(false); // need to check if no edge removed
-            console.warn('need to check if edge removed : modify test');
-
+            expect(removeEdgeMock).not.toHaveBeenCalled();
 
 
         });
 
         it('should return a DFS order and a graph without cycles, when directed cycle', async () => {
              // MOCK
+             const removeEdgeMock = jest.fn();
              const networkToGDSGraphMock = jest.spyOn(ConvertFromNetwork, 'networkToGDSGraph');
              networkToGDSGraphMock.mockImplementation(async () => {
                      return Promise.resolve({
@@ -182,7 +180,7 @@ describe('AlgorithmDFS', () => {
                                      return [];
                              }
                          }),
-                         removeEdge: jest.fn()
+                         removeEdge: removeEdgeMock
                      });
                     
              });
@@ -206,14 +204,11 @@ describe('AlgorithmDFS', () => {
 
             // EXPECT
             expect(result.dfs).toEqual([ 'A', 'C', 'E', 'B', 'D' ]);
-            //expect(true).toBe(false); // need to check if edge removed
-            console.warn('need to check if edge removed : modify test');
-
+            expect(removeEdgeMock).toHaveBeenCalled();
 
         });
 
        
-       
     });
 
 });
diff --git a/src/composables/__tests__/CalculateOverlaps.test.ts b/src/composables/__tests__/CalculateOverlaps.test.ts
index 4e918baeb017642946bdc319b4f68b425741efcc..5412c4a180cc8af2c59cb0360ef36ea871e016e9 100644
--- a/src/composables/__tests__/CalculateOverlaps.test.ts
+++ b/src/composables/__tests__/CalculateOverlaps.test.ts
@@ -1,15 +1,17 @@
 // Type import
-import { Node } from '@metabohub/viz-core/src/types/Node';
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Link } from '@metabohub/viz-core/src/types/Link';
-import { GraphStyleProperties } from '@metabohub/viz-core/src/types/GraphStyleProperties';
-import { Coordinate, Size } from '../../types/CoordinatesSize';
+import { GraphStyleProperties, Network } from "../../types/TypeVizCore";
 
 
 // Composable imports
 import * as CalculateSize from '../CalculateSize';
 import * as CalculateOverlaps from '../CalculateOverlaps';
 
+// General imports
+import { checkIntersection } from 'line-intersect';
+
+jest.mock("line-intersect", () => ({
+    checkIntersection: jest.fn(),
+  }));
 
 describe('CalculateOverlaps', () => {
 
@@ -30,6 +32,9 @@ describe('CalculateOverlaps', () => {
 
     describe('isIntersectionGraph', () => {
         it('should return false when there are no intersecting edges', () => {
+            // MOCK
+            checkIntersection.mockImplementationOnce(() => {return {type:"none"}});
+
             // DATA
             const nodes = {
                 A: {x: 0, y: 0},
@@ -47,9 +52,13 @@ describe('CalculateOverlaps', () => {
 
             // EXPECT
             expect(result).toBe(false);
+            expect(checkIntersection).toHaveBeenCalledTimes(1);
         });
 
         it('should return true when edges intersect', () => {
+            // MOCK
+            checkIntersection.mockImplementationOnce(() => {return {type:"intersecting"}});
+
             // DATA
             const nodes = {
                 A: {x: 0, y: 0},
@@ -67,6 +76,8 @@ describe('CalculateOverlaps', () => {
 
             // EXPECT
             expect(result).toBe(true);
+            expect(checkIntersection).toHaveBeenCalledTimes(1);
+
         });
 
         it('should return false when edges as a common end', () => {
@@ -87,6 +98,8 @@ describe('CalculateOverlaps', () => {
 
             // EXPECT
             expect(result).toBe(false);
+            expect(checkIntersection).not.toHaveBeenCalled();
+
         });
 
     });
@@ -95,6 +108,7 @@ describe('CalculateOverlaps', () => {
 
 
         it('should return false when nodes do not overlap', () => {
+            
             // DATA
             const nodesPosition = {
                 A: {x: 0, y: 0},
@@ -174,6 +188,9 @@ describe('CalculateOverlaps', () => {
     describe('isOverlapNodesEdges', () => {
 
         it('should return false when no node overlaps with any edge', () => {
+            // MOCK
+            checkIntersection.mockImplementation(() => {return {type:"none"}});
+
             // DATA
             const nodesPosition = {
                 A: {x: 0, y: 0},
@@ -199,9 +216,18 @@ describe('CalculateOverlaps', () => {
     
             // EXPECT
             expect(result).toBe(false);
+            expect(checkIntersection).toHaveBeenCalledTimes(4);
+
+            checkIntersection.mockClear();
         });
     
         it('should return true when a node overlaps with an edge', () => {
+            // MOCK
+            checkIntersection.mockImplementationOnce(() => {return {type:"none"}})
+            .mockImplementationOnce(() => {return {type:"none"}})
+            .mockImplementationOnce(() => {return {type:"intersecting"}})
+            .mockImplementation(() => {return {type:"none"}});
+
             const nodesPosition = {
                 A: {x: 0, y: 0},
                 B: {x: 100, y: 0},
@@ -226,6 +252,8 @@ describe('CalculateOverlaps', () => {
     
             // EXPECT
             expect(result).toBe(true);
+            expect(checkIntersection.mock.calls.length).toBeGreaterThanOrEqual(1);
+            expect(checkIntersection.mock.calls.length).toBeLessThanOrEqual(4);
         });
 
         it('should return true when a node overlaps with an edge because end of edge inside node', () => {
@@ -253,6 +281,9 @@ describe('CalculateOverlaps', () => {
     
             // EXPECT
             expect(result).toBe(true);
+            expect(checkIntersection).not.toHaveBeenCalled();
+
+            checkIntersection.mockClear();
         });
     });
     
diff --git a/src/composables/__tests__/CalculateRelationCycle.test.ts b/src/composables/__tests__/CalculateRelationCycle.test.ts
index 89b2fe2943ca8ca2c8f86d7e046697cfdebb2863..6ad6e6ead41a2aec7608c0a18b2165ec4b72b628 100644
--- a/src/composables/__tests__/CalculateRelationCycle.test.ts
+++ b/src/composables/__tests__/CalculateRelationCycle.test.ts
@@ -3,7 +3,7 @@ import { SubgraphNetwork } from '../../types/SubgraphNetwork';
 import { Subgraph, TypeSubgraph } from '../../types/Subgraph';
 import { LinkLayout, NetworkLayout, NodeLayout } from '../../types/NetworkLayout';
 import { Coordinate } from '../../types/CoordinatesSize';
-import { GraphStyleProperties } from '@metabohub/viz-core/src/types/GraphStyleProperties';
+import { GraphStyleProperties } from "../../types/TypeVizCore";
 import { Ordering } from '../../types/EnumArgs';
 
 // Composable imports
@@ -60,12 +60,12 @@ describe('CalculateRelationCycle', () => {
 // 0. Get nodes *****************************************************************
 
     describe('getNodesIDPlacedInGroupCycle', () => {
-        it('should throw error because cycle group not defined in subgraphNetwork when trying to get node id placed inside ', () => {
+        it('should throw error because cycle group not defined in subgraphNetwork when trying to get node id placed inside ', async () => {
             // EXPECT
-            expect(()=>{CalculateRelationCycle.getNodesIDPlacedInGroupCycle(subgraphNetwork,"groupCycle")}).toThrow();
-
+            await expect(CalculateRelationCycle.getNodesIDPlacedInGroupCycle(subgraphNetwork, "groupCycle")).rejects.toThrow();
         });
-        it('should get nodes id placed inside group cycle ', () => {
+
+        it('should get nodes id placed inside group cycle ', async() => {
             // DATA
             const cycleGroup:Subgraph={
                 name: "groupCycle",
@@ -77,19 +77,18 @@ describe('CalculateRelationCycle', () => {
                 type: TypeSubgraph.CYCLEGROUP
             };
 
-            subgraphNetwork[TypeSubgraph.CYCLEGROUP]={};
-            subgraphNetwork[TypeSubgraph.CYCLEGROUP]["groupCycle"] = cycleGroup;
-
+            subgraphNetwork[TypeSubgraph.CYCLEGROUP]={groupCycle:cycleGroup};
             const nodesIDExpected=["node2","node3"];
 
             // TEST
-            const nodesID=CalculateRelationCycle.getNodesIDPlacedInGroupCycle(subgraphNetwork,"groupCycle");
+            const nodesID=await CalculateRelationCycle.getNodesIDPlacedInGroupCycle(subgraphNetwork,"groupCycle");
 
             // EXPECT
             expect(nodesID).toEqual(nodesIDExpected);
 
         });
     });
+
     describe('getNodesPlacedInGroupCycleAsArray', () => {
 
         it('should throw error because cycle group not defined in subgraphNetwork when trying to get node placed inside ', () => {
@@ -215,7 +214,7 @@ describe('CalculateRelationCycle', () => {
 
     describe('childNodeNotInCycle', () => {
 
-        it('should return child of a groupcycle, that are not in a cycle , no sorting (and a parent node in cycle)', () => {
+        it('should return child of a groupcycle, that are not in a cycle , no sorting (and a parent node in cycle)', async() => {
             // MOCK
             const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
             inCycleMock.mockImplementation( (network,id)=>{
@@ -231,7 +230,7 @@ describe('CalculateRelationCycle', () => {
             ];
 
             // TEST
-            const children=CalculateRelationCycle.childNodeNotInCycle(subgraphNetwork,listNodes,false);
+            const children=await CalculateRelationCycle.childNodeNotInCycle(subgraphNetwork,listNodes,false);
 
             // EXPECT
             expect(children).toEqual(childrenExpected);
@@ -239,7 +238,7 @@ describe('CalculateRelationCycle', () => {
 
         });
 
-        it('should return child of a groupcycle, that are not in a cycle ,sorting (no parent node in cycle)', () => {
+        it('should return child of a groupcycle, that are not in a cycle ,sorting (no parent node in cycle)', async() => {
             // MOCK
             const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
             inCycleMock.mockImplementation( (network,id)=>{
@@ -255,7 +254,7 @@ describe('CalculateRelationCycle', () => {
             ];
 
             // TEST
-            const children=CalculateRelationCycle.childNodeNotInCycle(subgraphNetwork,listNodes,true);
+            const children=await CalculateRelationCycle.childNodeNotInCycle(subgraphNetwork,listNodes,true);
 
             // EXPECT
             expect(children).toEqual(childrenExpected);
@@ -266,7 +265,7 @@ describe('CalculateRelationCycle', () => {
 
     describe('parentNodeNotInCycle', () => {
 
-        it('should return parent of a groupcycle, that are not in a cycle , no sorting (and a parent node in cycle)', () => {
+        it('should return parent of a groupcycle, that are not in a cycle , no sorting (and a parent node in cycle)', async() => {
             // MOCK
             const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
             inCycleMock.mockImplementation( (network,id)=>{
@@ -282,14 +281,14 @@ describe('CalculateRelationCycle', () => {
             ];
 
             // TEST
-            const parent=CalculateRelationCycle.parentNodeNotInCycle(subgraphNetwork,listNodes,false);
+            const parent=await CalculateRelationCycle.parentNodeNotInCycle(subgraphNetwork,listNodes,false);
 
             // EXPECT
             expect(parent).toEqual(parentExpected);
 
         });
 
-        it('should return parent of a groupcycle, that are not in a cycle , sorting (no parent node in cycle)', () => {
+        it('should return parent of a groupcycle, that are not in a cycle , sorting (no parent node in cycle)', async() => {
             // MOCK
             const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
             inCycleMock.mockImplementation( (network,id)=>{
@@ -305,7 +304,7 @@ describe('CalculateRelationCycle', () => {
             ];
 
             // TEST
-            const parent=CalculateRelationCycle.parentNodeNotInCycle(subgraphNetwork,listNodes,true);
+            const parent=await CalculateRelationCycle.parentNodeNotInCycle(subgraphNetwork,listNodes,true);
 
             // EXPECT
             expect(parent).toEqual(parentExpected);
@@ -316,13 +315,13 @@ describe('CalculateRelationCycle', () => {
 
     describe('neighborsGroupCycle', () => {
 
-        it('sould throw an error instead of returning parent/child of a group cycle , because no groupcycle', () => {
+        it('sould throw an error instead of returning parent/child of a group cycle , because no groupcycle', async() => {
             // EXPECT
-            expect(()=>{CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","parent")}).toThrow();
-            expect(()=>{CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","child")}).toThrow();
+            await expect(CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","parent")).rejects.toThrow();
+            await expect(CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","child")).rejects.toThrow();
         });
 
-        it('sould return parent/child of a group cycle , but no precalculatedPosition', () => {
+        it('sould return parent/child of a group cycle , but no precalculatedPosition', async() => {
 
             // MOCK
             const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
@@ -343,8 +342,8 @@ describe('CalculateRelationCycle', () => {
             const resultExpected:string[]=[];
 
             // TEST
-            const resultParent=CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","parent");
-            const resultChildren=CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","child");
+            const resultParent=await CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","parent");
+            const resultChildren=await CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","child");
 
             // EXPECT
             expect(resultParent).toEqual(resultExpected);
@@ -352,7 +351,7 @@ describe('CalculateRelationCycle', () => {
 
         });
 
-        it('sould return parent/child of a group cycle with neighborsGroupCycle, no sorting', () => {
+        it('sould return parent/child of a group cycle with neighborsGroupCycle, no sorting', async() => {
             // MOCK
             const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
             inCycleMock.mockImplementation( (network,id)=>{
@@ -377,8 +376,8 @@ describe('CalculateRelationCycle', () => {
             const childrenExpected:string[]=["node1","node4","node0"];
 
             // TEST
-            const resultParent=CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","parent",false);
-            const resultChildren=CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","child",false);
+            const resultParent=await CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","parent",false);
+            const resultChildren=await CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","child",false);
 
             // EXPECT
             expect(resultParent).toEqual(parentExpected);
@@ -386,7 +385,7 @@ describe('CalculateRelationCycle', () => {
 
         });
 
-        it('sould return parent/child of a group cycle with neighborsGroupCycle, sorting', () => {
+        it('sould return parent/child of a group cycle with neighborsGroupCycle, sorting', async() => {
             // MOCK
             const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
             inCycleMock.mockImplementation( (network,id)=>{
@@ -411,8 +410,8 @@ describe('CalculateRelationCycle', () => {
             const childrenExpected:string[]=["node1","node0","node4"];
 
             // TEST
-            const resultParent=CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","parent",true);
-            const resultChildren=CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","child",true);
+            const resultParent=await CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","parent",true);
+            const resultChildren=await CalculateRelationCycle.neighborsGroupCycle(subgraphNetwork,"groupCycle","child",true);
 
             // EXPECT
             expect(resultParent).toEqual(parentExpected);
@@ -468,9 +467,9 @@ describe('CalculateRelationCycle', () => {
 
     describe('sortLinksWithAllGroupCycle', () => {
 
-        it('should not change links order', () => {
+        it('should not change links order', async() => {
             // TEST
-            const result=CalculateRelationCycle.sortLinksWithAllGroupCycle(subgraphNetwork,false);
+            const result=await CalculateRelationCycle.sortLinksWithAllGroupCycle(subgraphNetwork,false);
 
             // EXPECT
             expect(result.subgraphNetwork).toEqual(subgraphNetwork);
@@ -478,7 +477,7 @@ describe('CalculateRelationCycle', () => {
 
         });
 
-        it('should change links order, with ordering in (parent)', () => {
+        it('should change links order, with ordering in (parent)', async() => {
 
             // MOCK
             const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
@@ -494,7 +493,7 @@ describe('CalculateRelationCycle', () => {
 
             const subgraph:Subgraph={
                 name: "groupCycle",
-                nodes: ["node2","node3"],
+                nodes: [],
                 precalculatedNodesPosition:  {
                     node2: { x: 2, y: 3 },
                     node3: { x: 3, y: 2 },
@@ -525,8 +524,7 @@ describe('CalculateRelationCycle', () => {
             ]
 
             // TEST
-            const result=CalculateRelationCycle.sortLinksWithAllGroupCycle(subgraphNetwork,true);
-            //console.log(result.linksOrdered);
+            const result=await CalculateRelationCycle.sortLinksWithAllGroupCycle(subgraphNetwork,true);
 
             // EXPECT
             expect(result.subgraphNetwork).toEqual(expectedSubgraphNetwork);
@@ -534,7 +532,7 @@ describe('CalculateRelationCycle', () => {
 
         });
 
-        it('should change links order, with ordering out (child)', () => {
+        it('should change links order, with ordering out (child)', async() => {
 
             // MOCK : declare node in cycle
             const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
@@ -579,15 +577,14 @@ describe('CalculateRelationCycle', () => {
             ]
 
             // TEST
-            const result=CalculateRelationCycle.sortLinksWithAllGroupCycle(subgraphNetwork,true);
-            //console.log(result.linksOrdered);
+            const result=await CalculateRelationCycle.sortLinksWithAllGroupCycle(subgraphNetwork,true);
 
             // EXPECT
             expect(result.subgraphNetwork).toEqual(expectedSubgraphNetwork);
             expect(result.linksOrdered).toEqual(expectedLinksOrdered);
 
         });
-    });
+     });
     describe('getLinksForListNodes', () => {
 
         test('getLinksForListNodes', () => {
@@ -610,7 +607,7 @@ describe('CalculateRelationCycle', () => {
     });
 
 
-// 2. Get graph *****************************************************************
+// // 2. Get graph *****************************************************************
 
     describe('get Graph For Cycle Group', () => {
         test('getListNodeLinksForCycleGroupAsArray', () => {
@@ -695,7 +692,7 @@ describe('CalculateRelationCycle', () => {
         });
     });
 
-// 3. Get relation cycle *****************************************************************
+// // 3. Get relation cycle *****************************************************************
 
         // parentCycle
     describe('parentCycle', () => {
diff --git a/src/composables/__tests__/CalculateSize.test.ts b/src/composables/__tests__/CalculateSize.test.ts
index 96be7537c7a97cedbb7da35e1c8bed5555d3b4de..41bf2425b41a0debb0de9134b2b7a10ca77dcd4e 100644
--- a/src/composables/__tests__/CalculateSize.test.ts
+++ b/src/composables/__tests__/CalculateSize.test.ts
@@ -1,7 +1,5 @@
 // Type imports
-import { Node} from '@metabohub/viz-core/src/types/Node';
-import { Network } from '@metabohub/viz-core/src/types/Network';
-import { GraphStyleProperties } from '@metabohub/viz-core/src/types/GraphStyleProperties';
+import { Network, GraphStyleProperties } from "../../types/TypeVizCore";
 import { Coordinate } from '../../types/CoordinatesSize';
 import { SubgraphNetwork } from '../../types/SubgraphNetwork';
 import { NetworkLayout, NodeLayout } from '../../types/NetworkLayout';
diff --git a/src/composables/__tests__/CheckNetwork.test.ts b/src/composables/__tests__/CheckNetwork.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e628267bf104cadcbd461da8bccbd29c220bca24
--- /dev/null
+++ b/src/composables/__tests__/CheckNetwork.test.ts
@@ -0,0 +1,439 @@
+// Type imports
+import {Network, Node, Link, GraphStyleProperties} from '../../types/TypeVizCore';
+
+// Composable imports
+import * as CheckNetwork from '../CheckNetwork';
+
+describe('CheckNetwork', () => {
+
+    describe('CheckNetwork.checkValidIdForViz', () => {
+    
+        // Test valid alphabetic IDs
+        it('should accept valid alphabetic ID', () => {
+            expect(() => CheckNetwork.checkValidIdForViz("valid_id123")).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz("A1B2C3")).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz("validID")).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz("valid_id_with_underscore")).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz("éclair")).not.toThrow(); // Testing with extended ASCII
+        });
+    
+        // Test valid numerals
+        it('should accept valid numerals', () => {
+            expect(() => CheckNetwork.checkValidIdForViz("123")).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz("-123.45")).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz(".456")).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz("0.1")).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz("-0.1")).not.toThrow();
+        });
+    
+        // Test valid double-quoted strings
+        it('should accept valid double-quoted strings', () => {
+            expect(() => CheckNetwork.checkValidIdForViz('"Hello, World!"')).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz('"This is a test with an escaped quote: \\"')).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz('"Just a string"')).not.toThrow();
+        });
+    
+        // Test valid HTML strings
+        it('should accept valid HTML strings', () => {
+            expect(() => CheckNetwork.checkValidIdForViz('<div>')).not.toThrow();
+            expect(() => CheckNetwork.checkValidIdForViz('<span class="test">')).not.toThrow();
+        });
+    
+        // Test invalid cases
+        it('should throw an error for invalid strings', () => {
+            expect(() => CheckNetwork.checkValidIdForViz("123invalid")).toThrow('Invalid string: 123invalid');
+            expect(() => CheckNetwork.checkValidIdForViz("!@#$%")).toThrow('Invalid string: !@#$%');
+            expect(() => CheckNetwork.checkValidIdForViz("")).toThrow('Invalid string: ');
+            expect(() => CheckNetwork.checkValidIdForViz("invalid-id-!")).toThrow('Invalid string: invalid-id-!');
+            expect(() => CheckNetwork.checkValidIdForViz("<div>Invalid</span>")).toThrow('Invalid string: <div>Invalid</span>');
+        });
+    });
+    
+
+    describe('checkNodeFormat', () => {
+
+        const validNode: Node = { id: '1', x: 0, y: 0 };
+        const validNodeWithOptionalProps: Node = {
+            id: '1',
+            x: 10,
+            y: 20,
+            label: 'Node 1',
+            classes: ['class1'],
+            hidden: false,
+            selected: true,
+            metadata: { key: 'value' }
+        };
+
+        it('should pass with a valid node without exact interface check', () => {
+            expect(() => CheckNetwork.checkNodeFormat('1', validNode, false)).not.toThrow();
+            expect(() => CheckNetwork.checkNodeFormat('1', validNodeWithOptionalProps, false)).not.toThrow();
+        });
+
+        it('should pass with a valid node with exact interface check', () => {
+            expect(() => CheckNetwork.checkNodeFormat('1', validNode, true)).not.toThrow();
+            expect(() => CheckNetwork.checkNodeFormat('1', validNodeWithOptionalProps, true)).not.toThrow();
+        });
+
+        it('should pass with a node with too many key with checkExactKeysInterface=false', () => {
+            const invalidNode = { id: '1', x: 0, y: 0, extraKey: 'extraValue' };
+            expect(() => CheckNetwork.checkNodeFormat('1', invalidNode, false)).not.toThrow();
+        });
+
+        it('should throw an error if node is not an object', () => {
+            expect(() => CheckNetwork.checkNodeFormat('1', 'not-an-object' as any, false)).toThrow('Node 1 is not an object.');
+        });
+
+        it('should throw an error if node lacks mandatory key id', () => {
+            const noIDNode:any = { x: 0, y: 0 };
+            expect(() => CheckNetwork.checkNodeFormat('1', noIDNode, false)).toThrow('Node 1 lacks key: id');
+        });
+
+        it('should throw an error if node lacks mandatory key x', () => {
+            const invalidNode:any = { id: '1', y: 0 };
+            expect(() => CheckNetwork.checkNodeFormat('1', invalidNode, false)).toThrow('Node 1 lacks key: x');
+        });
+
+        it('should throw an error if node lacks mandatory key y', () => {
+            const invalidNode :any= { id: '1', x: 0 };
+            expect(() => CheckNetwork.checkNodeFormat('1', invalidNode, false)).toThrow('Node 1 lacks key: y');
+        });
+
+        it('should throw an error if node has invalid type for key id', () => {
+            const invalidNode:any = { id: 13, x: 0, y: '0' }; // id should be a string
+            expect(() => CheckNetwork.checkNodeFormat('1', invalidNode, false)).toThrow('Node 1 has an invalid type for key id: expected string, got number');
+        });
+
+        it('should throw an error if node has invalid type for key x', () => {
+            const invalidNode:any = { id: '1', x: '0', y: 0 }; // x should be a number
+            expect(() => CheckNetwork.checkNodeFormat('1', invalidNode, false)).toThrow('Node 1 has an invalid type for key x: expected number, got string');
+        });
+
+        it('should throw an error if node has invalid type for key y', () => {
+            const invalidNode:any = { id: '1', x: 0, y: '0' }; // y should be a number
+            expect(() => CheckNetwork.checkNodeFormat('1', invalidNode, false)).toThrow('Node 1 has an invalid type for key y: expected number, got string');
+        });
+
+        it('should throw an error if node id and key mismatch', () => {
+            const invalidNode:Node = { id: '2', x: 0, y: 0 };
+            expect(() => CheckNetwork.checkNodeFormat('1', invalidNode, false)).toThrow('Node id and key mismatch: expected 1 for id, got 2');
+        });
+
+        it('should throw an error if checkExactInterface is true and node has extra keys', () => {
+            const invalidNode = { id: '1', x: 0, y: 0, extraKey: 'extraValue' };
+            expect(() => CheckNetwork.checkNodeFormat('1', invalidNode, true)).toThrow('Node 1 has an invalid key: extraKey');
+        });
+
+        it('should throw an error if node has metadataLayout when checkExactInterface is false', () => {
+            const invalidNode = { id: '1', x: 0, y: 0, metadataLayout: {} };
+            expect(() => CheckNetwork.checkNodeFormat('1', invalidNode, false)).toThrow('Node 1 contains metadataLayout, which is not allowed.');
+        });
+
+        it('should pass with check of id for Viz', () => {
+            expect(() => CheckNetwork.checkNodeFormat('1', validNode, false,true)).not.toThrow();
+        });
+
+        it('should throw an error if id is not valid for Viz', () => {
+            const invalidNode = { id: '1node', x: 0, y: 0, metadataLayout: {} };
+            expect(() => CheckNetwork.checkNodeFormat('1node', invalidNode, false,true)).toThrow('Invalid string: 1node');
+        });
+
+    });
+
+    describe('checkLinkFormat', () => {
+        const validNode1: Node = { id: '1', x: 0, y: 0 };
+        const validNode2: Node = { id: '2', x: 10, y: 10 };
+        const validNetwork: Network = {
+            id: 'network1',
+            nodes: {
+                '1': validNode1,
+                '2': validNode2
+            },
+            links: []
+        };
+
+        const validLink: Link = { id: 'link1', source: validNode1, target: validNode2 };
+
+        it('should pass with a valid link', () => {
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, validLink, false)).not.toThrow();
+        });
+
+        it('should throw an error if link source is not in network', () => {
+            const invalidLinkSource: Link = { id: 'link2', source: { id: '3', x: 0, y: 0 }, target: validNode2 };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLinkSource, false)).toThrow('Link link2 has no source node in the network.');
+        });
+
+        it('should throw an error if link source is invalid (no pointer)', () => {
+            const invalidLinkPointer: Link = { id: 'link3', source: { id: '1', x: 0, y: 0 }, target: validNode2 };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLinkPointer, false)).toThrow('Link link3 has an invalid source node (no pointer).');
+        });
+
+        it('should throw an error if link target is not in network', () => {
+            const invalidLinkTarget: Link = { id: 'link4', source: validNode1, target: { id: '3', x: 0, y: 0 } };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLinkTarget, false)).toThrow('Link link4 has no target node in the network.');
+        });
+
+        it('should throw an error if link target is invalid (no pointer)', () => {
+            const invalidLinkPointerTarget: Link = { id: 'link5', source: validNode1, target: { id: '2', x: 10, y: 10 } };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLinkPointerTarget, false)).toThrow('Link link5 has an invalid target node (no pointer).');
+        });
+
+        it('should throw an error if link lacks the key id', () => {
+            const invalidLink: Partial<Link> = { source: validNode1, target: validNode2 };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLink as Link, false))
+                .toThrow('Link lacks key: id');
+        });
+    
+        it('should throw an error if link lacks the key source', () => {
+            const invalidLink: Partial<Link> = { id: 'link2', target: validNode2 };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLink as Link, false))
+                .toThrow('Link lacks key: source');
+        });
+    
+        it('should throw an error if link lacks the key target', () => {
+            const invalidLink: Partial<Link> = { id: 'link3', source: validNode1 };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLink as Link, false))
+                .toThrow('Link lacks key: target');
+        });
+    
+        it('should throw an error if link id is not an string', () => {
+            const invalidLink = { id: 45, source: validNode1, target: validNode2 };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLink as any, false))
+                .toThrow('Link has an invalid type for key id: expected string, got number');
+        });
+
+        it('should throw an error if link source is not an object', () => {
+            const invalidLink = { id: 'link4', source: 'invalid-source', target: validNode2 };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLink as any, false))
+                .toThrow('Link has an invalid type for key source: expected object, got string');
+        });
+    
+        it('should throw an error if link target is not an object', () => {
+            const invalidLink = { id: 'link5', source: validNode1, target: 'invalid-target' };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLink as any, false))
+                .toThrow('Link has an invalid type for key target: expected object, got string');
+        });
+
+        it('should pass with exact keys interface when all keys match', () => {
+            const validLinkWithOptionalProps: Link = { 
+                id: 'link10', 
+                source: validNode1, 
+                target: validNode2, 
+                label: 'link-label', 
+                classes: ['class1'], 
+                type: 'link-type', 
+                relation: 'relation1', 
+                directed: true,
+                metadata: { key: 'value' }
+            };
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, validLinkWithOptionalProps, true)).not.toThrow();
+        });
+    
+        it('should throw an error if link has extra keys when exact keys interface is checked', () => {
+            const invalidLinkWithExtraKey: Link = { 
+                id: 'link11', 
+                source: validNode1, 
+                target: validNode2, 
+                extraKey: 'extraValue' // Invalid key
+            } as any;
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLinkWithExtraKey, true))
+                .toThrow('Link has an invalid key: extraKey');
+        });
+
+        it('should throw an error if link not an object', ()=>{
+            const invalidLink:any="linkString";
+            expect(() => CheckNetwork.checkLinkFormat(validNetwork, invalidLink, true))
+                .toThrow('Link is not an object.');
+        })
+
+       
+
+    });
+
+    describe('checkNetworkFormat', () => {
+        const validNode1: Node = { id: '1', x: 0, y: 0 };
+        const validNode2: Node = { id: '2', x: 10, y: 10 };
+        const validLink: Link = { id: 'link1', source: validNode1, target: validNode2 };
+        const validNetwork: Network = {
+            id: 'network1',
+            nodes: {
+                '1': validNode1,
+                '2': validNode2
+            },
+            links: [validLink]
+        };
+
+        // Test: Network must be an object
+        it('should throw an error if the network is not an object', async () => {
+            await expect(CheckNetwork.checkNetworkFormat(56 as any, false,false)).rejects
+                .toThrow('Network is not an object.');
+        });
+
+        // Test: Mandatory keys are present
+        it('should throw an error if the network lacks a mandatory key (id)', async () => {
+            const networkWithoutId = { nodes: {}, links: [] } as any;
+            await expect(CheckNetwork.checkNetworkFormat(networkWithoutId, false,false)).rejects
+                .toThrow('Network lacks key: id');
+        });
+
+        it('should throw an error if the network lacks a mandatory key (nodes)', async () => {
+            const networkWithoutNodes = { id: 'network1', links: [] } as any;
+            await expect(CheckNetwork.checkNetworkFormat(networkWithoutNodes, false,false)).rejects
+                .toThrow('Network lacks key: nodes');
+        });
+
+        it('should throw an error if the network lacks a mandatory key (links)', async () => {
+            const networkWithoutLinks = { id: 'network1', nodes: {} } as any;
+            await expect(async () => await CheckNetwork.checkNetworkFormat(networkWithoutLinks, false,false)).rejects
+                .toThrow('Network lacks key: links');
+        });
+
+        // Test: Exact interface check
+        it('should pass if the network contains only the exact keys', async () => {
+            await expect(CheckNetwork.checkNetworkFormat(validNetwork, true,false)).resolves.not.toThrow();
+        });
+
+        it('should throw an error if the network contains extra keys when exact interface is checked', async () => {
+            const networkWithExtraKey = { ...validNetwork, extraKey: 'extraValue' } as any;
+            await expect(CheckNetwork.checkNetworkFormat(networkWithExtraKey, true,false)).rejects
+                .toThrow('Network has an invalid key: extraKey');
+        });
+
+        it('should pass if the network contains extra keys when exact interface is not checked', async() => {
+            const networkWithExtraKey = { ...validNetwork, extraKey: 'extraValue' } as any;
+            await expect(CheckNetwork.checkNetworkFormat(networkWithExtraKey, false,false)).resolves.not.toThrow();
+        });
+
+        // Test: Node validation failure
+        it('should throw an error if a node in the network is invalid', async () => {
+            const invalidNode = { id: '3', y: 0 }; // Missing the 'x' key
+            const networkWithInvalidNode = {
+                ...validNetwork,
+                nodes: { '3': invalidNode as Node }
+            };
+
+            // Assuming checkNodeFormat throws the appropriate error
+            await expect(CheckNetwork.checkNetworkFormat(networkWithInvalidNode, false,false)).rejects
+                .toThrow('Node 3 lacks key: x');
+        });
+
+        // Test: Link validation failure
+        it('should throw an error if a link in the network is invalid', async () => {
+            const invalidLink = { id: 'link1', source: validNode1 }; // Missing the 'target' key
+            const networkWithInvalidLink = {
+                ...validNetwork,
+                links: [invalidLink as Link]
+            };
+
+            // Assuming checkLinkFormat throws the appropriate error
+            await expect(CheckNetwork.checkNetworkFormat(networkWithInvalidLink, false,false)).rejects
+                .toThrow('Link lacks key: target');
+        });
+
+        // Test: check if of node for Viz
+        it('should pass with check of id for Viz', async () => {
+            await expect(CheckNetwork.checkNetworkFormat(validNetwork, false,true)).resolves.not.toThrow();
+        });
+
+        it('should throw an error if id is not valid for Viz', async () => {
+            const networkWithInvalidNodeID = {
+                ...validNetwork,
+                nodes: { '1node': {id:"1node",x:0,y:0} }
+            };
+            await expect(CheckNetwork.checkNetworkFormat(networkWithInvalidNodeID, false,true)).rejects.toThrow('Invalid string: 1node');
+        });
+
+    });
+
+    
+    describe('checkNetworkStyleFormat', () => {
+
+        const validNode1: Node = { id: '1', x: 0, y: 0, classes: ['class1'] };
+        const validNode2: Node = { id: '2', x: 10, y: 10, classes: ['class2'] };
+        const validLink: Link = { id: 'link1', source: validNode1, target: validNode2, classes: ['linkClass1'] };
+        const validNetwork: Network = {
+            id: 'network1',
+            nodes: {
+                '1': validNode1,
+                '2': validNode2
+            },
+            links: [validLink]
+        };
+
+        const validGraphStyle: GraphStyleProperties = {
+            nodeStyles: {
+                class1: { stroke: 'blue' },
+                class2: { stroke: 'red' }
+            },
+            linkStyles: {
+                linkClass1: { stroke: 'green' }
+            }
+        };
+
+        // Test: All node classes have corresponding styles
+        it('should pass if all node classes have corresponding styles in networkStyle.nodeStyles', () => {
+            expect( () => CheckNetwork.checkNetworkStyleFormat(validNetwork, validGraphStyle)).not.toThrow();
+        });
+
+        // Test: All link classes have corresponding styles
+        it('should pass if all link classes have corresponding styles in networkStyle.linkStyles', () => {
+            expect( () =>  CheckNetwork.checkNetworkStyleFormat(validNetwork, validGraphStyle)).not.toThrow();
+        });
+
+        // Test: Missing nodeStyles when node classes exist
+        it('should throw an error if node classes are present but no nodeStyles are provided', () => {
+            const missingNodeStyle: GraphStyleProperties = {
+                linkStyles: validGraphStyle.linkStyles // Missing nodeStyles
+            };
+            expect( () =>  CheckNetwork.checkNetworkStyleFormat(validNetwork, missingNodeStyle))
+                .toThrow('Node classes are present in the network but no nodeStyles are provided.');
+        });
+
+        // Test: Missing linkStyles when link classes exist
+        it('should throw an error if link classes are present but no linkStyles are provided', () => {
+            const missingLinkStyle: GraphStyleProperties = {
+                nodeStyles: validGraphStyle.nodeStyles // Missing linkStyles
+            };
+            expect( () =>  CheckNetwork.checkNetworkStyleFormat(validNetwork, missingLinkStyle))
+                .toThrow('Link classes are present in the network but no linkStyles are provided.');
+        });
+
+        // Test: Node class missing in nodeStyles
+        it('should throw an error if a node class is missing in networkStyle.nodeStyles', () => {
+            const incompleteNodeStyles: GraphStyleProperties = {
+                nodeStyles: { class1: { stroke: 'blue' } }, // Missing class2
+                linkStyles: validGraphStyle.linkStyles
+            };
+            expect( () =>  CheckNetwork.checkNetworkStyleFormat(validNetwork, incompleteNodeStyles))
+                .toThrow('Node class class2 is missing in networkStyle.nodeStyles.');
+        });
+
+        // Test: Link class missing in linkStyles
+        it('should throw an error if a link class is missing in networkStyle.linkStyles', () => {
+            const incompleteLinkStyles: GraphStyleProperties = {
+                nodeStyles: validGraphStyle.nodeStyles,
+                linkStyles: {} // Missing linkClass1
+            };
+            expect( () =>  CheckNetwork.checkNetworkStyleFormat(validNetwork, incompleteLinkStyles))
+                .toThrow('Link class linkClass1 is missing in networkStyle.linkStyles.');
+        });
+
+        // Test: No node or link classes present, no styles needed
+        it('should pass if there are no node or link classes and no styles are provided', () => {
+            const simpleNetwork: Network = {
+                id: 'network1',
+                nodes: {
+                    '1': { id: '1', x: 0, y: 0 },
+                    '2': { id: '2', x: 10, y: 10 }
+                },
+                links: []
+            };
+
+            const emptyGraphStyle: GraphStyleProperties = {};
+            expect( () =>  CheckNetwork.checkNetworkStyleFormat(simpleNetwork, emptyGraphStyle)).not.toThrow();
+        });
+
+
+
+    });
+
+});
\ No newline at end of file
diff --git a/src/composables/__tests__/ConvertFromNetwork.test.ts b/src/composables/__tests__/ConvertFromNetwork.test.ts
index c2f5f3df12846a57bb48f2cefec6261fcfc1bc3f..f6076ff1a1f9d6c2a08c1a88fa3c5600494f9105 100644
--- a/src/composables/__tests__/ConvertFromNetwork.test.ts
+++ b/src/composables/__tests__/ConvertFromNetwork.test.ts
@@ -1,11 +1,8 @@
 // Type imports
-import { Network } from '@metabohub/viz-core/src/types/Network';
-import { Node } from '@metabohub/viz-core/src/types/Node';
-import { Link } from '@metabohub/viz-core/src/types/Link';
+import { Network , Node, Link, GraphStyleProperties} from "../../types/TypeVizCore";
 import { Subgraph, TypeSubgraph } from '../../types/Subgraph';
 import { LinkLayout, NetworkLayout, NodeLayout } from '../../types/NetworkLayout';
 import { Ordering } from '../../types/EnumArgs';
-import { GraphStyleProperties } from '@metabohub/viz-core/src/types/GraphStyleProperties';
 import { SubgraphNetwork } from '../../types/SubgraphNetwork';
 
 
@@ -13,12 +10,13 @@ import { SubgraphNetwork } from '../../types/SubgraphNetwork';
 import  * as ConvertFromNetwork from '../ConvertFromNetwork';
 import * as GetSetAttributsNodes from "../GetSetAttributsNodes";
 import * as CalculateRelationCycle from  "../CalculateRelationCycle";
+import * as SubgraphForViz from "../SubgraphForViz";
+import * as CalculateSize from "../CalculateSize";
 
 
 // General imports
 import { Graph } from "@viz-js/viz";
 import * as GDS from 'graph-data-structure';
-import exp from 'constants';
 
 
 // Mocking GDS.Graph
@@ -72,11 +70,6 @@ describe('ConvertFromNetwork', () => {
 
     });
 
-    afterEach(() => {
-        jest.clearAllMocks();
-    });
-
-
 
     describe('networktoNetworkLayout', () => {
 
@@ -175,10 +168,47 @@ describe('ConvertFromNetwork', () => {
     describe('network for Viz', () => {
 
         let subgraphNetwork: SubgraphNetwork;
-        let inCycleMock: jest.SpyInstance;
-        let sortLinksWithAllGroupCycleMock: jest.SpyInstance;
         let cycleGroup:Subgraph;
 
+        let subgraphDotMock: jest.SpyInstance;
+        let addMainChainForVizMock: jest.SpyInstance;
+
+        const getSizeNodePixelMock = jest.spyOn(CalculateSize, 'getSizeNodePixel');
+        getSizeNodePixelMock.mockReturnValue({width: 25, height: 25});
+
+        const pixelsToInchesMock = jest.spyOn(CalculateSize, 'pixelsToInches');
+        pixelsToInchesMock.mockImplementation((value: number) => {
+            if (value) {
+                return 0.35;
+            }
+            return 0;
+        });
+
+        const inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
+        inCycleMock.mockImplementation( (network,id)=>{
+            return id==="node4" || id==="node5";
+        });
+
+        const sortLinksWithAllGroupCycleMock = jest.spyOn(CalculateRelationCycle, 'sortLinksWithAllGroupCycle');
+        sortLinksWithAllGroupCycleMock.mockImplementation(async (subgraphNetworkArg:SubgraphNetwork) => {
+            return {
+                subgraphNetwork:subgraphNetworkArg,
+                linksOrdered:subgraphNetworkArg.network.links
+            };
+        });
+
+        const cycleMetanodeLinkMock = jest.spyOn(CalculateRelationCycle, 'cycleMetanodeLink');
+        cycleMetanodeLinkMock.mockImplementation((link:LinkLayout,cycle?:boolean)=>{
+            if(cycle && link.target.id==="node4"){
+                return {inCycle:["cycleGroup"],tail:link.source.id,head:"cycleGroup"}
+            }
+            if(cycle && link.target.id==="node5" && link.source.id==="node4"){
+                return {inCycle:["cycleGroup"],tail:"cycleGroup",head:"cycleGroup"}
+            }
+            return {inCycle:[],tail:link.source.id,head:link.target.id}
+        }); 
+        
+
         beforeEach(() => {
 
             const mainChain :Subgraph={
@@ -203,11 +233,8 @@ describe('ConvertFromNetwork', () => {
                 [TypeSubgraph.CYCLEGROUP]: {cycleGroup:cycleGroup},
             };
 
-            subgraphNetwork.network.nodes["node4"].metadataLayout={
-                [TypeSubgraph.CYCLEGROUP]:"cycleGroup"
-            };
+            // need to declare the main chain in the node for the case group (instead of cluster)
             subgraphNetwork.network.nodes["node5"].metadataLayout={
-                [TypeSubgraph.CYCLEGROUP]:"cycleGroup",
                 [TypeSubgraph.MAIN_CHAIN]:["mainChain"]
             };
             subgraphNetwork.network.nodes["node2"].metadataLayout={
@@ -217,42 +244,45 @@ describe('ConvertFromNetwork', () => {
                 [TypeSubgraph.MAIN_CHAIN]:["mainChain"]
             };
 
-
-            // MOCK 
-            inCycleMock = jest.spyOn(GetSetAttributsNodes, 'inCycle');
-            inCycleMock.mockImplementation( (network,id)=>{
-                return id==="node4" || id==="node5";
+            // MOCK
+            addMainChainForVizMock = jest.spyOn(SubgraphForViz, 'addMainChainForViz');
+            addMainChainForVizMock.mockImplementation((vizgraph:Graph)=>{
+                vizgraph.subgraphs=[
+                    {"name": "cluster_mainChain", "nodes": [
+                    {"name": "node2"}, 
+                    {"name": "node3"}, 
+                    {"name": "cycleGroup"}
+                    ]}];
+                return vizgraph;
             });
 
-            sortLinksWithAllGroupCycleMock = jest.spyOn(CalculateRelationCycle, 'sortLinksWithAllGroupCycle');
-            sortLinksWithAllGroupCycleMock.mockReturnValue({
-                    subgraphNetwork:subgraphNetwork,
-                    linksOrdered:subgraphNetwork.network.links
-            });
+        });
 
+        afterEach(() => {
+            addMainChainForVizMock.mockClear();
         });
 
-        
 
-        it('should throw error when converting network to DOT string, but no size of cycleGroup', () => {
+        it('should throw error when converting network to DOT string, because no size of cycleGroup', async () => {
             // DATA
             delete cycleGroup.width;
             delete cycleGroup.height;
 
             // EXPECT
-            expect(()=>{ConvertFromNetwork.networkToViz(subgraphNetwork,true)}).toThrow();
+            await expect(ConvertFromNetwork.networkToViz(subgraphNetwork,true)).rejects.toThrow();
         });
 
-        it('should throw error when converting network to DOT string, change order but no ordering', () => {
+        it('should throw error when converting network to DOT string, change order but no ordering', async() => {
 
             // DATA
             delete cycleGroup.ordering;
            
             // EXPECT
-            expect(()=>{ConvertFromNetwork.networkToViz(subgraphNetwork,true,true,"cluster",true)}).toThrow();
+            await expect(ConvertFromNetwork.networkToViz(subgraphNetwork,true,true,"cluster",true)).rejects.toThrow();
         });
 
-        it('should convert network to DOT string, default args', () => {
+        it('should convert network to DOT string, default args', async () => {
+
             // DATA
             const resultExpected:Graph={
                 "graphAttributes":{},
@@ -266,19 +296,29 @@ describe('ConvertFromNetwork', () => {
                     {"name":"node1","attributes":{"height":0.35,"width":0.35,"fixedsize":true}},
                     {"name":"node2","attributes":{"height":0.35,"width":0.35,"fixedsize":true}},
                     {"name":"node3","attributes":{"height":0.35,"width":0.35,"fixedsize":true}},
-                    {"name":"cycleGroup","attributes":{"fixedsize":true,"height":0.01,"width":0.01}}],
+                    {"name":"cycleGroup","attributes":{"fixedsize":true,"height":0.35,"width":0.35}}],
 
             "subgraphs":[{"name":"cluster_mainChain","nodes":[{"name":"node2"},{"name":"node3"},{"name":"cycleGroup"}]}]}
 
             // TEST
-            const result = ConvertFromNetwork.networkToViz(subgraphNetwork,true,true,"cluster",false);
+            const result = await ConvertFromNetwork.networkToViz(subgraphNetwork,true,true,"cluster",false);
 
             // EXPECT
             expect(result).toEqual(resultExpected);
             
         });
 
-        it('should convert network to DOT string, no cyle', () => {
+        it('should convert network to DOT string, no cyle', async () => {
+            // MOCK
+            addMainChainForVizMock.mockImplementationOnce((vizgraph:Graph)=>{
+                vizgraph.subgraphs=[
+                    {"name": "cluster_mainChain", "nodes": [
+                    {"name": "node2"}, 
+                    {"name": "node3"}, 
+                    {"name": "node5"}]}]
+                return vizgraph;
+            });
+
             // DATA
             const resultExpected:Graph={
                 "graphAttributes": {},
@@ -307,14 +347,15 @@ describe('ConvertFromNetwork', () => {
               
 
             // TEST
-            const result = ConvertFromNetwork.networkToViz(subgraphNetwork,false);
+            const result = await ConvertFromNetwork.networkToViz(subgraphNetwork,false);
             
             // EXPECT
             expect(result).toEqual(resultExpected);
             
         });
 
-        it('should convert network to DOT string, add no nodes', () => {
+        it('should convert network to DOT string, add no nodes', async() => {
+
             // DATA
             const resultExpected:Graph={
                 "graphAttributes": {},
@@ -325,7 +366,7 @@ describe('ConvertFromNetwork', () => {
                   {"tail": "node3", "head": "cycleGroup"}
                 ],
                 "nodes": [
-                  {"name": "cycleGroup", "attributes": {"fixedsize": true, "height": 0.01, "width": 0.01}}
+                  {"name": "cycleGroup", "attributes": {"fixedsize": true, "height": 0.35, "width": 0.35}}
                 ],
                 "subgraphs": [
                   {"name": "cluster_mainChain", "nodes": [
@@ -338,13 +379,24 @@ describe('ConvertFromNetwork', () => {
               
 
             // TEST
-            const result = ConvertFromNetwork.networkToViz(subgraphNetwork,true,false);
+            const result = await ConvertFromNetwork.networkToViz(subgraphNetwork,true,false);
 
             // EXPECT
-            expect(result).toEqual(resultExpected);          
+            expect(result).toEqual(resultExpected);      
         });
 
-        it('should convert network to DOT string, add no nodes et no cycle', () => {
+        it('should convert network to DOT string, add no nodes et no cycle', async () => {
+
+            // MOCK
+            addMainChainForVizMock.mockImplementationOnce((vizgraph:Graph)=>{
+                vizgraph.subgraphs=[
+                    {"name": "cluster_mainChain", "nodes": [
+                    {"name": "node2"}, 
+                    {"name": "node3"}, 
+                    {"name": "node5"}]}]
+                return vizgraph;
+            });
+
             // DATA
             const resultExpected:Graph={
                 "graphAttributes": {},
@@ -367,13 +419,14 @@ describe('ConvertFromNetwork', () => {
               
 
             // TEST
-            const result = ConvertFromNetwork.networkToViz(subgraphNetwork,false,false);
+            const result = await ConvertFromNetwork.networkToViz(subgraphNetwork,false,false);
 
             // EXPECT
             expect(result).toEqual(resultExpected);          
         });
 
-        it('should convert network to DOT string, group for main chain', () => {
+        it('should convert network to DOT string, group for main chain', async () => {
+
             // DATA
             const resultExpected:Graph={
                 "graphAttributes": {},
@@ -387,21 +440,28 @@ describe('ConvertFromNetwork', () => {
                   {"name": "node1", "attributes": {"height": 0.35, "width": 0.35, "fixedsize": true}}, 
                   {"name": "node2", "attributes": {"height": 0.35, "width": 0.35, "fixedsize": true, "group": "mainChain"}}, 
                   {"name": "node3", "attributes": {"height": 0.35, "width": 0.35, "fixedsize": true, "group": "mainChain"}}, 
-                  {"name": "cycleGroup", "attributes": {"fixedsize": true, "height": 0.01, "width": 0.01}}
+                  {"name": "cycleGroup", "attributes": {"fixedsize": true, "height": 0.35, "width": 0.35}}
                 ],
                 "subgraphs": []
               }
               
 
             // TEST
-            const result = ConvertFromNetwork.networkToViz(subgraphNetwork,true,true, "group");
+            const result = await ConvertFromNetwork.networkToViz(subgraphNetwork,true,true, "group");
 
             // EXPECT
             expect(result).toEqual(resultExpected);
+            expect(addMainChainForVizMock).not.toHaveBeenCalled();
             
         });
 
-        it('should convert network to DOT string, several cycleGroup', () => {
+        it('should convert network to DOT string, several cycleGroup', async() => {
+            // MOCK 
+            cycleMetanodeLinkMock.mockReturnValueOnce({inCycle:["cycleGroup2"],tail:"cycleGroup2",head:"node2"})
+            .mockReturnValueOnce({inCycle:[],tail:"node2",head:"node3"})
+            .mockReturnValueOnce({inCycle:["cycleGroup"],tail:"node3",head:"cycleGroup"})
+            .mockReturnValueOnce({inCycle:["cycleGroup"],tail:"cycleGroup",head:"cycleGroup"});
+
             // DATA
             const cycleGroup2 :Subgraph={
                 name: "cycleGroup2",
@@ -410,9 +470,7 @@ describe('ConvertFromNetwork', () => {
                 height: 3,
                 type: TypeSubgraph.CYCLEGROUP,
             };
-            subgraphNetwork.network.nodes["node1"].metadataLayout={
-                [TypeSubgraph.CYCLEGROUP]:"cycleGroup2"
-            };
+
             if(subgraphNetwork[TypeSubgraph.CYCLEGROUP]){
                 subgraphNetwork[TypeSubgraph.CYCLEGROUP].cycleGroup2=cycleGroup2;
             }else{
@@ -431,8 +489,8 @@ describe('ConvertFromNetwork', () => {
                 {"name": "node1", "attributes": {"fixedsize": true, "height": 0.35, "width": 0.35}},
                 {"name": "node2", "attributes": {"fixedsize": true, "height": 0.35, "width": 0.35}},
                 {"name": "node3", "attributes": {"fixedsize": true, "height": 0.35, "width": 0.35}},
-                {"name": "cycleGroup2", "attributes": {"fixedsize": true, "height": 0.04, "width": 0.04}},
-                {"name": "cycleGroup", "attributes": {"fixedsize": true, "height": 0.01, "width": 0.01}}
+                {"name": "cycleGroup2", "attributes": {"fixedsize": true, "height": 0.35, "width": 0.35}},
+                {"name": "cycleGroup", "attributes": {"fixedsize": true, "height": 0.35, "width": 0.35}}
                 ],
                 "subgraphs": [
                 {"name": "cluster_mainChain", "nodes": [
@@ -444,16 +502,16 @@ describe('ConvertFromNetwork', () => {
                 }
                 
             // TEST
-            const result = ConvertFromNetwork.networkToViz(subgraphNetwork);
+            const result = await ConvertFromNetwork.networkToViz(subgraphNetwork);
 
             // EXPECT
             expect(result).toEqual(resultExpected);
             
         });
 
-        it('should convert network to DOT string, order change', () => {
+        it('should convert network to DOT string, order change', async() => {
             // MOCK 
-            sortLinksWithAllGroupCycleMock.mockReturnValue({
+            sortLinksWithAllGroupCycleMock.mockReturnValueOnce(Promise.resolve({
                 subgraphNetwork:subgraphNetwork,
                 linksOrdered: [
                     { id: 'link', source: nodes.node3 , target:nodes.node4 },
@@ -461,7 +519,7 @@ describe('ConvertFromNetwork', () => {
                     { id: 'link', source: nodes.node2 , target:nodes.node3 },
                     { id: 'link', source: nodes.node4 , target:nodes.node5 }
                 ]
-            });
+            }));
 
             // DATA
             const resultExpected:Graph={
@@ -477,7 +535,7 @@ describe('ConvertFromNetwork', () => {
                   {"name": "node1", "attributes": {"height": 0.35, "width": 0.35, "fixedsize": true}}, 
                   {"name": "node2", "attributes": {"height": 0.35, "width": 0.35, "fixedsize": true}}, 
                   {"name": "node3", "attributes": {"height": 0.35, "width": 0.35, "fixedsize": true}}, 
-                  {"name": "cycleGroup", "attributes": {"fixedsize": true, "height": 0.01, "width": 0.01, "ordering": "in"}}
+                  {"name": "cycleGroup", "attributes": {"fixedsize": true, "height": 0.35, "width": 0.35, "ordering": "in"}}
                 ],
                 "subgraphs": [
                   {"name": "cluster_mainChain", "nodes": [
@@ -490,7 +548,7 @@ describe('ConvertFromNetwork', () => {
               
 
             // TEST
-            const result = ConvertFromNetwork.networkToViz(subgraphNetwork,true,true, "cluster",true);
+            const result = await ConvertFromNetwork.networkToViz(subgraphNetwork,true,true, "cluster",true);
 
             // EXPECT
             expect(result).toEqual(resultExpected);    
@@ -498,6 +556,10 @@ describe('ConvertFromNetwork', () => {
     
          
         test('graphVizToDot', () => {
+            // MOCK
+            subgraphDotMock = jest.spyOn(SubgraphForViz, 'subgraphDot');
+            subgraphDotMock.mockReturnValue("subgraph cluster_mainChain {\nnode2;node3;cycleGroup;}\n");
+
             // DATA 
             const vizGraph:Graph={
                 "graphAttributes":{},
@@ -511,12 +573,12 @@ describe('ConvertFromNetwork', () => {
                     {"name":"node1","attributes":{"height":0.35,"width":0.35,"fixedsize":true}},
                     {"name":"node2","attributes":{"height":0.35,"width":0.35,"fixedsize":true}},
                     {"name":"node3","attributes":{"height":0.35,"width":0.35,"fixedsize":true}},
-                    {"name":"cycleGroup","attributes":{"fixedsize":true,"height":0.01,"width":0.01}}],
+                    {"name":"cycleGroup","attributes":{"fixedsize":true,"height":0.35,"width":0.35}}],
 
             "subgraphs":[{"name":"cluster_mainChain","nodes":[{"name":"node2"},{"name":"node3"},{"name":"cycleGroup"}]}]}
 
-            const resultExpected = "strict digraph G {\n graph []\nsubgraph cluster_mainChain {\nnode2;node3;cycleGroup;}\nnode1  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode2  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode3  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\ncycleGroup  [fixedsize=\"true\", height=\"0.01\", width=\"0.01\"];\nnode1 -> node2;\nnode2 -> node3;\nnode3 -> cycleGroup;\n}"
-            const resultExpectedSubgraphLast ="strict digraph G {\n graph []\nnode1  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode2  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode3  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\ncycleGroup  [fixedsize=\"true\", height=\"0.01\", width=\"0.01\"];\nnode1 -> node2;\nnode2 -> node3;\nnode3 -> cycleGroup;\nsubgraph cluster_mainChain {\nnode2;node3;cycleGroup;}\n}"
+            const resultExpected = "strict digraph G {\n graph []\nsubgraph cluster_mainChain {\nnode2;node3;cycleGroup;}\nnode1  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode2  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode3  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\ncycleGroup  [fixedsize=\"true\", height=\"0.35\", width=\"0.35\"];\nnode1 -> node2;\nnode2 -> node3;\nnode3 -> cycleGroup;\n}"
+            const resultExpectedSubgraphLast ="strict digraph G {\n graph []\nnode1  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode2  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode3  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\ncycleGroup  [fixedsize=\"true\", height=\"0.35\", width=\"0.35\"];\nnode1 -> node2;\nnode2 -> node3;\nnode3 -> cycleGroup;\nsubgraph cluster_mainChain {\nnode2;node3;cycleGroup;}\n}"
 
             // TEST
             const result = ConvertFromNetwork.graphVizToDot(vizGraph,true);
@@ -528,12 +590,16 @@ describe('ConvertFromNetwork', () => {
 
         });
 
-        test('networkToDOT', () => {
+        test('networkToDOT', async () => {
+            // MOCK
+            subgraphDotMock = jest.spyOn(SubgraphForViz, 'subgraphDot');
+            subgraphDotMock.mockReturnValue("subgraph cluster_mainChain {\nnode2;node3;cycleGroup;}\n");
+        
             // DATA
-            const resultExpected = "strict digraph G {\n graph []\nsubgraph cluster_mainChain {\nnode2;node3;cycleGroup;}\nnode1  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode2  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode3  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\ncycleGroup  [fixedsize=\"true\", height=\"0.01\", width=\"0.01\"];\nnode1 -> node2;\nnode2 -> node3;\nnode3 -> cycleGroup;\n}"
+            const resultExpected = "strict digraph G {\n graph []\nsubgraph cluster_mainChain {\nnode2;node3;cycleGroup;}\nnode1  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode2  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\nnode3  [height=\"0.35\", width=\"0.35\", fixedsize=\"true\"];\ncycleGroup  [fixedsize=\"true\", height=\"0.35\", width=\"0.35\"];\nnode1 -> node2;\nnode2 -> node3;\nnode3 -> cycleGroup;\n}"
 
             // TEST
-            const result = ConvertFromNetwork.networkToDOT(subgraphNetwork);
+            const result = await ConvertFromNetwork.networkToDOT(subgraphNetwork);
 
             // EXPECT
             expect(result).toEqual(resultExpected);
diff --git a/src/composables/__tests__/ConvertToNetwork.test.ts b/src/composables/__tests__/ConvertToNetwork.test.ts
index ea3bbd222f375895031890802c7eca42f92348c8..70214700f59a1bb158e892cd4367e41ea67b009c 100644
--- a/src/composables/__tests__/ConvertToNetwork.test.ts
+++ b/src/composables/__tests__/ConvertToNetwork.test.ts
@@ -1,5 +1,5 @@
 // Type imports
-import { Network } from '@metabohub/viz-core/src/types/Network';
+import { Network } from "../../types/TypeVizCore";
 import {  NetworkLayout } from '../../types/NetworkLayout';
 import { JsonViz } from '../../types/FormatJsonViz';
 import { SubgraphNetwork } from '../../types/SubgraphNetwork';
diff --git a/src/composables/__tests__/GetSetAttributsNodes.test.ts b/src/composables/__tests__/GetSetAttributsNodes.test.ts
index 677733670187250afc598bfe9c5f255edc81266b..a0ec06ab11ccfa5071e0d042d713c5525771264b 100644
--- a/src/composables/__tests__/GetSetAttributsNodes.test.ts
+++ b/src/composables/__tests__/GetSetAttributsNodes.test.ts
@@ -1,7 +1,5 @@
 // Type imports
-import { Node } from "@metabohub/viz-core/src/types/Node";
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Link } from "@metabohub/viz-core/src/types/Link";
+import { Node, Network, Link } from "../../types/TypeVizCore";
 import { NetworkLayout } from "../../types/NetworkLayout";
 import { TypeSubgraph } from "../../types/Subgraph";
 
@@ -293,81 +291,6 @@ describe('Duplicate', () => {
 // 2.  Reversible *****************************************************************
 
 describe('Reversible', () => {
-     test("addMetadataReversibleWithClass",  async () => {
-
-        const addReversibleNetworkMock = jest.spyOn(GetSetAttributsNodes, 'addReversibleNetwork');
-        // DATA 
-
-        let network:Network = {
-            id:"networkTest",
-            nodes: {
-                node1 :{
-                    id: "node1",
-                    x: 10,
-                    y: 10,
-                },
-                node2: {
-                    id: "node2",
-                    x: 20,
-                    y: 20,
-                    classes: [GetSetAttributsNodes.classReversible+"_test"]
-                },
-                node3: {
-                    id: "node3",
-                    x: 30,
-                    y: 30,
-                    classes: [GetSetAttributsNodes.classReversible]
-                },
-                node4: {
-                    id: "node4",
-                    x: 40,
-                    y: 40,
-                    classes: [GetSetAttributsNodes.classReversible+"_test",GetSetAttributsNodes.classReversible]
-                }
-            },
-            links: []
-        };
-
-        let networkExpected:Network = {
-            id:"networkTest",
-            nodes: {
-                node1 :{
-                    id: "node1",
-                    x: 10,
-                    y: 10,
-                },
-                node2: {
-                    id: "node2",
-                    x: 20,
-                    y: 20,
-                    classes: [GetSetAttributsNodes.classReversible+"_test"]
-                },
-                node3: {
-                    id: "node3",
-                    x: 30,
-                    y: 30,
-                    classes: [GetSetAttributsNodes.classReversible],
-                    metadata: {[GetSetAttributsNodes.reversibleAttribute]:true}
-                },
-                node4: {
-                    id: "node4",
-                    x: 40,
-                    y: 40,
-                    classes: [GetSetAttributsNodes.classReversible+"_test",GetSetAttributsNodes.classReversible],
-                    metadata: {[GetSetAttributsNodes.reversibleAttribute]:true}
-                }
-            },
-            links: []
-        };
-
-        // TEST
-        await GetSetAttributsNodes.addMetadataReversibleWithClass(network);
-
-        // EXPECT
-        //expect(addReversibleNetworkMock).toHaveBeenCalled();
-        expect(network).toEqual(networkExpected);
-
-     });
 
      test("addReversibleNetwork",  () => {
         // DATA
diff --git a/src/composables/__tests__/LayoutDrawCycle.test.ts b/src/composables/__tests__/LayoutDrawCycle.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b53705e2aaf6d003cc6fb30085855d1917163e74
--- /dev/null
+++ b/src/composables/__tests__/LayoutDrawCycle.test.ts
@@ -0,0 +1,1226 @@
+// Type imports
+import { SubgraphNetwork } from '../../types/SubgraphNetwork';
+import { NetworkLayout, NodeLayout } from '../../types/NetworkLayout';
+import { Subgraph, TypeSubgraph } from '../../types/Subgraph';
+import { CoordinateNull } from '../../types/CoordinatesSize';
+
+
+// Composable imports
+import * as LayoutDrawCycle from '../LayoutDrawCycle';
+import * as CalculateRelationCycle from '../CalculateRelationCycle';
+import * as SubgraphForSubgraphNetwork from '../SubgraphForSubgraphNetwork';
+import * as CalculateOverlaps from '../CalculateOverlaps';
+import * as CalculateSize from '../CalculateSize';
+
+// General imports
+import * as d3 from 'd3';
+
+
+jest.mock('d3', () => {
+    return {
+        forceSimulation:jest.fn(),
+        forceLink: jest.fn(() => ({
+            id: jest.fn().mockReturnThis(),
+            links: jest.fn().mockReturnThis(),
+            distance: jest.fn().mockReturnThis(),
+            strength: jest.fn().mockReturnThis(),
+        })),
+        forceManyBody: jest.fn(() => ({
+            strength: jest.fn().mockReturnThis(),
+        })),
+    };
+});
+
+const forcesimulationMock=jest.fn((nodes) => {
+    nodes[3].x=34;
+    nodes[3].y=34;
+    return {
+    force: jest.fn().mockReturnThis(),  
+    alphaMin: jest.fn().mockReturnThis(),
+    stop: jest.fn().mockReturnThis(),
+    tick: jest.fn().mockReturnThis(),
+    alpha: jest.fn(() => {return 0.3}), 
+};});
+
+(d3.forceSimulation as jest.Mock).mockImplementation(forcesimulationMock);
+
+
+function getNodeWithMinYInFirstCycleGroup(subgraphNetwork: SubgraphNetwork): string | null {
+
+    let minYNodeId: string | null = null;
+    let minY: number = Infinity;
+
+    let cycleGroup: Subgraph;
+    if (!subgraphNetwork[TypeSubgraph.CYCLEGROUP]) return null;
+    else {
+        cycleGroup=subgraphNetwork[TypeSubgraph.CYCLEGROUP]["cycle_group_0"];
+        const position= cycleGroup.precalculatedNodesPosition;
+        for (const nodeId in position) {
+            const pos = position[nodeId];
+            if (pos.y && pos.y < minY) {
+                minY = pos.y;
+                minYNodeId = nodeId;
+            }
+        }
+    }
+
+    return minYNodeId;
+}
+
+describe('LayoutDrawCycle',()=>{
+
+    let parentNodeNotInCycleMock:jest.SpyInstance;
+    let childNodeNotInCycleMock:jest.SpyInstance;
+    let getListNodeLinksForCycleGroupAsArrayMock:jest.SpyInstance;
+    let getListNodeLinksForCycleGroupAsObjectMock:jest.SpyInstance;
+    let getNodesPlacedInGroupCycleAsObjectMock:jest.SpyInstance;
+    let isIntersectionGraphMock:jest.SpyInstance;
+    let isOverlapNodesMock:jest.SpyInstance;
+    let isOverlapNodesEdgesMock:jest.SpyInstance;
+    let updateNodeMetadataSubgraphMock:jest.SpyInstance;
+    let getMeanNodesSizePixelMock:jest.SpyInstance;
+    let medianEdgeLengthMock:jest.SpyInstance;
+    let rectangleSizeMock:jest.SpyInstance;
+
+    getMeanNodesSizePixelMock = jest.spyOn(CalculateSize, 'getMeanNodesSizePixel');
+    getMeanNodesSizePixelMock.mockReturnValue(Promise.resolve({width:2,height:2}));
+
+    medianEdgeLengthMock= jest.spyOn(CalculateSize, 'medianEdgeLength');
+    medianEdgeLengthMock.mockReturnValue(5);
+
+    
+    beforeEach(() => {
+    
+        parentNodeNotInCycleMock = jest.spyOn(CalculateRelationCycle, 'parentNodeNotInCycle');
+        parentNodeNotInCycleMock.mockReturnValue([]);
+
+        childNodeNotInCycleMock = jest.spyOn(CalculateRelationCycle, 'childNodeNotInCycle');
+        childNodeNotInCycleMock.mockReturnValue([]);
+
+        updateNodeMetadataSubgraphMock = jest.spyOn(SubgraphForSubgraphNetwork, 'updateNodeMetadataSubgraph');
+        updateNodeMetadataSubgraphMock.mockImplementation();
+
+        isIntersectionGraphMock = jest.spyOn(CalculateOverlaps, 'isIntersectionGraph');
+        isIntersectionGraphMock.mockReturnValue(false);
+
+        isOverlapNodesMock = jest.spyOn(CalculateOverlaps, 'isOverlapNodes');
+        isOverlapNodesMock.mockReturnValue(false);
+
+        isOverlapNodesEdgesMock = jest.spyOn(CalculateOverlaps, 'isOverlapNodesEdges');
+        isOverlapNodesEdgesMock.mockReturnValue(false);
+
+        getListNodeLinksForCycleGroupAsArrayMock = jest.spyOn(CalculateRelationCycle, 'getListNodeLinksForCycleGroupAsArray');
+        getListNodeLinksForCycleGroupAsArrayMock.mockReturnValue({});
+
+        getListNodeLinksForCycleGroupAsObjectMock = jest.spyOn(CalculateRelationCycle, 'getListNodeLinksForCycleGroupAsObject');
+        getListNodeLinksForCycleGroupAsObjectMock.mockReturnValue({});
+
+        getNodesPlacedInGroupCycleAsObjectMock = jest.spyOn(CalculateRelationCycle, 'getNodesPlacedInGroupCycleAsObject');
+        getNodesPlacedInGroupCycleAsObjectMock.mockReturnValue({});
+
+        rectangleSizeMock = jest.spyOn(CalculateSize, 'rectangleSize');
+        rectangleSizeMock.mockReturnValue({width:0,height:0,center:{x:0,y:0}});
+
+    });
+
+    afterEach(() => {
+        parentNodeNotInCycleMock.mockRestore();
+        childNodeNotInCycleMock.mockRestore();
+        updateNodeMetadataSubgraphMock.mockRestore();
+        isIntersectionGraphMock.mockRestore();
+        isOverlapNodesMock.mockRestore();
+        isOverlapNodesEdgesMock.mockRestore();
+        getListNodeLinksForCycleGroupAsArrayMock.mockRestore();
+        getListNodeLinksForCycleGroupAsObjectMock.mockRestore();
+        getNodesPlacedInGroupCycleAsObjectMock.mockRestore();
+        rectangleSizeMock.mockRestore();
+        forcesimulationMock.mockClear();
+    });
+
+    describe('coordinateAllCycles',()=>{
+        
+        it('should throw error because all cycle have parent subgraph of type cycle',async ()=>{        
+        
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0"],
+                parentSubgraph:{name:"cycleParent",type:TypeSubgraph.CYCLE}
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:{node0:{id:"node0",x:0,y:0}},
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph}
+            };
+
+            // TEST & EXPECT
+           await expect(LayoutDrawCycle.coordinateAllCycles(subgraphNetwork)).rejects.toThrow();
+
+        });
+
+        it('should throw error because cycle have no  node',async ()=>{  
+        
+        
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:[],
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:{},
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph}
+            };
+
+            // TEST & EXPECT
+            await expect(LayoutDrawCycle.coordinateAllCycles(subgraphNetwork)).rejects.toThrow();
+
+        });
+
+        it('should throw error because cycle have non existant node',async()=>{        
+        
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0"],
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:{},
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph}
+            };
+
+            // TEST & EXPECT
+            await expect(LayoutDrawCycle.coordinateAllCycles(subgraphNetwork)).rejects.toThrow();
+
+        });
+
+        it('should calculate coordinates for a cycle without parents and children, and get size of metanode', async()=>{        
+        
+            // MOCK 
+            getNodesPlacedInGroupCycleAsObjectMock = jest.spyOn(CalculateRelationCycle, 'getNodesPlacedInGroupCycleAsObject');
+            getNodesPlacedInGroupCycleAsObjectMock.mockImplementation( () => {
+                if (!subgraphNetwork[TypeSubgraph.CYCLEGROUP]) return;
+                const position=subgraphNetwork[TypeSubgraph.CYCLEGROUP]["cycle_group_0"].precalculatedNodesPosition;
+                if (position && position.node0.x === 0 && position.node0.y === -6 &&
+                    position.node1.x === 5.2 && position.node1.y === 3 &&
+                    position.node2.x === -5.2 && position.node2.y === 3) {
+                    return {node0:{x:0,y:-6},node1:{x:5.2,y:3},node2:{x:-5.2,y:3}};
+                }
+              }
+            );
+            
+            rectangleSizeMock = jest.spyOn(CalculateSize, 'rectangleSize');
+            rectangleSizeMock.mockReturnValue({width:10.4,height:9,center:{x:0,y:-1.5}});
+
+
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0}
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph}
+            };
+
+            const subgraphNetworkExpected:SubgraphNetwork={"network":{"id":"network",
+                "nodes":{"node0":{"id":"node0","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node1":{"id":"node1","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node2":{"id":"node2","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}}},
+                "links":[]},
+                "networkStyle":{},
+                "cycles":{"cycle":{"name":"cycle","type":TypeSubgraph.CYCLE,"nodes":["node0","node1","node2"],"radiusCycle":6,"centroidCycle":{"x":0,"y":0}}},
+                "cyclesGroup":{"cycle_group_0":{"name":"cycle_group_0","nodes":["cycle"],"type":TypeSubgraph.CYCLEGROUP,"precalculatedNodesPosition":{"node0":{"x":0,"y":-6},"node1":{"x":5.2,"y":3},"node2":{"x":-5.2,"y":3}},"width":10.4,"height":9,"originalPosition":{"x":0,"y":-1.5}}}}
+
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+
+            // EXPECT
+            expect(updateNodeMetadataSubgraphMock).toHaveBeenCalledTimes(3);
+            expect(rectangleSizeMock).toHaveBeenCalledTimes(1);
+            expect(result).toEqual(subgraphNetworkExpected);
+
+        });
+
+        it('should find top node for a cycle with parents at different levels', async()=>{        
+        
+            // MOCK 
+            parentNodeNotInCycleMock.mockReturnValue([
+                [],["node3"],["node4"]
+            ])
+            
+
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:-1},
+                node4:{id:"node4",x:0,y:-2}
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[
+                    {id:"link0",source:nodes.node1,target:nodes.node3},
+                    {id:"link1",source:nodes.node2,target:nodes.node4}
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph}
+            };
+
+
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+            const topNode=getNodeWithMinYInFirstCycleGroup(result);
+
+            // EXPECT
+            expect(topNode).toEqual("node2");
+            
+        });
+
+        it('should find top node for a cycle with parents at same levels', async()=>{        
+        
+            // MOCK 
+            parentNodeNotInCycleMock.mockReturnValue([
+                [],["node3"],["node4"]
+            ])
+            
+
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:-1},
+                node4:{id:"node4",x:0,y:-1}
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[
+                    {id:"link0",source:nodes.node1,target:nodes.node3},
+                    {id:"link1",source:nodes.node2,target:nodes.node4}
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph}
+            };
+
+
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+            const topNode=getNodeWithMinYInFirstCycleGroup(result);
+
+            // EXPECT
+            expect(topNode).toEqual("node1");
+            
+        });
+
+        it('should find top node for a cycle with child at different levels', async()=>{        
+        
+            // MOCK 
+            childNodeNotInCycleMock.mockReturnValue([
+                [],["node3"],["node4"]
+            ])
+            
+
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:1},
+                node4:{id:"node4",x:0,y:2}
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[
+                    {id:"link0",source:nodes.node1,target:nodes.node3},
+                    {id:"link1",source:nodes.node2,target:nodes.node4}
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph}
+            };
+
+
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+            const topNode=getNodeWithMinYInFirstCycleGroup(result);
+
+            // EXPECT
+            expect(topNode).toEqual("node0"); // the opposite of the bottom node (node2)
+            
+        });
+
+        it('should calculate coordinates for 2 cycles related : as line (but no force)', async()=>{
+
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2","node3"],
+            };
+            const subgraph2:Subgraph={
+                name:"cycle2",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2","node4"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:0},
+                node4:{id:"node4",x:10,y:10}
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph, "cycle2":subgraph2}
+            };
+
+            const subgraphNetworkExpected:SubgraphNetwork={"network":{"id":"network",
+                "nodes":{"node0":{"id":"node0","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node1":{"id":"node1","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node2":{"id":"node2","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node3":{"id":"node3","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node4":{"id":"node4","x":10,"y":10,"metadataLayout":{"isFixed":true}}},"links":[]},
+                "networkStyle":{},
+                "cycles":{"cycle":{"name":"cycle","type":TypeSubgraph.CYCLE,"nodes":["node0","node1","node2","node3"],"radiusCycle":8,"centroidCycle":{"x":0,"y":0}},
+                "cycle2":{"name":"cycle2","type":TypeSubgraph.CYCLE,"nodes":["node0","node1","node2","node4"]}},
+            "cyclesGroup":{"cycle_group_0":{"name":"cycle_group_0","nodes":["cycle","cycle2"],"type":TypeSubgraph.CYCLEGROUP,"precalculatedNodesPosition":{"node0":{"x":0,"y":-8},"node1":{"x":8,"y":0},"node2":{"x":0,"y":8},"node3":{"x":-8,"y":0},"node4":{"x":0,"y":0}},"width":0,"height":0,"originalPosition":{"x":0,"y":0}}}}
+
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+
+            // EXPECT
+            expect(result).toEqual(subgraphNetworkExpected);
+            expect(forcesimulationMock).not.toHaveBeenCalled();
+
+
+        });
+
+        it('should calculate coordinates for 2 cycles related : as line and interval unfixed at the end and beginning of cycle (but no force)', async()=>{
+
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0", "node1", "node2", "node3", "node4"],
+            };
+            const subgraph2:Subgraph={
+                name:"cycle2",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node6","node0","node1","node5"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:0},
+                node4:{id:"node4",x:0,y:0},
+                node5:{id:"node5",x:0,y:0},
+                node6:{id:"node6",x:0,y:0}
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph, "cycle2":subgraph2}
+            };
+
+            const subgraphNetworkExpected:SubgraphNetwork={
+                "network": {
+                  "id": "network",
+                  "nodes": {
+                    "node0": { "id": "node0", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node1": { "id": "node1", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node2": { "id": "node2", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node3": { "id": "node3", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node4": { "id": "node4", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node5": { "id": "node5", "x": 0, "y": 0, "metadataLayout": { "isFixed": true } },
+                    "node6": { "id": "node6", "x": 0, "y": 0, "metadataLayout": { "isFixed": true } }
+                  },
+                  "links": []
+                },
+                "networkStyle": {},
+                "cycles": {
+                  "cycle": {
+                    "name": "cycle",
+                    "type": TypeSubgraph.CYCLE,
+                    "nodes": ["node0", "node1", "node2", "node3", "node4"],
+                    "radiusCycle": 10,
+                    "centroidCycle": { "x": 0, "y": 0 }
+                  },
+                  "cycle2": {
+                    "name": "cycle2",
+                    "type": TypeSubgraph.CYCLE,
+                    "nodes": ["node6", "node0", "node1", "node5"]
+                  }
+                },
+                "cyclesGroup": {
+                  "cycle_group_0": {
+                    "name": "cycle_group_0",
+                    "nodes": ["cycle", "cycle2"],
+                    "type": TypeSubgraph.CYCLEGROUP,
+                    "precalculatedNodesPosition": {
+                      "node0": { "x": 0, "y": -10 },
+                      "node1": { "x": 9.51, "y": -3.09 },
+                      "node2": { "x": 5.88, "y": 8.09 },
+                      "node3": { "x": -5.88, "y": 8.09 },
+                      "node4": { "x": -9.51, "y": -3.09 },
+                      "node5": { "x": 6.34, "y": -5.39 },
+                      "node6": { "x": 3.17, "y": -7.7 }
+                    },
+                    "width": 0,
+                    "height": 0,
+                    "originalPosition": { "x": 0, "y": 0 }
+                  }
+                }
+              }
+              
+              
+            
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+
+            // EXPECT
+            expect(result).toEqual(subgraphNetworkExpected);
+            expect(forcesimulationMock).not.toHaveBeenCalled();
+
+        });
+
+    
+
+        it('should calculate coordinates for 2 cycles related : as tangent (but no force)', async()=>{
+
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2",],
+            };
+            const subgraph2:Subgraph={
+                name:"cycle2",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node3","node4"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:0},
+                node4:{id:"node4",x:0,y:0}
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph, "cycle2":subgraph2}
+            };
+
+            const subgraphNetworkExpected:SubgraphNetwork={"network":{"id":"network",
+                "nodes":{"node0":{"id":"node0","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node1":{"id":"node1","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node2":{"id":"node2","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node3":{"id":"node3","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle2"}},
+                "node4":{"id":"node4","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle2"}}},
+                "links":[]},"networkStyle":{},
+                "cycles":{"cycle":{"name":"cycle","type":TypeSubgraph.CYCLE,"nodes":["node0","node1","node2"],"radiusCycle":6,"centroidCycle":{"x":0,"y":0}},
+                "cycle2":{"name":"cycle2","type":TypeSubgraph.CYCLE,"nodes":["node0","node3","node4"],"radiusCycle":6,"centroidCycle":{"x":0,"y":-12}}},
+            "cyclesGroup":{"cycle_group_0":{"name":"cycle_group_0","nodes":["cycle","cycle2"],"type":TypeSubgraph.CYCLEGROUP,"precalculatedNodesPosition":{"node0":{"x":0,"y":-6},"node1":{"x":5.2,"y":3},"node2":{"x":-5.2,"y":3},"node3":{"x":-5.2,"y":-15},"node4":{"x":5.2,"y":-15}},"width":0,"height":0,"originalPosition":{"x":0,"y":0}}}}
+
+            
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+
+            // EXPECT
+            expect(result).toEqual(subgraphNetworkExpected);
+            expect(forcesimulationMock).not.toHaveBeenCalled();
+
+
+        });
+
+        it('should calculate coordinates when force layout neccessary (case line) : intersection of edges', async()=>{
+
+            // MOCK
+            isIntersectionGraphMock.mockReturnValue(true);
+
+            getListNodeLinksForCycleGroupAsArrayMock.mockReturnValue({
+                nodes: [
+                  { id: 'node0', fx: 0, fy: -6 },
+                  { id: 'node1', fx: 5.2, fy: 3 },
+                  { id: 'node2', fx: -5.2, fy: 3 },
+                  { id: 'node3' }
+                ],
+                links: []
+            });
+                                  
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2"],
+            };
+            const subgraph2:Subgraph={
+                name:"cycle2",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node3"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:0}, // will be placed at (34,34) by force
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph, "cycle2":subgraph2}
+            };
+
+            const subgraphNetworkExpected:SubgraphNetwork={"network":{"id":"network",
+                "nodes":{"node0":{"id":"node0","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node1":{"id":"node1","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node2":{"id":"node2","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node3":{"id":"node3","x":0,"y":0,"metadataLayout":{"isFixed":true}}},
+                "links":[]},
+                "networkStyle":{},
+                "cycles":{"cycle":{"name":"cycle","type":TypeSubgraph.CYCLE,"nodes":["node0","node1","node2"],"radiusCycle":6,"centroidCycle":{"x":0,"y":0}},
+                "cycle2":{"name":"cycle2","type":TypeSubgraph.CYCLE,"nodes":["node0","node1","node3"]}},
+                "cyclesGroup":{"cycle_group_0":{"name":"cycle_group_0","nodes":["cycle","cycle2"],"type":TypeSubgraph.CYCLEGROUP,
+                    "precalculatedNodesPosition":{"node0":{"x":0,"y":-6},"node1":{"x":5.2,"y":3},"node2":{"x":-5.2,"y":3},"node3":{"x":34,"y":34}},
+                "width":0,"height":0,"originalPosition":{"x":0,"y":0}}}}
+
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+
+            // EXPECT
+            expect(getListNodeLinksForCycleGroupAsArrayMock).toHaveBeenCalledTimes(1);
+            expect(result).toEqual(subgraphNetworkExpected);
+            expect(forcesimulationMock).toHaveBeenCalledTimes(1);
+
+
+        });
+
+        it('should test if force layout used (case line) : node overlap ', async()=>{
+
+            // MOCK
+            isOverlapNodesMock.mockReturnValue(true);
+
+            getListNodeLinksForCycleGroupAsArrayMock.mockReturnValue({
+                nodes: [
+                  { id: 'node0', fx: 0, fy: -6 },
+                  { id: 'node1', fx: 5.2, fy: 3 },
+                  { id: 'node2', fx: -5.2, fy: 3 },
+                  { id: 'node3' }
+                ],
+                links: []
+            });
+                                  
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2"],
+            };
+            const subgraph2:Subgraph={
+                name:"cycle2",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node3"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:0}, // will be placed at (34,34) by force
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph, "cycle2":subgraph2}
+            };
+
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+            let posNode3:CoordinateNull={x:null,y:null};
+
+            if(result.cyclesGroup && result[TypeSubgraph.CYCLEGROUP]["cycle_group_0"] 
+                && result.cyclesGroup["cycle_group_0"].precalculatedNodesPosition
+            && result.cyclesGroup["cycle_group_0"].precalculatedNodesPosition.node3){
+                posNode3=result.cyclesGroup["cycle_group_0"].precalculatedNodesPosition.node3;
+            }
+
+            // EXPECT
+            expect(posNode3).toBeDefined();
+            expect(posNode3.x).toEqual(34);
+            expect(posNode3.y).toEqual(34);
+            expect(forcesimulationMock).toHaveBeenCalledTimes(1);
+
+
+        });
+
+        it('should test if force layout used (case line) : node-edge overlap ', async()=>{
+
+            // MOCK
+            isOverlapNodesEdgesMock.mockReturnValue(true);
+
+            getListNodeLinksForCycleGroupAsArrayMock.mockReturnValue({
+                nodes: [
+                  { id: 'node0', fx: 0, fy: -6 },
+                  { id: 'node1', fx: 5.2, fy: 3 },
+                  { id: 'node2', fx: -5.2, fy: 3 },
+                  { id: 'node3' }
+                ],
+                links: []
+            });
+                                  
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2"],
+            };
+            const subgraph2:Subgraph={
+                name:"cycle2",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node3"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:0}, // will be placed at (34,34) by force
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph, "cycle2":subgraph2}
+            };
+
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+            let posNode3:CoordinateNull={x:null,y:null};
+
+            if(result.cyclesGroup && result[TypeSubgraph.CYCLEGROUP]["cycle_group_0"] 
+                && result.cyclesGroup["cycle_group_0"].precalculatedNodesPosition
+            && result.cyclesGroup["cycle_group_0"].precalculatedNodesPosition.node3){
+                posNode3=result.cyclesGroup["cycle_group_0"].precalculatedNodesPosition.node3;
+            }
+
+            // EXPECT
+            expect(posNode3).toBeDefined();
+            expect(posNode3.x).toEqual(34);
+            expect(posNode3.y).toEqual(34);
+            expect(forcesimulationMock).toHaveBeenCalledTimes(1);
+
+        });
+
+
+        it('should calculate coordinates for more complex case : 1 cycle group with 1 line and 1 tangent (but no force)', async()=>{
+
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node6","node7","node8","node9"],
+            };
+            const subgraph2:Subgraph={
+                name:"cycle2",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node1","node2","node3","node4","node5"],
+            };
+            const subgraph3:Subgraph={
+                name:"cycle3",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node6","node7","node8","node2"],
+            };
+
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:0},
+                node4:{id:"node4",x:0,y:0},
+                node5:{id:"node5",x:0,y:0},
+                node6:{id:"node6",x:0,y:0},
+                node7:{id:"node7",x:0,y:0},
+                node8:{id:"node8",x:0,y:0},
+                node9:{id:"node9",x:0,y:0}
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph, "cycle2":subgraph2, "cycle3":subgraph3}
+            };
+
+            const subgraphNetworkExpected:SubgraphNetwork={
+                "network": {
+                  "id": "network",
+                  "nodes": {
+                    "node0": { "id": "node0", "x": 0, "y": 0 },
+                    "node1": { "id": "node1", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle2" } },
+                    "node2": { "id": "node2", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle2" } },
+                    "node3": { "id": "node3", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle2" } },
+                    "node4": { "id": "node4", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle2" } },
+                    "node5": { "id": "node5", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle2" } },
+                    "node6": { "id": "node6", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle3" } },
+                    "node7": { "id": "node7", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle3" } },
+                    "node8": { "id": "node8", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle3" } },
+                    "node9": { "id": "node9", "x": 0, "y": 0, "metadataLayout": { "isFixed": true } }
+                  },
+                  "links": []
+                },
+                "networkStyle": {},
+                "cycles": {
+                  "cycle": { "name": "cycle", "type": TypeSubgraph.CYCLE, "nodes": ["node6", "node7", "node8", "node9"] },
+                  "cycle2": { "name": "cycle2", "type": TypeSubgraph.CYCLE, "nodes": ["node1", "node2", "node3", "node4", "node5"], "radiusCycle": 10, "centroidCycle": { "x": 0, "y": 0 } },
+                  "cycle3": { "name": "cycle3", "type": TypeSubgraph.CYCLE, "nodes": ["node6", "node7", "node8", "node2"], "radiusCycle": 8, "centroidCycle": { "x": 17.12, "y": -5.56 } }
+                },
+                "cyclesGroup": {
+                  "cycle_group_0": {
+                    "name": "cycle_group_0",
+                    "nodes": ["cycle2", "cycle3", "cycle"],
+                    "type": TypeSubgraph.CYCLEGROUP,
+                    "precalculatedNodesPosition": {
+                      "node1": { "x": 0, "y": -10 },
+                      "node2": { "x": 9.51, "y": -3.09 },
+                      "node3": { "x": 5.88, "y": 8.09 },
+                      "node4": { "x": -5.88, "y": 8.09 },
+                      "node5": { "x": -9.51, "y": -3.09 },
+                      "node6": { "x": 14.65, "y": -13.17 },
+                      "node7": { "x": 24.73, "y": -8.03 },
+                      "node8": { "x": 19.59, "y": 2.05 },
+                      "node9": { "x": 17.12, "y": -5.56 }
+                    },
+                    "width": 0,
+                    "height": 0,
+                    "originalPosition": { "x": 0, "y": 0 }
+                  }
+                }
+              }
+              
+            
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+
+            // EXPECT
+            expect(result).toEqual(subgraphNetworkExpected);
+            expect(forcesimulationMock).not.toHaveBeenCalled();
+
+
+        });
+
+
+        it('should calculate coordinates for 2 cycles independant', async()=>{
+
+            // DATA
+            const subgraph:Subgraph={
+                name:"cycle",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node0","node1","node2"],
+            };
+            const subgraph2:Subgraph={
+                name:"cycle2",
+                type:TypeSubgraph.CYCLE,
+                nodes:["node3","node4","node5"],
+            };
+            const nodes:{[key:string]:NodeLayout}={
+                node0:{id:"node0",x:0,y:0},
+                node1:{id:"node1",x:0,y:0},
+                node2:{id:"node2",x:0,y:0},
+                node3:{id:"node3",x:0,y:0},
+                node4:{id:"node4",x:0,y:0},
+                node5:{id:"node5",x:0,y:0},
+            };
+
+            const network:NetworkLayout={
+                id:"network",
+                nodes:nodes,
+                links:[]
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                network:network,
+                networkStyle:{},
+                [TypeSubgraph.CYCLE]:{"cycle":subgraph, "cycle2":subgraph2}
+            };
+
+            const subgraphNetworkExpected:SubgraphNetwork={
+                "network": {
+                  "id": "network",
+                  "nodes": {
+                    "node0": { "id": "node0", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node1": { "id": "node1", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node2": { "id": "node2", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node3": { "id": "node3", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle2" } },
+                    "node4": { "id": "node4", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle2" } },
+                    "node5": { "id": "node5", "x": 0, "y": 0, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle2" } }
+                  },
+                  "links": []
+                },
+                "networkStyle": {},
+                "cycles": {
+                  "cycle": { "name": "cycle", "type": TypeSubgraph.CYCLE, "nodes": ["node0", "node1", "node2"], "radiusCycle": 6, "centroidCycle": { "x": 0, "y": 0 } },
+                  "cycle2": { "name": "cycle2", "type": TypeSubgraph.CYCLE, "nodes": ["node3", "node4", "node5"], "radiusCycle": 6, "centroidCycle": { "x": 0, "y": 0 } }
+                },
+                "cyclesGroup": {
+                  "cycle_group_0": {
+                    "name": "cycle_group_0",
+                    "nodes": ["cycle"],
+                    "type": TypeSubgraph.CYCLEGROUP,
+                    "precalculatedNodesPosition": {
+                      "node0": { "x": 0, "y": -6 },
+                      "node1": { "x": 5.2, "y": 3 },
+                      "node2": { "x": -5.2, "y": 3 }
+                    },
+                    "width": 0,"height": 0,"originalPosition": { "x": 0, "y": 0 }
+                  },
+                  "cycle_group_1": {
+                    "name": "cycle_group_1",
+                    "nodes": ["cycle2"],
+                    "type": TypeSubgraph.CYCLEGROUP,
+                    "precalculatedNodesPosition": {
+                      "node3": { "x": 0, "y": -6 },
+                      "node4": { "x": 5.2, "y": 3 },
+                      "node5": { "x": -5.2, "y": 3 }
+                    },
+                    "width": 0,"height": 0,"originalPosition": { "x": 0, "y": 0 }
+                  }
+                }
+              };        
+
+            // TEST
+            const result=await LayoutDrawCycle.coordinateAllCycles(subgraphNetwork);
+
+            
+            // EXPECT
+            expect(getNodesPlacedInGroupCycleAsObjectMock).toHaveBeenCalledTimes(2);
+            expect(result).toEqual(subgraphNetworkExpected);
+
+        });
+
+        
+    });
+
+
+    describe('drawAllCyclesGroup',()=>{
+
+        it('should draw all cycle group',()=>{
+
+            // MOCK
+            getNodesPlacedInGroupCycleAsObjectMock
+                .mockReturnValueOnce(
+                    {
+                    node0: { x: 0, y: -6 },
+                    node1: { x: 5.2, y: 3 },
+                    node2: { x: -5.2, y: 3 }
+                })
+                .mockReturnValueOnce({ node3: { x: 6, y: -6 } })
+
+
+            // DATA
+            const nodes:{[key:string]:NodeLayout}={"node0":{"id":"node0","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node1":{"id":"node1","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node2":{"id":"node2","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node3":{"id":"node3","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle2"}}};
+
+            const subgraphNetwork:SubgraphNetwork={
+                "network":{
+                    "id":"network",
+                    nodes:nodes,
+                    "links":[]},
+                "networkStyle":{},
+                "cyclesGroup":{cycle_group_0:
+                    {"name":"cycle_group_0","nodes":["cycle"],
+                    "type":TypeSubgraph.CYCLEGROUP,
+                    "position":{x:10,y:10},
+                    "precalculatedNodesPosition":{
+                        "node0":{"x":0,"y":-6},
+                        "node1":{"x":5.2,"y":3},
+                        "node2":{"x":-5.2,"y":3}},
+                        "width":10.4,"height":9,
+                        "originalPosition":{"x":0,"y":-1.5}},
+                    cycle_group_1:
+                    {"name":"cycle_group_1","nodes":["cycle2"],
+                    "type":TypeSubgraph.CYCLEGROUP,
+                    "position":{x:-10,y:-10},
+                    "precalculatedNodesPosition":{
+                        "node3":{"x":6,"y":-6}},
+                        "width":10.4,"height":9,
+                        "originalPosition":{"x":0,"y":-1.5}}}};
+
+            
+
+            const networkExpected : NetworkLayout ={
+                "id": "network",
+                "nodes": {
+                    "node0": { "id": "node0", "x": 10, "y": 5.5, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node1": { "id": "node1", "x": 15.2, "y": 14.5, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node2": { "id": "node2", "x": 4.8, "y": 14.5, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle" } },
+                    "node3": { "id": "node3", "x": -4, "y": -14.5, "metadataLayout": { "isFixed": true, "fixedInCircle": "cycle2" } }
+                },
+                "links": []
+                };
+                
+            // TEST
+            LayoutDrawCycle.drawAllCyclesGroup(subgraphNetwork);
+
+            // EXPECT
+            expect(subgraphNetwork.network).toEqual(networkExpected);
+
+        });
+
+        it('should throw error because no original position of cyclegroup',()=>{
+
+            // MOCK
+            getNodesPlacedInGroupCycleAsObjectMock
+                .mockReturnValueOnce(
+                    {
+                    node0: { x: 0, y: -6 },
+                    node1: { x: 5.2, y: 3 },
+                    node2: { x: -5.2, y: 3 }
+                })
+                .mockReturnValueOnce({ node3: { x: 6, y: -6 } })
+
+
+            // DATA
+            const nodes:{[key:string]:NodeLayout}={"node0":{"id":"node0","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node1":{"id":"node1","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node2":{"id":"node2","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                "network":{
+                    "id":"network",
+                    nodes:nodes,
+                    "links":[]},
+                "networkStyle":{},
+                "cyclesGroup":{cycle_group_0:
+                    {"name":"cycle_group_0","nodes":["cycle"],
+                    "type":TypeSubgraph.CYCLEGROUP,
+                    "position":{x:10,y:10},
+                    "precalculatedNodesPosition":{
+                        "node0":{"x":0,"y":-6},
+                        "node1":{"x":5.2,"y":3},
+                        "node2":{"x":-5.2,"y":3}},
+                        "width":10.4,"height":9,
+                }}
+            };
+
+            // TEST & EXPECT
+            expect(() => {
+                LayoutDrawCycle.drawAllCyclesGroup(subgraphNetwork);
+            }).toThrow();
+
+        });
+
+        it('should throw error because no position of metanode',()=>{
+
+            // MOCK
+            getNodesPlacedInGroupCycleAsObjectMock
+                .mockReturnValueOnce(
+                    {
+                    node0: { x: 0, y: -6 },
+                    node1: { x: 5.2, y: 3 },
+                    node2: { x: -5.2, y: 3 }
+                })
+                .mockReturnValueOnce({ node3: { x: 6, y: -6 } })
+
+
+            // DATA
+            const nodes:{[key:string]:NodeLayout}={"node0":{"id":"node0","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node1":{"id":"node1","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node2":{"id":"node2","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                "network":{
+                    "id":"network",
+                    nodes:nodes,
+                    "links":[]},
+                "networkStyle":{},
+                "cyclesGroup":{cycle_group_0:
+                    {"name":"cycle_group_0","nodes":["cycle"],
+                    "type":TypeSubgraph.CYCLEGROUP,
+                    "precalculatedNodesPosition":{
+                        "node0":{"x":0,"y":-6},
+                        "node1":{"x":5.2,"y":3},
+                        "node2":{"x":-5.2,"y":3}},
+                        "width":10.4,"height":9,
+                        "originalPosition":{"x":0,"y":-1.5}
+                }}
+            };
+
+            // TEST & EXPECT
+            expect(() => {
+                LayoutDrawCycle.drawAllCyclesGroup(subgraphNetwork);
+            }).toThrow();
+
+        });
+
+        it('should throw error because node in metadata but not in network',()=>{
+
+            // MOCK
+            getNodesPlacedInGroupCycleAsObjectMock
+                .mockReturnValueOnce(
+                    {
+                    node0: { x: 0, y: -6 },
+                    node1: { x: 5.2, y: 3 },
+                    node2: { x: -5.2, y: 3 }
+                })
+                .mockReturnValueOnce({ node3: { x: 6, y: -6 } })
+
+
+            // DATA
+            const nodes:{[key:string]:NodeLayout}={"node0":{"id":"node0","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+                "node1":{"id":"node1","x":0,"y":0,"metadataLayout":{"isFixed":true,"fixedInCircle":"cycle"}},
+            };
+
+            const subgraphNetwork:SubgraphNetwork={
+                "network":{
+                    "id":"network",
+                    nodes:nodes,
+                    "links":[]},
+                "networkStyle":{},
+                "cyclesGroup":{cycle_group_0:
+                    {"name":"cycle_group_0","nodes":["cycle"],
+                    "type":TypeSubgraph.CYCLEGROUP,
+                    "position":{x:10,y:10},
+                    "precalculatedNodesPosition":{
+                        "node0":{"x":0,"y":-6},
+                        "node1":{"x":5.2,"y":3},
+                        "node2":{"x":-5.2,"y":3}},
+                        "width":10.4,"height":9,
+                        "originalPosition":{"x":0,"y":-1.5}
+                }}
+            };
+
+            // TEST & EXPECT
+            expect(() => {
+                LayoutDrawCycle.drawAllCyclesGroup(subgraphNetwork);
+            }).toThrow();
+
+        });
+
+
+
+    });
+   
+});
\ No newline at end of file
diff --git a/src/composables/__tests__/LayoutFindCycle.test.ts b/src/composables/__tests__/LayoutFindCycle.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5197fd3500199f46fb94082939c47816672e2071
--- /dev/null
+++ b/src/composables/__tests__/LayoutFindCycle.test.ts
@@ -0,0 +1,360 @@
+// Type imports
+import { NodeLayout } from "../../types/NetworkLayout";
+import { Subgraph, TypeSubgraph } from "../../types/Subgraph";
+import { SubgraphNetwork } from "../../types/SubgraphNetwork";
+import { Network,Node } from  "../../types/TypeVizCore";
+
+// Composable imports
+import * as LayoutFindCycle from '../LayoutFindCycle';
+import * as LayoutReversibleReactions from '../LayoutReversibleReactions';
+import * as SubgraphForSubgraphNetwork from '../SubgraphForSubgraphNetwork'; 
+
+
+describe('LayoutFindCycle', () => {
+
+    let addSubgraphToNetworkMock: jest.SpyInstance;
+    let createSubgraphMock: jest.SpyInstance;
+    let updateNodeMetadataSubgraphMock: jest.SpyInstance;
+    let updateParentSubgraphOfMock: jest.SpyInstance;
+    let keepFirstReversibleNodeMock: jest.SpyInstance;
+    let renameAllIDNodeMock: jest.SpyInstance;
+
+    const minsize=3;
+    let nodes:{[key:string]:NodeLayout} ;
+
+    renameAllIDNodeMock = jest.spyOn(LayoutReversibleReactions, 'renameAllIDNode');
+    renameAllIDNodeMock.mockImplementation(()=>{});
+
+    updateNodeMetadataSubgraphMock = jest.spyOn(SubgraphForSubgraphNetwork, 'updateNodeMetadataSubgraph');
+    updateNodeMetadataSubgraphMock.mockImplementation(()=>{});
+
+    createSubgraphMock = jest.spyOn(SubgraphForSubgraphNetwork, 'createSubgraph');
+    createSubgraphMock.mockImplementation((name:string,nodes:string[])=>{
+        return {
+            name: name,
+            nodes: nodes,
+            type: TypeSubgraph.CYCLE,
+        }
+});
+
+    beforeEach(() => {
+
+        nodes={
+            A:{id:'A',x:0,y:0,metadataLayout:{reversibleNodeVersion:"A_rev"}},
+            B:{id:'B',x:0,y:0},
+            C:{id:'C',x:0,y:0},
+            D:{id:'D',x:0,y:0},
+            E:{id:'E',x:0,y:0},
+            F:{id:'F',x:0,y:0},
+            A_rev:{id:'A_rev',x:0,y:0,metadataLayout:{reversibleNodeVersion:"A"}},
+        }
+
+        keepFirstReversibleNodeMock = jest.spyOn(LayoutReversibleReactions, 'keepFirstReversibleNode');
+        keepFirstReversibleNodeMock.mockImplementation(()=>{});
+
+        addSubgraphToNetworkMock = jest.spyOn(SubgraphForSubgraphNetwork, 'addSubgraphToNetwork');
+        addSubgraphToNetworkMock.mockImplementation((subgraphNetwork:SubgraphNetwork,subgraph:Subgraph,type:TypeSubgraph)=>{
+            if (!subgraphNetwork[type]) subgraphNetwork[type]={};
+            if(!(subgraph.name in subgraphNetwork[type])){
+                subgraphNetwork[type][subgraph.name]=subgraph;
+            }
+            return subgraphNetwork;
+        });
+
+        updateParentSubgraphOfMock = jest.spyOn(SubgraphForSubgraphNetwork, 'updateParentSubgraphOf');
+        updateParentSubgraphOfMock.mockImplementation(()=>{});
+
+    });
+
+    afterEach(() => {
+        addSubgraphToNetworkMock.mockRestore();
+        keepFirstReversibleNodeMock.mockRestore();
+        updateParentSubgraphOfMock.mockRestore();
+    });
+
+    describe('addDirectedCycleToSubgraphNetwork', () => {
+
+
+        it('should find only one directed cycles when there is a permutation', () => {            
+
+            // DATA
+            const network:Network = {
+                id:"network",
+                nodes: nodes,
+                links: [
+                    {id:"link", source:nodes.A,target:nodes.B},
+                    {id:"link", source:nodes.B,target:nodes.C},
+                    {id:"link", source:nodes.C,target:nodes.A},
+                    {id:"link", source:nodes.B,target:nodes.A},
+                    {id:"link", source:nodes.C,target:nodes.B},
+                    {id:"link", source:nodes.A,target:nodes.C}
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork = {
+                network:network,
+                networkStyle:{},
+            }
+
+            const cyclesExpected : {[key:string]:Subgraph}= {"cycle_0":{"name":"cycle_0","nodes":["A","B","C"],"type":TypeSubgraph.CYCLE}};
+
+            // TEST
+            const result=LayoutFindCycle.addDirectedCycleToSubgraphNetwork(subgraphNetwork,minsize);
+            
+            // EXPECT
+            expect(addSubgraphToNetworkMock).toHaveBeenCalledTimes(1);
+            expect(result[TypeSubgraph.CYCLE]).toBeDefined();
+            expect(result[TypeSubgraph.CYCLE]).toEqual(cyclesExpected)
+                
+        });
+
+        it('should find directed cycles that are independants', () => {
+
+            // DATA
+            const network:Network = {
+                id:"network",
+                nodes: nodes,
+                links: [
+                    {id:"link", source:nodes.A,target:nodes.B},
+                    {id:"link", source:nodes.B,target:nodes.C},
+                    {id:"link", source:nodes.C,target:nodes.A},
+                    {id:"link", source:nodes.D,target:nodes.E},
+                    {id:"link", source:nodes.E,target:nodes.F},
+                    {id:"link", source:nodes.F,target:nodes.D}
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork = {
+                network:network,
+                networkStyle:{},
+            }
+
+           const cyclesExpected : {[key:string]:Subgraph}= {
+            cycle_0: { name: 'cycle_0', nodes: [ 'A', 'B', 'C' ], type: TypeSubgraph.CYCLE },
+            cycle_1: { name: 'cycle_1', nodes: [ 'D', 'E', 'F' ], type: TypeSubgraph.CYCLE}
+          }
+
+            // TEST
+            const result=LayoutFindCycle.addDirectedCycleToSubgraphNetwork(subgraphNetwork,minsize);
+
+            // EXPECT
+            expect(addSubgraphToNetworkMock).toHaveBeenCalledTimes(2);
+            expect(updateParentSubgraphOfMock).toHaveBeenCalledTimes(0);
+            expect(result[TypeSubgraph.CYCLE]).toBeDefined();
+            expect(result[TypeSubgraph.CYCLE]).toEqual(cyclesExpected);
+                
+        });
+
+        it('should find directed cycles that have one node in common', () => {
+
+            // DATA
+            const network:Network = {
+                id:"network",
+                nodes: nodes,
+                links: [
+                    {id:"link", source:nodes.A,target:nodes.B},
+                    {id:"link", source:nodes.B,target:nodes.C},
+                    {id:"link", source:nodes.C,target:nodes.A},
+                    {id:"link", source:nodes.D,target:nodes.E},
+                    {id:"link", source:nodes.E,target:nodes.B},
+                    {id:"link", source:nodes.B,target:nodes.D}
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork = {
+                network:network,
+                networkStyle:{},
+            }
+
+           const cyclesExpected : {[key:string]:Subgraph}= {
+            cycle_0: { name: 'cycle_0', nodes: [ 'A', 'B', 'C' ], type: TypeSubgraph.CYCLE },
+            cycle_1: { name: 'cycle_1', nodes: [ 'B', 'D', 'E' ], type: TypeSubgraph.CYCLE }
+          }
+
+            // TEST
+            const result=LayoutFindCycle.addDirectedCycleToSubgraphNetwork(subgraphNetwork,minsize);
+
+            // EXPECT
+            expect(addSubgraphToNetworkMock).toHaveBeenCalledTimes(2);
+            expect(updateParentSubgraphOfMock).toHaveBeenCalledTimes(0);
+            expect(result[TypeSubgraph.CYCLE]).toBeDefined();
+            expect(result[TypeSubgraph.CYCLE]).toEqual(cyclesExpected);
+
+        });
+
+        it('should find directed cycles that have several nodes in common', () => {
+
+            // DATA
+            const network:Network = {
+                id:"network",
+                nodes: nodes,
+                links: [
+                    {id:"link", source:nodes.A,target:nodes.B},
+                    {id:"link", source:nodes.B,target:nodes.C},
+                    {id:"link", source:nodes.C,target:nodes.A},
+                    {id:"link", source:nodes.D,target:nodes.E},
+                    {id:"link", source:nodes.E,target:nodes.B},
+                    {id:"link", source:nodes.B,target:nodes.C},
+                    {id:"link", source:nodes.C,target:nodes.D},
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork = {
+                network:network,
+                networkStyle:{},
+            }
+
+           const cyclesExpected : {[key:string]:Subgraph}= {
+            cycle_1: { name: 'cycle_1', nodes: [ 'B', 'C', 'D', 'E' ], type: TypeSubgraph.CYCLE },
+            cycle_0: {
+              name: 'cycle_0',
+              nodes: [ 'A', 'B', 'C' ],
+              type: TypeSubgraph.CYCLE,
+              parentSubgraph: { name: 'cycle_1', type: TypeSubgraph.CYCLE }
+            }
+          }
+
+            // TEST
+            const result=LayoutFindCycle.addDirectedCycleToSubgraphNetwork(subgraphNetwork,minsize);
+
+            // EXPECT
+            expect(addSubgraphToNetworkMock).toHaveBeenCalledTimes(2);
+            expect(updateParentSubgraphOfMock).toHaveBeenCalledTimes(1);
+            expect(result[TypeSubgraph.CYCLE]).toBeDefined();
+            expect(result[TypeSubgraph.CYCLE]).toEqual(cyclesExpected);
+
+        });
+
+        it('shouln d find cycles when reversible reactions are duplicated', () => {
+            // DATA
+            const network:Network = {
+                id:"network",
+                nodes: nodes,
+                links: [
+                    {id:"link", source:nodes.A,target:nodes.C},
+                    {id:"link", source:nodes.C,target:nodes.A_rev},
+                    {id:"link", source:nodes.A_rev,target:nodes.B},
+                    {id:"link", source:nodes.B,target:nodes.A},
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork = {
+                network:network,
+                networkStyle:{},
+            }
+
+            // TEST
+            const result=LayoutFindCycle.addDirectedCycleToSubgraphNetwork(subgraphNetwork,minsize);
+
+            // EXPECT
+            expect(keepFirstReversibleNodeMock).toHaveBeenCalledTimes(0);
+            expect(result[TypeSubgraph.CYCLE]).toBeDefined();
+            expect(result[TypeSubgraph.CYCLE]).toEqual({});
+
+        });
+
+        it('should find cycles when reversible reactions are duplicated, and rename node', () => {
+
+            // MOCK
+            keepFirstReversibleNodeMock.mockImplementation((subgraphNetwork:SubgraphNetwork,nodeOrder:string[])=>{
+                if (nodeOrder.includes("A_rev") && !nodeOrder.includes("A")){
+                    return {"A_rev":"A"};
+                }
+                return {};
+
+            })
+
+            // DATA
+            const network:Network = {
+                id:"network",
+                nodes: nodes,
+                links: [
+                    {id:"link", source:nodes.A,target:nodes.C},
+                    {id:"link", source:nodes.C,target:nodes.A_rev},
+                    {id:"link", source:nodes.A_rev,target:nodes.B},
+                    {id:"link", source:nodes.B,target:nodes.A},
+                    {id:"link", source:nodes.B,target:nodes.C},
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork = {
+                network:network,
+                networkStyle:{},
+            }
+
+            const cyclesExpected={
+                cycle_0: { name: 'cycle_0', nodes: [ 'A_rev', 'B', 'C' ], type: 'cycles' }
+              };
+
+            // TEST
+            const result=LayoutFindCycle.addDirectedCycleToSubgraphNetwork(subgraphNetwork,minsize);
+
+            // EXPECT
+            expect(keepFirstReversibleNodeMock).toHaveBeenCalledTimes(1);
+            expect(renameAllIDNodeMock).toHaveBeenCalledWith(expect.anything(),{"A_rev":"A"})
+            expect(result[TypeSubgraph.CYCLE]).toBeDefined();
+            expect(result[TypeSubgraph.CYCLE]).toEqual(cyclesExpected);
+
+        });
+
+        it('should remove a non existant cycle when reversible reactions are duplicated', () => {
+
+            // MOCK
+            keepFirstReversibleNodeMock.mockImplementation((subgraphNetwork:SubgraphNetwork,nodeOrder:string[])=>{
+                if (nodeOrder.includes("A_rev") && !nodeOrder.includes("A")){
+                    delete subgraphNetwork.network.nodes.A;
+                }
+                if (nodeOrder.includes("A") && !nodeOrder.includes("A_rev")){
+                    delete subgraphNetwork.network.nodes.A_rev;
+                }
+                return subgraphNetwork;
+            })
+
+            // DATA
+            const network:Network = {
+                id:"network",
+                nodes: nodes,
+                links: [
+                    {id:"link", source:nodes.A,target:nodes.D},
+                    {id:"link", source:nodes.C,target:nodes.D},
+                    {id:"link", source:nodes.B,target:nodes.C},
+                    {id:"link", source:nodes.B,target:nodes.A},
+                    {id:"link", source:nodes.A_rev,target:nodes.B},
+                    {id:"link", source:nodes.D,target:nodes.A_rev},
+                    {id:"link", source:nodes.E,target:nodes.A_rev},
+                    {id:"link", source:nodes.A,target:nodes.E},
+                    {id:"link", source:nodes.A_rev,target:nodes.F},
+                    {id:"link", source:nodes.F,target:nodes.A},
+                    {id:"link", source:nodes.E,target:nodes.F},
+                ]
+            };
+
+            const subgraphNetwork:SubgraphNetwork = {
+                network:network,
+                networkStyle:{},
+            }
+
+            const cyclesExpected={
+                cycle_1: {
+                  name: 'cycle_1',
+                  nodes: [ 'A_rev', 'B', 'C', 'D' ],
+                  type: 'cycles'
+                }
+            };
+
+            // TEST
+            const result=LayoutFindCycle.addDirectedCycleToSubgraphNetwork(subgraphNetwork,minsize);
+
+            // EXPECT
+            expect(keepFirstReversibleNodeMock).toHaveBeenCalledTimes(1);
+            expect(renameAllIDNodeMock).toHaveBeenCalledWith(expect.anything(),{"A_rev":"A"})
+            expect(result[TypeSubgraph.CYCLE]).toBeDefined();
+            expect(result[TypeSubgraph.CYCLE]).toEqual(cyclesExpected);
+            expect(result.network.nodes.A).not.toBeDefined();
+
+        });
+
+
+    });
+
+});
\ No newline at end of file
diff --git a/src/composables/__tests__/LayoutMain.test.ts b/src/composables/__tests__/LayoutMain.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a8296f9910c9016ea858e9b92fd0ffb4f7b2d93d
--- /dev/null
+++ b/src/composables/__tests__/LayoutMain.test.ts
@@ -0,0 +1,522 @@
+// Type imports
+import { defaultParameters,Parameters } from "../../types/Parameters";
+import { GraphStyleProperties, Link, Network } from "../../types/TypeVizCore";
+import { NetworkLayout } from "../../types/NetworkLayout";
+import { SubgraphNetwork } from "../../types/SubgraphNetwork";
+import { TypeSubgraph } from "../../types/Subgraph";
+import {Node} from "../../types/TypeVizCore";
+
+// Composable imports
+import * as LayoutMain from "../LayoutMain";
+import * as LayoutManageSideCompounds from "../LayoutManageSideCompounds";
+import * as LayoutReversibleReactions from "../LayoutReversibleReactions";
+import * as LayoutSugiyamaForce from "../LayoutSugiyama";
+import * as LayoutFindCycle from "../LayoutFindCycle";
+import * as LayoutMainChain from "../LayoutMainChain";
+import * as LayoutDrawCycle from "../LayoutDrawCycle";
+import * as CalculateSize from "../CalculateSize";
+import * as CalculateStartNodes from "../CalculateStartNodes";
+import * as ConvertFromNetwork from "../ConvertFromNetwork";
+import * as ConvertToNetwork from "../ConvertToNetwork";
+import * as CheckNetwork from "../CheckNetwork";
+import exp from "constants";
+
+
+jest.mock('d3',( ) => {});
+
+
+describe('LayoutMain', () => {
+
+
+    afterEach(() => {
+        jest.clearAllMocks();
+    });
+
+
+    describe('allSteps', () => {
+
+        let subgraphNetwork:SubgraphNetwork;
+        let parameters:Parameters;
+
+        let putDuplicatedSideCompoundAsideMock:jest.SpyInstance;
+        let vizLayoutMock:jest.SpyInstance;
+        let duplicateReversibleReactionsMock:jest.SpyInstance;
+        let addDirectedCycleToSubgraphNetworkMock:jest.SpyInstance;
+        let getStartNodesMock:jest.SpyInstance;
+        let chooseReversibleReactionMock:jest.SpyInstance;
+        let addMainChainFromSourcesMock:jest.SpyInstance;
+        let addMiniBranchToMainChainMock:jest.SpyInstance;
+        let coordinateAllCyclesMock:jest.SpyInstance;
+        let drawAllCyclesGroupMock:jest.SpyInstance;
+        let reinsertionSideCompoundsMock:jest.SpyInstance;
+        let shiftAllToGetTopLeftCoordMock:jest.SpyInstance;
+
+
+        beforeEach(() => {
+
+            // DATA
+
+            const networkStyle:GraphStyleProperties = {};
+            const networkLayout:NetworkLayout = {
+                id: 'network',
+                nodes: {},
+                links : []
+            };
+
+            subgraphNetwork={
+                network:networkLayout,
+                networkStyle:networkStyle
+                }
+
+            parameters = {
+                ...defaultParameters,
+                doDuplicateSideCompounds: true, 
+                doPutAsideSideCompounds: true, 
+                doReactionReversible: true, 
+                doMainChain: true,
+                doMiniBranch: true, 
+                doCycle: true,         
+                shiftCoord: true,
+            };
+
+            // MOCKS
+            putDuplicatedSideCompoundAsideMock = jest.spyOn(LayoutManageSideCompounds, 'putDuplicatedSideCompoundAside');
+            putDuplicatedSideCompoundAsideMock.mockReturnValue(Promise.resolve(subgraphNetwork));
+
+            vizLayoutMock = jest.spyOn(LayoutSugiyamaForce, 'vizLayout');
+            vizLayoutMock.mockReturnValue(Promise.resolve(subgraphNetwork));
+
+            duplicateReversibleReactionsMock = jest.spyOn(LayoutReversibleReactions, 'duplicateReversibleReactions');
+            duplicateReversibleReactionsMock.mockReturnValue(Promise.resolve());
+
+            addDirectedCycleToSubgraphNetworkMock = jest.spyOn(LayoutFindCycle, 'addDirectedCycleToSubgraphNetwork');
+            addDirectedCycleToSubgraphNetworkMock.mockImplementation((subgraphNetwork:SubgraphNetwork) => {
+                subgraphNetwork[TypeSubgraph.CYCLE] = {
+                    "cycle":{name:"cycle", nodes:[],type:TypeSubgraph.CYCLE}
+                };
+                return subgraphNetwork;
+            });
+
+            getStartNodesMock = jest.spyOn(CalculateStartNodes, 'getStartNodes');
+            getStartNodesMock.mockReturnValue(Promise.resolve([] as string[]));
+
+            chooseReversibleReactionMock = jest.spyOn(LayoutReversibleReactions, 'chooseReversibleReaction');
+            chooseReversibleReactionMock.mockReturnValue(Promise.resolve(subgraphNetwork));
+
+            addMainChainFromSourcesMock = jest.spyOn(LayoutMainChain, 'addMainChainFromSources');
+            addMainChainFromSourcesMock.mockReturnValue(subgraphNetwork);
+
+            addMiniBranchToMainChainMock = jest.spyOn(LayoutMainChain, 'addMiniBranchToMainChain');
+            addMiniBranchToMainChainMock.mockReturnValue(subgraphNetwork);
+
+            coordinateAllCyclesMock = jest.spyOn(LayoutDrawCycle, 'coordinateAllCycles');
+            coordinateAllCyclesMock.mockReturnValue(Promise.resolve(subgraphNetwork));
+
+            drawAllCyclesGroupMock = jest.spyOn(LayoutDrawCycle, 'drawAllCyclesGroup');
+            drawAllCyclesGroupMock.mockImplementation(() => {});
+
+            reinsertionSideCompoundsMock = jest.spyOn(LayoutManageSideCompounds, 'reinsertionSideCompounds');
+            reinsertionSideCompoundsMock.mockReturnValue(Promise.resolve(subgraphNetwork));
+
+            shiftAllToGetTopLeftCoordMock = jest.spyOn(CalculateSize, 'shiftAllToGetTopLeftCoord');
+            shiftAllToGetTopLeftCoordMock.mockImplementation(() => {});
+
+        });
+
+        afterAll(() => {
+            jest.restoreAllMocks();
+        });
+
+        
+       it('should call all steps', async () => {
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(3);
+            expect(duplicateReversibleReactionsMock).toHaveBeenCalledTimes(1);
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).toHaveBeenCalledTimes(2);
+            expect(chooseReversibleReactionMock).toHaveBeenCalledTimes(1);
+            expect(addMainChainFromSourcesMock).toHaveBeenCalledTimes(1);
+            expect(addMiniBranchToMainChainMock).toHaveBeenCalledTimes(1);
+            expect(coordinateAllCyclesMock).toHaveBeenCalledTimes(1);
+            expect(drawAllCyclesGroupMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).toHaveBeenCalledTimes(1);
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+
+       });
+
+       it("shouldn't do main chain", async () => {
+            // DATA
+            parameters.doMainChain = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(3);
+            expect(duplicateReversibleReactionsMock).toHaveBeenCalledTimes(1);
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).toHaveBeenCalledTimes(1);
+            expect(chooseReversibleReactionMock).toHaveBeenCalledTimes(1);
+            expect(addMainChainFromSourcesMock).not.toHaveBeenCalled();
+            expect(addMiniBranchToMainChainMock).not.toHaveBeenCalled();
+            expect(coordinateAllCyclesMock).toHaveBeenCalledTimes(1);
+            expect(drawAllCyclesGroupMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).toHaveBeenCalledTimes(1);
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+
+       });
+
+       it("shouldn't do reaction reversible", async () => {
+            // DATA
+            parameters.doReactionReversible = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+            
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(3);
+            expect(duplicateReversibleReactionsMock).not.toHaveBeenCalled();
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).toHaveBeenCalledTimes(1);
+            expect(chooseReversibleReactionMock).not.toHaveBeenCalled();
+            expect(addMainChainFromSourcesMock).toHaveBeenCalledTimes(1);
+            expect(addMiniBranchToMainChainMock).toHaveBeenCalledTimes(1);
+            expect(coordinateAllCyclesMock).toHaveBeenCalledTimes(1);
+            expect(drawAllCyclesGroupMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).toHaveBeenCalledWith(expect.anything(),expect.anything(),false);
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+
+       });
+
+       it("shouldn't do reaction reversible and main chain", async () => {
+            // DATA
+            parameters.doReactionReversible = false;
+            parameters.doMainChain = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+            
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(2);
+            expect(duplicateReversibleReactionsMock).not.toHaveBeenCalled();
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).not.toHaveBeenCalled();
+            expect(chooseReversibleReactionMock).not.toHaveBeenCalled();
+            expect(addMainChainFromSourcesMock).not.toHaveBeenCalled();
+            expect(addMiniBranchToMainChainMock).not.toHaveBeenCalled();
+            expect(coordinateAllCyclesMock).toHaveBeenCalledTimes(1);
+            expect(drawAllCyclesGroupMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).toHaveBeenCalledWith(expect.anything(),expect.anything(),false);
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+
+       });
+
+       it("shouldn't do cycle", async () => {
+            // DATA
+            parameters.doCycle = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+            
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(2);
+            expect(duplicateReversibleReactionsMock).toHaveBeenCalledTimes(1);
+            expect(addDirectedCycleToSubgraphNetworkMock).not.toHaveBeenCalled();
+            expect(getStartNodesMock).toHaveBeenCalledTimes(2);
+            expect(chooseReversibleReactionMock).toHaveBeenCalledTimes(1);
+            expect(addMainChainFromSourcesMock).toHaveBeenCalledTimes(1);
+            expect(addMiniBranchToMainChainMock).toHaveBeenCalledTimes(1);
+            expect(coordinateAllCyclesMock).not.toHaveBeenCalled();
+            expect(drawAllCyclesGroupMock).not.toHaveBeenCalled();
+            expect(reinsertionSideCompoundsMock).toHaveBeenCalledTimes(1);
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+
+       });
+        
+        it("should do cycle but no cycle found", async () => {
+            // MOCK
+            addDirectedCycleToSubgraphNetworkMock.mockImplementation((subgraphNetwork:SubgraphNetwork) => {
+                return subgraphNetwork;
+            });
+    
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+        
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(2);
+            expect(duplicateReversibleReactionsMock).toHaveBeenCalledTimes(1);
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).toHaveBeenCalledTimes(2);
+            expect(chooseReversibleReactionMock).toHaveBeenCalledTimes(1);
+            expect(addMainChainFromSourcesMock).toHaveBeenCalledTimes(1);
+            expect(addMiniBranchToMainChainMock).toHaveBeenCalledTimes(1);
+            expect(coordinateAllCyclesMock).not.toHaveBeenCalled();
+            expect(drawAllCyclesGroupMock).not.toHaveBeenCalled();
+            expect(reinsertionSideCompoundsMock).toHaveBeenCalledTimes(1);
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+    
+        });
+
+        it("shouldn't do mini branch", async () => {
+            // DATA
+            parameters.doMiniBranch = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(3);
+            expect(duplicateReversibleReactionsMock).toHaveBeenCalledTimes(1);
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).toHaveBeenCalledTimes(2);
+            expect(chooseReversibleReactionMock).toHaveBeenCalledTimes(1);
+            expect(addMainChainFromSourcesMock).toHaveBeenCalledTimes(1);
+            expect(addMiniBranchToMainChainMock).not.toHaveBeenCalled();
+            expect(coordinateAllCyclesMock).toHaveBeenCalledTimes(1);
+            expect(drawAllCyclesGroupMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).toHaveBeenCalledTimes(1);
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+
+        });
+
+        it("shouldn't shift coordinates", async () => {
+            // DATA
+            parameters.shiftCoord = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(3);
+            expect(duplicateReversibleReactionsMock).toHaveBeenCalledTimes(1);
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).toHaveBeenCalledTimes(2);
+            expect(chooseReversibleReactionMock).toHaveBeenCalledTimes(1);
+            expect(addMainChainFromSourcesMock).toHaveBeenCalledTimes(1);
+            expect(addMiniBranchToMainChainMock).toHaveBeenCalledTimes(1);
+            expect(coordinateAllCyclesMock).toHaveBeenCalledTimes(1);
+            expect(drawAllCyclesGroupMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).toHaveBeenCalledTimes(1);
+            expect(shiftAllToGetTopLeftCoordMock).not.toHaveBeenCalled();
+
+        });
+
+        it("shouldn't duplicate side compound", async () => {
+            // DATA
+            parameters.doDuplicateSideCompounds = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledWith(expect.anything(),false,expect.anything());
+            expect(vizLayoutMock).toHaveBeenCalledTimes(3);
+            expect(duplicateReversibleReactionsMock).toHaveBeenCalledTimes(1);
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).toHaveBeenCalledTimes(2);
+            expect(chooseReversibleReactionMock).toHaveBeenCalledTimes(1);
+            expect(addMainChainFromSourcesMock).toHaveBeenCalledTimes(1);
+            expect(addMiniBranchToMainChainMock).toHaveBeenCalledTimes(1);
+            expect(coordinateAllCyclesMock).toHaveBeenCalledTimes(1);
+            expect(drawAllCyclesGroupMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).not.toHaveBeenCalled();
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+
+       });
+
+       it("shouldn't put aside side compound", async () => {
+            // DATA
+            parameters.doPutAsideSideCompounds = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledWith(expect.anything(),expect.anything(),false);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(3);
+            expect(duplicateReversibleReactionsMock).toHaveBeenCalledTimes(1);
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).toHaveBeenCalledTimes(2);
+            expect(chooseReversibleReactionMock).toHaveBeenCalledTimes(1);
+            expect(addMainChainFromSourcesMock).toHaveBeenCalledTimes(1);
+            expect(addMiniBranchToMainChainMock).toHaveBeenCalledTimes(1);
+            expect(coordinateAllCyclesMock).toHaveBeenCalledTimes(1);
+            expect(drawAllCyclesGroupMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).not.toHaveBeenCalled();
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+
+        });
+
+        it("shouldn't put aside side and duplicate compound", async () => {
+            // DATA
+            parameters.doDuplicateSideCompounds = false;
+            parameters.doPutAsideSideCompounds = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledWith(expect.anything(),false,false);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(3);
+            expect(duplicateReversibleReactionsMock).toHaveBeenCalledTimes(1);
+            expect(addDirectedCycleToSubgraphNetworkMock).toHaveBeenCalledTimes(1);
+            expect(getStartNodesMock).toHaveBeenCalledTimes(2);
+            expect(chooseReversibleReactionMock).toHaveBeenCalledTimes(1);
+            expect(addMainChainFromSourcesMock).toHaveBeenCalledTimes(1);
+            expect(addMiniBranchToMainChainMock).toHaveBeenCalledTimes(1);
+            expect(coordinateAllCyclesMock).toHaveBeenCalledTimes(1);
+            expect(drawAllCyclesGroupMock).toHaveBeenCalledTimes(1);
+            expect(reinsertionSideCompoundsMock).not.toHaveBeenCalled();
+            expect(shiftAllToGetTopLeftCoordMock).toHaveBeenCalledTimes(1);
+
+        });
+
+
+        it("shouldn't do any special step", async () => {
+            // DATA
+            parameters.doDuplicateSideCompounds = false;
+            parameters.doPutAsideSideCompounds = false;
+            parameters.doReactionReversible = false;
+            parameters.doMainChain = false;
+            parameters.doMiniBranch = false;
+            parameters.doCycle = false;
+            parameters.shiftCoord = false;
+
+            // TEST
+            await LayoutMain.allSteps(subgraphNetwork, parameters);
+
+            // EXPECT
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledTimes(1);
+            expect(putDuplicatedSideCompoundAsideMock).toHaveBeenCalledWith(expect.anything(),false,false);
+            expect(vizLayoutMock).toHaveBeenCalledTimes(1);
+            expect(duplicateReversibleReactionsMock).not.toHaveBeenCalled();
+            expect(addDirectedCycleToSubgraphNetworkMock).not.toHaveBeenCalled();
+            expect(getStartNodesMock).not.toHaveBeenCalled();
+            expect(chooseReversibleReactionMock).not.toHaveBeenCalled();
+            expect(addMainChainFromSourcesMock).not.toHaveBeenCalled();
+            expect(addMiniBranchToMainChainMock).not.toHaveBeenCalled();
+            expect(coordinateAllCyclesMock).not.toHaveBeenCalled();
+            expect(drawAllCyclesGroupMock).not.toHaveBeenCalled();
+            expect(reinsertionSideCompoundsMock).not.toHaveBeenCalled();
+            expect(shiftAllToGetTopLeftCoordMock).not.toHaveBeenCalled();
+
+       });
+
+    });
+
+
+    describe('algorithmOnNetwork', () => {
+
+        let networktoNetworkLayoutMock:jest.SpyInstance;
+        let networkLayoutToNetworkMock:jest.SpyInstance;
+        let checkNetworkFormat:jest.SpyInstance;
+
+        let nodes:{ [key: string]: Node };
+
+        let links:Link[];
+
+        let networkLayout:NetworkLayout;
+
+        beforeEach(() => {
+
+            nodes={
+                'A':{ id: 'A', x: 0, y: 0 },
+                'B':{ id: 'B', x: 0, y: 0 },
+            };
+
+            links=[
+                {id:"link",source:nodes.A,target:nodes.B}
+            ]
+
+            networkLayout = {
+                id: 'network',
+                nodes: nodes,
+                links : links
+            };
+
+            // MOCK
+
+            networktoNetworkLayoutMock = jest.spyOn(ConvertFromNetwork, 'networktoNetworkLayout');
+
+            networkLayoutToNetworkMock = jest.spyOn(ConvertToNetwork, 'networkLayoutToNetwork');
+
+            checkNetworkFormat = jest.spyOn(CheckNetwork, 'checkNetworkFormat');
+
+        });
+
+        afterEach(() => {
+            networktoNetworkLayoutMock.mockRestore();
+            networkLayoutToNetworkMock.mockRestore();
+        });
+
+        it ('should throw error if incorrect network', async () => {
+            // MOCK
+            checkNetworkFormat.mockImplementationOnce(() => {
+                throw new Error("Incorrect network format");
+            });
+
+            await expect(LayoutMain.layoutOnNetwork(networkLayout, {})).rejects.toThrow("Incorrect network format");
+
+        });
+
+        it ('should throw error if network is empty', async () => {
+
+            const emptyNetwork: Network = { id:"network", nodes: {}, links: [] };
+
+            await expect(LayoutMain.layoutOnNetwork(emptyNetwork, {})).rejects.toThrow('The network is not defined, has no nodes or no links : the algorithm will not be executed');
+        });
+
+        it ('should throw error if network has no links', async () => {
+            const noNodesNetwork: Network = { id:"network", nodes:nodes, links: [] };
+
+            await expect(LayoutMain.layoutOnNetwork(noNodesNetwork, {})).rejects.toThrow('The network is not defined, has no nodes or no links : the algorithm will not be executed');
+
+        });
+
+
+        it ('should apply both fonction of conversion', async () => {
+            // MOCK
+            networktoNetworkLayoutMock.mockImplementationOnce((network:Network)=>{return network });
+            networkLayoutToNetworkMock.mockImplementationOnce((network:NetworkLayout)=>{return network});
+
+            const result= await LayoutMain.layoutOnNetwork(networkLayout, {});
+
+            expect(networktoNetworkLayoutMock).toHaveBeenCalledTimes(1);
+            expect(networkLayoutToNetworkMock).toHaveBeenCalledTimes(1);
+  
+        });
+
+        it('should call all steps and change at least one position', async () => {
+
+            const result= await LayoutMain.layoutOnNetwork(networkLayout, {});
+
+            let changed = false;
+            for (const node of Object.values(result.nodes)) {
+                if (node.x !== 0 || node.y !== 0) {
+                    changed = true;
+                    break;
+                }
+            }
+            expect(changed).toBe(true);
+        });
+
+
+    });
+
+
+});
\ No newline at end of file
diff --git a/src/composables/__tests__/LayoutMainChain.test.ts b/src/composables/__tests__/LayoutMainChain.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d18827b615941c4e467cfca0d4273e78053754a3
--- /dev/null
+++ b/src/composables/__tests__/LayoutMainChain.test.ts
@@ -0,0 +1,690 @@
+// Type imports
+import { PathType, StartNodesType } from "../../types/EnumArgs";
+import { SubgraphNetwork } from "../../types/SubgraphNetwork";
+import {TypeSubgraph, type Subgraph} from "../../types/Subgraph";
+import { Network } from  "../../types/TypeVizCore";
+
+// Composable imports
+import * as LayoutMainChain from "../LayoutMainChain";
+import * as AlgorithmDFS from "../AlgorithmDFS";
+import * as ConvertFromNetwork from "../ConvertFromNetwork";
+import * as CalculateStartNodes from "../CalculateStartNodes";
+import * as AlgorithmBFS from "../AlgorithmBFS";
+import * as SubgraphForSubgraphNetwork from '../SubgraphForSubgraphNetwork';
+import { before } from "node:test";
+
+
+describe('LayoutMainChain', () => {
+
+    const createSubgraphMock = jest.spyOn(SubgraphForSubgraphNetwork, 'createSubgraph');
+    const networkToGDSGraphMock = jest.spyOn(ConvertFromNetwork, 'networkToGDSGraph');
+
+    const addSubgraphToNetworkMock=jest.spyOn(SubgraphForSubgraphNetwork, 'addSubgraphToNetwork');
+    addSubgraphToNetworkMock.mockImplementation((subgraphNetwork:SubgraphNetwork,subgraph:Subgraph,type:TypeSubgraph) => {
+        if (!subgraphNetwork[type]) subgraphNetwork[type]={};
+        if(!(subgraph.name in subgraphNetwork[type])){
+            subgraphNetwork[type][subgraph.name]=subgraph;
+        }
+        return subgraphNetwork;
+    });
+
+    let network: Network;
+    let subgraphNetwork: SubgraphNetwork;
+
+    beforeEach(() => {
+        network = {
+            id:"network",
+            nodes:{},
+            links:[]
+        };
+
+        subgraphNetwork={
+            network: network,
+            networkStyle: {},
+        };
+    });
+
+    afterEach(() => {
+        jest.clearAllMocks();
+    });
+
+    describe('addMainChainFromSources', () => {
+
+        const getStartNodesMock= jest.spyOn(CalculateStartNodes, 'getStartNodes');
+        getStartNodesMock.mockReturnValue(Promise.resolve(["A", "B"]));
+ 
+        beforeEach(() => {
+
+            createSubgraphMock.mockImplementation((name:string,nodes:string[])=>{
+                return {
+                    name: name,
+                    nodes: nodes,
+                    type: TypeSubgraph.MAIN_CHAIN,
+                }
+    
+            });
+
+        });
+
+        
+        it('shouldn t use getStartNodes because already list of sources', async () => {
+            // DATA
+            const sources=["A", "B"];
+            const getMainChains= async function(){
+                return {};
+            }
+            
+            // TEST
+            await LayoutMainChain.addMainChainFromSources(subgraphNetwork, sources,getMainChains);
+
+            // EXPECT
+            expect(getStartNodesMock).not.toHaveBeenCalled();
+        });
+
+        it('should use getStartNodes because already list of sources', async () => {
+            // DATA
+            const sources=StartNodesType.RANK_ONLY;
+            const getMainChains= async function(){
+                return {};
+            }
+            
+             // TEST
+             await LayoutMainChain.addMainChainFromSources(subgraphNetwork, sources,getMainChains);
+ 
+             // EXPECT
+             expect(getStartNodesMock).toHaveBeenCalledTimes(1);
+        });
+
+        it('should add 2 mainChain', async () => {
+            // DATA
+            const getMainChains= async function(network: Network, sources: Array<string>):
+            Promise<{[key:string]:{nodes:Array<string>, height:number}}>{
+                return {mainChain1:{nodes:["A", "B"],height:8}, mainChain2:{nodes:["C", "D"],height:8}};
+            }
+            const mainChainExpected : {[key:string]:Subgraph}={
+                mainChain__mainChain1: {
+                  name: 'mainChain__mainChain1',
+                  nodes: [ 'A', 'B' ],
+                  type: TypeSubgraph.MAIN_CHAIN
+                },
+                mainChain__mainChain2: {
+                  name: 'mainChain__mainChain2',
+                  nodes: [ 'C', 'D' ],
+                  type: TypeSubgraph.MAIN_CHAIN
+                }
+              };
+
+            // TEST
+            await LayoutMainChain.addMainChainFromSources(subgraphNetwork, StartNodesType.RANK_ONLY,getMainChains);
+
+            // EXPECT
+            expect(createSubgraphMock).toHaveBeenCalledTimes(2);
+            expect(addSubgraphToNetworkMock).toHaveBeenCalledTimes(2);
+            expect(subgraphNetwork[TypeSubgraph.MAIN_CHAIN]).toBeDefined();
+            expect(subgraphNetwork[TypeSubgraph.MAIN_CHAIN]).toEqual(mainChainExpected);
+
+        });
+
+        it('should only add 1 mainChain bacause one is to small', async () => {
+            // DATA
+            const minHeight=8;
+            const getMainChains= async function(network: Network, sources: Array<string>):
+            Promise<{[key:string]:{nodes:Array<string>, height:number}}>{
+                return {mainChain1:{nodes:["A", "B"],height:3}, mainChain2:{nodes:["C", "D"],height:8}};
+            }
+            const mainChainExpected : {[key:string]:Subgraph}={
+                mainChain__mainChain2: {
+                  name: 'mainChain__mainChain2',
+                  nodes: [ 'C', 'D' ],
+                  type: TypeSubgraph.MAIN_CHAIN
+                }
+              };
+
+            // TEST
+            await LayoutMainChain.addMainChainFromSources(subgraphNetwork, StartNodesType.RANK_ONLY,getMainChains,true,PathType.ALL,minHeight);
+
+            // EXPECT
+            expect(createSubgraphMock).toHaveBeenCalledTimes(1);
+            expect(addSubgraphToNetworkMock).toHaveBeenCalledTimes(1);
+            expect(subgraphNetwork[TypeSubgraph.MAIN_CHAIN]).toBeDefined();
+            expect(subgraphNetwork[TypeSubgraph.MAIN_CHAIN]).toEqual(mainChainExpected);
+
+        });
+
+
+    });
+
+    describe('addMiniBranchToMainChain', () => {
+
+        beforeEach(() => {
+
+            createSubgraphMock.mockImplementation((name:string,nodes:string[],classes: Array<string>, type: TypeSubgraph, parentSubgraph?: {name:string,type:TypeSubgraph})=>{
+                return {
+                    name: name,
+                    nodes: nodes,
+                    type: TypeSubgraph.SECONDARY_CHAIN,
+                    parentSubgraph: parentSubgraph
+                }
+    
+            });
+
+            networkToGDSGraphMock.mockImplementation(async (network)=>{
+                return {
+                    outdegree: jest.fn((id: string) => {
+                        if (id === 'F'|| id === 'E') return 0;
+                        return 1;
+                    }),
+                    adjacent:jest.fn((id: string) => {
+                        switch (id) {
+                            case 'A':
+                                return ['B', 'D'];
+                            case 'B':
+                                return ['C'];
+                            case 'C':
+                                return ['F'];
+                            case 'D':
+                                return ['E'];
+                            default:
+                                return [];
+                        }
+    
+                    })
+                }
+            });
+
+        });
+
+        it('shouldn t add miniBranch because no mainChain', async () => {
+
+            // TEST
+            await LayoutMainChain.addMiniBranchToMainChain(subgraphNetwork);
+
+            // EXPECT
+            expect(networkToGDSGraphMock).not.toHaveBeenCalled();
+
+        });
+
+        it('shouldn t add miniBranch because no product of main chain has outdegree of 0', async () => {
+            // DATA
+            subgraphNetwork[TypeSubgraph.MAIN_CHAIN]={
+                mainChain1: {
+                    name: 'mainChain1',
+                    nodes: [ 'A' ,'B'],
+                    type: TypeSubgraph.MAIN_CHAIN
+                  }
+            };
+
+            // TEST
+            await LayoutMainChain.addMiniBranchToMainChain(subgraphNetwork);
+
+            // EXPECT
+            expect(networkToGDSGraphMock).toHaveBeenCalledTimes(1);
+            if(subgraphNetwork[TypeSubgraph.SECONDARY_CHAIN]){
+                expect(subgraphNetwork[TypeSubgraph.SECONDARY_CHAIN]).toEqual({});
+            }
+
+        });
+
+
+        it('should add miniBranch', async () => {
+            // DATA
+            subgraphNetwork[TypeSubgraph.MAIN_CHAIN]={
+                mainChain1: {
+                    name: 'mainChain1',
+                    nodes: [ 'A' ,'C'],
+                    type: TypeSubgraph.MAIN_CHAIN
+                  },
+                  mainChain2: {
+                    name: 'mainChain2',
+                    nodes: [ 'D' ],
+                    type: TypeSubgraph.MAIN_CHAIN
+                  }
+            };
+
+            const secondaryChainExpected : {[key:string]:Subgraph}={
+                minibranch_mainChain1: {
+                  name: 'minibranch_mainChain1',
+                  nodes: [ 'F' ],
+                  type: TypeSubgraph.SECONDARY_CHAIN,
+                  parentSubgraph: { name: 'mainChain1', type: TypeSubgraph.MAIN_CHAIN }
+                },
+                minibranch_mainChain2: {
+                  name: 'minibranch_mainChain2',
+                  nodes: [ 'E' ],
+                  type: TypeSubgraph.SECONDARY_CHAIN,
+                  parentSubgraph: { name: 'mainChain2', type: TypeSubgraph.MAIN_CHAIN }
+                }
+              }
+
+            // TEST
+            await LayoutMainChain.addMiniBranchToMainChain(subgraphNetwork);
+
+            // EXPECT
+            expect(networkToGDSGraphMock).toHaveBeenCalledTimes(1);
+            expect(createSubgraphMock).toHaveBeenCalledTimes(2);
+            expect(subgraphNetwork[TypeSubgraph.SECONDARY_CHAIN]).toBeDefined();
+            expect(subgraphNetwork[TypeSubgraph.SECONDARY_CHAIN]).toEqual(secondaryChainExpected);
+            
+        });
+
+
+    });
+
+    describe('getPathSourcesToTargetNode', () => {
+
+        let DFSsourceDAGMock = jest.spyOn(AlgorithmDFS, 'DFSsourceDAG');
+        let BFSMock = jest.spyOn(AlgorithmBFS, 'BFS');
+
+        let sources: Array<string>;
+        let graphGDS:{[key:string]:Function};
+
+        
+        describe('case one source with one target', () => {
+
+            beforeEach(() => {
+                // DATA
+                sources=["A"];
+
+                // MOCK
+                graphGDS={
+                    adjacent:jest.fn((id: string) => {
+                        switch (id) {
+                            case 'A':
+                                return ['B', 'F','E'];
+                            case 'B':
+                                return ['C'];
+                            case 'C':
+                                return ['D'];
+                            case 'E':
+                                return ['D'];
+                            case 'F':
+                                return ['G'];
+                            case 'G':
+                                return ['D'];
+                            default:
+                                return [];
+                        }
+
+                    }),
+                    getEdgeWeight:jest.fn(() => (1)),
+                    nodes: jest.fn(() => (['A', 'B', 'C', 'D', 'E', 'F', 'G']))
+                }
+
+                networkToGDSGraphMock.mockImplementation(async ()=>{
+                    return graphGDS;
+                });
+
+                DFSsourceDAGMock.mockReturnValue(Promise.resolve(
+                    {dfs:[
+                            'A', 'F', 'G',
+                            'E', 'B', 'C',
+                            'D'
+                        ], 
+                        graph:graphGDS}
+                ));
+            });
+
+
+            test ('all longest path', async () => {
+    
+                BFSMock.mockReturnValue([ 'D', 'G', 'C', 'F', 'B', 'A' ]);
+    
+                // DATA
+                const pathExpected = { A: { nodes: [ 'D', 'G', 'C', 'F', 'B', 'A' ], height: 4 } };
+    
+    
+                // TEST
+                const result = await LayoutMainChain.getPathSourcesToTargetNode(network, sources, true ,PathType.ALL_LONGEST);
+    
+                // EXPECT
+                expect(DFSsourceDAGMock).toHaveBeenCalledTimes(1);
+                expect(BFSMock).toHaveBeenCalledTimes(1);
+                expect(BFSMock).toHaveBeenCalledWith({
+                    A: [],
+                    F: [ 'A' ],
+                    G: [ 'F' ],
+                    E: [ 'A' ],
+                    B: [ 'A' ],
+                    C: [ 'B' ],
+                    D: [ 'G', 'C' ]
+                  }, 'D');
+                expect(result).toEqual(pathExpected);
+
+    
+            });
+        
+
+
+            test ('longest path', async () => {
+
+                BFSMock.mockReturnValue([ 'D', 'G', 'F','A' ]);
+
+                // DATA
+                const pathExpected = { A: { nodes: [ 'D', 'G', 'F','A' ], height: 4 } };
+
+                // TEST
+                const result = await LayoutMainChain.getPathSourcesToTargetNode(network, sources, true ,PathType.LONGEST);
+
+                // EXPECT
+                expect(DFSsourceDAGMock).toHaveBeenCalledTimes(1);
+                expect(BFSMock).toHaveBeenCalledTimes(1);
+                expect(BFSMock).toHaveBeenCalledWith({
+                    A: [],
+                    F: [ 'A' ],
+                    G: [ 'F' ],
+                    E: [ 'A' ],
+                    B: [ 'A' ],
+                    C: [ 'B' ],
+                    D: [ 'G' ]
+                }, 'D');
+                expect(result).toEqual(pathExpected);
+
+
+            });
+
+            test ('all path', async () => {
+
+                BFSMock.mockReturnValue([ 'D','G','E', 'C', 'F','A','B' ]);
+
+                // DATA
+                const pathExpected = {
+                    A: { nodes: [ 'D','G','E', 'C', 'F','A','B' ], height: 4 }
+                };
+
+                // TEST
+                const result = await LayoutMainChain.getPathSourcesToTargetNode(network, sources, true ,PathType.ALL);
+
+                // EXPECT
+                expect(DFSsourceDAGMock).toHaveBeenCalledTimes(1);
+                expect(BFSMock).toHaveBeenCalledTimes(1);
+                expect(BFSMock).toHaveBeenCalledWith({
+                    A: [],
+                    F: [ 'A' ],
+                    G: [ 'F' ],
+                    E: [ 'A' ],
+                    B: [ 'A' ],
+                    C: [ 'B' ],
+                    D: [ 'G', 'E', 'C' ]
+                }, 'D');
+                expect(result).toEqual(pathExpected);
+
+
+            });
+
+        });
+
+        describe('case one source with several targets', () => {
+
+
+            beforeEach(() => {
+                // DATA
+                sources=["A"];
+
+                // MOCK
+                graphGDS={
+                    adjacent:jest.fn((id: string) => {
+                        switch (id) {
+                            case 'A':
+                                return ['B','D'];
+                            case 'B':
+                                return ['C'];
+                            case 'D':
+                                return ['E'];
+                            default:
+                                return [];
+                        }
+
+                    }),
+                    getEdgeWeight:jest.fn(() => (1)),
+                    nodes: jest.fn(() => (['A', 'B', 'C', 'D', 'E']))
+                }
+
+                networkToGDSGraphMock.mockImplementation(async ()=>{
+                    return graphGDS;
+                });
+
+                DFSsourceDAGMock.mockReturnValue(Promise.resolve(
+                    {dfs:[
+                            'A','D','E', 'B', 'C',
+                        ], 
+                        graph:graphGDS}
+                ));
+
+                
+            });
+
+            test('case of merge', async () => {
+                // MOCK
+                BFSMock.mockReturnValueOnce([ 'C','B','A']);
+                BFSMock.mockReturnValueOnce([ 'E','D','A']);
+               
+                // DATA
+                const pathExpected = {
+                    A: { nodes: [  'C','B','A','E','D'  ], height: 3 }
+                };
+
+                // TEST
+                const result = await LayoutMainChain.getPathSourcesToTargetNode(network, sources, true ,PathType.ALL_LONGEST);
+
+                // EXPECT
+                expect(DFSsourceDAGMock).toHaveBeenCalledTimes(1);
+                expect(BFSMock).toHaveBeenCalledTimes(2);
+                expect(BFSMock).toHaveBeenCalledWith({ A: [], D: [ 'A' ], E: [ 'D' ], B: [ 'A' ], C: [ 'B' ] }, 'C');
+                expect(BFSMock).toHaveBeenLastCalledWith({ A: [], D: [ 'A' ], E: [ 'D' ], B: [ 'A' ], C: [ 'B' ] }, 'E');
+                expect(result).toEqual(pathExpected);
+
+            });
+
+            test('case of no merge', async () => {
+                // MOCK
+                BFSMock.mockReturnValueOnce([ 'C','B','A']);
+                BFSMock.mockReturnValueOnce([ 'E','D','A']);
+               
+                // DATA
+                const pathExpected = {
+                    A: { nodes: [  'C','B','A' ], height: 3 }
+                };
+
+                // TEST
+                const result = await LayoutMainChain.getPathSourcesToTargetNode(network, sources, false ,PathType.ALL_LONGEST);
+                
+                // EXPECT
+                expect(DFSsourceDAGMock).toHaveBeenCalledTimes(1);
+                expect(BFSMock).toHaveBeenCalledTimes(2);
+                expect(BFSMock).toHaveBeenCalledWith({ A: [], D: [ 'A' ], E: [ 'D' ], B: [ 'A' ], C: [ 'B' ] }, 'C');
+                expect(BFSMock).toHaveBeenLastCalledWith({ A: [], D: [ 'A' ], E: [ 'D' ], B: [ 'A' ], C: [ 'B' ] }, 'E');
+                expect(result).toEqual(pathExpected);
+
+            });
+
+         });
+
+        describe('case multiple sources with one target for each', () => {
+
+            beforeEach(() => {
+                 // DATA
+                 sources=["A","D"];
+
+                // MOCK 
+                graphGDS={
+                adjacent:jest.fn((id: string) => {
+                    switch (id) {
+                        case 'A':
+                            return ['B'];
+                        case 'B':
+                            return ['C','F'];
+                        case 'D':
+                            return ['G'];
+                        case 'E':
+                            return ['F'];
+                        case 'G':
+                            return ['E'];
+                        case 'F':
+                            return ['H'];
+                        default:
+                            return [];
+                    }
+
+                }),
+                getEdgeWeight:jest.fn(() => (1)),
+                nodes: jest.fn(() => (['A', 'B', 'C', 'D', 'E', 'F','G','H']))
+            }
+
+            networkToGDSGraphMock.mockImplementation(async ()=>{
+                return graphGDS;
+            });
+
+            });
+
+            test ('independant case', async () => {
+                // MOCK 
+                graphGDS={
+                    adjacent:jest.fn((id: string) => {
+                        switch (id) {
+                            case 'A':
+                                return ['B'];
+                            case 'B':
+                                return ['C'];
+                            case 'D':
+                                return ['E'];
+                            case 'E':
+                                return ['F'];
+                            default:
+                                return [];
+                        }
+
+                    }),
+                    getEdgeWeight:jest.fn(() => (1)),
+                    nodes: jest.fn(() => (['A', 'B', 'C', 'D', 'E', 'F']))
+                }
+
+                networkToGDSGraphMock.mockImplementation(async ()=>{
+                    return graphGDS;
+                });
+
+                // DFS start : A
+                DFSsourceDAGMock.mockReturnValueOnce(Promise.resolve(
+                    {dfs:[
+                            'A', 'B', 'C',
+                        ], 
+                        graph:graphGDS}
+                ));
+                // DFS start : D
+                DFSsourceDAGMock.mockReturnValueOnce(Promise.resolve(
+                    {dfs:[
+                            'D', 'E', 'F',
+                        ], 
+                        graph:graphGDS}
+                ));
+
+                // BFS start : C
+                BFSMock.mockReturnValueOnce([ 'C','B','A' ]);
+                // BFS start : F
+                BFSMock.mockReturnValueOnce([  'F','E','D' ]);
+
+                // DATA
+                const pathExpected = {
+                    A: { nodes: [ 'C','B','A' ], height: 3 },
+                    D: { nodes: [ 'F','E','D' ], height: 3 }
+                };
+
+                // TEST
+                const result = await LayoutMainChain.getPathSourcesToTargetNode(network, sources, true ,PathType.ALL);
+
+                // EXPECT
+                expect(DFSsourceDAGMock).toHaveBeenCalledTimes(2);
+                expect(DFSsourceDAGMock).toHaveBeenCalledWith(expect.anything(),['A']);
+                expect(DFSsourceDAGMock).toHaveBeenLastCalledWith(expect.anything(),['D']);
+                expect(BFSMock).toHaveBeenCalledTimes(2);
+                expect(BFSMock).toHaveBeenCalledWith({ A: [], B: [ 'A' ], C: [ 'B' ] }, 'C');
+                expect(BFSMock).toHaveBeenLastCalledWith({ D: [], E: [ 'D' ], F: [ 'E' ]}, 'F');
+                expect(result).toEqual(pathExpected);
+            });
+
+            test ('dependant case (same unique target), merge = true', async () => {
+                // MOCK
+
+                // DFS start : A
+                DFSsourceDAGMock.mockReturnValueOnce(Promise.resolve(
+                    {dfs:[
+                            'A', 'B','F','H', 'C',
+                        ], 
+                        graph:graphGDS}
+                ));
+
+                // DFS start : D
+                DFSsourceDAGMock.mockReturnValueOnce(Promise.resolve(
+                    {dfs:[
+                            'D', 'G','E', 'F','H',
+                        ], 
+                        graph:graphGDS}
+                ));
+
+                // BFS start : H (DFS with A)
+                BFSMock.mockReturnValueOnce(['H','F','B','A' ]);
+                // BFS start : H (DFS with D)
+                BFSMock.mockReturnValueOnce([ 'H','F','E','G','D' ]);
+
+                const pathExpected = { A__D: { nodes: [ 'H','F','B','A','E','G','D' ], height: 5 } };
+
+                // TEST
+                const result = await LayoutMainChain.getPathSourcesToTargetNode(network, sources, true ,PathType.ALL);
+
+                // EXPECT
+                expect(DFSsourceDAGMock).toHaveBeenCalledTimes(2);
+                expect(DFSsourceDAGMock).toHaveBeenCalledWith(expect.anything(),['A']);
+                expect(DFSsourceDAGMock).toHaveBeenLastCalledWith(expect.anything(),['D']);
+                expect(BFSMock).toHaveBeenCalledTimes(2);
+                expect(BFSMock).toHaveBeenCalledWith({ A: [], B: [ 'A' ], F: [ 'B' ], H: [ 'F' ], C: [ 'B' ] }, 'H');
+                expect(BFSMock).toHaveBeenLastCalledWith({ D: [], G: [ 'D' ], E: [ 'G' ], F: [ 'E' ], H: [ 'F' ] }, 'H');
+                expect(result).toEqual(pathExpected);
+
+            });
+
+            test ('dependant case, merge = false', async () => {
+
+                // MOCK
+
+                // DFS start : A
+                DFSsourceDAGMock.mockReturnValueOnce(Promise.resolve(
+                    {dfs:[
+                            'A', 'B','F','H', 'C',
+                        ], 
+                        graph:graphGDS}
+                ));
+
+                // DFS start : D
+                DFSsourceDAGMock.mockReturnValueOnce(Promise.resolve(
+                    {dfs:[
+                            'D', 'G','E', 'F','H',
+                        ], 
+                        graph:graphGDS}
+                ));
+
+                // BFS start : H (DFS with A)
+                BFSMock.mockReturnValueOnce(['H','F','B','A' ]);
+                // BFS start : H (DFS with D)
+                BFSMock.mockReturnValueOnce([ 'H','F','E','G','D' ]);
+
+                const pathExpected = { D: { nodes: ['H','F','E','G','D' ], height: 5 } };
+
+                // TEST
+                const result = await LayoutMainChain.getPathSourcesToTargetNode(network, sources, false ,PathType.ALL);
+
+                // EXPECT
+                expect(DFSsourceDAGMock).toHaveBeenCalledTimes(2);
+                expect(DFSsourceDAGMock).toHaveBeenCalledWith(expect.anything(),['A']);
+                expect(DFSsourceDAGMock).toHaveBeenLastCalledWith(expect.anything(),['D']);
+                expect(BFSMock).toHaveBeenCalledTimes(2);
+                expect(BFSMock).toHaveBeenCalledWith({ A: [], B: [ 'A' ], F: [ 'B' ], H: [ 'F' ], C: [ 'B' ] }, 'H');
+                expect(BFSMock).toHaveBeenLastCalledWith({ D: [], G: [ 'D' ], E: [ 'G' ], F: [ 'E' ], H: [ 'F' ] }, 'H');
+                expect(result).toEqual(pathExpected);
+            });
+
+
+        });
+
+
+    });
+
+});
\ No newline at end of file
diff --git a/src/composables/__tests__/LayoutManageSideCompounds.test.ts b/src/composables/__tests__/LayoutManageSideCompounds.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..91dba9d1118288a127556de8fc4e3fdb64937725
--- /dev/null
+++ b/src/composables/__tests__/LayoutManageSideCompounds.test.ts
@@ -0,0 +1,760 @@
+// Type imports
+import { SubgraphNetwork } from "../../types/SubgraphNetwork";
+import { Network, Node, Link } from "../../types/TypeVizCore";
+import { VizArgs } from "../../types/EnumArgs";
+import { NetworkLayout, NodeLayout } from "../../types/NetworkLayout";
+
+
+// Composable imports
+import * as LayoutManageSideCompounds from "../LayoutManageSideCompounds";
+import {sideCompoundAttribute} from "../GetSetAttributsNodes";
+import * as VizCoreFunctions from "../VizCoreFunctions";
+import * as CalculateSize from "../CalculateSize";
+import * as GetSetAttributsNodes from "../GetSetAttributsNodes";
+
+
+
+describe("LayoutManageSideCompounds", () => {
+
+    describe('putDuplicatedSideCompoundAside', () => {
+
+        let network: Network;
+        let subgraphNetwork: SubgraphNetwork;
+        let nodes: {[key: string]: Node};
+        let links:Link[];
+
+        let duplicateAllNodesByAttributMock: jest.SpyInstance;
+        let removeAllSelectedNodesMock: jest.SpyInstance;
+        let isSideCompoundMock: jest.SpyInstance;
+        let setAsSideCompoundMock: jest.SpyInstance;
+        let isDuplicateMock: jest.SpyInstance;
+
+        beforeEach(() => {
+
+            nodes={
+                nodeA:{id: 'nodeA',x: 0, y: 0},
+                nodeC:{id: 'nodeC',x: 2, y: 2,metadata:{[sideCompoundAttribute]:true}},
+                nodeD:{id: 'nodeD',x: 3, y: 3},
+                nodeE:{id: 'nodeE',x: 4, y: 4,metadata:{[sideCompoundAttribute]:true}},
+                nodeF:{id: 'nodeF',x: 5, y: 5},
+                nodeG:{id: 'nodeG',x: 6, y: 6},
+            };
+
+            links=[
+                {id:"link", source: nodes.nodeA, target: nodes.nodeF},
+                {id:"link", source: nodes.nodeC, target: nodes.nodeF},
+                {id:"link", source: nodes.nodeF, target: nodes.nodeD},
+                {id:"link", source: nodes.nodeF, target: nodes.nodeE},
+                {id:"link", source: nodes.nodeC, target: nodes.nodeG},
+            ]
+
+            network={
+                id: 'network',
+                nodes: nodes,
+                links: links,
+            };
+
+            subgraphNetwork={
+                network: network,
+                networkStyle: {}
+            };
+
+            // MOCK
+            duplicateAllNodesByAttributMock = jest.spyOn(VizCoreFunctions, 'duplicateAllNodesByAttribut');
+            duplicateAllNodesByAttributMock.mockImplementation(() => {
+                network.nodes['nodeC0'] = {id: 'nodeC0',x: 2, y: 2,classes: ['duplicate']};
+                network.nodes['nodeC1'] = {id: 'nodeC1',x: 2, y: 2,classes: ['duplicate']};
+                delete network.nodes['nodeC'];
+                network.nodes['nodeE0'] = {id: 'nodeE0',x: 4, y: 4,classes: ['duplicate']};
+                delete network.nodes['nodeE'];
+                network.links[1].source = network.nodes['nodeC0'];
+                network.links[4].source = network.nodes['nodeC1'];
+                network.links[3].target = network.nodes['nodeE0'];
+            });
+
+            removeAllSelectedNodesMock = jest.spyOn(VizCoreFunctions, 'removeAllSelectedNodes');
+            isSideCompoundMock = jest.spyOn(GetSetAttributsNodes, 'isSideCompound');
+            isSideCompoundMock.mockImplementation((node: NodeLayout) => {
+                return node.id === 'nodeC' || node.id === 'nodeC0'|| node.id === 'nodeC1' ||
+                 node.id === 'nodeE' || node.id === 'nodeE0';
+            });
+
+            setAsSideCompoundMock = jest.spyOn(GetSetAttributsNodes, 'setAsSideCompound');
+            setAsSideCompoundMock.mockImplementation((network:Network,nodeID: string) => {
+                if (network.nodes[nodeID].metadata){
+                network.nodes[nodeID].metadata[sideCompoundAttribute]=true;
+                }else{
+                    network.nodes[nodeID].metadata={[sideCompoundAttribute]:true};
+                }
+            });
+
+            isDuplicateMock = jest.spyOn(GetSetAttributsNodes, 'isDuplicate');
+            isDuplicateMock.mockImplementation((network:Network,nodeID: string) => {
+                return  nodeID === 'nodeC0'|| nodeID === 'nodeC1' || nodeID=== 'nodeE0';
+            });
+
+        });
+
+        afterEach(() => {
+            jest.clearAllMocks();
+        });
+
+        it('should only duplicate side compound', async () => {
+            
+            // DATA
+            const resultExpected = {
+                "network": {
+                  "id": "network",
+                  "nodes": {
+                    "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                    "nodeD": {"id": "nodeD", "x": 3, "y": 3},
+                    "nodeF": {"id": "nodeF", "x": 5, "y": 5},
+                    "nodeG": {"id": "nodeG", "x": 6, "y": 6},
+                    "nodeC0": {"id": "nodeC0", "x": 2, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                    "nodeC1": {"id": "nodeC1", "x": 2, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                    "nodeE0": {"id": "nodeE0", "x": 4, "y": 4, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                  },
+                  "links": [
+                    {"id": "link", "source": {"id": "nodeA", "x": 0, "y": 0}, "target": {"id": "nodeF", "x": 5, "y": 5}},
+                    {"id": "link", "source": {"id": "nodeC0", "x": 2, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeF", "x": 5, "y": 5}},
+                    {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5}, "target": {"id": "nodeD", "x": 3, "y": 3}},
+                    {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5}, "target": {"id": "nodeE0", "x": 4, "y": 4, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}},
+                    {"id": "link", "source": {"id": "nodeC1", "x": 2, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeG", "x": 6, "y": 6}}
+                  ]
+                },
+                "networkStyle": {}
+              }
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.putDuplicatedSideCompoundAside(subgraphNetwork,true,false);
+
+            // EXPECT
+            expect(result).toEqual(resultExpected);
+
+        });
+
+        it('should put side compound aside', async () => {
+
+            // MOCK 
+            removeAllSelectedNodesMock.mockImplementation(() => {
+                delete network.nodes.nodeC;
+                 delete network.nodes.nodeE;
+                 const links = network.links.filter((link) => {
+                 if (link.source.id !== "nodeC" && link.target.id !== "nodeC" &&
+                     link.source.id !== "nodeE" && link.target.id !== "nodeE" 
+                 ) {
+                     return link;
+                 }
+                 });
+                 network.links = links;
+             });
+
+            // DATA
+             const resultExpected :SubgraphNetwork= {
+                "network": {
+                  "id": "network",
+                  "nodes": {
+                    "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                    "nodeD": {"id": "nodeD", "x": 3, "y": 3},
+                    "nodeF": {"id": "nodeF", "x": 5, "y": 5},
+                    "nodeG": {"id": "nodeG", "x": 6, "y": 6}
+                  },
+                  "links": [
+                    {"id": "link", "source": {"id": "nodeA", "x": 0, "y": 0}, "target": {"id": "nodeF", "x": 5, "y": 5}},
+                    {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5}, "target": {"id": "nodeD", "x": 3, "y": 3}}
+                  ]
+                },
+                "networkStyle": {},
+                "sideCompounds": {
+                  "nodeF": {
+                    "reactants": [
+                      {"id": "nodeC", "x": 2, "y": 2, "metadata": {"isSideCompound": true}}
+                    ],
+                    "products": [
+                      {"id": "nodeE", "x": 4, "y": 4, "metadata": {"isSideCompound": true}}
+                    ]
+                  },
+                  "nodeG": {
+                    "reactants": [
+                      {"id": "nodeC", "x": 2, "y": 2, "metadata": {"isSideCompound": true}}
+                    ],
+                    "products": []
+                  }
+                }
+              };
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.putDuplicatedSideCompoundAside(subgraphNetwork,false,true);
+
+            // EXPECT
+            expect(result).toEqual(resultExpected);
+
+        });
+
+        it('should duplicate side compound and put them aside', async() => {
+            // MOCK
+            removeAllSelectedNodesMock.mockImplementation(() => {
+               delete network.nodes.nodeC0;
+                delete network.nodes.nodeC1;
+                delete network.nodes.nodeE0;
+                const links = network.links.filter((link) => {
+                if (link.source.id !== "nodeC0" && link.target.id !== "nodeC0" &&
+                    link.source.id !== "nodeC1" && link.target.id !== "nodeC1" &&
+                    link.source.id !== "nodeE0" && link.target.id !== "nodeE0" 
+                ) {
+                    return link;
+                }
+                });
+                network.links = links;
+            });
+
+            // DATA
+            const resultExpected :SubgraphNetwork= {
+                "network": {
+                  "id": "network",
+                  "nodes": {
+                    "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                    "nodeD": {"id": "nodeD", "x": 3, "y": 3},
+                    "nodeF": {"id": "nodeF", "x": 5, "y": 5},
+                    "nodeG": {"id": "nodeG", "x": 6, "y": 6}
+                  },
+                  "links": [
+                    {"id": "link", "source": {"id": "nodeA", "x": 0, "y": 0}, "target": {"id": "nodeF", "x": 5, "y": 5}},
+                    {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5}, "target": {"id": "nodeD", "x": 3, "y": 3}}
+                  ]
+                },
+                "networkStyle": {},
+                "sideCompounds": {
+                  "nodeF": {
+                    "reactants": [
+                      {"id": "nodeC0", "x": 2, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                    ],
+                    "products": [
+                      {"id": "nodeE0", "x": 4, "y": 4, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                    ]
+                  },
+                  "nodeG": {
+                    "reactants": [
+                      {"id": "nodeC1", "x": 2, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                    ],
+                    "products": []
+                  }
+                }
+              };
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.putDuplicatedSideCompoundAside(subgraphNetwork,true,true);
+
+            // EXPECT
+            expect(result).toEqual(resultExpected);
+
+        });
+
+    });
+
+
+    describe('reinsertionSideCompounds', () => {
+
+        let subgraphNetworkDupliAside: SubgraphNetwork;
+        let minEdgeLengthMock: jest.SpyInstance;
+        let getMeanNodesSizePixelMock: jest.SpyInstance;
+        let inchesToPixelsMock: jest.SpyInstance;
+
+        beforeEach(() => {
+
+            const nodes:{[key:string]:NodeLayout}= {
+                    "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                    "nodeD": {"id": "nodeD", "x": 7, "y": 6},
+                    "nodeF": {"id": "nodeF", "x": 5, "y": 5, metadataLayout:{isReversedVersion:true}},
+                };
+            subgraphNetworkDupliAside = {
+                "network": {
+                  "id": "network",
+                  nodes:nodes,
+                  "links": [
+                    {"id": "link",source: nodes.nodeA, "target": nodes.nodeF},
+                    {"id": "link", source: nodes.nodeF, "target": nodes.nodeD}
+                  ]
+                },
+                "networkStyle": {},
+                "sideCompounds": {
+                  "nodeF": {
+                    "reactants": [
+                      {"id": "nodeC0", "x": 2, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                    ],
+                    "products": [
+                      {"id": "nodeE0", "x": 4, "y": 4, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                    ]
+                  }
+                }
+              };
+
+              // MOCK
+              minEdgeLengthMock = jest.spyOn(CalculateSize, 'minEdgeLength');
+              minEdgeLengthMock.mockReturnValue(3);
+
+              getMeanNodesSizePixelMock = jest.spyOn(CalculateSize, 'getMeanNodesSizePixel');
+              getMeanNodesSizePixelMock.mockReturnValue(Promise.resolve({height:2,width:2}));
+
+              inchesToPixelsMock = jest.spyOn(CalculateSize, 'inchesToPixels');
+              inchesToPixelsMock.mockReturnValue(2);
+           
+        });
+
+        afterEach(() => {
+            jest.clearAllMocks();
+        });
+
+
+        it('should throw error because reaction node in sideCompound but not in netwotk for update when reversed version', async () => {
+            // DATA
+            delete subgraphNetworkDupliAside.network.nodes.nodeF;
+
+            // TEST & EXPECT
+            await expect(LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true)).rejects.toThrow("Reaction in side compounds but not in network");
+        
+        });
+
+        it('should throw error because reaction node in sideCompound but not in network for initializeReactionSideCompounds (no update rev)', async () => {
+            // DATA
+            delete subgraphNetworkDupliAside.network.nodes.nodeF;
+
+            // TEST & EXPECT
+            await expect(LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,false)).rejects.toThrow();
+        
+        });
+
+
+        it('should t change network because no product or reactant in reaction in side compounds', async () => {
+            // DATA
+            if (subgraphNetworkDupliAside.sideCompounds && subgraphNetworkDupliAside.sideCompounds.nodeF){
+                subgraphNetworkDupliAside.sideCompounds.nodeF.products=[];
+                subgraphNetworkDupliAside.sideCompounds.nodeF.reactants=[];
+            }
+            
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+
+            // EXPECT 
+            expect(result.network).toEqual(subgraphNetworkDupliAside.network);
+        
+        });
+
+        it('should t change because no side compounds', async () => {
+            // DATA
+            delete subgraphNetworkDupliAside.sideCompounds;
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+
+            // EXPECT 
+            expect(result).toEqual(subgraphNetworkDupliAside);
+        
+        });
+
+        it('should t change because side compounds empty', async () => {
+            // DATA
+            subgraphNetworkDupliAside.sideCompounds={};
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+
+            // EXPECT 
+            expect(result).toEqual(subgraphNetworkDupliAside);
+        
+        });
+
+         it('should use min edge length by default, when no rank and node sep', async () => {
+            // MOCK
+            minEdgeLengthMock.mockReturnValue(NaN);
+
+            // DATA
+            const networkExpected:NetworkLayout  = {
+                "id": "network",
+                "nodes": {
+                  "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                  "nodeD": {"id": "nodeD", "x": 7, "y": 6},
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeE0": {
+                    "id": "nodeE0",
+                    "x": 3.006,
+                    "y": 5.161,
+                    "classes": ["duplicate"],
+                    "metadata": {"isSideCompound": true}
+                  },
+                  "nodeC0": {
+                    "id": "nodeC0",
+                    "x": 5.478,
+                    "y": 6.942,
+                    "classes": ["duplicate"],
+                    "metadata": {"isSideCompound": true}
+                  }
+                },
+                "links": [
+                  {
+                    "id": "link",
+                    "source": {"id": "nodeA", "x": 0, "y": 0},
+                    "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}
+                  },
+                  {
+                    "id": "link",
+                    "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                    "target": {"id": "nodeD", "x": 7, "y": 6}
+                  },
+                  {
+                    "id": "nodeE0--nodeF",
+                    "source": {
+                      "id": "nodeE0",
+                      "x": 3.006,
+                      "y": 5.161,
+                      "classes": ["duplicate"],
+                      "metadata": {"isSideCompound": true}
+                    },
+                    "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}
+                  },
+                  {
+                    "id": "nodeF--nodeC0",
+                    "source": {
+                      "id": "nodeF",
+                      "x": 5,
+                      "y": 5,
+                      "metadataLayout": {"isReversedVersion": true}
+                    },
+                    "target": {
+                      "id": "nodeC0",
+                      "x": 5.478,
+                      "y": 6.942,
+                      "classes": ["duplicate"],
+                      "metadata": {"isSideCompound": true}
+                    }
+                  }
+                ]
+              };
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+            // => type interval : 0
+
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+
+        });
+
+        it('should use min edge length by default, when rank and node sep', async () => {
+            // MOCK
+            minEdgeLengthMock.mockReturnValue(NaN);
+
+            // DATA
+            subgraphNetworkDupliAside.attributs={};
+            subgraphNetworkDupliAside.attributs[VizArgs.RANKSEP]=2;
+            subgraphNetworkDupliAside.attributs[VizArgs.NODESEP]=1;
+
+            const networkExpected:NetworkLayout= {
+                "id": "network",
+                "nodes": {
+                  "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                  "nodeD": {"id": "nodeD", "x": 7, "y": 6},
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeE0": {"id": "nodeE0", "x": 3.006, "y": 5.161, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeC0": {"id": "nodeC0", "x": 5.478, "y": 6.942, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                },
+                "links": [
+                  {"id": "link", "source": {"id": "nodeA", "x": 0, "y": 0}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeD", "x": 7, "y": 6}},
+                  {"id": "nodeE0--nodeF", "source": {"id": "nodeE0", "x": 3.006, "y": 5.161, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "nodeF--nodeC0", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeC0", "x": 5.478, "y": 6.942, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}}
+                ]
+              }
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+
+        });
+        
+
+
+        it('should reinsert side compounds when case of biggest interval includes angle 0 (test 1)', async () => {
+            // DATA
+            subgraphNetworkDupliAside.network.nodes.nodeD.x=6;
+            subgraphNetworkDupliAside.network.nodes.nodeD.y=7;
+
+            const networkExpected:NetworkLayout= {
+                "id": "network",
+                "nodes": {
+                  "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                  "nodeD": {"id": "nodeD", "x": 6, "y": 7},
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeE0": {"id": "nodeE0", "x": 5.242, "y": 2.01, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeC0": {"id": "nodeC0", "x": 7.913, "y": 5.716, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                },
+                "links": [
+                  {
+                    "id": "link",
+                    "source": {"id": "nodeA", "x": 0, "y": 0},
+                    "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}
+                  },
+                  {
+                    "id": "link",
+                    "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                    "target": {"id": "nodeD", "x": 6, "y": 7}
+                  },
+                  {
+                    "id": "nodeE0--nodeF",
+                    "source": {"id": "nodeE0", "x": 5.242, "y": 2.01, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                    "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}
+                  },
+                  {
+                    "id": "nodeF--nodeC0",
+                    "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                    "target": {"id": "nodeC0", "x": 7.913, "y": 5.716, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                  }
+                ]
+              };
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+            // => type interval : 2
+
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+
+        
+        });
+
+        it('should reinsert side compounds but position of reactant and product is the other way', async () => {
+            // DATA 
+            subgraphNetworkDupliAside.network.nodes.nodeD.x=0;
+            subgraphNetworkDupliAside.network.nodes.nodeD.y=0;
+            subgraphNetworkDupliAside.network.nodes.nodeA.x=7;
+            subgraphNetworkDupliAside.network.nodes.nodeA.y=6;
+
+            const networkExpected:NetworkLayout= {
+                "id": "network",
+                "nodes": {
+                  "nodeA": {"id": "nodeA", "x": 7, "y": 6},
+                  "nodeD": {"id": "nodeD", "x": 0, "y": 0},
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeE0": {"id": "nodeE0", "x": 5.716, "y": 7.913, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeC0": {"id": "nodeC0", "x": 2.01, "y": 5.242, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                },
+                "links": [
+                  {"id": "link", "source": {"id": "nodeA", "x": 7, "y": 6}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeD", "x": 0, "y": 0}},
+                  {"id": "nodeE0--nodeF", "source": {"id": "nodeE0", "x": 5.716, "y": 7.913, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "nodeF--nodeC0", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeC0", "x": 2.01, "y": 5.242, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}}
+                ]
+              }
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+            // => type interval : 1
+
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+        
+        });
+
+        it('should reinsert side compounds when case of biggest interval includes angle 0 (test 2)', async () => {
+
+            // DATA 
+            subgraphNetworkDupliAside.network.nodes.nodeD.x=0;
+            subgraphNetworkDupliAside.network.nodes.nodeD.y=0;
+            subgraphNetworkDupliAside.network.nodes.nodeA.x=6;
+            subgraphNetworkDupliAside.network.nodes.nodeA.y=7;
+
+            const networkExpected:NetworkLayout= {
+                "id": "network",
+                "nodes": {
+                  "nodeA": {"id": "nodeA", "x": 6, "y": 7},
+                  "nodeD": {"id": "nodeD", "x": 0, "y": 0},
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeE0": {"id": "nodeE0", "x": 7.913, "y": 5.716, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeC0": {"id": "nodeC0", "x": 5.242, "y": 2.01, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                },
+                "links": [
+                  {"id": "link", "source": {"id": "nodeA", "x": 6, "y": 7}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeD", "x": 0, "y": 0}},
+                  {"id": "nodeE0--nodeF", "source": {"id": "nodeE0", "x": 7.913, "y": 5.716, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "nodeF--nodeC0", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeC0", "x": 5.242, "y": 2.01, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}}
+                ]
+              };
+            
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+            // => type interval : 3
+            
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+        
+        });
+
+
+        it('should reinsert side compounds when only product in reaction', async () => {
+            // DATA
+            delete subgraphNetworkDupliAside.network.nodes.nodeA;
+            const newLinks=subgraphNetworkDupliAside.network.links.filter(link => link.source.id !== "nodeA");
+            subgraphNetworkDupliAside.network.links=newLinks;
+            const networkExpected:NetworkLayout= {
+                "id": "network",
+                "nodes": {
+                  "nodeD": {"id": "nodeD", "x": 7, "y": 6},
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeE0": {"id": "nodeE0", "x": 3.658, "y": 7.683, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeC0": {"id": "nodeC0", "x": 6.341, "y": 2.316, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                },
+                "links": [
+                  {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeD", "x": 7, "y": 6}},
+                  {"id": "nodeE0--nodeF", "source": {"id": "nodeE0", "x": 3.658, "y": 7.683, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "nodeF--nodeC0", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeC0", "x": 6.341, "y": 2.316, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}}
+                ]
+              };
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+            
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+
+        });
+
+        it('should reinsert side compounds when only reactant in reaction', async () => {
+            // DATA
+            delete subgraphNetworkDupliAside.network.nodes.nodeD;
+            const newLinks=subgraphNetworkDupliAside.network.links.filter(link => link.target.id !== "nodeD");
+            subgraphNetworkDupliAside.network.links=newLinks;
+
+            const networkExpected:NetworkLayout= {
+                "id": "network",
+                "nodes": {
+                  "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeE0": {"id": "nodeE0", "x": 7.122, "y": 2.879, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeC0": {"id": "nodeC0", "x": 2.879, "y": 7.122, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                },
+                "links": [
+                  {"id": "link", "source": {"id": "nodeA", "x": 0, "y": 0}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "nodeE0--nodeF", "source": {"id": "nodeE0", "x": 7.122, "y": 2.879, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "nodeF--nodeC0", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeC0", "x": 2.879, "y": 7.122, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}}
+                ]
+              };
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+
+        });
+
+        it('should reinsert side compounds when no reactant or product in reaction', async () => {
+            // DATA
+            delete subgraphNetworkDupliAside.network.nodes.nodeD;
+            delete subgraphNetworkDupliAside.network.nodes.nodeA;
+            subgraphNetworkDupliAside.network.links=[];
+
+            const networkExpected:NetworkLayout= {
+                "id": "network",
+                "nodes": {
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeE0": {"id": "nodeE0", "x": 4.999, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeC0": {"id": "nodeC0", "x": 4.999, "y": 8, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                },
+                "links": [
+                  {"id": "nodeE0--nodeF", "source": {"id": "nodeE0", "x": 4.999, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "nodeF--nodeC0", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeC0", "x": 4.999, "y": 8, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}}
+                ]
+              };
+                 
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+        
+        });
+
+        
+
+        it('should reinsert side compounds with several side compound of same type (reactant or product)', async () => {
+            
+            // DATA
+            const nodeB0:NodeLayout={"id": "nodeB0", "x": 1, "y": 2, "classes": ["duplicate"], "metadata": {"isSideCompound": true}};
+            if (subgraphNetworkDupliAside.sideCompounds){
+                subgraphNetworkDupliAside.sideCompounds.nodeF.reactants.push(nodeB0);
+            }
+            const networkExpected:NetworkLayout= {
+                "id": "network",
+                "nodes": {
+                  "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                  "nodeD": {"id": "nodeD", "x": 7, "y": 6},
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeE0": {"id": "nodeE0", "x": 2.01, "y": 5.242, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeC0": {"id": "nodeC0", "x": 6.517, "y": 7.588, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeB0": {"id": "nodeB0", "x": 4.859, "y": 7.997, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                },
+                "links": [
+                  {"id": "link", "source": {"id": "nodeA", "x": 0, "y": 0}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeD", "x": 7, "y": 6}},
+                  {"id": "nodeE0--nodeF", "source": {"id": "nodeE0", "x": 2.01, "y": 5.242, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "nodeF--nodeC0", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeC0", "x": 6.517, "y": 7.588, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}},
+                  {"id": "nodeF--nodeB0", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeB0", "x": 4.859, "y": 7.997, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}}
+                ]
+              };
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,true);
+
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+
+        
+        });
+
+        it('should reinsert side compounds but no update of reaction reversible', async () => {
+            // DATA
+            const networkExpected:NetworkLayout= {
+                "id": "network",
+                "nodes": {
+                  "nodeA": {"id": "nodeA", "x": 0, "y": 0},
+                  "nodeD": {"id": "nodeD", "x": 7, "y": 6},
+                  "nodeF": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}},
+                  "nodeC0": {"id": "nodeC0", "x": 2.01, "y": 5.242, "classes": ["duplicate"], "metadata": {"isSideCompound": true}},
+                  "nodeE0": {"id": "nodeE0", "x": 5.716, "y": 7.913, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}
+                },
+                "links": [
+                  {"id": "link", "source": {"id": "nodeA", "x": 0, "y": 0}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "link", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeD", "x": 7, "y": 6}},
+                  {"id": "nodeC0--nodeF", "source": {"id": "nodeC0", "x": 2.01, "y": 5.242, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}, "target": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}},
+                  {"id": "nodeF--nodeE0", "source": {"id": "nodeF", "x": 5, "y": 5, "metadataLayout": {"isReversedVersion": true}}, "target": {"id": "nodeE0", "x": 5.716, "y": 7.913, "classes": ["duplicate"], "metadata": {"isSideCompound": true}}}
+                ]
+              };
+              
+
+            // TEST
+            const result = await LayoutManageSideCompounds.reinsertionSideCompounds(subgraphNetworkDupliAside,1,false);
+
+            // EXPECT
+            expect(result.network).toEqual(networkExpected);
+
+        });
+
+
+
+    });
+
+});
\ No newline at end of file
diff --git a/src/composables/__tests__/LayoutReversibleReactions.test.ts b/src/composables/__tests__/LayoutReversibleReactions.test.ts
index 8f9df8f84c1f329afd5f4ddd92fcd7c3a2217baa..aa65c0f3e4246b1d357d89a92af31fe7b25eb55b 100644
--- a/src/composables/__tests__/LayoutReversibleReactions.test.ts
+++ b/src/composables/__tests__/LayoutReversibleReactions.test.ts
@@ -1,7 +1,5 @@
 // Type imports
-import { Link } from "@metabohub/viz-core/src/types/Link";
-import { Node } from "@metabohub/viz-core/src/types/Node";
-import { Network } from "@metabohub/viz-core/src/types/Network";
+import { Link, Node, Network } from "../../types/TypeVizCore";
 import { SubgraphNetwork } from "../../types/SubgraphNetwork";
 import { TypeSubgraph } from "../../types/Subgraph";
 import { StartNodesType } from "../../types/EnumArgs";
@@ -10,22 +8,7 @@ import { NetworkLayout, NodeLayout } from "../../types/NetworkLayout";
 // Composable imports
 import * as GetSetAttributsNodes from "../GetSetAttributsNodes";
 import * as LayoutReversibleReactions from "../LayoutReversibleReactions";
-import exp from "constants";
-import { link } from "fs";
-
-
-
-jest.mock('@metabohub/viz-core', () => ({
-    removeAllSelectedNodes: jest.fn((reactionToRemove:string[],network:Network) => {
-        delete network.nodes[reactionToRemove[0]];
-        const links = network.links.filter((link) => {
-            if (link.source.id !== reactionToRemove[0] && link.target.id !== reactionToRemove[0]) {
-            return link;
-            }
-        });
-        network.links = links;
-    }),  
-}));
+import * as VizCoreFunctions from "../VizCoreFunctions";
 
 
 describe('LayoutReversibleReactions', () => {
@@ -42,6 +25,7 @@ describe('LayoutReversibleReactions', () => {
     let addLinkClassReversibleMock: jest.SpyInstance;
     let isReactionMock: jest.SpyInstance;
     let isReversibleMock: jest.SpyInstance;
+    let removeAllSelectedNodesMock:jest.SpyInstance;
 
     beforeEach(() => {
         
@@ -50,7 +34,7 @@ describe('LayoutReversibleReactions', () => {
             nodeA: {id:"nodeA", x:0, y:0, classes:["metabolite"]},
             nodeB: {id:"nodeB", x:0, y:0, classes:["reaction"]},
             nodeC: {id:"nodeC", x:0, y:0, classes:["metabolite"]},
-            nodeD: {id:"nodeD", x:0, y:0, classes:["reaction"]},
+            nodeD: {id:"nodeD", x:0, y:0, classes:["reaction"],"metadata": {"reversible": true}},
             nodeE: {id:"nodeE", x:0, y:0, classes:["metabolite"]},
             nodeF: {id:"nodeF", x:0, y:0, classes:["metabolite"]},
         }
@@ -96,14 +80,6 @@ describe('LayoutReversibleReactions', () => {
           }
 
         // MOCK
-        addMetadataReversibleWithClassMock = jest.spyOn(GetSetAttributsNodes, 'addMetadataReversibleWithClass');
-        addMetadataReversibleWithClassMock.mockImplementation(
-            async (network) =>{
-                network.nodes.nodeD.metadata={};
-                network.nodes.nodeD.metadata[reversibleAttribute]=true;
-            }
-        )
-
         addLinkClassReversibleMock = jest.spyOn(GetSetAttributsNodes, 'addLinkClassReversible');
         addLinkClassReversibleMock.mockImplementation( (link:Link) => {
             link.classes=[classReversible];
@@ -120,6 +96,18 @@ describe('LayoutReversibleReactions', () => {
             return id==="nodeD" || id==="nodeD_rev";
         });
 
+        removeAllSelectedNodesMock=jest.spyOn(VizCoreFunctions,'removeAllSelectedNodes');
+        removeAllSelectedNodesMock.mockImplementation((reactionToRemove:string[],network:Network) => {
+            delete network.nodes[reactionToRemove[0]];
+            const links = network.links.filter((link) => {
+                if (link.source.id !== reactionToRemove[0] && link.target.id !== reactionToRemove[0]) {
+                return link;
+                }
+            });
+            network.links = links;
+        });
+
+
 
     });
 
diff --git a/src/composables/__tests__/LayoutSugiyama.test.ts b/src/composables/__tests__/LayoutSugiyama.test.ts
index 0b00a2255d5315148e368ea1bbfaeea8c3386fae..4dd3dc794338e27910575c8c4379297133bf5a65 100644
--- a/src/composables/__tests__/LayoutSugiyama.test.ts
+++ b/src/composables/__tests__/LayoutSugiyama.test.ts
@@ -1,8 +1,5 @@
 // Type imports
-import { Network } from '@metabohub/viz-core/src/types/Network';
-import { Node } from '@metabohub/viz-core/src/types/Node';
-import { Link } from '@metabohub/viz-core/src/types/Link';
-import { GraphStyleProperties } from '@metabohub/viz-core/src/types/GraphStyleProperties';
+import { Network, Node, Link, GraphStyleProperties } from "../../types/TypeVizCore";
 import { SubgraphNetwork } from '../../types/SubgraphNetwork';
 
 
@@ -133,7 +130,7 @@ describe('LayoutSugiyama', () => {
     getSepAttributesInchesMock.mockReturnValue(Promise.resolve({rankSep: 4, nodeSep: 4}));
 
     const networkToDOTMock = jest.spyOn(ConvertFromNetwork, 'networkToDOT');
-    networkToDOTMock.mockReturnValue(DOT);
+    networkToDOTMock.mockReturnValue(Promise.resolve(DOT));
 
     const changeNetworkFromVizMock = jest.spyOn(ConvertToNetwork, 'changeNetworkFromViz');
     changeNetworkFromVizMock.mockImplementation(async(json,subgraphNetwork,assignRank)=>{
diff --git a/src/composables/__tests__/SubgraphForSubgraphNetwork.test.ts b/src/composables/__tests__/SubgraphForSubgraphNetwork.test.ts
index 4ef32dfcef7274669e9a3d00d3f6c911c612d29f..d391fece80c65fd242f499977dcda3853a8ec42f 100644
--- a/src/composables/__tests__/SubgraphForSubgraphNetwork.test.ts
+++ b/src/composables/__tests__/SubgraphForSubgraphNetwork.test.ts
@@ -1,6 +1,5 @@
 // Type imports
-import { Link } from '@metabohub/viz-core/src/types/Link';
-import { GraphStyleProperties } from '@metabohub/viz-core/src/types/GraphStyleProperties';
+import { Link, GraphStyleProperties } from "../../types/TypeVizCore";
 import { SubgraphNetwork } from '../../types/SubgraphNetwork';
 import { NetworkLayout, NodeLayout } from '../../types/NetworkLayout';
 import { Subgraph, TypeSubgraph } from '../../types/Subgraph';
diff --git a/src/composables/__tests__/SubgraphForViz.test.ts b/src/composables/__tests__/SubgraphForViz.test.ts
index 79653160486f85299d7a6d29ff26c7457946716c..ffcb9fee51a9f769b90e7510adb724fd2ebaf67d 100644
--- a/src/composables/__tests__/SubgraphForViz.test.ts
+++ b/src/composables/__tests__/SubgraphForViz.test.ts
@@ -1,6 +1,5 @@
 // Type imports
-import { Link } from '@metabohub/viz-core/src/types/Link';
-import { GraphStyleProperties } from '@metabohub/viz-core/src/types/GraphStyleProperties';
+import { Link, GraphStyleProperties } from "../../types/TypeVizCore";
 import { SubgraphNetwork } from '../../types/SubgraphNetwork';
 import { NetworkLayout, NodeLayout } from '../../types/NetworkLayout';
 import { Subgraph, TypeSubgraph } from '../../types/Subgraph';
diff --git a/src/composables/__tests__/VizCoreFunctions.test.ts b/src/composables/__tests__/VizCoreFunctions.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ba82ada4ee03714dc360f993f23f7073e6ad5d9c
--- /dev/null
+++ b/src/composables/__tests__/VizCoreFunctions.test.ts
@@ -0,0 +1,214 @@
+// Type imports
+import { GraphStyleProperties, Link, Network } from  "../../types/TypeVizCore";
+
+// Composable imports
+import * as VizCoreFunctions from '../VizCoreFunctions';
+
+
+describe('VizCoreFunctions', () => {
+
+    let network: Network;
+    let networkStyle: GraphStyleProperties;
+
+    beforeEach(() => {
+        network = {
+            id: 'testNetwork',
+            nodes: {
+              "A": {
+                id: "A",
+                label: "A",
+                x: 0,
+                y: 0,
+                metadata:{toDuplicate: true}
+              },
+              "B": {
+                id: "B",
+                label: "B",
+                x: 10,
+                y: 10,
+                metadata:{toDuplicate: true}
+              },
+              "C": {
+                id: "C",
+                label: "C",
+                x: 20,
+                y: 20,
+                metadata:{toDuplicate: false}
+              },
+              "D": {
+                id: "D",
+                label: "D",
+                x: 30,
+                y: 30
+              },
+              "E": {
+                id: "E",
+                label: "E",
+                x: 40,
+                y: 40,
+                metadata:{toDuplicate: true}
+              },
+              "F": {
+                id: "F",
+                label: "F",
+                x: 50,
+                y: 50
+              }
+            },
+            links: [
+              {
+                id: 'A - B',
+                source: {
+                  id: "A",
+                  label: "A",
+                  x: 0,
+                  y: 0
+                },
+                target: {
+                  id: "B",
+                  label: "B",
+                  x: 10,
+                  y: 10
+                }
+              },
+              {
+                id: 'B - C',
+                source: {
+                  id: "B",
+                  label: "B",
+                  x: 10,
+                  y: 10
+                },
+                target: {
+                  id: "C",
+                  label: "C",
+                  x: 20,
+                  y: 20
+                }
+              },
+              {
+                id: 'C - A',
+                source: {
+                  id: "C",
+                  label: "C",
+                  x: 20,
+                  y: 20
+                },
+                target: {
+                  id: "A",
+                  label: "A",
+                  x: 0,
+                  y: 0
+                }
+              },
+              {
+                id: 'D - F',
+                source: {
+                  id: "D",
+                  label: "D",
+                  x: 30,
+                  y: 30
+                },
+                target: {
+                  id: "F",
+                  label: "F",
+                  x: 50,
+                  y: 50
+                }
+              },
+              {
+                id: 'D - E',
+                source: {
+                  id: "D",
+                  label: "D",
+                  x: 30,
+                  y: 30
+                },
+                target: {
+                  id: "E",
+                  label: "E",
+                  x: 40,
+                  y: 40
+                }
+              }
+            ]
+          }
+          
+        networkStyle= {
+            nodeStyles: {},
+            linkStyles: {}
+          }
+    });
+      
+
+    describe('duplicateNode', () => {
+
+        it('should duplicate node and suppress the original', () => {
+            // TEST
+            VizCoreFunctions.duplicateNode('D', network, networkStyle)
+
+            // EXPECT
+            expect(Object.keys(network.nodes).includes('D')).not.toBeTruthy();
+            network.links.forEach((link: Link) => {
+                expect(link.source.id).not.toEqual('D');
+                expect(link.target.id).not.toEqual('D');
+            });
+
+            expect(Object.keys(network.nodes).includes('D0')).toBeTruthy();
+            expect(Object.keys(network.nodes).includes('D1')).toBeTruthy();
+
+            let newLinksCount = 0;
+            network.links.forEach((link: Link) => {
+            if (
+                link.source.id === 'D0' || 
+                link.source.id === 'D1' ||
+                link.target.id === 'D0' ||
+                link.target.id === 'D1'
+            ) {
+                newLinksCount += 1;
+            }
+            });
+
+            expect(newLinksCount).toEqual(2);
+        });
+
+    });
+
+    describe('duplicateAllNodesByAttribut', () => {
+
+        it('should duplicate all nodes by attribut', () => {
+            // DATA
+            const nodesIDExpected:string[] = ['A0', 'A1', 'B0', 'B1','C','D', 'E0','F' ];
+
+            // TEST
+            VizCoreFunctions.duplicateAllNodesByAttribut(network, networkStyle, 'toDuplicate');
+
+            // EXPECT
+            expect(Object.keys(network.nodes).sort()).toEqual(nodesIDExpected.sort());
+
+        });
+
+
+    });
+
+    describe('removeAllSelectedNodes', () => {
+        it('should remove all selected nodes', () => {
+            // TEST
+            VizCoreFunctions.removeAllSelectedNodes(['A', 'B'], network);
+
+            // EXPECT
+            expect(Object.keys(network.nodes).includes('A')).not.toBeTruthy();
+            expect(Object.keys(network.nodes).includes('B')).not.toBeTruthy();
+            network.links.forEach((link: Link) => {
+                expect(link.source.id).not.toEqual('A');
+                expect(link.target.id).not.toEqual('A');
+
+                expect(link.source.id).not.toEqual('B');
+                expect(link.target.id).not.toEqual('B');
+            });
+        });
+
+    });
+
+});
+
diff --git a/src/composables/importNetwork.ts b/src/composables/importNetwork.ts
deleted file mode 100644
index ec7117c21656f862a1216c080419a47bf3c10444..0000000000000000000000000000000000000000
--- a/src/composables/importNetwork.ts
+++ /dev/null
@@ -1,93 +0,0 @@
-// import type { Ref } from "vue";
-// import type { Network } from "@metabohub/viz-core/src/types/Network";
-// import type { GraphStyleProperties } from "@metabohub/viz-core/src//types/GraphStyleProperties";
-
-// //import { readJsonGraph } from "./readJson";
-// import { readJsonGraph } from "@metabohub/viz-core";
-// import { sbml2json } from "./SBMLtoJSON";
-
-
-
-// /**
-//  * Import network at JSONGraph format from an URL.
-//  * @param url URL to get network data
-//  * @param network Reference to network object
-//  * @param networkStyle Reference to networkStyle object
-//  * @param callbackFunction Function to call after network load (opt)
-//  */
-// export function importNetworkFromURL(url: string, network: Ref<Network>, networkStyle: Ref<GraphStyleProperties>, callbackFunction = () => {}): void {
-// 	setTimeout(async function() {
-// 		let data:string = await getContentFromURL(url);
-// 		// Check if the data is XML
-// 		if (data.startsWith('<?xml')) {
-// 			// Convert XML to JSON
-// 			data = JSON.stringify(await sbml2json(data));
-// 		}
-// 		const graphData = readJsonGraph(data);
-// 		networkStyle.value = graphData.networkStyle;
-// 		loadNetwork(graphData.network, network).then(() => {
-//       callbackFunction();
-// 		});
-// 	}, 1);
-// }
-
-
-// /**
-//  * Import network at JSONGraph format from a file.
-//  * @param file File to get network data
-//  * @param network Reference to network object
-//  * @param networkStyle Reference to networkStyle object
-//  * @param callbackFunction Function to call after network load (opt)
-//  */
-
-// export function importNetworkFromFile(file: File, network: Ref<Network>, networkStyle: Ref<GraphStyleProperties>, callbackFunction = () => {}): void {
-// 	const reader = new FileReader();
-// 	reader.onload = async function () {
-// 		let data = reader.result as string;
-// 		if (data.startsWith('<?xml')) {
-// 			// Convert XML to JSON
-// 			data = JSON.stringify(await sbml2json(data));
-// 		}
-// 		const networkData = readJsonGraph(data);
-// 		networkStyle.value = networkData.networkStyle;
-//     loadNetwork(networkData.network, network).then(() => {
-// 			callbackFunction();
-// 		});
-// 	}
-
-// 	reader.readAsText(file);
-// }
-
-
-// /**
-//  * Make async the step where the data are put in network reference. 
-//  * That permit to chain with another function like rescale.
-//  * @param data network data
-//  * @param network Reference to network object
-//  */
-// async function loadNetwork(data: Network, network: Ref<Network>): Promise<void> {
-// 	network.value = data;
-//   }
-
-
-// /**
-//  * Fetch url to return data
-//  * @param url URL to fetch 
-//  * @returns Return response
-//  */
-// export async function getContentFromURL(url: string): Promise<string> {
-// 	try {
-// 	  const response = await fetch(url);
-// 	  if (!response.ok) {
-// 		throw new Error('La requête a échoué avec le statut ' + response.status);
-// 	  }
-// 	  const content = await response.text();
-// 	  return content;
-// 	} catch (error) {
-// 	  console.error('Une erreur s\'est produite lors de la récupération du contenu du fichier :', error);
-// 	  throw error;
-// 	}
-//   }
-  
-  
-
diff --git a/src/index.ts b/src/index.ts
index 525ff2dd7d5f219d1d4c378eaf26a96fea999127..73da76a331ad5050c6701c3b3f5aa84ba3bc50ec 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,3 +1,19 @@
-import {algorithmOnNetwork} from "./composables/LayoutMain";
+import {layoutOnNetwork} from "./composables/LayoutMain";
+import {Network, GraphStyleProperties, Node,Link, NodeStyle} from "./types/TypeVizCore";
+import { defaultParameters } from "./types/Parameters";
+import { PathType,StartNodesType } from "./types/EnumArgs";
 
-export {algorithmOnNetwork};
\ No newline at end of file
+export {layoutOnNetwork as algorithmOnNetwork};
+
+export type {
+    Network,
+    GraphStyleProperties,
+    Node,
+    Link,
+    NodeStyle,
+    PathType,
+    StartNodesType
+};
+
+export {defaultParameters};
+  
\ No newline at end of file
diff --git a/src/types/FormatJSONGraphXML.ts b/src/types/FormatJSONGraphXML.ts
deleted file mode 100644
index 7587a3226493d8ede3743d58bc84fcd5422c6981..0000000000000000000000000000000000000000
--- a/src/types/FormatJSONGraphXML.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
-
-export interface JSONGraphFormat {
-    graph: {
-        id: any;
-        type: string;
-        metadata: {
-            style:GraphStyleProperties;
-        };
-        nodes: {
-            [x: string]: {
-                id: string;
-                metadata: {
-                    classes?: string[];
-                    position?: {
-                        x: number;
-                        y: number;
-                    
-                    };
-                };
-                label: string;
-            };
-        };
-        edges: {
-            id: string;
-            source: string;
-            target: string;
-            metadata: {
-                classes?: string[];
-            };
-        }[];
-    };
-}
-
-export interface XMLSpecies {
-    $: { 
-        compartment: string; 
-        id: string; 
-        name: string; 
-        species: string 
-    }
-}
-
-export interface XMLReactions {
-    $: {
-        id: string;
-        name: string;
-        reversible:string;
-    },
-    listOfReactants: {
-        speciesReference: any[]|{} 
-    },
-    listOfProducts: {
-        speciesReference: Partial<XMLSpecies>[]|Partial<XMLSpecies> 
-    }
-}
-
-
diff --git a/src/types/FormatJsonStyle.ts b/src/types/FormatJsonStyle.ts
deleted file mode 100644
index 9d54eb7d7e56d76ff968af38f4f422f94b98a86a..0000000000000000000000000000000000000000
--- a/src/types/FormatJsonStyle.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-
-export interface JsonStyle {
-    biosource?: {[key:string]:string|number},
-    generalStyle?:{[key:string]:string|number|boolean},
-    linkStyle?:{[key:string]:string|number|boolean},
-    metaboliteStyle?:{[key:string]:string|number|boolean},
-    reactionStyle?:{[key:string]:string|number|boolean},
-}
diff --git a/src/types/FormatJsonViz.ts b/src/types/FormatJsonViz.ts
index 4f95bc5d5be94a23f2307f865b3298a4bc524893..779ddc97bc43d79d90613824662d41d367166890 100644
--- a/src/types/FormatJsonViz.ts
+++ b/src/types/FormatJsonViz.ts
@@ -1,8 +1,10 @@
+import { EdgeViz } from "./TypeViz"
 
 /**
  * This file contains the types for the Json object return by the viz API
  */
 
+
 export interface JsonViz {
     directed?: boolean,
     edges:Array<EdgeViz>,
diff --git a/src/types/NetworkLayout.ts b/src/types/NetworkLayout.ts
index 3c64e2d03973f6aea3ce7289e0004ed81fa1f056..f9a6d4930b71a92510ee880c3aca697b37140f3f 100644
--- a/src/types/NetworkLayout.ts
+++ b/src/types/NetworkLayout.ts
@@ -1,6 +1,4 @@
-import { Link } from "@metabohub/viz-core/src/types/Link";
-import { Node } from "@metabohub/viz-core/src/types/Node";
-import type { Network } from "@metabohub/viz-core/src/types/Network";
+import { Link , Node, Network} from "../types/TypeVizCore";
 import { TypeSubgraph } from "./Subgraph";
 
 /**
diff --git a/src/types/Parameters.ts b/src/types/Parameters.ts
index b5d0e44d3987912bc77c281cd0f02d5a2c388b68..38eba04ce2006e8119c1d2fe99b55f0f5430e41f 100644
--- a/src/types/Parameters.ts
+++ b/src/types/Parameters.ts
@@ -1,4 +1,4 @@
-import { Network } from "@metabohub/viz-core/src/types/Network";
+import { Network } from "../types/TypeVizCore";
 import { PathType, StartNodesType } from "./EnumArgs";
 import { getPathSourcesToTargetNode } from "../composables/LayoutMainChain";
 
@@ -16,37 +16,34 @@ export interface Parameters {
     doReactionReversible: boolean; // do the step duplication and choice of reaction reversible ?
 
     doMainChain: boolean; // do the step main chain ?
-    getSubgraph : (network: Network, sources: Array<string>,merge?:boolean,pathType?:PathType) => Promise<{[key:string]:{nodes:Array<string>, height:number}}>; // function to get subgraph (main chain)
+    readonly getSubgraph : (network: Network, sources: Array<string>,merge?:boolean,pathType?:PathType) => Promise<{[key:string]:{nodes:Array<string>, height:number}}>; // function to get subgraph (main chain)
     startNodeTypeMainChain: StartNodesType; // for the main chain step : which are the start nodes?
     pathType: PathType; // main chain step : longest path , all longest paths or all paths
-    merge: boolean; // merging main chain ? If not : nodes can be in several clusters
+    readonly merge: boolean; // merging main chain ? If not : nodes can be in several clusters
     doMiniBranch: boolean; // adding minibranch for main chains ?
-    groupOrCluster: "group" | "cluster"; //main chain as group or cluster in DOT
+    readonly groupOrCluster: "group" | "cluster"; //main chain as group or cluster in DOT
 
     doCycle: boolean; // do the step cycle ?
-    allowInternalCycles: boolean; // allow internal cycles for tangent one ?
+    readonly allowInternalCycles: boolean; // allow internal cycles for tangent one ?
 
-    addNodes: boolean; // adding node at the beginning of the DOT ?
-    ordering: boolean; // reorder edges in DOT ? (for cycle step)
+    readonly addNodes: boolean; // adding node at the beginning of the DOT ?
+    readonly ordering: boolean; // reorder edges in DOT ? (for cycle step)
 
-    dpi: number; // DPI for the image (viz parameter)
+    readonly dpi: number; // DPI for the image (viz parameter)
 
-    numberNodeOnEdge: number; // space between two rank, with size of a node as unit (mean of all size)
-    factorLengthSideCompounds: number; // % of the lenght of minimal edge to use as lenght of side compounds edges
+    readonly numberNodeOnEdge: number; // space between two rank, with size of a node as unit (mean of all size)
+    readonly factorLengthSideCompounds: number; // % of the lenght of minimal edge to use as lenght of side compounds edges
 
     shiftCoord?: boolean; // shift coordinates : center is at the previous coord (because of top left corner)
-
-    //userSources: string[];
-    //onlyUserSources: boolean;
 }
 
-export let defaultParameters: Parameters = {
+export const defaultParameters: Parameters = {
     doDuplicateSideCompounds: true, // user can change this parameter
     doPutAsideSideCompounds: true, // user can change this parameter
 
     doReactionReversible: true, // user can change this parameter
 
-    doMainChain: false, // user can change this parameter
+    doMainChain: true, // user can change this parameter
     getSubgraph : getPathSourcesToTargetNode,
     startNodeTypeMainChain: StartNodesType.RANK_SOURCE, // usefull to allow user to change this parameter with RANK_ONLY or SOURCE_ONLY ? (if source-only, put source_all for reaction rev and no first viz)
     pathType: PathType.ALL_LONGEST, // user can change this parameter
@@ -54,7 +51,7 @@ export let defaultParameters: Parameters = {
     doMiniBranch: true, // usefull choice ? run metrix to see if it's usefull
     groupOrCluster: "cluster",
 
-    doCycle: false, // user can change this parameter
+    doCycle: true, // user can change this parameter
     allowInternalCycles: false,
    
     addNodes: true,
@@ -65,8 +62,5 @@ export let defaultParameters: Parameters = {
     numberNodeOnEdge: 3, // user can change this parameter, but doesn't work for cycle edge length
     factorLengthSideCompounds: 1/2, // user can change this parameter
 
-    shiftCoord: true,
-
-    //userSources: [],
-    //onlyUserSources: false,
+    shiftCoord: false,
 };
\ No newline at end of file
diff --git a/src/types/Reaction.ts b/src/types/Reaction.ts
index cf90a30e4c2440973be11a73e422105364e7bf56..2688d6d174e957d4ecaefad0f71bb5a06915f90e 100644
--- a/src/types/Reaction.ts
+++ b/src/types/Reaction.ts
@@ -8,18 +8,11 @@ export enum MetaboliteType {
     PRODUCT='product',
 }
 
-// export enum MinMedianMax {
-//     MEDIAN='median',
-//     MIN='min',
-//     MAX='max'
-// }
-
 export interface Reaction {
     id:string
     sideCompoundsReactants: Array<string>
     sideCompoundsProducts:Array<string>
     metabolitesAngles:{[key:string]:{angle:number,type:MetaboliteType}}
-    //linkMedianMinMaxLength?:{median:number,min:number,max:number}
     intervalsAvailables?: ReactionInterval[]
     angleSpacingReactant?:number
     angleSpacingProduct?:number
diff --git a/src/types/SubgraphNetwork.ts b/src/types/SubgraphNetwork.ts
index 86e404eeb4937b46b8ed3c2ab4911d2df1ef1a8a..9da2c08757ef7e8ac12645bce23e1a6427e766f1 100644
--- a/src/types/SubgraphNetwork.ts
+++ b/src/types/SubgraphNetwork.ts
@@ -1,10 +1,7 @@
-import { Network } from "@metabohub/viz-core/src/types/Network";
-import { Node } from "@metabohub/viz-core/src/types/Node";
 import { Subgraph, TypeSubgraph } from "./Subgraph";
-import { Ref } from "vue";
-import { GraphStyleProperties } from "@metabohub/viz-core/src/types/GraphStyleProperties";
-import { NetworkLayout } from "./NetworkLayout";
-import { AttributesViz } from "./VizType";
+import { GraphStyleProperties } from "../types/TypeVizCore";
+import { NetworkLayout, NodeLayout } from "./NetworkLayout";
+import { AttributesViz } from "./TypeViz";
 
 /**
  * This file contains the types for the SubgraphNetwork object : a network with nodes and links information, stats information (minimal length of edge for example), attributs for viz, subgraphs (main chains, secondary chains, cycles and cycle groups) and side compounds.
@@ -33,6 +30,6 @@ export interface SubgraphNetwork {
 	}
 
 	sideCompounds?:{
-		[key:string]:{reactants:Array<Node>,products:Array<Node>}
+		[key:string]:{reactants:Array<NodeLayout>,products:Array<NodeLayout>}
 	}
 }
\ No newline at end of file
diff --git a/src/types/VizType.ts b/src/types/TypeViz.ts
similarity index 50%
rename from src/types/VizType.ts
rename to src/types/TypeViz.ts
index 72b18ecd732297c2e573c0e686d514583de94fee..9c9532e4eda3b85afd4a90f62a6e2311850ecd1f 100644
--- a/src/types/VizType.ts
+++ b/src/types/TypeViz.ts
@@ -1,15 +1,3 @@
-// Graph already accessible (see the format below, but implemented in library), but the other interface can't be exported so there are duplicated here
-// export interface Graph {
-//     name?: string
-//     strict?: boolean
-//     directed?: boolean
-//     graphAttributes?: Attributes
-//     nodeAttributes?: Attributes
-//     edgeAttributes?: Attributes
-//     nodes?: Node[]
-//     edges?: Edge[]
-//     subgraphs?: Subgraph[]
-//   }
 
 export interface AttributesViz {
     [name: string]: string | number | boolean 
diff --git a/src/types/TypeVizCore.ts b/src/types/TypeVizCore.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b90dfe38c47f41289b7f38246ec2402d3d6a0741
--- /dev/null
+++ b/src/types/TypeVizCore.ts
@@ -0,0 +1,76 @@
+
+
+/*******************************************************************************************************************************************************/
+//_____________________________________________________________________ Style __________________________________________________________________________
+
+
+export interface GraphStyleProperties {
+	nodeStyles?: { [key: string]: NodeStyle };
+	linkStyles?: { [key: string]: LinkStyle };
+	curveLine?: boolean;
+	directed?: boolean;
+}
+
+export interface NodeStyle {
+    height?: number;
+    width?: number;
+    fill?: string;
+    strokeWidth?: number;
+    stroke?: string;
+    displayLabel?: boolean;
+    label?: string;
+    rx?: number;
+    ry?: number;
+    shape?: string;
+    opacity?: number;
+  }
+
+  
+export interface LinkStyle {
+    display ?: boolean;
+    stroke?: string;
+    strokeWidth?: number;
+    opacity?: number;
+  }
+  
+
+
+
+  /*******************************************************************************************************************************************************/
+//_____________________________________________________________________ Network __________________________________________________________________________
+
+
+export interface Network {
+	id: String;
+	label?: String;
+	nodes: {
+		[key: string]: Node
+	};
+	links: Array<Link>;
+	type?: String;
+	rescale?: Boolean;
+}
+
+export interface Node {
+    id: string;
+    label?: string;
+    x: number;
+    y: number;
+    classes?: Array<string>;
+    hidden?: boolean;
+    selected?: boolean;
+    metadata?: {[key: string]: string | number | {[key: string]: string | number} | Array<string> | boolean};
+  }
+  
+export interface Link {
+    id: string;
+    classes?: Array<string>;
+    label?: string;
+    type?: string;
+    source: Node;
+    target: Node;
+    relation?: string;
+    directed?: boolean;
+    metadata?: {[key: string]: string | number | {[key: string]: string | number} | Array<string | number>};
+  }
+