From 61bc2186872ef42e4f7c4f15c9ac320e70625738 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Tue, 19 May 2020 14:48:58 +0200
Subject: [PATCH 01/92] Update jalhyd_branch

---
 jalhyd_branch | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/jalhyd_branch b/jalhyd_branch
index f95555f7a..1e054d20c 100644
--- a/jalhyd_branch
+++ b/jalhyd_branch
@@ -1 +1 @@
-204-ajout-de-la-fonctionnalite-respect-des-criteres-2
+223-calage-d-une-par-remplacer-la-cote-de-deversement-par-la-charge
-- 
GitLab


From 5a684b96ca52c983239858c6f5ffd196ba6be0fb Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 3 Mar 2020 15:36:22 +0100
Subject: [PATCH 02/92] PAR : calage

---
 package-lock.json           | 618 +++++++++++++++---------------------
 src/app/app.module.ts       |  13 +-
 src/locale/messages.en.json |   1 +
 src/locale/messages.fr.json |   1 +
 4 files changed, 267 insertions(+), 366 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e066204be..5fdece8c9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,10 +21,9 @@
       },
       "dependencies": {
         "rxjs": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
-          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
-          "dev": true,
+          "version": "6.5.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
+          "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
           "requires": {
             "tslib": "^1.9.0"
           }
@@ -1356,11 +1355,10 @@
             "js-tokens": "^4.0.0"
           }
         },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "requires": {
             "@babel/code-frame": "^7.10.4",
             "@babel/parser": "^7.10.4",
@@ -2857,51 +2855,47 @@
           }
         },
         "lru-cache": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-          "dev": true,
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
           "requires": {
             "yallist": "^4.0.0"
           }
         },
         "npm-package-arg": {
-          "version": "8.0.1",
-          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz",
-          "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==",
-          "dev": true,
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz",
+          "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==",
           "requires": {
             "hosted-git-info": "^3.0.2",
             "semver": "^7.0.0",
             "validate-npm-package-name": "^3.0.0"
+          },
+          "dependencies": {
+            "semver": {
+              "version": "5.7.1",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+            }
           }
         },
         "rxjs": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
-          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
-          "dev": true,
+          "version": "6.5.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
+          "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
           "requires": {
             "tslib": "^1.9.0"
           }
         },
         "semver": {
-          "version": "7.3.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
-          "dev": true
-        },
-        "tslib": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
-          "dev": true
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
         },
         "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
         }
       }
     },
@@ -3259,8 +3253,7 @@
     "@yarnpkg/lockfile": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
-      "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
-      "dev": true
+      "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
     },
     "JSONStream": {
       "version": "1.3.5",
@@ -3396,7 +3389,6 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
       "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
-      "dev": true,
       "requires": {
         "es6-promisify": "^5.0.0"
       }
@@ -3405,7 +3397,6 @@
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz",
       "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==",
-      "dev": true,
       "requires": {
         "humanize-ms": "^1.2.1"
       }
@@ -3424,7 +3415,6 @@
       "version": "6.6.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
       "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
-      "dev": true,
       "requires": {
         "fast-deep-equal": "^2.0.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -3710,8 +3700,7 @@
     "aproba": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
-      "dev": true
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
     },
     "arg": {
       "version": "4.1.3",
@@ -3822,14 +3811,12 @@
     "asap": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
-      "dev": true
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
     },
     "asn1": {
       "version": "0.2.4",
       "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
       "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-      "dev": true,
       "requires": {
         "safer-buffer": "~2.1.0"
       }
@@ -4001,14 +3988,12 @@
     "aws-sign2": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "dev": true
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
     },
     "aws4": {
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
-      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
-      "dev": true
+      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
     },
     "axobject-query": {
       "version": "2.0.2",
@@ -4239,7 +4224,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
       "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
       "requires": {
         "tweetnacl": "^0.14.3"
       }
@@ -4294,8 +4278,7 @@
     "bluebird": {
       "version": "3.5.5",
       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
-      "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
-      "dev": true
+      "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w=="
     },
     "bluebird-lst": {
       "version": "1.0.9",
@@ -4914,8 +4897,7 @@
     "builtins": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
-      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
-      "dev": true
+      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og="
     },
     "bytes": {
       "version": "3.0.0",
@@ -5169,8 +5151,7 @@
     "chardet": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
-      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
-      "dev": true
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
     },
     "chart.js": {
       "version": "2.7.3",
@@ -5356,10 +5337,9 @@
       }
     },
     "chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-      "dev": true
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
     },
     "chrome-trace-event": {
       "version": "1.0.2",
@@ -5466,16 +5446,14 @@
       }
     },
     "cli-spinners": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz",
-      "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==",
-      "dev": true
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz",
+      "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ=="
     },
     "cli-width": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
-      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
-      "dev": true
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
     },
     "clipboard": {
       "version": "2.0.6",
@@ -5708,7 +5686,6 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
       "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
-      "dev": true,
       "requires": {
         "delayed-stream": "~1.0.0"
       }
@@ -5968,7 +5945,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
       "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
-      "dev": true,
       "requires": {
         "aproba": "^1.1.1",
         "fs-write-stream-atomic": "^1.0.8",
@@ -7462,8 +7438,7 @@
     "cyclist": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
-      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
-      "dev": true
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
     },
     "d": {
       "version": "1.0.1",
@@ -7769,7 +7744,6 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
       "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
       "requires": {
         "assert-plus": "^1.0.0"
       }
@@ -7803,8 +7777,7 @@
     "debuglog": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
-      "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=",
-      "dev": true
+      "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI="
     },
     "decache": {
       "version": "4.5.1",
@@ -7873,7 +7846,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
       "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
-      "dev": true,
       "requires": {
         "clone": "^1.0.2"
       },
@@ -7881,8 +7853,7 @@
         "clone": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
-          "dev": true
+          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
         }
       }
     },
@@ -8019,8 +7990,7 @@
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
     },
     "delegate": {
       "version": "3.2.0",
@@ -8095,7 +8065,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
       "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
-      "dev": true,
       "requires": {
         "asap": "^2.0.0",
         "wrappy": "1"
@@ -8321,7 +8290,6 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
       "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "dev": true,
       "requires": {
         "jsbn": "~0.1.0",
         "safer-buffer": "^2.1.0"
@@ -8550,8 +8518,7 @@
     "emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
     },
     "emoji-toolkit": {
       "version": "6.0.1",
@@ -8571,10 +8538,9 @@
       "dev": true
     },
     "encoding": {
-      "version": "0.1.13",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
-      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-      "dev": true,
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
       "requires": {
         "iconv-lite": "^0.6.2"
       },
@@ -8749,8 +8715,7 @@
     "err-code": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
-      "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=",
-      "dev": true
+      "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA="
     },
     "errno": {
       "version": "0.1.7",
@@ -8814,16 +8779,14 @@
       }
     },
     "es6-promise": {
-      "version": "4.2.8",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
-      "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
-      "dev": true
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
+      "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg=="
     },
     "es6-promisify": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
       "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
-      "dev": true,
       "requires": {
         "es6-promise": "^4.0.3"
       }
@@ -9319,7 +9282,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
       "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
-      "dev": true,
       "requires": {
         "chardet": "^0.7.0",
         "iconv-lite": "^0.4.24",
@@ -9406,8 +9368,7 @@
     "extsprintf": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
     },
     "falafel": {
       "version": "2.1.0",
@@ -9450,8 +9411,7 @@
     "fast-deep-equal": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-      "dev": true
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
     },
     "fast-glob": {
       "version": "2.2.7",
@@ -9475,8 +9435,7 @@
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "dev": true
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
     },
     "fast-levenshtein": {
       "version": "2.0.6",
@@ -9517,10 +9476,9 @@
       }
     },
     "figgy-pudding": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
-      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
-      "dev": true
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
+      "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w=="
     },
     "figures": {
       "version": "2.0.0",
@@ -9816,14 +9774,12 @@
     "forever-agent": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
     },
     "form-data": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
       "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
       "requires": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.6",
@@ -9866,7 +9822,6 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
       "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
-      "dev": true,
       "requires": {
         "inherits": "^2.0.1",
         "readable-stream": "^2.0.0"
@@ -9917,7 +9872,6 @@
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
       "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
-      "dev": true,
       "requires": {
         "graceful-fs": "^4.1.2",
         "iferr": "^0.1.5",
@@ -10487,8 +10441,7 @@
     "genfun": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz",
-      "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==",
-      "dev": true
+      "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA=="
     },
     "gensync": {
       "version": "1.0.0-beta.1",
@@ -10526,7 +10479,6 @@
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
       "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
       "requires": {
         "assert-plus": "^1.0.0"
       }
@@ -10861,14 +10813,12 @@
     "har-schema": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "dev": true
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
     },
     "har-validator": {
       "version": "5.1.3",
       "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
       "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
-      "dev": true,
       "requires": {
         "ajv": "^6.5.5",
         "har-schema": "^2.0.0"
@@ -11136,8 +11086,7 @@
     "http-cache-semantics": {
       "version": "3.8.1",
       "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
-      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
-      "dev": true
+      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w=="
     },
     "http-deceiver": {
       "version": "1.2.7",
@@ -11178,7 +11127,6 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
       "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
-      "dev": true,
       "requires": {
         "agent-base": "4",
         "debug": "3.1.0"
@@ -11188,7 +11136,6 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
           "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
           "requires": {
             "ms": "2.0.0"
           }
@@ -11211,7 +11158,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
       "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "dev": true,
       "requires": {
         "assert-plus": "^1.0.0",
         "jsprim": "^1.2.2",
@@ -11228,17 +11174,23 @@
       "version": "2.2.4",
       "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
       "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
-      "dev": true,
       "requires": {
         "agent-base": "^4.3.0",
         "debug": "^3.1.0"
       },
       "dependencies": {
+        "agent-base": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
+          "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+          "requires": {
+            "es6-promisify": "^5.0.0"
+          }
+        },
         "debug": {
           "version": "3.2.6",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
           "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
           "requires": {
             "ms": "^2.1.1"
           }
@@ -11246,8 +11198,7 @@
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
         }
       }
     },
@@ -11260,7 +11211,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
       "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
-      "dev": true,
       "requires": {
         "ms": "^2.0.0"
       }
@@ -11300,8 +11250,7 @@
     "iferr": {
       "version": "0.1.5",
       "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
-      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
-      "dev": true
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
     },
     "ignore": {
       "version": "3.3.10",
@@ -11313,7 +11262,6 @@
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
       "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
-      "dev": true,
       "requires": {
         "minimatch": "^3.0.4"
       }
@@ -11378,8 +11326,7 @@
     "imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
     },
     "indent-string": {
       "version": "4.0.0",
@@ -11402,8 +11349,7 @@
     "infer-owner": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
-      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
-      "dev": true
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
     },
     "inflight": {
       "version": "1.0.6",
@@ -11572,8 +11518,7 @@
     "ip": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
-      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
-      "dev": true
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
     },
     "ip-regex": {
       "version": "2.1.0",
@@ -11753,8 +11698,7 @@
     "is-interactive": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
-      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
-      "dev": true
+      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="
     },
     "is-negated-glob": {
       "version": "1.0.0",
@@ -11833,6 +11777,30 @@
         "isobject": "^3.0.1"
       }
     },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+    },
+    "is-redirect": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+      "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+      "dev": true
+    },
+    "is-regex": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "requires": {
+        "has": "^1.0.1"
+      }
+    },
+    "is-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
+    },
     "is-relative": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
@@ -11875,8 +11843,7 @@
     "is-typedarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
     },
     "is-unc-path": {
       "version": "1.0.0",
@@ -11931,8 +11898,7 @@
     "isstream": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
     },
     "istanbul-lib-coverage": {
       "version": "3.0.0",
@@ -12194,8 +12160,7 @@
     "jsbn": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-      "dev": true
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
     },
     "jsesc": {
       "version": "2.5.2",
@@ -12217,8 +12182,7 @@
     "json-schema": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
     },
     "json-schema-traverse": {
       "version": "0.4.1",
@@ -12229,8 +12193,7 @@
     "json-stringify-safe": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
     },
     "json3": {
       "version": "3.3.3",
@@ -12266,7 +12229,6 @@
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
       "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "dev": true,
       "requires": {
         "assert-plus": "1.0.0",
         "extsprintf": "1.3.0",
@@ -12876,7 +12838,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
       "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
-      "dev": true,
       "requires": {
         "chalk": "^2.4.2"
       }
@@ -12975,10 +12936,9 @@
       "dev": true
     },
     "magic-string": {
-      "version": "0.25.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
-      "dev": true,
+      "version": "0.25.4",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz",
+      "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==",
       "requires": {
         "sourcemap-codec": "^1.4.4"
       }
@@ -13010,7 +12970,6 @@
       "version": "5.0.2",
       "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz",
       "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==",
-      "dev": true,
       "requires": {
         "agentkeepalive": "^3.4.1",
         "cacache": "^12.0.0",
@@ -13026,10 +12985,9 @@
       },
       "dependencies": {
         "cacache": {
-          "version": "12.0.4",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
-          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
-          "dev": true,
+          "version": "12.0.3",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
+          "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
           "requires": {
             "bluebird": "^3.5.5",
             "chownr": "^1.1.1",
@@ -13058,7 +13016,6 @@
           "version": "7.1.6",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
           "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-          "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
@@ -13072,7 +13029,6 @@
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
           "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-          "dev": true,
           "requires": {
             "yallist": "^3.0.2"
           }
@@ -13081,7 +13037,6 @@
           "version": "6.0.1",
           "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
           "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
-          "dev": true,
           "requires": {
             "figgy-pudding": "^3.5.1"
           }
@@ -13089,8 +13044,7 @@
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-          "dev": true
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
         }
       }
     },
@@ -13296,14 +13250,12 @@
     "mime-db": {
       "version": "1.37.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
-      "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
-      "dev": true
+      "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
     },
     "mime-types": {
       "version": "2.1.21",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
       "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
-      "dev": true,
       "requires": {
         "mime-db": "~1.37.0"
       }
@@ -13426,10 +13378,9 @@
       }
     },
     "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
     },
     "minipass": {
       "version": "3.1.3",
@@ -13476,20 +13427,27 @@
       }
     },
     "minizlib": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-      "dev": true,
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
+      "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
       "requires": {
         "minipass": "^3.0.0",
         "yallist": "^4.0.0"
       },
       "dependencies": {
+        "minipass": {
+          "version": "2.9.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+          "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
         "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
         }
       }
     },
@@ -13497,7 +13455,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
       "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
-      "dev": true,
       "requires": {
         "concat-stream": "^1.5.0",
         "duplexify": "^3.4.2",
@@ -13533,10 +13490,9 @@
       }
     },
     "mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
       "requires": {
         "minimist": "^1.2.5"
       },
@@ -13581,7 +13537,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
       "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
-      "dev": true,
       "requires": {
         "aproba": "^1.1.1",
         "copy-concurrently": "^1.0.0",
@@ -13880,7 +13835,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
       "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
-      "dev": true,
       "requires": {
         "npm-normalize-package-bin": "^1.0.1"
       }
@@ -13916,14 +13870,12 @@
     "npm-normalize-package-bin": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
-      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
-      "dev": true
+      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
     },
     "npm-package-arg": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz",
       "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==",
-      "dev": true,
       "requires": {
         "hosted-git-info": "^2.6.0",
         "osenv": "^0.1.5",
@@ -13935,7 +13887,6 @@
       "version": "1.4.8",
       "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
       "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
-      "dev": true,
       "requires": {
         "ignore-walk": "^3.0.1",
         "npm-bundled": "^1.0.1",
@@ -13943,10 +13894,9 @@
       }
     },
     "npm-pick-manifest": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz",
-      "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==",
-      "dev": true,
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz",
+      "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==",
       "requires": {
         "npm-install-checks": "^4.0.0",
         "npm-package-arg": "^8.0.0",
@@ -13997,10 +13947,9 @@
       }
     },
     "npm-registry-fetch": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz",
-      "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==",
-      "dev": true,
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz",
+      "integrity": "sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw==",
       "requires": {
         "JSONStream": "^1.3.4",
         "bluebird": "^3.5.1",
@@ -14015,22 +13964,19 @@
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
           "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-          "dev": true,
           "requires": {
             "yallist": "^3.0.2"
           }
         },
         "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-          "dev": true
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
         },
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-          "dev": true
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
         }
       }
     },
@@ -14061,8 +14007,7 @@
     "oauth-sign": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "dev": true
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
     },
     "object-assign": {
       "version": "4.1.1",
@@ -14150,17 +14095,15 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
       "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
-      "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.0-next.1"
       },
       "dependencies": {
         "es-abstract": {
-          "version": "1.17.6",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
-          "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
-          "dev": true,
+          "version": "1.17.4",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
+          "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
           "requires": {
             "es-to-primitive": "^1.2.1",
             "function-bind": "^1.1.1",
@@ -14179,7 +14122,6 @@
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
           "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-          "dev": true,
           "requires": {
             "is-callable": "^1.1.4",
             "is-date-object": "^1.0.1",
@@ -14189,35 +14131,30 @@
         "has-symbols": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-          "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
-          "dev": true
+          "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
         },
         "is-callable": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
-          "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
-          "dev": true
+          "version": "1.1.5",
+          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+          "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q=="
         },
         "is-regex": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-          "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
-          "dev": true,
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+          "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
           "requires": {
             "has-symbols": "^1.0.1"
           }
         },
         "object-inspect": {
-          "version": "1.8.0",
-          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-          "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
-          "dev": true
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+          "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
         },
         "object-keys": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-          "dev": true
+          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
         }
       }
     },
@@ -14350,23 +14287,18 @@
       }
     },
     "open": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz",
-      "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==",
-      "dev": true,
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz",
+      "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==",
       "requires": {
         "is-docker": "^2.0.0",
         "is-wsl": "^2.1.1"
       },
       "dependencies": {
         "is-wsl": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
-          "dev": true,
-          "requires": {
-            "is-docker": "^2.0.0"
-          }
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz",
+          "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog=="
         }
       }
     },
@@ -14400,10 +14332,9 @@
       }
     },
     "ora": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz",
-      "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==",
-      "dev": true,
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz",
+      "integrity": "sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==",
       "requires": {
         "chalk": "^3.0.0",
         "cli-cursor": "^3.1.0",
@@ -14416,10 +14347,9 @@
       },
       "dependencies": {
         "ansi-regex": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-          "dev": true
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
         },
         "ansi-styles": {
           "version": "4.2.1",
@@ -14445,7 +14375,6 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
           "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-          "dev": true,
           "requires": {
             "restore-cursor": "^3.1.0"
           }
@@ -14472,10 +14401,9 @@
           "dev": true
         },
         "onetime": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-          "dev": true,
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
           "requires": {
             "mimic-fn": "^2.1.0"
           }
@@ -14484,17 +14412,15 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
           "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-          "dev": true,
           "requires": {
             "onetime": "^5.1.0",
             "signal-exit": "^3.0.2"
           }
         },
         "strip-ansi": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-          "dev": true,
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
           "requires": {
             "ansi-regex": "^5.0.0"
           }
@@ -14636,10 +14562,9 @@
       }
     },
     "pacote": {
-      "version": "9.5.12",
-      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz",
-      "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==",
-      "dev": true,
+      "version": "9.5.8",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.8.tgz",
+      "integrity": "sha512-0Tl8Oi/K0Lo4MZmH0/6IsT3gpGf9eEAznLXEQPKgPq7FscnbUOyopnVpwXlnQdIbCUaojWy1Wd7VMyqfVsRrIw==",
       "requires": {
         "bluebird": "^3.5.3",
         "cacache": "^12.0.2",
@@ -14674,10 +14599,9 @@
       },
       "dependencies": {
         "cacache": {
-          "version": "12.0.4",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
-          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
-          "dev": true,
+          "version": "12.0.3",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
+          "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
           "requires": {
             "bluebird": "^3.5.5",
             "chownr": "^1.1.1",
@@ -14700,7 +14624,6 @@
               "version": "7.1.6",
               "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
               "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-              "dev": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -14731,7 +14654,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
           "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "dev": true,
           "requires": {
             "pump": "^3.0.0"
           }
@@ -14740,7 +14662,6 @@
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
           "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-          "dev": true,
           "requires": {
             "yallist": "^3.0.2"
           }
@@ -14749,7 +14670,6 @@
           "version": "2.9.0",
           "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
           "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
-          "dev": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
@@ -14778,14 +14698,12 @@
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
         },
         "ssri": {
           "version": "6.0.1",
           "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
           "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
-          "dev": true,
           "requires": {
             "figgy-pudding": "^3.5.1"
           }
@@ -14808,8 +14726,7 @@
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-          "dev": true
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
         }
       }
     },
@@ -14822,7 +14739,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
       "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
-      "dev": true,
       "requires": {
         "cyclist": "^1.0.1",
         "inherits": "^2.0.3",
@@ -15030,8 +14946,7 @@
     "performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
     },
     "picomatch": {
       "version": "2.0.7",
@@ -15876,6 +15791,12 @@
         "clipboard": "^2.0.0"
       }
     },
+    "private": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+      "dev": true
+    },
     "process": {
       "version": "0.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -15897,14 +15818,12 @@
     "promise-inflight": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
-      "dev": true
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
     },
     "promise-retry": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz",
       "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=",
-      "dev": true,
       "requires": {
         "err-code": "^1.0.0",
         "retry": "^0.10.0"
@@ -15913,8 +15832,7 @@
         "retry": {
           "version": "0.10.1",
           "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
-          "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
-          "dev": true
+          "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q="
         }
       }
     },
@@ -15946,7 +15864,6 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz",
       "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==",
-      "dev": true,
       "requires": {
         "genfun": "^5.0.0"
       }
@@ -16101,8 +16018,7 @@
     "psl": {
       "version": "1.1.31",
       "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
-      "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
-      "dev": true
+      "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw=="
     },
     "public-encrypt": {
       "version": "4.0.3",
@@ -16161,8 +16077,7 @@
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "pupa": {
       "version": "2.0.1",
@@ -16397,7 +16312,6 @@
       "version": "2.0.13",
       "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz",
       "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==",
-      "dev": true,
       "requires": {
         "glob": "^7.1.1",
         "graceful-fs": "^4.1.2",
@@ -16410,7 +16324,6 @@
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz",
       "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==",
-      "dev": true,
       "requires": {
         "read-package-json": "^2.0.0",
         "readdir-scoped-modules": "^1.0.0",
@@ -16436,7 +16349,6 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz",
       "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==",
-      "dev": true,
       "requires": {
         "debuglog": "^1.0.1",
         "dezalgo": "^1.0.0",
@@ -16580,7 +16492,6 @@
       "version": "2.88.0",
       "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
       "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
-      "dev": true,
       "requires": {
         "aws-sign2": "~0.7.0",
         "aws4": "^1.8.0",
@@ -16832,7 +16743,6 @@
       "version": "2.7.1",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
       "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-      "dev": true,
       "requires": {
         "glob": "^7.1.3"
       }
@@ -16895,21 +16805,17 @@
       }
     },
     "run-async": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
-      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
-      "dev": true
-    },
-    "run-parallel": {
-      "version": "1.1.9",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
-      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+      "requires": {
+        "is-promise": "^2.1.0"
+      }
     },
     "run-queue": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
       "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
-      "dev": true,
       "requires": {
         "aproba": "^1.1.1"
       }
@@ -16934,6 +16840,11 @@
         }
       }
     },
+    "rxjs-compat": {
+      "version": "6.5.4",
+      "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.5.4.tgz",
+      "integrity": "sha512-rkn+lbOHUQOurdd74J/hjmDsG9nFx0z66fvnbs8M95nrtKvNqCKdk7iZqdY51CGmDemTQk+kUPy4s8HVOHtkfA=="
+    },
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -17153,7 +17064,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz",
       "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==",
-      "dev": true,
       "requires": {
         "semver": "^5.0.0"
       }
@@ -17399,14 +17309,12 @@
     "slash": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
-      "dev": true
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
     },
     "smart-buffer": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz",
-      "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==",
-      "dev": true
+      "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw=="
     },
     "snapdragon": {
       "version": "0.8.2",
@@ -17709,7 +17617,6 @@
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz",
       "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==",
-      "dev": true,
       "requires": {
         "ip": "1.1.5",
         "smart-buffer": "^4.1.0"
@@ -17719,7 +17626,6 @@
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz",
       "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==",
-      "dev": true,
       "requires": {
         "agent-base": "~4.2.1",
         "socks": "~2.3.2"
@@ -17729,7 +17635,6 @@
           "version": "4.2.1",
           "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
           "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
-          "dev": true,
           "requires": {
             "es6-promisify": "^5.0.0"
           }
@@ -17754,8 +17659,7 @@
     "source-map": {
       "version": "0.7.3",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-      "dev": true
+      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
     },
     "source-map-loader": {
       "version": "1.0.0",
@@ -17979,7 +17883,6 @@
       "version": "1.16.1",
       "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
       "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
-      "dev": true,
       "requires": {
         "asn1": "~0.2.3",
         "assert-plus": "^1.0.0",
@@ -18133,7 +18036,6 @@
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
       "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
-      "dev": true,
       "requires": {
         "end-of-stream": "^1.1.0",
         "stream-shift": "^1.0.0"
@@ -18254,11 +18156,20 @@
       "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz",
       "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="
     },
-    "string.prototype.trimend": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
-      "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
-      "dev": true,
+    "string.prototype.trim": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
+      "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
+      "requires": {
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.5.0",
+        "function-bind": "^1.0.2"
+      }
+    },
+    "string.prototype.trimleft": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
+      "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5"
@@ -18329,11 +18240,10 @@
         }
       }
     },
-    "string.prototype.trimstart": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
-      "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
-      "dev": true,
+    "string.prototype.trimright": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
+      "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5"
@@ -18673,8 +18583,7 @@
     "symbol-observable": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
-      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
-      "dev": true
+      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
     },
     "systeminformation": {
       "version": "4.27.1",
@@ -18689,10 +18598,9 @@
       "dev": true
     },
     "tar": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
-      "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
-      "dev": true,
+      "version": "4.4.13",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
+      "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
       "requires": {
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
@@ -18702,17 +18610,27 @@
         "yallist": "^4.0.0"
       },
       "dependencies": {
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
+        "fs-minipass": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
+          "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+          "requires": {
+            "minipass": "^2.6.0"
+          }
+        },
+        "minipass": {
+          "version": "2.9.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+          "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
         },
         "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
         }
       }
     },
@@ -18884,7 +18802,6 @@
       "version": "0.0.33",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
       "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
-      "dev": true,
       "requires": {
         "os-tmpdir": "~1.0.2"
       }
@@ -18964,7 +18881,6 @@
       "version": "2.4.3",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
       "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
-      "dev": true,
       "requires": {
         "psl": "^1.1.24",
         "punycode": "^1.4.1"
@@ -18973,8 +18889,7 @@
         "punycode": {
           "version": "1.4.1",
           "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
         }
       }
     },
@@ -19173,7 +19088,6 @@
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
       "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
       "requires": {
         "safe-buffer": "^5.0.1"
       }
@@ -19181,8 +19095,7 @@
     "tweetnacl": {
       "version": "0.14.5",
       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-      "dev": true
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
     },
     "type": {
       "version": "1.2.0",
@@ -19393,7 +19306,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
       "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
-      "dev": true,
       "requires": {
         "unique-slug": "^2.0.0"
       }
@@ -19402,7 +19314,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
       "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
-      "dev": true,
       "requires": {
         "imurmurhash": "^0.1.4"
       }
@@ -19420,7 +19331,6 @@
       "version": "0.4.20",
       "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz",
       "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==",
-      "dev": true,
       "requires": {
         "debug": "^3.0.0",
         "request": "^2.88.0",
@@ -19431,7 +19341,6 @@
           "version": "3.2.6",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
           "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
           "requires": {
             "ms": "^2.1.1"
           }
@@ -19439,8 +19348,7 @@
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
         }
       }
     },
@@ -19701,7 +19609,6 @@
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
       "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-      "dev": true,
       "requires": {
         "punycode": "^2.1.0"
       }
@@ -19796,7 +19703,6 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz",
       "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=",
-      "dev": true,
       "requires": {
         "object.getownpropertydescriptors": "^2.0.3"
       }
@@ -19887,8 +19793,7 @@
     "uuid": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
-      "dev": true
+      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
     },
     "valid-identifier": {
       "version": "0.0.2",
@@ -19910,7 +19815,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
       "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
-      "dev": true,
       "requires": {
         "builtins": "^1.0.3"
       }
@@ -19931,7 +19835,6 @@
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
       "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "dev": true,
       "requires": {
         "assert-plus": "^1.0.0",
         "core-util-is": "1.0.2",
@@ -20164,7 +20067,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
       "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
-      "dev": true,
       "requires": {
         "defaults": "^1.0.3"
       }
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 8ed21e343..3ed2239b9 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -29,7 +29,7 @@ import { MaterialFileInputModule } from "ngx-material-file-input";
 import { DragDropModule } from "@angular/cdk/drag-drop";
 
 import { TableModule } from "primeng/table";
-import { KonamiModule } from "ngx-konami";
+/* import { KonamiModule } from "ngx-konami"; */
 import { MarkdownModule, MarkedOptions } from "ngx-markdown";
 
 import { FlexLayoutModule } from "@angular/flex-layout";
@@ -177,7 +177,7 @@ const appRoutes: Routes = [
         ),
         StorageServiceModule,
         TableModule,
-        KonamiModule
+        // KonamiModule
     ],
     declarations: [ // composants, pipes et directives
         AppComponent,
@@ -194,7 +194,6 @@ const appRoutes: Routes = [
         DialogEditParamValuesComponent,
         DialogGeneratePABComponent,
         DialogGeneratePARSimulationComponent,
-        DialogLoadPredefinedEspeceComponent,
         DialogLoadSessionComponent,
         DialogLogEntriesDetailsComponent,
         DialogSaveSessionComponent,
@@ -215,13 +214,11 @@ const appRoutes: Routes = [
         JetResultsComponent,
         JetTrajectoryChartComponent,
         LogComponent,
-        LogDrawerComponent,
         LogEntryComponent,
         ModulesDiagramComponent,
         NgParamInputComponent,
         PabProfileChartComponent,
         PabResultsComponent,
-        VerificateurResultsComponent,
         PabResultsTableComponent,
         PabTableComponent,
         VariableResultsSelectorComponent,
@@ -237,6 +234,7 @@ const appRoutes: Routes = [
         SectionCanvasComponent,
         SectionResultsComponent,
         SelectFieldLineComponent,
+        SelectModelFieldLineComponent,
         SessionPropertiesComponent,
         VarResultsComponent
     ],
@@ -248,7 +246,6 @@ const appRoutes: Routes = [
         DialogEditParamValuesComponent,
         DialogGeneratePABComponent,
         DialogGeneratePARSimulationComponent,
-        DialogLoadPredefinedEspeceComponent,
         DialogSaveSessionComponent,
         DialogLoadSessionComponent,
         DialogLogEntriesDetailsComponent
@@ -265,8 +262,8 @@ const appRoutes: Routes = [
             useClass: ImmediateErrorStateMatcher
         }
     ],
-    schemas: [NO_ERRORS_SCHEMA],
-    bootstrap: [AppComponent]
+  schemas: [ NO_ERRORS_SCHEMA ],
+  bootstrap: [ AppComponent ]
 })
 
 export class AppModule { }
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 8f48e654c..09990d2e0 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -602,6 +602,7 @@
     "INFO_EXAMPLE_LABEL_WEIR_JET_LENGTH": "Weir jet length",
     "INFO_EXAMPLES_TITLE": "Examples",
     "INFO_EXAMPLES_SUBTITLE": "Load standard examples",
+    "INFO_PAR_P_WAS_IGNORED": "Given P value was ignored",
     "INFO_YAXB_TITRE": "Linear function",
     "INFO_YAXB_DESCRIPTION": "addition plus subtraction minus multiplication division",
     "INFO_YAXB_TITRE_COURT": "Linear f.",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 6ce751141..83f65a9ec 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -603,6 +603,7 @@
     "INFO_EXAMPLE_LABEL_WEIR_JET_LENGTH": "Longueur de jet d'un déversoir",
     "INFO_EXAMPLES_TITLE": "Exemples",
     "INFO_EXAMPLES_SUBTITLE": "Charger des exemples types",
+    "INFO_PAR_P_WAS_IGNORED": "La valeur de P fournie a été ignorée",
     "INFO_YAXB_TITRE": "Fonction affine",
     "INFO_YAXB_DESCRIPTION": "addition plus soustraction moins multiplication division",
     "INFO_YAXB_TITRE_COURT": "F. affine",
-- 
GitLab


From 864af123c7732ffd30190599e613cd91edccf91c Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 5 Mar 2020 10:08:53 +0100
Subject: [PATCH 03/92] Update dependencies

---
 package-lock.json     | 657 ++++++++++++++++++++++--------------------
 src/app/app.module.ts |   2 +-
 2 files changed, 349 insertions(+), 310 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 5fdece8c9..eba56ad88 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,6 +24,7 @@
           "version": "6.5.3",
           "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
           "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
+          "dev": true,
           "requires": {
             "tslib": "^1.9.0"
           }
@@ -417,235 +418,6 @@
           "requires": {
             "type-fest": "^0.11.0"
           }
-        },
-        "ansi-regex": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
-          "dev": true,
-          "requires": {
-            "@types/color-name": "^1.1.1",
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "cli-cursor": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-          "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-          "dev": true,
-          "requires": {
-            "restore-cursor": "^3.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "figures": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
-          "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
-          "dev": true,
-          "requires": {
-            "escape-string-regexp": "^1.0.5"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "hosted-git-info": {
-          "version": "3.0.5",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
-          "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "inquirer": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
-          "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
-          "dev": true,
-          "requires": {
-            "ansi-escapes": "^4.2.1",
-            "chalk": "^3.0.0",
-            "cli-cursor": "^3.1.0",
-            "cli-width": "^2.0.0",
-            "external-editor": "^3.0.3",
-            "figures": "^3.0.0",
-            "lodash": "^4.17.15",
-            "mute-stream": "0.0.8",
-            "run-async": "^2.4.0",
-            "rxjs": "^6.5.3",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0",
-            "through": "^2.3.6"
-          }
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "lodash": {
-          "version": "4.17.20",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-          "dev": true
-        },
-        "lru-cache": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "mute-stream": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
-          "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
-          "dev": true
-        },
-        "npm-package-arg": {
-          "version": "8.0.1",
-          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz",
-          "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==",
-          "dev": true,
-          "requires": {
-            "hosted-git-info": "^3.0.2",
-            "semver": "^7.0.0",
-            "validate-npm-package-name": "^3.0.0"
-          }
-        },
-        "onetime": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-          "dev": true,
-          "requires": {
-            "mimic-fn": "^2.1.0"
-          }
-        },
-        "restore-cursor": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-          "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-          "dev": true,
-          "requires": {
-            "onetime": "^5.1.0",
-            "signal-exit": "^3.0.2"
-          }
-        },
-        "rimraf": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "run-async": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
-          "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
-          "dev": true
-        },
-        "semver": {
-          "version": "7.3.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^5.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "type-fest": {
-          "version": "0.11.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
-          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
-          "dev": true
-        },
-        "uuid": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz",
-          "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==",
-          "dev": true
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
         }
       }
     },
@@ -1083,6 +855,31 @@
         "source-map": "^0.5.0"
       },
       "dependencies": {
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "regenerator-transform": {
+          "version": "0.14.2",
+          "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.2.tgz",
+          "integrity": "sha512-V4+lGplCM/ikqi5/mkkpJ06e9Bujq1NFmNLvsCs56zg3ZbzrnUzAtizZ24TXxtRX/W2jcdScwQCnbL0CICTFkQ==",
+          "requires": {
+            "@babel/runtime": "^7.8.4",
+            "private": "^0.1.8"
+          }
+        },
+        "rimraf": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
+          "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
         "source-map": {
           "version": "0.5.7",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@@ -1359,6 +1156,7 @@
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
           "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
           "requires": {
             "@babel/code-frame": "^7.10.4",
             "@babel/parser": "^7.10.4",
@@ -2027,7 +1825,8 @@
       "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-unicode-regex": {
@@ -2858,6 +2657,7 @@
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
           "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
           "requires": {
             "yallist": "^4.0.0"
           }
@@ -2866,6 +2666,7 @@
           "version": "7.0.0",
           "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz",
           "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==",
+          "dev": true,
           "requires": {
             "hosted-git-info": "^3.0.2",
             "semver": "^7.0.0",
@@ -2875,7 +2676,8 @@
             "semver": {
               "version": "5.7.1",
               "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+              "dev": true
             }
           }
         },
@@ -2883,6 +2685,7 @@
           "version": "6.5.3",
           "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
           "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
+          "dev": true,
           "requires": {
             "tslib": "^1.9.0"
           }
@@ -2890,12 +2693,14 @@
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
         },
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
@@ -3253,7 +3058,8 @@
     "@yarnpkg/lockfile": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
-      "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
+      "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
+      "dev": true
     },
     "JSONStream": {
       "version": "1.3.5",
@@ -3389,6 +3195,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
       "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+      "dev": true,
       "requires": {
         "es6-promisify": "^5.0.0"
       }
@@ -3397,6 +3204,7 @@
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz",
       "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==",
+      "dev": true,
       "requires": {
         "humanize-ms": "^1.2.1"
       }
@@ -3415,6 +3223,7 @@
       "version": "6.6.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
       "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+      "dev": true,
       "requires": {
         "fast-deep-equal": "^2.0.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -3700,7 +3509,8 @@
     "aproba": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
     },
     "arg": {
       "version": "4.1.3",
@@ -3811,12 +3621,14 @@
     "asap": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "dev": true
     },
     "asn1": {
       "version": "0.2.4",
       "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
       "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dev": true,
       "requires": {
         "safer-buffer": "~2.1.0"
       }
@@ -3853,7 +3665,8 @@
     "assert-plus": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "dev": true
     },
     "assign-symbols": {
       "version": "1.0.0",
@@ -3988,12 +3801,14 @@
     "aws-sign2": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
     },
     "aws4": {
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
-      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
+      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+      "dev": true
     },
     "axobject-query": {
       "version": "2.0.2",
@@ -4224,6 +4039,7 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
       "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dev": true,
       "requires": {
         "tweetnacl": "^0.14.3"
       }
@@ -4278,7 +4094,8 @@
     "bluebird": {
       "version": "3.5.5",
       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
-      "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w=="
+      "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
+      "dev": true
     },
     "bluebird-lst": {
       "version": "1.0.9",
@@ -4897,7 +4714,8 @@
     "builtins": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
-      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og="
+      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
+      "dev": true
     },
     "bytes": {
       "version": "3.0.0",
@@ -5151,7 +4969,8 @@
     "chardet": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
-      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
     },
     "chart.js": {
       "version": "2.7.3",
@@ -5339,7 +5158,8 @@
     "chownr": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "dev": true
     },
     "chrome-trace-event": {
       "version": "1.0.2",
@@ -5448,12 +5268,14 @@
     "cli-spinners": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz",
-      "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ=="
+      "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==",
+      "dev": true
     },
     "cli-width": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
-      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+      "dev": true
     },
     "clipboard": {
       "version": "2.0.6",
@@ -5686,6 +5508,7 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
       "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+      "dev": true,
       "requires": {
         "delayed-stream": "~1.0.0"
       }
@@ -5945,6 +5768,7 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
       "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "dev": true,
       "requires": {
         "aproba": "^1.1.1",
         "fs-write-stream-atomic": "^1.0.8",
@@ -7438,7 +7262,8 @@
     "cyclist": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
-      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
+      "dev": true
     },
     "d": {
       "version": "1.0.1",
@@ -7744,6 +7569,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
       "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
       "requires": {
         "assert-plus": "^1.0.0"
       }
@@ -7777,7 +7603,8 @@
     "debuglog": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
-      "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI="
+      "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=",
+      "dev": true
     },
     "decache": {
       "version": "4.5.1",
@@ -7846,6 +7673,7 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
       "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "dev": true,
       "requires": {
         "clone": "^1.0.2"
       },
@@ -7853,7 +7681,8 @@
         "clone": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+          "dev": true
         }
       }
     },
@@ -7990,7 +7819,8 @@
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
     },
     "delegate": {
       "version": "3.2.0",
@@ -8065,6 +7895,7 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
       "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
+      "dev": true,
       "requires": {
         "asap": "^2.0.0",
         "wrappy": "1"
@@ -8290,6 +8121,7 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
       "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dev": true,
       "requires": {
         "jsbn": "~0.1.0",
         "safer-buffer": "^2.1.0"
@@ -8518,7 +8350,8 @@
     "emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
     },
     "emoji-toolkit": {
       "version": "6.0.1",
@@ -8541,6 +8374,7 @@
       "version": "0.1.12",
       "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
       "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+      "dev": true,
       "requires": {
         "iconv-lite": "^0.6.2"
       },
@@ -8715,7 +8549,8 @@
     "err-code": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
-      "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA="
+      "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=",
+      "dev": true
     },
     "errno": {
       "version": "0.1.7",
@@ -8781,12 +8616,14 @@
     "es6-promise": {
       "version": "4.2.5",
       "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
-      "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg=="
+      "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
+      "dev": true
     },
     "es6-promisify": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
       "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+      "dev": true,
       "requires": {
         "es6-promise": "^4.0.3"
       }
@@ -9282,6 +9119,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
       "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "dev": true,
       "requires": {
         "chardet": "^0.7.0",
         "iconv-lite": "^0.4.24",
@@ -9368,7 +9206,8 @@
     "extsprintf": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "dev": true
     },
     "falafel": {
       "version": "2.1.0",
@@ -9411,7 +9250,8 @@
     "fast-deep-equal": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "dev": true
     },
     "fast-glob": {
       "version": "2.2.7",
@@ -9435,7 +9275,8 @@
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "dev": true
     },
     "fast-levenshtein": {
       "version": "2.0.6",
@@ -9478,7 +9319,8 @@
     "figgy-pudding": {
       "version": "3.5.1",
       "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
-      "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w=="
+      "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
+      "dev": true
     },
     "figures": {
       "version": "2.0.0",
@@ -9774,12 +9616,14 @@
     "forever-agent": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
     },
     "form-data": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
       "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dev": true,
       "requires": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.6",
@@ -9822,6 +9666,7 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
       "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
       "requires": {
         "inherits": "^2.0.1",
         "readable-stream": "^2.0.0"
@@ -9872,6 +9717,7 @@
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
       "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "dev": true,
       "requires": {
         "graceful-fs": "^4.1.2",
         "iferr": "^0.1.5",
@@ -10479,6 +10325,7 @@
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
       "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
       "requires": {
         "assert-plus": "^1.0.0"
       }
@@ -10813,12 +10660,14 @@
     "har-schema": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "dev": true
     },
     "har-validator": {
       "version": "5.1.3",
       "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
       "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+      "dev": true,
       "requires": {
         "ajv": "^6.5.5",
         "har-schema": "^2.0.0"
@@ -11086,7 +10935,8 @@
     "http-cache-semantics": {
       "version": "3.8.1",
       "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
-      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w=="
+      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
+      "dev": true
     },
     "http-deceiver": {
       "version": "1.2.7",
@@ -11127,6 +10977,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
       "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
+      "dev": true,
       "requires": {
         "agent-base": "4",
         "debug": "3.1.0"
@@ -11136,6 +10987,7 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
           "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
           "requires": {
             "ms": "2.0.0"
           }
@@ -11158,6 +11010,7 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
       "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
       "requires": {
         "assert-plus": "^1.0.0",
         "jsprim": "^1.2.2",
@@ -11174,6 +11027,7 @@
       "version": "2.2.4",
       "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
       "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+      "dev": true,
       "requires": {
         "agent-base": "^4.3.0",
         "debug": "^3.1.0"
@@ -11183,6 +11037,7 @@
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
           "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+          "dev": true,
           "requires": {
             "es6-promisify": "^5.0.0"
           }
@@ -11191,6 +11046,7 @@
           "version": "3.2.6",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
           "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
           "requires": {
             "ms": "^2.1.1"
           }
@@ -11198,7 +11054,8 @@
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
         }
       }
     },
@@ -11211,6 +11068,7 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
       "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
+      "dev": true,
       "requires": {
         "ms": "^2.0.0"
       }
@@ -11250,7 +11108,8 @@
     "iferr": {
       "version": "0.1.5",
       "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
-      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
     },
     "ignore": {
       "version": "3.3.10",
@@ -11262,6 +11121,7 @@
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
       "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
+      "dev": true,
       "requires": {
         "minimatch": "^3.0.4"
       }
@@ -11326,7 +11186,8 @@
     "imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
     },
     "indent-string": {
       "version": "4.0.0",
@@ -11349,7 +11210,8 @@
     "infer-owner": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
-      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+      "dev": true
     },
     "inflight": {
       "version": "1.0.6",
@@ -11518,7 +11380,8 @@
     "ip": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
-      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
     },
     "ip-regex": {
       "version": "2.1.0",
@@ -11698,7 +11561,8 @@
     "is-interactive": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
-      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="
+      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+      "dev": true
     },
     "is-negated-glob": {
       "version": "1.0.0",
@@ -11780,7 +11644,8 @@
     "is-promise": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
-      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+      "dev": true
     },
     "is-redirect": {
       "version": "1.0.0",
@@ -11843,7 +11708,8 @@
     "is-typedarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
     },
     "is-unc-path": {
       "version": "1.0.0",
@@ -11879,9 +11745,9 @@
       "dev": true
     },
     "isbinaryfile": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz",
-      "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.4.tgz",
+      "integrity": "sha512-pEutbN134CzcjlLS1myKX/uxNjwU5eBVSprvkpv3+3dqhBHUZLIWJQowC40w5c0Zf19vBY8mrZl88y5J4RAPbQ==",
       "dev": true
     },
     "isexe": {
@@ -11898,7 +11764,82 @@
     "isstream": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
+    "istanbul-api": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz",
+      "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.2",
+        "compare-versions": "^3.4.0",
+        "fileset": "^2.0.3",
+        "istanbul-lib-coverage": "^2.0.5",
+        "istanbul-lib-hook": "^2.0.7",
+        "istanbul-lib-instrument": "^3.3.0",
+        "istanbul-lib-report": "^2.0.8",
+        "istanbul-lib-source-maps": "^3.0.6",
+        "istanbul-reports": "^2.2.4",
+        "js-yaml": "^3.13.1",
+        "make-dir": "^2.1.0",
+        "minimatch": "^3.0.4",
+        "once": "^1.4.0"
+      },
+      "dependencies": {
+        "istanbul-lib-coverage": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
+          "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
+          "dev": true
+        },
+        "istanbul-lib-instrument": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
+          "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
+          "dev": true,
+          "requires": {
+            "@babel/generator": "^7.4.0",
+            "@babel/parser": "^7.4.3",
+            "@babel/template": "^7.4.0",
+            "@babel/traverse": "^7.4.3",
+            "@babel/types": "^7.4.0",
+            "istanbul-lib-coverage": "^2.0.5",
+            "semver": "^6.0.0"
+          }
+        },
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+          "dev": true,
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          },
+          "dependencies": {
+            "semver": {
+              "version": "5.7.1",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+              "dev": true
+            }
+          }
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
     },
     "istanbul-lib-coverage": {
       "version": "3.0.0",
@@ -12160,7 +12101,8 @@
     "jsbn": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true
     },
     "jsesc": {
       "version": "2.5.2",
@@ -12182,7 +12124,8 @@
     "json-schema": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
     },
     "json-schema-traverse": {
       "version": "0.4.1",
@@ -12193,7 +12136,8 @@
     "json-stringify-safe": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "dev": true
     },
     "json3": {
       "version": "3.3.3",
@@ -12229,6 +12173,7 @@
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
       "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
       "requires": {
         "assert-plus": "1.0.0",
         "extsprintf": "1.3.0",
@@ -12838,6 +12783,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
       "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+      "dev": true,
       "requires": {
         "chalk": "^2.4.2"
       }
@@ -12939,6 +12885,7 @@
       "version": "0.25.4",
       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz",
       "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==",
+      "dev": true,
       "requires": {
         "sourcemap-codec": "^1.4.4"
       }
@@ -12970,6 +12917,7 @@
       "version": "5.0.2",
       "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz",
       "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==",
+      "dev": true,
       "requires": {
         "agentkeepalive": "^3.4.1",
         "cacache": "^12.0.0",
@@ -12988,6 +12936,7 @@
           "version": "12.0.3",
           "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
           "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
+          "dev": true,
           "requires": {
             "bluebird": "^3.5.5",
             "chownr": "^1.1.1",
@@ -13016,6 +12965,7 @@
           "version": "7.1.6",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
           "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
@@ -13029,6 +12979,7 @@
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
           "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
           "requires": {
             "yallist": "^3.0.2"
           }
@@ -13037,6 +12988,7 @@
           "version": "6.0.1",
           "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
           "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
           "requires": {
             "figgy-pudding": "^3.5.1"
           }
@@ -13044,7 +12996,8 @@
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
@@ -13250,12 +13203,14 @@
     "mime-db": {
       "version": "1.37.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
-      "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
+      "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
+      "dev": true
     },
     "mime-types": {
       "version": "2.1.21",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
       "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
+      "dev": true,
       "requires": {
         "mime-db": "~1.37.0"
       }
@@ -13380,7 +13335,8 @@
     "minimist": {
       "version": "0.0.8",
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+      "dev": true
     },
     "minipass": {
       "version": "3.1.3",
@@ -13430,6 +13386,7 @@
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
       "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+      "dev": true,
       "requires": {
         "minipass": "^3.0.0",
         "yallist": "^4.0.0"
@@ -13439,6 +13396,7 @@
           "version": "2.9.0",
           "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
           "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "dev": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
@@ -13447,7 +13405,8 @@
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
@@ -13455,6 +13414,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
       "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+      "dev": true,
       "requires": {
         "concat-stream": "^1.5.0",
         "duplexify": "^3.4.2",
@@ -13493,6 +13453,7 @@
       "version": "0.5.1",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
       "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "dev": true,
       "requires": {
         "minimist": "^1.2.5"
       },
@@ -13537,6 +13498,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
       "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "dev": true,
       "requires": {
         "aproba": "^1.1.1",
         "copy-concurrently": "^1.0.0",
@@ -13835,6 +13797,7 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
       "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
+      "dev": true,
       "requires": {
         "npm-normalize-package-bin": "^1.0.1"
       }
@@ -13870,12 +13833,14 @@
     "npm-normalize-package-bin": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
-      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
+      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
+      "dev": true
     },
     "npm-package-arg": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz",
       "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==",
+      "dev": true,
       "requires": {
         "hosted-git-info": "^2.6.0",
         "osenv": "^0.1.5",
@@ -13887,6 +13852,7 @@
       "version": "1.4.8",
       "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
       "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
+      "dev": true,
       "requires": {
         "ignore-walk": "^3.0.1",
         "npm-bundled": "^1.0.1",
@@ -13897,6 +13863,7 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz",
       "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==",
+      "dev": true,
       "requires": {
         "npm-install-checks": "^4.0.0",
         "npm-package-arg": "^8.0.0",
@@ -13950,6 +13917,7 @@
       "version": "4.0.3",
       "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz",
       "integrity": "sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw==",
+      "dev": true,
       "requires": {
         "JSONStream": "^1.3.4",
         "bluebird": "^3.5.1",
@@ -13964,6 +13932,7 @@
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
           "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
           "requires": {
             "yallist": "^3.0.2"
           }
@@ -13971,12 +13940,14 @@
         "safe-buffer": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
+          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+          "dev": true
         },
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
@@ -14007,7 +13978,8 @@
     "oauth-sign": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "dev": true
     },
     "object-assign": {
       "version": "4.1.1",
@@ -14095,6 +14067,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
       "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
+      "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.0-next.1"
@@ -14104,6 +14077,7 @@
           "version": "1.17.4",
           "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
           "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
+          "dev": true,
           "requires": {
             "es-to-primitive": "^1.2.1",
             "function-bind": "^1.1.1",
@@ -14122,6 +14096,7 @@
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
           "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+          "dev": true,
           "requires": {
             "is-callable": "^1.1.4",
             "is-date-object": "^1.0.1",
@@ -14131,17 +14106,20 @@
         "has-symbols": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-          "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
+          "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+          "dev": true
         },
         "is-callable": {
           "version": "1.1.5",
           "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
-          "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q=="
+          "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+          "dev": true
         },
         "is-regex": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
           "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+          "dev": true,
           "requires": {
             "has-symbols": "^1.0.1"
           }
@@ -14149,12 +14127,14 @@
         "object-inspect": {
           "version": "1.7.0",
           "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
-          "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
+          "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+          "dev": true
         },
         "object-keys": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+          "dev": true
         }
       }
     },
@@ -14290,6 +14270,7 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz",
       "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==",
+      "dev": true,
       "requires": {
         "is-docker": "^2.0.0",
         "is-wsl": "^2.1.1"
@@ -14298,7 +14279,8 @@
         "is-wsl": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz",
-          "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog=="
+          "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==",
+          "dev": true
         }
       }
     },
@@ -14335,6 +14317,7 @@
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz",
       "integrity": "sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==",
+      "dev": true,
       "requires": {
         "chalk": "^3.0.0",
         "cli-cursor": "^3.1.0",
@@ -14349,7 +14332,8 @@
         "ansi-regex": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
         },
         "ansi-styles": {
           "version": "4.2.1",
@@ -14375,6 +14359,7 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
           "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+          "dev": true,
           "requires": {
             "restore-cursor": "^3.1.0"
           }
@@ -14404,6 +14389,7 @@
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
           "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+          "dev": true,
           "requires": {
             "mimic-fn": "^2.1.0"
           }
@@ -14412,6 +14398,7 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
           "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+          "dev": true,
           "requires": {
             "onetime": "^5.1.0",
             "signal-exit": "^3.0.2"
@@ -14421,6 +14408,7 @@
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
           "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
           "requires": {
             "ansi-regex": "^5.0.0"
           }
@@ -14565,6 +14553,7 @@
       "version": "9.5.8",
       "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.8.tgz",
       "integrity": "sha512-0Tl8Oi/K0Lo4MZmH0/6IsT3gpGf9eEAznLXEQPKgPq7FscnbUOyopnVpwXlnQdIbCUaojWy1Wd7VMyqfVsRrIw==",
+      "dev": true,
       "requires": {
         "bluebird": "^3.5.3",
         "cacache": "^12.0.2",
@@ -14602,6 +14591,7 @@
           "version": "12.0.3",
           "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
           "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
+          "dev": true,
           "requires": {
             "bluebird": "^3.5.5",
             "chownr": "^1.1.1",
@@ -14624,6 +14614,7 @@
               "version": "7.1.6",
               "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
               "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+              "dev": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -14654,6 +14645,7 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
           "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
           "requires": {
             "pump": "^3.0.0"
           }
@@ -14662,6 +14654,7 @@
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
           "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
           "requires": {
             "yallist": "^3.0.2"
           }
@@ -14670,6 +14663,7 @@
           "version": "2.9.0",
           "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
           "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "dev": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
@@ -14698,12 +14692,14 @@
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
         },
         "ssri": {
           "version": "6.0.1",
           "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
           "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
           "requires": {
             "figgy-pudding": "^3.5.1"
           }
@@ -14726,7 +14722,8 @@
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
@@ -14739,6 +14736,7 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
       "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+      "dev": true,
       "requires": {
         "cyclist": "^1.0.1",
         "inherits": "^2.0.3",
@@ -14946,7 +14944,8 @@
     "performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+      "dev": true
     },
     "picomatch": {
       "version": "2.0.7",
@@ -15818,12 +15817,14 @@
     "promise-inflight": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "dev": true
     },
     "promise-retry": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz",
       "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=",
+      "dev": true,
       "requires": {
         "err-code": "^1.0.0",
         "retry": "^0.10.0"
@@ -15832,7 +15833,8 @@
         "retry": {
           "version": "0.10.1",
           "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
-          "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q="
+          "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
+          "dev": true
         }
       }
     },
@@ -15864,6 +15866,7 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz",
       "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==",
+      "dev": true,
       "requires": {
         "genfun": "^5.0.0"
       }
@@ -16018,7 +16021,8 @@
     "psl": {
       "version": "1.1.31",
       "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
-      "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw=="
+      "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
+      "dev": true
     },
     "public-encrypt": {
       "version": "4.0.3",
@@ -16077,7 +16081,8 @@
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
     },
     "pupa": {
       "version": "2.0.1",
@@ -16312,6 +16317,7 @@
       "version": "2.0.13",
       "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz",
       "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==",
+      "dev": true,
       "requires": {
         "glob": "^7.1.1",
         "graceful-fs": "^4.1.2",
@@ -16324,6 +16330,7 @@
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz",
       "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==",
+      "dev": true,
       "requires": {
         "read-package-json": "^2.0.0",
         "readdir-scoped-modules": "^1.0.0",
@@ -16349,6 +16356,7 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz",
       "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==",
+      "dev": true,
       "requires": {
         "debuglog": "^1.0.1",
         "dezalgo": "^1.0.0",
@@ -16492,6 +16500,7 @@
       "version": "2.88.0",
       "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
       "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+      "dev": true,
       "requires": {
         "aws-sign2": "~0.7.0",
         "aws4": "^1.8.0",
@@ -16743,6 +16752,7 @@
       "version": "2.7.1",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
       "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "dev": true,
       "requires": {
         "glob": "^7.1.3"
       }
@@ -16808,6 +16818,7 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
       "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+      "dev": true,
       "requires": {
         "is-promise": "^2.1.0"
       }
@@ -16816,6 +16827,7 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
       "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "dev": true,
       "requires": {
         "aproba": "^1.1.1"
       }
@@ -16840,11 +16852,6 @@
         }
       }
     },
-    "rxjs-compat": {
-      "version": "6.5.4",
-      "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.5.4.tgz",
-      "integrity": "sha512-rkn+lbOHUQOurdd74J/hjmDsG9nFx0z66fvnbs8M95nrtKvNqCKdk7iZqdY51CGmDemTQk+kUPy4s8HVOHtkfA=="
-    },
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -17064,6 +17071,7 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz",
       "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==",
+      "dev": true,
       "requires": {
         "semver": "^5.0.0"
       }
@@ -17309,12 +17317,14 @@
     "slash": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
     },
     "smart-buffer": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz",
-      "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw=="
+      "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==",
+      "dev": true
     },
     "snapdragon": {
       "version": "0.8.2",
@@ -17617,6 +17627,7 @@
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz",
       "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==",
+      "dev": true,
       "requires": {
         "ip": "1.1.5",
         "smart-buffer": "^4.1.0"
@@ -17626,6 +17637,7 @@
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz",
       "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==",
+      "dev": true,
       "requires": {
         "agent-base": "~4.2.1",
         "socks": "~2.3.2"
@@ -17635,6 +17647,7 @@
           "version": "4.2.1",
           "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
           "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
+          "dev": true,
           "requires": {
             "es6-promisify": "^5.0.0"
           }
@@ -17659,7 +17672,8 @@
     "source-map": {
       "version": "0.7.3",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+      "dev": true
     },
     "source-map-loader": {
       "version": "1.0.0",
@@ -17883,6 +17897,7 @@
       "version": "1.16.1",
       "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
       "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+      "dev": true,
       "requires": {
         "asn1": "~0.2.3",
         "assert-plus": "^1.0.0",
@@ -18036,6 +18051,7 @@
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
       "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "dev": true,
       "requires": {
         "end-of-stream": "^1.1.0",
         "stream-shift": "^1.0.0"
@@ -18170,6 +18186,7 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
       "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
+      "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5"
@@ -18244,6 +18261,7 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
       "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+      "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5"
@@ -18583,7 +18601,8 @@
     "symbol-observable": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
-      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
+      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
+      "dev": true
     },
     "systeminformation": {
       "version": "4.27.1",
@@ -18601,6 +18620,7 @@
       "version": "4.4.13",
       "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
       "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
+      "dev": true,
       "requires": {
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
@@ -18614,6 +18634,7 @@
           "version": "1.2.7",
           "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
           "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+          "dev": true,
           "requires": {
             "minipass": "^2.6.0"
           }
@@ -18622,6 +18643,7 @@
           "version": "2.9.0",
           "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
           "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "dev": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
@@ -18630,7 +18652,8 @@
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
@@ -18802,6 +18825,7 @@
       "version": "0.0.33",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
       "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
       "requires": {
         "os-tmpdir": "~1.0.2"
       }
@@ -18881,6 +18905,7 @@
       "version": "2.4.3",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
       "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+      "dev": true,
       "requires": {
         "psl": "^1.1.24",
         "punycode": "^1.4.1"
@@ -18889,7 +18914,8 @@
         "punycode": {
           "version": "1.4.1",
           "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
         }
       }
     },
@@ -19088,6 +19114,7 @@
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
       "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dev": true,
       "requires": {
         "safe-buffer": "^5.0.1"
       }
@@ -19095,7 +19122,8 @@
     "tweetnacl": {
       "version": "0.14.5",
       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true
     },
     "type": {
       "version": "1.2.0",
@@ -19306,6 +19334,7 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
       "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "dev": true,
       "requires": {
         "unique-slug": "^2.0.0"
       }
@@ -19314,6 +19343,7 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
       "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "dev": true,
       "requires": {
         "imurmurhash": "^0.1.4"
       }
@@ -19331,6 +19361,7 @@
       "version": "0.4.20",
       "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz",
       "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==",
+      "dev": true,
       "requires": {
         "debug": "^3.0.0",
         "request": "^2.88.0",
@@ -19341,6 +19372,7 @@
           "version": "3.2.6",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
           "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
           "requires": {
             "ms": "^2.1.1"
           }
@@ -19348,7 +19380,8 @@
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
         }
       }
     },
@@ -19609,6 +19642,7 @@
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
       "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+      "dev": true,
       "requires": {
         "punycode": "^2.1.0"
       }
@@ -19703,6 +19737,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz",
       "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=",
+      "dev": true,
       "requires": {
         "object.getownpropertydescriptors": "^2.0.3"
       }
@@ -19793,7 +19828,8 @@
     "uuid": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+      "dev": true
     },
     "valid-identifier": {
       "version": "0.0.2",
@@ -19815,6 +19851,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
       "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+      "dev": true,
       "requires": {
         "builtins": "^1.0.3"
       }
@@ -19835,6 +19872,7 @@
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
       "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
       "requires": {
         "assert-plus": "^1.0.0",
         "core-util-is": "1.0.2",
@@ -20067,6 +20105,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
       "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+      "dev": true,
       "requires": {
         "defaults": "^1.0.3"
       }
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 3ed2239b9..d7fa9db45 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -29,7 +29,7 @@ import { MaterialFileInputModule } from "ngx-material-file-input";
 import { DragDropModule } from "@angular/cdk/drag-drop";
 
 import { TableModule } from "primeng/table";
-/* import { KonamiModule } from "ngx-konami"; */
+import { KonamiModule } from "ngx-konami";
 import { MarkdownModule, MarkedOptions } from "ngx-markdown";
 
 import { FlexLayoutModule } from "@angular/flex-layout";
-- 
GitLab


From f56358cb809d1d646297b7ffdbbe7ea0101cb5c9 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 5 Mar 2020 11:05:50 +0100
Subject: [PATCH 04/92] Convert info to warning

---
 src/locale/messages.en.json | 1 -
 src/locale/messages.fr.json | 1 -
 2 files changed, 2 deletions(-)

diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 09990d2e0..8f48e654c 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -602,7 +602,6 @@
     "INFO_EXAMPLE_LABEL_WEIR_JET_LENGTH": "Weir jet length",
     "INFO_EXAMPLES_TITLE": "Examples",
     "INFO_EXAMPLES_SUBTITLE": "Load standard examples",
-    "INFO_PAR_P_WAS_IGNORED": "Given P value was ignored",
     "INFO_YAXB_TITRE": "Linear function",
     "INFO_YAXB_DESCRIPTION": "addition plus subtraction minus multiplication division",
     "INFO_YAXB_TITRE_COURT": "Linear f.",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 83f65a9ec..6ce751141 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -603,7 +603,6 @@
     "INFO_EXAMPLE_LABEL_WEIR_JET_LENGTH": "Longueur de jet d'un déversoir",
     "INFO_EXAMPLES_TITLE": "Exemples",
     "INFO_EXAMPLES_SUBTITLE": "Charger des exemples types",
-    "INFO_PAR_P_WAS_IGNORED": "La valeur de P fournie a été ignorée",
     "INFO_YAXB_TITRE": "Fonction affine",
     "INFO_YAXB_DESCRIPTION": "addition plus soustraction moins multiplication division",
     "INFO_YAXB_TITRE_COURT": "F. affine",
-- 
GitLab


From 45849f79c2af70091a7f53665b183c1e9475f997 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Tue, 17 Mar 2020 17:46:30 +0100
Subject: [PATCH 05/92] PAR : simulation

---
 src/app/formulaire/definition/form-fixedvar.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/app/formulaire/definition/form-fixedvar.ts b/src/app/formulaire/definition/form-fixedvar.ts
index 87b008f0c..c9fb9ddbc 100644
--- a/src/app/formulaire/definition/form-fixedvar.ts
+++ b/src/app/formulaire/definition/form-fixedvar.ts
@@ -114,6 +114,7 @@ export class FormulaireFixedVar extends FormulaireDefinition {
         this.runNubCalc(this.currentNub);
         this.refreshFieldsets(); // important: before reaffectResultComponents() or it will break results components localization
         this.reaffectResultComponents();
+        this.refreshFieldsets();
     }
 
     protected reaffectResultComponents() {
-- 
GitLab


From 1715fd7f03b27647746bf056495e6044dc4bebb9 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 19 Mar 2020 09:42:29 +0100
Subject: [PATCH 06/92] Update package-lock

---
 package-lock.json | 1691 ++++++++++++++++++++++++++++++++++++---------
 1 file changed, 1349 insertions(+), 342 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index eba56ad88..5bb80ae67 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -131,12 +131,43 @@
             "uri-js": "^4.2.2"
           }
         },
-        "core-js": {
-          "version": "3.6.4",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
-          "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==",
+        "browserslist": {
+          "version": "4.9.1",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz",
+          "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30001030",
+            "electron-to-chromium": "^1.3.363",
+            "node-releases": "^1.1.50"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001035",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz",
+          "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==",
           "dev": true
         },
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+          "dev": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.3",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "normalize-path": "^3.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.2.1",
+            "upath": "^1.1.1"
+          }
+        },
         "fast-deep-equal": {
           "version": "3.1.3",
           "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -275,6 +306,16 @@
         "source-map": "0.7.3"
       },
       "dependencies": {
+        "@babel/highlight": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
         "ajv": {
           "version": "6.12.3",
           "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
@@ -404,6 +445,16 @@
         "uuid": "8.1.0"
       },
       "dependencies": {
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
         "ansi-colors": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
@@ -472,6 +523,101 @@
         "yargs": "15.3.0"
       },
       "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "requires": {
+            "@babel/highlight": "^7.8.3"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.7.tgz",
+          "integrity": "sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew==",
+          "requires": {
+            "@babel/types": "^7.8.7",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.8.3",
+            "@babel/template": "^7.8.3",
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.7.tgz",
+          "integrity": "sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A=="
+        },
+        "@babel/template": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
+          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/generator": "^7.8.6",
+            "@babel/helper-function-name": "^7.8.3",
+            "@babel/helper-split-export-declaration": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
         "ansi-regex": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
@@ -508,10 +654,24 @@
             "color-name": "~1.1.4"
           }
         },
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
           "dev": true,
           "requires": {
             "locate-path": "^5.0.0",
@@ -559,10 +719,27 @@
             "p-limit": "^2.2.0"
           }
         },
-        "path-exists": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "normalize-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
           "dev": true
         },
         "require-main-filename": {
@@ -1260,143 +1437,946 @@
           "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.4"
+            "@babel/highlight": "^7.10.4"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "chalk": "^2.0.0",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+      "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.10.4"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "chalk": "^2.0.0",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.11.4",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz",
+      "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA=="
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
+      "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.10.4",
+        "@babel/plugin-syntax-async-generators": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-dynamic-import": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
+      "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-json-strings": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
+      "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-json-strings": "^7.8.0"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
+      "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+      "requires": {
+        "@babel/types": "^7.8.3"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
+      "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.8.3"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.8.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz",
+      "integrity": "sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.8.3",
+        "@babel/helper-replace-supers": "^7.8.6",
+        "@babel/helper-simple-access": "^7.8.3",
+        "@babel/helper-split-export-declaration": "^7.8.3",
+        "@babel/template": "^7.8.6",
+        "@babel/types": "^7.8.6",
+        "lodash": "^4.17.13"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.8.3"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
+          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6"
+          }
+        },
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
+      "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+      "requires": {
+        "@babel/types": "^7.8.3"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
+      "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==",
+      "dev": true
+    },
+    "@babel/helper-regex": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz",
+      "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.13"
+      }
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz",
+      "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.8.3",
+        "@babel/helper-wrap-function": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.8.3"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
+          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.7",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.8.3",
+            "@babel/template": "^7.8.3",
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
+          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
+          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/generator": "^7.8.6",
+            "@babel/helper-function-name": "^7.8.3",
+            "@babel/helper-split-export-declaration": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.8.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
+      "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.8.3",
+        "@babel/helper-optimise-call-expression": "^7.8.3",
+        "@babel/traverse": "^7.8.6",
+        "@babel/types": "^7.8.6"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "requires": {
+            "@babel/highlight": "^7.8.3"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
+          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.7",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.8.3",
+            "@babel/template": "^7.8.3",
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
+          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
+          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/generator": "^7.8.6",
+            "@babel/helper-function-name": "^7.8.3",
+            "@babel/helper-split-export-declaration": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
+      "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
+      "requires": {
+        "@babel/template": "^7.8.3",
+        "@babel/types": "^7.8.3"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "requires": {
+            "@babel/highlight": "^7.8.3"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
+          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6"
+          }
+        },
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
+      "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.4.4"
+      }
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
+      "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.8.3"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
+          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.7",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.8.3",
+            "@babel/template": "^7.8.3",
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
             "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
             "js-tokens": "^4.0.0"
           }
         },
+        "@babel/parser": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
+          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
+          "dev": true
+        },
         "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
+            "@babel/code-frame": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
+          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/generator": "^7.8.6",
+            "@babel/helper-function-name": "^7.8.3",
+            "@babel/helper-split-export-declaration": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
           }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
         }
       }
     },
     "@babel/helpers": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
-      "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz",
+      "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.10.4",
-        "@babel/types": "^7.10.4"
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.8.4",
+        "@babel/types": "^7.8.3"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.4"
+            "@babel/highlight": "^7.8.3"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
+          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.7",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.8.3",
+            "@babel/template": "^7.8.3",
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
             "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
             "js-tokens": "^4.0.0"
           }
         },
+        "@babel/parser": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
+          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
+          "dev": true
+        },
         "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
+            "@babel/code-frame": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
+          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/generator": "^7.8.6",
+            "@babel/helper-function-name": "^7.8.3",
+            "@babel/helper-split-export-declaration": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
           }
+        },
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
         }
       }
     },
     "@babel/highlight": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
+      "dev": true,
       "requires": {
-        "@babel/helper-validator-identifier": "^7.10.4",
         "chalk": "^2.0.0",
+        "esutils": "^2.0.2",
         "js-tokens": "^4.0.0"
+      },
+      "dependencies": {
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        }
       }
     },
     "@babel/parser": {
-      "version": "7.11.4",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz",
-      "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA=="
+      "version": "7.5.5",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz",
+      "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==",
+      "dev": true
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.10.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
-      "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz",
+      "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-remap-async-to-generator": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-remap-async-to-generator": "^7.8.3",
         "@babel/plugin-syntax-async-generators": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
-      "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.8.3",
         "@babel/plugin-syntax-dynamic-import": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-json-strings": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
-      "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz",
+      "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.8.3",
         "@babel/plugin-syntax-json-strings": "^7.8.0"
       }
     },
-    "@babel/plugin-proposal-nullish-coalescing-operator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
-      "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
-      }
-    },
-    "@babel/plugin-proposal-numeric-separator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
-      "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
-      }
-    },
     "@babel/plugin-proposal-object-rest-spread": {
       "version": "7.11.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz",
@@ -1572,6 +2552,100 @@
         "@babel/helper-replace-supers": "^7.10.4",
         "@babel/helper-split-export-declaration": "^7.10.4",
         "globals": "^11.1.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.8.3"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.8.3",
+            "@babel/template": "^7.8.3",
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
+          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6"
+          }
+        },
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+        },
+        "minimist": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.4.tgz",
+          "integrity": "sha512-wTiNDqe4D2rbTJGZk1qcdZgFtY0/r+iuE6GDT7V0/+Gu5MLpIDm4+CssDECR79OJs/OxLPXMzdxy153b5Qy3hg=="
+        },
+        "normalize-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+        }
       }
     },
     "@babel/plugin-transform-computed-properties": {
@@ -3395,7 +4469,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
       "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-      "dev": true,
       "requires": {
         "micromatch": "^3.1.4",
         "normalize-path": "^2.1.1"
@@ -3546,20 +4619,17 @@
     "arr-diff": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
     },
     "arr-flatten": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
     },
     "arr-union": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
     },
     "array-differ": {
       "version": "1.0.0",
@@ -3603,8 +4673,7 @@
     "array-unique": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
     },
     "arraybuffer.slice": {
       "version": "0.0.7",
@@ -3671,8 +4740,7 @@
     "assign-symbols": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
     },
     "ast-transform": {
       "version": "0.0.0",
@@ -3751,8 +4819,7 @@
     "async-each": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
-      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
-      "dev": true
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
     },
     "async-exit-hook": {
       "version": "2.0.1",
@@ -3780,8 +4847,7 @@
     "atob": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
     },
     "autoprefixer": {
       "version": "9.8.0",
@@ -3952,7 +5018,6 @@
       "version": "0.11.2",
       "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
       "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
       "requires": {
         "cache-base": "^1.0.1",
         "class-utils": "^0.3.5",
@@ -3967,7 +5032,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^1.0.0"
           }
@@ -3976,7 +5040,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -3985,7 +5048,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -3994,7 +5056,6 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -4073,8 +5134,7 @@
     "binary-extensions": {
       "version": "1.13.0",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz",
-      "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==",
-      "dev": true
+      "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw=="
     },
     "blob": {
       "version": "0.0.5",
@@ -4326,7 +5386,6 @@
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
       "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
       "requires": {
         "arr-flatten": "^1.1.0",
         "array-unique": "^0.3.2",
@@ -4344,7 +5403,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -4798,7 +5856,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
       "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
       "requires": {
         "collection-visit": "^1.0.0",
         "component-emitter": "^1.2.1",
@@ -5210,7 +6267,6 @@
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
       "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
       "requires": {
         "arr-union": "^3.1.0",
         "define-property": "^0.2.5",
@@ -5222,7 +6278,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -5439,7 +6494,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
       "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
       "requires": {
         "map-visit": "^1.0.0",
         "object-visit": "^1.0.0"
@@ -5533,8 +6587,7 @@
     "component-emitter": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
-      "dev": true
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
     },
     "component-inherit": {
       "version": "0.0.3",
@@ -5781,8 +6834,7 @@
     "copy-descriptor": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
     },
     "copy-webpack-plugin": {
       "version": "6.0.3",
@@ -6827,8 +7879,7 @@
     "core-util-is": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
     },
     "cors": {
       "version": "2.8.5",
@@ -7595,7 +8646,6 @@
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
       "requires": {
         "ms": "2.0.0"
       }
@@ -7624,8 +8674,7 @@
     "decode-uri-component": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
     },
     "decompress-response": {
       "version": "3.3.0",
@@ -7705,7 +8754,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
       "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
       "requires": {
         "is-descriptor": "^1.0.2",
         "isobject": "^3.0.1"
@@ -7715,7 +8763,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -7724,7 +8771,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -7733,7 +8779,6 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -8686,6 +9731,11 @@
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
     },
+    "escaper": {
+      "version": "2.5.3",
+      "resolved": "https://registry.npmjs.org/escaper/-/escaper-2.5.3.tgz",
+      "integrity": "sha512-QGb9sFxBVpbzMggrKTX0ry1oiI4CSDAl9vIL702hzl1jGW8VZs7qfqTRX7WDOjoNDoEVGcEtu1ZOQgReSfT2kQ=="
+    },
     "escodegen": {
       "version": "1.9.1",
       "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
@@ -8753,8 +9803,7 @@
     "esutils": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-      "dev": true
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
     },
     "etag": {
       "version": "1.8.1",
@@ -8859,7 +9908,6 @@
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
       "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
       "requires": {
         "debug": "^2.3.3",
         "define-property": "^0.2.5",
@@ -8874,7 +9922,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -8883,7 +9930,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -9098,7 +10144,6 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
       "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
       "requires": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -9108,7 +10153,6 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
           "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
           "requires": {
             "is-plain-object": "^2.0.4"
           }
@@ -9130,7 +10174,6 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
       "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
       "requires": {
         "array-unique": "^0.3.2",
         "define-property": "^1.0.0",
@@ -9146,7 +10189,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^1.0.0"
           }
@@ -9155,7 +10197,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -9164,7 +10205,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -9173,7 +10213,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -9182,7 +10221,6 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -9250,8 +10288,7 @@
     "fast-deep-equal": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-      "dev": true
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
     },
     "fast-glob": {
       "version": "2.2.7",
@@ -9275,8 +10312,7 @@
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "dev": true
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
     },
     "fast-levenshtein": {
       "version": "2.0.6",
@@ -9359,7 +10395,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
       "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
       "requires": {
         "extend-shallow": "^2.0.1",
         "is-number": "^3.0.0",
@@ -9371,7 +10406,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -9604,8 +10638,7 @@
     "for-in": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
     },
     "foreach": {
       "version": "2.0.5",
@@ -9645,7 +10678,6 @@
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
       "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
       "requires": {
         "map-cache": "^0.2.2"
       }
@@ -9734,7 +10766,6 @@
       "version": "1.2.7",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz",
       "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==",
-      "dev": true,
       "optional": true,
       "requires": {
         "nan": "^2.9.2",
@@ -9744,25 +10775,21 @@
         "abbrev": {
           "version": "1.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "ansi-regex": {
           "version": "2.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "aproba": {
           "version": "1.2.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "are-we-there-yet": {
           "version": "1.1.5",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "delegates": "^1.0.0",
@@ -9772,13 +10799,11 @@
         "balanced-match": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
@@ -9788,37 +10813,31 @@
         "chownr": {
           "version": "1.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "code-point-at": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "concat-map": {
           "version": "0.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "console-control-strings": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "core-util-is": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "debug": {
           "version": "2.6.9",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "ms": "2.0.0"
@@ -9827,25 +10846,21 @@
         "deep-extend": {
           "version": "0.6.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "delegates": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "detect-libc": {
           "version": "1.0.3",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "fs-minipass": {
           "version": "1.2.5",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "minipass": "^2.2.1"
@@ -9854,13 +10869,11 @@
         "fs.realpath": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "gauge": {
           "version": "2.7.4",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "aproba": "^1.0.3",
@@ -9876,7 +10889,6 @@
         "glob": {
           "version": "7.1.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -9890,13 +10902,11 @@
         "has-unicode": {
           "version": "2.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "iconv-lite": {
           "version": "0.4.24",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "safer-buffer": ">= 2.1.2 < 3"
@@ -9905,7 +10915,6 @@
         "ignore-walk": {
           "version": "3.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "minimatch": "^3.0.4"
@@ -9914,7 +10923,6 @@
         "inflight": {
           "version": "1.0.6",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "once": "^1.3.0",
@@ -9924,19 +10932,16 @@
         "inherits": {
           "version": "2.0.3",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "ini": {
           "version": "1.3.5",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
@@ -9945,13 +10950,11 @@
         "isarray": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "minimatch": {
           "version": "3.0.4",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
@@ -9960,13 +10963,11 @@
         "minimist": {
           "version": "0.0.8",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "minipass": {
           "version": "2.3.5",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "safe-buffer": "^5.1.2",
@@ -9976,7 +10977,6 @@
         "minizlib": {
           "version": "1.2.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "minipass": "^2.2.1"
@@ -9985,7 +10985,6 @@
         "mkdirp": {
           "version": "0.5.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "minimist": "0.0.8"
@@ -9994,13 +10993,11 @@
         "ms": {
           "version": "2.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "needle": {
           "version": "2.2.4",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "debug": "^2.1.2",
@@ -10011,7 +11008,6 @@
         "node-pre-gyp": {
           "version": "0.10.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "detect-libc": "^1.0.2",
@@ -10029,7 +11025,6 @@
         "nopt": {
           "version": "4.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "abbrev": "1",
@@ -10039,13 +11034,11 @@
         "npm-bundled": {
           "version": "1.0.5",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "npm-packlist": {
           "version": "1.2.0",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "ignore-walk": "^3.0.1",
@@ -10055,7 +11048,6 @@
         "npmlog": {
           "version": "4.1.2",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "are-we-there-yet": "~1.1.2",
@@ -10067,19 +11059,16 @@
         "number-is-nan": {
           "version": "1.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "object-assign": {
           "version": "4.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "once": {
           "version": "1.4.0",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "wrappy": "1"
@@ -10088,19 +11077,16 @@
         "os-homedir": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "os-tmpdir": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "osenv": {
           "version": "0.1.5",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "os-homedir": "^1.0.0",
@@ -10110,19 +11096,16 @@
         "path-is-absolute": {
           "version": "1.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "process-nextick-args": {
           "version": "2.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "rc": {
           "version": "1.2.8",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "deep-extend": "^0.6.0",
@@ -10134,7 +11117,6 @@
             "minimist": {
               "version": "1.2.0",
               "bundled": true,
-              "dev": true,
               "optional": true
             }
           }
@@ -10142,7 +11124,6 @@
         "readable-stream": {
           "version": "2.3.6",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "core-util-is": "~1.0.0",
@@ -10157,7 +11138,6 @@
         "rimraf": {
           "version": "2.6.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "glob": "^7.1.3"
@@ -10166,43 +11146,36 @@
         "safe-buffer": {
           "version": "5.1.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "safer-buffer": {
           "version": "2.1.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "sax": {
           "version": "1.2.4",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "semver": {
           "version": "5.6.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "set-blocking": {
           "version": "2.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "signal-exit": {
           "version": "3.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "string-width": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
@@ -10213,7 +11186,6 @@
         "string_decoder": {
           "version": "1.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "safe-buffer": "~5.1.0"
@@ -10222,7 +11194,6 @@
         "strip-ansi": {
           "version": "3.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
@@ -10231,13 +11202,11 @@
         "strip-json-comments": {
           "version": "2.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "tar": {
           "version": "4.4.8",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "chownr": "^1.1.1",
@@ -10252,13 +11221,11 @@
         "util-deprecate": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "wide-align": {
           "version": "1.1.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "string-width": "^1.0.2 || 2"
@@ -10267,13 +11234,11 @@
         "wrappy": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "yallist": {
           "version": "3.0.3",
           "bundled": true,
-          "dev": true,
           "optional": true
         }
       }
@@ -10318,8 +11283,7 @@
     "get-value": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
     },
     "getpass": {
       "version": "0.1.7",
@@ -10348,7 +11312,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
       "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
       "requires": {
         "is-glob": "^3.1.0",
         "path-dirname": "^1.0.0"
@@ -10358,7 +11321,6 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
           "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
           "requires": {
             "is-extglob": "^2.1.0"
           }
@@ -10729,7 +11691,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
       "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
       "requires": {
         "get-value": "^2.0.6",
         "has-values": "^1.0.0",
@@ -10740,7 +11701,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
       "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
       "requires": {
         "is-number": "^3.0.0",
         "kind-of": "^4.0.0"
@@ -10750,7 +11710,6 @@
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
           "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -11415,7 +12374,6 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
       "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -11424,7 +12382,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -11441,7 +12398,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
       "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-      "dev": true,
       "requires": {
         "binary-extensions": "^1.0.0"
       }
@@ -11449,8 +12405,7 @@
     "is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
     },
     "is-ci": {
       "version": "2.0.0",
@@ -11479,7 +12434,6 @@
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
       "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -11488,7 +12442,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -11505,7 +12458,6 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
       "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
       "requires": {
         "is-accessor-descriptor": "^0.1.6",
         "is-data-descriptor": "^0.1.4",
@@ -11515,8 +12467,7 @@
         "kind-of": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
         }
       }
     },
@@ -11535,8 +12486,7 @@
     "is-extendable": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
     },
     "is-extglob": {
       "version": "2.1.1",
@@ -11553,6 +12503,14 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
       "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-installed-globally": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+      "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
       "dev": true,
       "requires": {
         "is-extglob": "^2.1.1"
@@ -11580,7 +12538,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
       "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -11589,7 +12546,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -11636,7 +12592,6 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
       "requires": {
         "isobject": "^3.0.1"
       }
@@ -11723,8 +12678,7 @@
     "is-windows": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
     },
     "is-wsl": {
       "version": "1.1.0",
@@ -11741,8 +12695,7 @@
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
     },
     "isbinaryfile": {
       "version": "4.0.4",
@@ -11758,8 +12711,7 @@
     "isobject": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
     },
     "isstream": {
       "version": "0.1.2",
@@ -11859,6 +12811,136 @@
         "semver": "^6.3.0"
       },
       "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.8.3"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
+          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.7",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.8.3",
+            "@babel/template": "^7.8.3",
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.8.3"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.8.8",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
+          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.8.6",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
+          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/generator": "^7.8.6",
+            "@babel/helper-function-name": "^7.8.3",
+            "@babel/helper-split-export-declaration": "^7.8.3",
+            "@babel/parser": "^7.8.6",
+            "@babel/types": "^7.8.6",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.8.7",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "convert-source-map": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+          "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "~5.1.1"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -12130,8 +13212,7 @@
     "json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
     },
     "json-stringify-safe": {
       "version": "5.0.1",
@@ -13004,8 +14085,7 @@
     "map-cache": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
     },
     "map-stream": {
       "version": "0.1.0",
@@ -13017,7 +14097,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
       "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
       "requires": {
         "object-visit": "^1.0.0"
       }
@@ -13159,7 +14238,6 @@
       "version": "3.1.10",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
       "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
       "requires": {
         "arr-diff": "^4.0.0",
         "array-unique": "^0.3.2",
@@ -13432,7 +14510,6 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
       "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
       "requires": {
         "for-in": "^1.0.2",
         "is-extendable": "^1.0.1"
@@ -13442,7 +14519,6 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
           "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
           "requires": {
             "is-plain-object": "^2.0.4"
           }
@@ -13528,8 +14604,7 @@
     "ms": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
     },
     "multicast-dns": {
       "version": "6.2.3",
@@ -13566,17 +14641,15 @@
       "dev": true
     },
     "nan": {
-      "version": "2.14.0",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
-      "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
-      "dev": true,
+      "version": "2.12.1",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
+      "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==",
       "optional": true
     },
     "nanomatch": {
       "version": "1.2.13",
       "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
       "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
       "requires": {
         "arr-diff": "^4.0.0",
         "array-unique": "^0.3.2",
@@ -13776,7 +14849,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
       "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "dev": true,
       "requires": {
         "remove-trailing-separator": "^1.0.1"
       }
@@ -13997,7 +15069,6 @@
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
       "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
       "requires": {
         "copy-descriptor": "^0.1.0",
         "define-property": "^0.2.5",
@@ -14008,7 +15079,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -14017,7 +15087,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -14046,7 +15115,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
       "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
       "requires": {
         "isobject": "^3.0.0"
       }
@@ -14142,7 +15210,6 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
       "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
       "requires": {
         "isobject": "^3.0.1"
       }
@@ -14820,8 +15887,7 @@
     "pascalcase": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
     },
     "path-browserify": {
       "version": "0.0.1",
@@ -14832,8 +15898,7 @@
     "path-dirname": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
     },
     "path-exists": {
       "version": "3.0.0",
@@ -15093,8 +16158,7 @@
     "posix-character-classes": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
     },
     "postcss": {
       "version": "7.0.31",
@@ -15793,8 +16857,7 @@
     "private": {
       "version": "0.1.8",
       "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
-      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
-      "dev": true
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
     },
     "process": {
       "version": "0.11.10",
@@ -15805,8 +16868,7 @@
     "process-nextick-args": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
-      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
-      "dev": true
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
     },
     "progress": {
       "version": "2.0.3",
@@ -16081,17 +17143,7 @@
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
-    },
-    "pupa": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
-      "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
-      "dev": true,
-      "requires": {
-        "escape-goat": "^2.0.0"
-      }
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "q": {
       "version": "1.4.1",
@@ -16341,7 +17393,6 @@
       "version": "2.3.6",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
       "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-      "dev": true,
       "requires": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -16368,7 +17419,6 @@
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
       "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-      "dev": true,
       "requires": {
         "graceful-fs": "^4.1.11",
         "micromatch": "^3.1.10",
@@ -16384,8 +17434,7 @@
     "regenerate": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
-      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
-      "dev": true
+      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
     },
     "regenerate-unicode-properties": {
       "version": "8.2.0",
@@ -16415,7 +17464,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
       "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
       "requires": {
         "extend-shallow": "^3.0.2",
         "safe-regex": "^1.1.0"
@@ -16481,20 +17529,17 @@
     "remove-trailing-separator": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
     },
     "repeat-element": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-      "dev": true
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
     },
     "repeat-string": {
       "version": "1.6.1",
       "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-      "dev": true
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
     },
     "request": {
       "version": "2.88.0",
@@ -16569,8 +17614,7 @@
     "resolve-url": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "dev": true
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
     },
     "resolve-url-loader": {
       "version": "3.1.1",
@@ -16692,8 +17736,7 @@
     "ret": {
       "version": "0.1.15",
       "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
     },
     "retry": {
       "version": "0.12.0",
@@ -16855,14 +17898,12 @@
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
     },
     "safe-regex": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
       "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
       "requires": {
         "ret": "~0.1.10"
       }
@@ -17221,7 +18262,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
       "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-      "dev": true,
       "requires": {
         "extend-shallow": "^2.0.1",
         "is-extendable": "^0.1.1",
@@ -17233,7 +18273,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -17330,7 +18369,6 @@
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
       "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
       "requires": {
         "base": "^0.11.1",
         "debug": "^2.2.0",
@@ -17346,7 +18384,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -17355,7 +18392,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -17363,8 +18399,7 @@
         "source-map": {
           "version": "0.5.7",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
         }
       }
     },
@@ -17372,7 +18407,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
       "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
       "requires": {
         "define-property": "^1.0.0",
         "isobject": "^3.0.0",
@@ -17383,7 +18417,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^1.0.0"
           }
@@ -17392,7 +18425,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -17401,7 +18433,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -17410,7 +18441,6 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -17423,7 +18453,6 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
       "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
       "requires": {
         "kind-of": "^3.2.0"
       },
@@ -17432,7 +18461,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -17709,7 +18737,6 @@
       "version": "0.5.2",
       "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
       "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
-      "dev": true,
       "requires": {
         "atob": "^2.1.1",
         "decode-uri-component": "^0.2.0",
@@ -17739,8 +18766,7 @@
     "source-map-url": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "dev": true
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
     },
     "sourcemap-codec": {
       "version": "1.4.8",
@@ -17874,7 +18900,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
       "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
       "requires": {
         "extend-shallow": "^3.0.0"
       }
@@ -17972,7 +18997,6 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
       "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
       "requires": {
         "define-property": "^0.2.5",
         "object-copy": "^0.1.0"
@@ -17982,7 +19006,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -18336,7 +19359,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
       "requires": {
         "safe-buffer": "~5.1.0"
       }
@@ -18851,7 +19873,6 @@
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
       "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -18860,7 +19881,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -18877,7 +19897,6 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
       "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
       "requires": {
         "define-property": "^2.0.2",
         "extend-shallow": "^3.0.2",
@@ -18889,7 +19908,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
       "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
       "requires": {
         "is-number": "^3.0.0",
         "repeat-string": "^1.6.1"
@@ -19235,14 +20253,12 @@
     "unicode-canonical-property-names-ecmascript": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
-      "dev": true
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
     },
     "unicode-match-property-ecmascript": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
       "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
-      "dev": true,
       "requires": {
         "unicode-canonical-property-names-ecmascript": "^1.0.4",
         "unicode-property-aliases-ecmascript": "^1.0.4"
@@ -19310,7 +20326,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
       "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-      "dev": true,
       "requires": {
         "arr-union": "^3.1.0",
         "get-value": "^2.0.6",
@@ -19413,7 +20428,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
       "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
       "requires": {
         "has-value": "^0.3.1",
         "isobject": "^3.0.0"
@@ -19423,7 +20437,6 @@
           "version": "0.3.1",
           "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
           "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "dev": true,
           "requires": {
             "get-value": "^2.0.3",
             "has-values": "^0.1.4",
@@ -19434,7 +20447,6 @@
               "version": "2.1.0",
               "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
               "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "dev": true,
               "requires": {
                 "isarray": "1.0.0"
               }
@@ -19444,8 +20456,7 @@
         "has-values": {
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
         }
       }
     },
@@ -19642,7 +20653,6 @@
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
       "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-      "dev": true,
       "requires": {
         "punycode": "^2.1.0"
       }
@@ -19650,8 +20660,7 @@
     "urix": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
     },
     "url": {
       "version": "0.11.0",
@@ -19701,8 +20710,7 @@
     "use": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
     },
     "utf8-byte-length": {
       "version": "1.0.4",
@@ -19730,8 +20738,7 @@
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
     },
     "util-promisify": {
       "version": "2.1.0",
-- 
GitLab


From 5bfccd35bcba0140a504baf57e32d3bcdb6f0bde Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Fri, 20 Mar 2020 10:40:15 +0100
Subject: [PATCH 07/92] Update dependencies

---
 package-lock.json | 521 +++++++++++++++++++++++++---------------------
 1 file changed, 289 insertions(+), 232 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 5bb80ae67..3b3f1a16b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -131,23 +131,6 @@
             "uri-js": "^4.2.2"
           }
         },
-        "browserslist": {
-          "version": "4.9.1",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz",
-          "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==",
-          "dev": true,
-          "requires": {
-            "caniuse-lite": "^1.0.30001030",
-            "electron-to-chromium": "^1.3.363",
-            "node-releases": "^1.1.50"
-          }
-        },
-        "caniuse-lite": {
-          "version": "1.0.30001035",
-          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz",
-          "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==",
-          "dev": true
-        },
         "chokidar": {
           "version": "2.1.8",
           "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
@@ -306,16 +289,6 @@
         "source-map": "0.7.3"
       },
       "dependencies": {
-        "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
-          "requires": {
-            "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
-            "js-tokens": "^4.0.0"
-          }
-        },
         "ajv": {
           "version": "6.12.3",
           "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
@@ -445,16 +418,6 @@
         "uuid": "8.1.0"
       },
       "dependencies": {
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
         "ansi-colors": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
@@ -523,101 +486,6 @@
         "yargs": "15.3.0"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "requires": {
-            "@babel/highlight": "^7.8.3"
-          }
-        },
-        "@babel/generator": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.7.tgz",
-          "integrity": "sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew==",
-          "requires": {
-            "@babel/types": "^7.8.7",
-            "jsesc": "^2.5.1",
-            "lodash": "^4.17.13"
-          }
-        },
-        "@babel/helper-function-name": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
-          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
-          "requires": {
-            "@babel/helper-get-function-arity": "^7.8.3",
-            "@babel/template": "^7.8.3",
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-get-function-arity": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
-          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
-          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
-          "requires": {
-            "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "@babel/parser": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.7.tgz",
-          "integrity": "sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A=="
-        },
-        "@babel/template": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6"
-          }
-        },
-        "@babel/traverse": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
-          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/generator": "^7.8.6",
-            "@babel/helper-function-name": "^7.8.3",
-            "@babel/helper-split-export-declaration": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6",
-            "debug": "^4.1.0",
-            "globals": "^11.1.0",
-            "lodash": "^4.17.13"
-          }
-        },
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
         "ansi-regex": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
@@ -654,14 +522,6 @@
             "color-name": "~1.1.4"
           }
         },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
         "emoji-regex": {
           "version": "7.0.3",
           "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
@@ -731,11 +591,6 @@
           "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
           "dev": true
         },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        },
         "normalize-path": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -1558,6 +1413,7 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
       "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+      "dev": true,
       "requires": {
         "@babel/types": "^7.8.3"
       },
@@ -1566,6 +1422,7 @@
           "version": "7.8.7",
           "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
           "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
           "requires": {
             "esutils": "^2.0.2",
             "lodash": "^4.17.13",
@@ -1674,6 +1531,7 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
       "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+      "dev": true,
       "requires": {
         "@babel/types": "^7.8.3"
       },
@@ -1682,6 +1540,7 @@
           "version": "7.8.7",
           "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
           "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
           "requires": {
             "esutils": "^2.0.2",
             "lodash": "^4.17.13",
@@ -1851,6 +1710,7 @@
       "version": "7.8.6",
       "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
       "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
+      "dev": true,
       "requires": {
         "@babel/helper-member-expression-to-functions": "^7.8.3",
         "@babel/helper-optimise-call-expression": "^7.8.3",
@@ -1862,6 +1722,7 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
           "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "dev": true,
           "requires": {
             "@babel/highlight": "^7.8.3"
           }
@@ -1882,6 +1743,7 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
           "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+          "dev": true,
           "requires": {
             "@babel/helper-get-function-arity": "^7.8.3",
             "@babel/template": "^7.8.3",
@@ -1892,6 +1754,7 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
           "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+          "dev": true,
           "requires": {
             "@babel/types": "^7.8.3"
           }
@@ -1900,6 +1763,7 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
           "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "dev": true,
           "requires": {
             "@babel/types": "^7.8.3"
           }
@@ -1908,6 +1772,7 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
           "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "dev": true,
           "requires": {
             "chalk": "^2.0.0",
             "esutils": "^2.0.2",
@@ -1924,6 +1789,7 @@
           "version": "7.8.6",
           "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
           "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "dev": true,
           "requires": {
             "@babel/code-frame": "^7.8.3",
             "@babel/parser": "^7.8.6",
@@ -1934,6 +1800,7 @@
           "version": "7.8.6",
           "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
           "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
+          "dev": true,
           "requires": {
             "@babel/code-frame": "^7.8.3",
             "@babel/generator": "^7.8.6",
@@ -1950,6 +1817,7 @@
           "version": "7.8.7",
           "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
           "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
           "requires": {
             "esutils": "^2.0.2",
             "lodash": "^4.17.13",
@@ -1960,6 +1828,7 @@
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
           "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
           "requires": {
             "ms": "^2.1.1"
           }
@@ -1967,12 +1836,14 @@
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
         },
         "source-map": {
           "version": "0.5.7",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
         }
       }
     },
@@ -1980,6 +1851,7 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
       "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
+      "dev": true,
       "requires": {
         "@babel/template": "^7.8.3",
         "@babel/types": "^7.8.3"
@@ -1989,6 +1861,7 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
           "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+          "dev": true,
           "requires": {
             "@babel/highlight": "^7.8.3"
           }
@@ -1997,6 +1870,7 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
           "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "dev": true,
           "requires": {
             "chalk": "^2.0.0",
             "esutils": "^2.0.2",
@@ -2013,6 +1887,7 @@
           "version": "7.8.6",
           "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
           "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "dev": true,
           "requires": {
             "@babel/code-frame": "^7.8.3",
             "@babel/parser": "^7.8.6",
@@ -2023,6 +1898,7 @@
           "version": "7.8.7",
           "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
           "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "dev": true,
           "requires": {
             "esutils": "^2.0.2",
             "lodash": "^4.17.13",
@@ -2630,21 +2506,6 @@
             "lodash": "^4.17.13",
             "to-fast-properties": "^2.0.0"
           }
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
-        },
-        "minimist": {
-          "version": "1.2.4",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.4.tgz",
-          "integrity": "sha512-wTiNDqe4D2rbTJGZk1qcdZgFtY0/r+iuE6GDT7V0/+Gu5MLpIDm4+CssDECR79OJs/OxLPXMzdxy153b5Qy3hg=="
-        },
-        "normalize-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
         }
       }
     },
@@ -4440,6 +4301,7 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
       "requires": {
         "color-convert": "^1.9.0"
       },
@@ -4448,6 +4310,7 @@
           "version": "1.9.3",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
           "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+          "dev": true,
           "requires": {
             "color-name": "1.1.3"
           }
@@ -4455,7 +4318,8 @@
         "color-name": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+          "dev": true
         }
       }
     },
@@ -4469,6 +4333,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
       "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "dev": true,
       "requires": {
         "micromatch": "^3.1.4",
         "normalize-path": "^2.1.1"
@@ -4619,17 +4484,20 @@
     "arr-diff": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true
     },
     "arr-flatten": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
     },
     "arr-union": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
     },
     "array-differ": {
       "version": "1.0.0",
@@ -4673,7 +4541,8 @@
     "array-unique": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true
     },
     "arraybuffer.slice": {
       "version": "0.0.7",
@@ -4740,7 +4609,8 @@
     "assign-symbols": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
     },
     "ast-transform": {
       "version": "0.0.0",
@@ -4819,7 +4689,8 @@
     "async-each": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
-      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+      "dev": true
     },
     "async-exit-hook": {
       "version": "2.0.1",
@@ -4847,7 +4718,8 @@
     "atob": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true
     },
     "autoprefixer": {
       "version": "9.8.0",
@@ -5018,6 +4890,7 @@
       "version": "0.11.2",
       "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
       "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "dev": true,
       "requires": {
         "cache-base": "^1.0.1",
         "class-utils": "^0.3.5",
@@ -5032,6 +4905,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
           "requires": {
             "is-descriptor": "^1.0.0"
           }
@@ -5040,6 +4914,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -5048,6 +4923,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -5056,6 +4932,7 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -5134,7 +5011,8 @@
     "binary-extensions": {
       "version": "1.13.0",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz",
-      "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw=="
+      "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==",
+      "dev": true
     },
     "blob": {
       "version": "0.0.5",
@@ -5386,6 +5264,7 @@
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
       "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
       "requires": {
         "arr-flatten": "^1.1.0",
         "array-unique": "^0.3.2",
@@ -5403,6 +5282,7 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -5856,6 +5736,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
       "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "dev": true,
       "requires": {
         "collection-visit": "^1.0.0",
         "component-emitter": "^1.2.1",
@@ -6007,6 +5888,7 @@
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
       "requires": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -6017,6 +5899,7 @@
           "version": "5.5.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
           "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
           "requires": {
             "has-flag": "^3.0.0"
           }
@@ -6267,6 +6150,7 @@
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
       "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "dev": true,
       "requires": {
         "arr-union": "^3.1.0",
         "define-property": "^0.2.5",
@@ -6278,6 +6162,7 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -6494,6 +6379,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
       "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
       "requires": {
         "map-visit": "^1.0.0",
         "object-visit": "^1.0.0"
@@ -6587,7 +6473,8 @@
     "component-emitter": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+      "dev": true
     },
     "component-inherit": {
       "version": "0.0.3",
@@ -6834,7 +6721,8 @@
     "copy-descriptor": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
     },
     "copy-webpack-plugin": {
       "version": "6.0.3",
@@ -7879,7 +7767,8 @@
     "core-util-is": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
     },
     "cors": {
       "version": "2.8.5",
@@ -8646,6 +8535,7 @@
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
       "requires": {
         "ms": "2.0.0"
       }
@@ -8674,7 +8564,8 @@
     "decode-uri-component": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
     },
     "decompress-response": {
       "version": "3.3.0",
@@ -8754,6 +8645,7 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
       "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
       "requires": {
         "is-descriptor": "^1.0.2",
         "isobject": "^3.0.1"
@@ -8763,6 +8655,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -8771,6 +8664,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -8779,6 +8673,7 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -9729,7 +9624,8 @@
     "escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
     },
     "escaper": {
       "version": "2.5.3",
@@ -9803,7 +9699,8 @@
     "esutils": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "dev": true
     },
     "etag": {
       "version": "1.8.1",
@@ -9908,6 +9805,7 @@
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
       "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
       "requires": {
         "debug": "^2.3.3",
         "define-property": "^0.2.5",
@@ -9922,6 +9820,7 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -9930,6 +9829,7 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -10144,6 +10044,7 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
       "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
       "requires": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -10153,6 +10054,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
           "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
           "requires": {
             "is-plain-object": "^2.0.4"
           }
@@ -10174,6 +10076,7 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
       "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "dev": true,
       "requires": {
         "array-unique": "^0.3.2",
         "define-property": "^1.0.0",
@@ -10189,6 +10092,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
           "requires": {
             "is-descriptor": "^1.0.0"
           }
@@ -10197,6 +10101,7 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -10205,6 +10110,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -10213,6 +10119,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -10221,6 +10128,7 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -10249,12 +10157,10 @@
     },
     "falafel": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz",
-      "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=",
+      "resolved": "",
       "dev": true,
       "requires": {
         "acorn": "^5.0.0",
-        "foreach": "^2.0.5",
         "isarray": "0.0.1",
         "object-keys": "^1.0.6"
       },
@@ -10288,7 +10194,8 @@
     "fast-deep-equal": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "dev": true
     },
     "fast-glob": {
       "version": "2.2.7",
@@ -10312,7 +10219,8 @@
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "dev": true
     },
     "fast-levenshtein": {
       "version": "2.0.6",
@@ -10395,6 +10303,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
       "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "dev": true,
       "requires": {
         "extend-shallow": "^2.0.1",
         "is-number": "^3.0.0",
@@ -10406,6 +10315,7 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -10638,12 +10548,7 @@
     "for-in": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
-    },
-    "foreach": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
-      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
       "dev": true
     },
     "forever-agent": {
@@ -10678,6 +10583,7 @@
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
       "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
       "requires": {
         "map-cache": "^0.2.2"
       }
@@ -10766,6 +10672,7 @@
       "version": "1.2.7",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz",
       "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==",
+      "dev": true,
       "optional": true,
       "requires": {
         "nan": "^2.9.2",
@@ -10775,21 +10682,25 @@
         "abbrev": {
           "version": "1.1.1",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "ansi-regex": {
           "version": "2.1.1",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "aproba": {
           "version": "1.2.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "are-we-there-yet": {
           "version": "1.1.5",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "delegates": "^1.0.0",
@@ -10799,11 +10710,13 @@
         "balanced-match": {
           "version": "1.0.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
@@ -10813,31 +10726,37 @@
         "chownr": {
           "version": "1.1.1",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "code-point-at": {
           "version": "1.1.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "concat-map": {
           "version": "0.0.1",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "console-control-strings": {
           "version": "1.1.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "core-util-is": {
           "version": "1.0.2",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "debug": {
           "version": "2.6.9",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "ms": "2.0.0"
@@ -10846,21 +10765,25 @@
         "deep-extend": {
           "version": "0.6.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "delegates": {
           "version": "1.0.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "detect-libc": {
           "version": "1.0.3",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "fs-minipass": {
           "version": "1.2.5",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "minipass": "^2.2.1"
@@ -10869,11 +10792,13 @@
         "fs.realpath": {
           "version": "1.0.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "gauge": {
           "version": "2.7.4",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "aproba": "^1.0.3",
@@ -10889,6 +10814,7 @@
         "glob": {
           "version": "7.1.3",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -10902,11 +10828,13 @@
         "has-unicode": {
           "version": "2.0.1",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "iconv-lite": {
           "version": "0.4.24",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "safer-buffer": ">= 2.1.2 < 3"
@@ -10915,6 +10843,7 @@
         "ignore-walk": {
           "version": "3.0.1",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "minimatch": "^3.0.4"
@@ -10923,6 +10852,7 @@
         "inflight": {
           "version": "1.0.6",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "once": "^1.3.0",
@@ -10932,16 +10862,19 @@
         "inherits": {
           "version": "2.0.3",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "ini": {
           "version": "1.3.5",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
@@ -10950,11 +10883,13 @@
         "isarray": {
           "version": "1.0.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "minimatch": {
           "version": "3.0.4",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
@@ -10963,11 +10898,13 @@
         "minimist": {
           "version": "0.0.8",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "minipass": {
           "version": "2.3.5",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "safe-buffer": "^5.1.2",
@@ -10977,6 +10914,7 @@
         "minizlib": {
           "version": "1.2.1",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "minipass": "^2.2.1"
@@ -10985,6 +10923,7 @@
         "mkdirp": {
           "version": "0.5.1",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "minimist": "0.0.8"
@@ -10993,11 +10932,13 @@
         "ms": {
           "version": "2.0.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "needle": {
           "version": "2.2.4",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "debug": "^2.1.2",
@@ -11008,6 +10949,7 @@
         "node-pre-gyp": {
           "version": "0.10.3",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "detect-libc": "^1.0.2",
@@ -11025,6 +10967,7 @@
         "nopt": {
           "version": "4.0.1",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "abbrev": "1",
@@ -11034,11 +10977,13 @@
         "npm-bundled": {
           "version": "1.0.5",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "npm-packlist": {
           "version": "1.2.0",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "ignore-walk": "^3.0.1",
@@ -11048,6 +10993,7 @@
         "npmlog": {
           "version": "4.1.2",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "are-we-there-yet": "~1.1.2",
@@ -11059,16 +11005,19 @@
         "number-is-nan": {
           "version": "1.0.1",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "object-assign": {
           "version": "4.1.1",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "once": {
           "version": "1.4.0",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "wrappy": "1"
@@ -11077,16 +11026,19 @@
         "os-homedir": {
           "version": "1.0.2",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "os-tmpdir": {
           "version": "1.0.2",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "osenv": {
           "version": "0.1.5",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "os-homedir": "^1.0.0",
@@ -11096,16 +11048,19 @@
         "path-is-absolute": {
           "version": "1.0.1",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "process-nextick-args": {
           "version": "2.0.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "rc": {
           "version": "1.2.8",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "deep-extend": "^0.6.0",
@@ -11117,6 +11072,7 @@
             "minimist": {
               "version": "1.2.0",
               "bundled": true,
+              "dev": true,
               "optional": true
             }
           }
@@ -11124,6 +11080,7 @@
         "readable-stream": {
           "version": "2.3.6",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "core-util-is": "~1.0.0",
@@ -11138,6 +11095,7 @@
         "rimraf": {
           "version": "2.6.3",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "glob": "^7.1.3"
@@ -11146,36 +11104,43 @@
         "safe-buffer": {
           "version": "5.1.2",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "safer-buffer": {
           "version": "2.1.2",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "sax": {
           "version": "1.2.4",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "semver": {
           "version": "5.6.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "set-blocking": {
           "version": "2.0.0",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "signal-exit": {
           "version": "3.0.2",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "string-width": {
           "version": "1.0.2",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
@@ -11186,6 +11151,7 @@
         "string_decoder": {
           "version": "1.1.1",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "safe-buffer": "~5.1.0"
@@ -11194,6 +11160,7 @@
         "strip-ansi": {
           "version": "3.0.1",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
@@ -11202,11 +11169,13 @@
         "strip-json-comments": {
           "version": "2.0.1",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "tar": {
           "version": "4.4.8",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "chownr": "^1.1.1",
@@ -11221,11 +11190,13 @@
         "util-deprecate": {
           "version": "1.0.2",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "wide-align": {
           "version": "1.1.3",
           "bundled": true,
+          "dev": true,
           "optional": true,
           "requires": {
             "string-width": "^1.0.2 || 2"
@@ -11234,11 +11205,13 @@
         "wrappy": {
           "version": "1.0.2",
           "bundled": true,
+          "dev": true,
           "optional": true
         },
         "yallist": {
           "version": "3.0.3",
           "bundled": true,
+          "dev": true,
           "optional": true
         }
       }
@@ -11283,7 +11256,8 @@
     "get-value": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
     },
     "getpass": {
       "version": "0.1.7",
@@ -11312,6 +11286,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
       "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "dev": true,
       "requires": {
         "is-glob": "^3.1.0",
         "path-dirname": "^1.0.0"
@@ -11321,6 +11296,7 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
           "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
           "requires": {
             "is-extglob": "^2.1.0"
           }
@@ -11374,7 +11350,8 @@
     "globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true
     },
     "globalthis": {
       "version": "1.0.1",
@@ -11679,7 +11656,8 @@
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
     },
     "has-symbols": {
       "version": "1.0.0",
@@ -11691,6 +11669,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
       "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
       "requires": {
         "get-value": "^2.0.6",
         "has-values": "^1.0.0",
@@ -11701,6 +11680,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
       "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
       "requires": {
         "is-number": "^3.0.0",
         "kind-of": "^4.0.0"
@@ -11710,6 +11690,7 @@
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
           "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -12374,6 +12355,7 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
       "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -12382,6 +12364,7 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -12398,6 +12381,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
       "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "dev": true,
       "requires": {
         "binary-extensions": "^1.0.0"
       }
@@ -12405,7 +12389,8 @@
     "is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
     },
     "is-ci": {
       "version": "2.0.0",
@@ -12434,6 +12419,7 @@
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
       "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -12442,6 +12428,7 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -12458,6 +12445,7 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
       "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "dev": true,
       "requires": {
         "is-accessor-descriptor": "^0.1.6",
         "is-data-descriptor": "^0.1.4",
@@ -12467,7 +12455,8 @@
         "kind-of": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
         }
       }
     },
@@ -12486,12 +12475,14 @@
     "is-extendable": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
     },
     "is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
     },
     "is-fullwidth-code-point": {
       "version": "2.0.0",
@@ -12503,6 +12494,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
       "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+      "dev": true,
       "requires": {
         "is-extglob": "^2.1.1"
       }
@@ -12538,6 +12530,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
       "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -12546,6 +12539,7 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -12592,6 +12586,7 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
       "requires": {
         "isobject": "^3.0.1"
       }
@@ -12678,7 +12673,8 @@
     "is-windows": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
     },
     "is-wsl": {
       "version": "1.1.0",
@@ -12695,7 +12691,8 @@
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
     },
     "isbinaryfile": {
       "version": "4.0.4",
@@ -12711,7 +12708,8 @@
     "isobject": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
     },
     "isstream": {
       "version": "0.1.2",
@@ -12917,15 +12915,6 @@
             "to-fast-properties": "^2.0.0"
           }
         },
-        "convert-source-map": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-          "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.1"
-          }
-        },
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -13160,7 +13149,8 @@
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
     },
     "js-yaml": {
       "version": "3.13.1",
@@ -13189,7 +13179,8 @@
     "jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true
     },
     "json-buffer": {
       "version": "3.0.0",
@@ -13212,7 +13203,8 @@
     "json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
     },
     "json-stringify-safe": {
       "version": "5.0.1",
@@ -14085,7 +14077,8 @@
     "map-cache": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
     },
     "map-stream": {
       "version": "0.1.0",
@@ -14097,6 +14090,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
       "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
       "requires": {
         "object-visit": "^1.0.0"
       }
@@ -14238,6 +14232,7 @@
       "version": "3.1.10",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
       "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
       "requires": {
         "arr-diff": "^4.0.0",
         "array-unique": "^0.3.2",
@@ -14510,6 +14505,7 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
       "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "dev": true,
       "requires": {
         "for-in": "^1.0.2",
         "is-extendable": "^1.0.1"
@@ -14519,6 +14515,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
           "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
           "requires": {
             "is-plain-object": "^2.0.4"
           }
@@ -14604,7 +14601,8 @@
     "ms": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
     },
     "multicast-dns": {
       "version": "6.2.3",
@@ -14644,12 +14642,14 @@
       "version": "2.12.1",
       "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
       "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==",
+      "dev": true,
       "optional": true
     },
     "nanomatch": {
       "version": "1.2.13",
       "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
       "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
       "requires": {
         "arr-diff": "^4.0.0",
         "array-unique": "^0.3.2",
@@ -14849,6 +14849,7 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
       "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "dev": true,
       "requires": {
         "remove-trailing-separator": "^1.0.1"
       }
@@ -15069,6 +15070,7 @@
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
       "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
       "requires": {
         "copy-descriptor": "^0.1.0",
         "define-property": "^0.2.5",
@@ -15079,6 +15081,7 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -15087,6 +15090,7 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -15115,6 +15119,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
       "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
       "requires": {
         "isobject": "^3.0.0"
       }
@@ -15210,6 +15215,7 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
       "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
       "requires": {
         "isobject": "^3.0.1"
       }
@@ -15887,7 +15893,8 @@
     "pascalcase": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
     },
     "path-browserify": {
       "version": "0.0.1",
@@ -15898,7 +15905,8 @@
     "path-dirname": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
     },
     "path-exists": {
       "version": "3.0.0",
@@ -16158,7 +16166,8 @@
     "posix-character-classes": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
     },
     "postcss": {
       "version": "7.0.31",
@@ -16868,7 +16877,8 @@
     "process-nextick-args": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
-      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+      "dev": true
     },
     "progress": {
       "version": "2.0.3",
@@ -17143,7 +17153,8 @@
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
     },
     "q": {
       "version": "1.4.1",
@@ -17393,6 +17404,7 @@
       "version": "2.3.6",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
       "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "dev": true,
       "requires": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -17419,6 +17431,7 @@
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
       "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+      "dev": true,
       "requires": {
         "graceful-fs": "^4.1.11",
         "micromatch": "^3.1.10",
@@ -17434,7 +17447,8 @@
     "regenerate": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
-      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
+      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+      "dev": true
     },
     "regenerate-unicode-properties": {
       "version": "8.2.0",
@@ -17464,6 +17478,7 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
       "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
       "requires": {
         "extend-shallow": "^3.0.2",
         "safe-regex": "^1.1.0"
@@ -17529,17 +17544,20 @@
     "remove-trailing-separator": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
     },
     "repeat-element": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+      "dev": true
     },
     "repeat-string": {
       "version": "1.6.1",
       "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
     },
     "request": {
       "version": "2.88.0",
@@ -17614,7 +17632,8 @@
     "resolve-url": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
     },
     "resolve-url-loader": {
       "version": "3.1.1",
@@ -17736,7 +17755,8 @@
     "ret": {
       "version": "0.1.15",
       "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true
     },
     "retry": {
       "version": "0.12.0",
@@ -17898,12 +17918,14 @@
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
     },
     "safe-regex": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
       "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
       "requires": {
         "ret": "~0.1.10"
       }
@@ -18262,6 +18284,7 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
       "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "dev": true,
       "requires": {
         "extend-shallow": "^2.0.1",
         "is-extendable": "^0.1.1",
@@ -18273,6 +18296,7 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -18369,6 +18393,7 @@
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
       "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
       "requires": {
         "base": "^0.11.1",
         "debug": "^2.2.0",
@@ -18384,6 +18409,7 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -18392,6 +18418,7 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -18399,7 +18426,8 @@
         "source-map": {
           "version": "0.5.7",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
         }
       }
     },
@@ -18407,6 +18435,7 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
       "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
       "requires": {
         "define-property": "^1.0.0",
         "isobject": "^3.0.0",
@@ -18417,6 +18446,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
           "requires": {
             "is-descriptor": "^1.0.0"
           }
@@ -18425,6 +18455,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -18433,6 +18464,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -18441,6 +18473,7 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -18453,6 +18486,7 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
       "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
       "requires": {
         "kind-of": "^3.2.0"
       },
@@ -18461,6 +18495,7 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -18737,6 +18772,7 @@
       "version": "0.5.2",
       "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
       "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+      "dev": true,
       "requires": {
         "atob": "^2.1.1",
         "decode-uri-component": "^0.2.0",
@@ -18766,7 +18802,8 @@
     "source-map-url": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
     },
     "sourcemap-codec": {
       "version": "1.4.8",
@@ -18900,6 +18937,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
       "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
       "requires": {
         "extend-shallow": "^3.0.0"
       }
@@ -18997,6 +19035,7 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
       "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
       "requires": {
         "define-property": "^0.2.5",
         "object-copy": "^0.1.0"
@@ -19006,6 +19045,7 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -19359,6 +19399,7 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
       "requires": {
         "safe-buffer": "~5.1.0"
       }
@@ -19867,12 +19908,14 @@
     "to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+      "dev": true
     },
     "to-object-path": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
       "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -19881,6 +19924,7 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -19897,6 +19941,7 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
       "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "dev": true,
       "requires": {
         "define-property": "^2.0.2",
         "extend-shallow": "^3.0.2",
@@ -19908,6 +19953,7 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
       "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
       "requires": {
         "is-number": "^3.0.0",
         "repeat-string": "^1.6.1"
@@ -20253,12 +20299,14 @@
     "unicode-canonical-property-names-ecmascript": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+      "dev": true
     },
     "unicode-match-property-ecmascript": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
       "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+      "dev": true,
       "requires": {
         "unicode-canonical-property-names-ecmascript": "^1.0.4",
         "unicode-property-aliases-ecmascript": "^1.0.4"
@@ -20326,6 +20374,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
       "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "dev": true,
       "requires": {
         "arr-union": "^3.1.0",
         "get-value": "^2.0.6",
@@ -20428,6 +20477,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
       "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
       "requires": {
         "has-value": "^0.3.1",
         "isobject": "^3.0.0"
@@ -20437,6 +20487,7 @@
           "version": "0.3.1",
           "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
           "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
           "requires": {
             "get-value": "^2.0.3",
             "has-values": "^0.1.4",
@@ -20447,6 +20498,7 @@
               "version": "2.1.0",
               "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
               "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
               "requires": {
                 "isarray": "1.0.0"
               }
@@ -20456,7 +20508,8 @@
         "has-values": {
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
         }
       }
     },
@@ -20653,6 +20706,7 @@
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
       "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+      "dev": true,
       "requires": {
         "punycode": "^2.1.0"
       }
@@ -20660,7 +20714,8 @@
     "urix": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
     },
     "url": {
       "version": "0.11.0",
@@ -20710,7 +20765,8 @@
     "use": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "dev": true
     },
     "utf8-byte-length": {
       "version": "1.0.4",
@@ -20738,7 +20794,8 @@
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
     },
     "util-promisify": {
       "version": "2.1.0",
-- 
GitLab


From 82e73fb75fec4d2f90bc3f628a7faeca35319fa9 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 23 Mar 2020 11:31:12 +0100
Subject: [PATCH 08/92] Fix bug in fieldsets refresh after compute

---
 src/app/formulaire/definition/form-fixedvar.ts | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/app/formulaire/definition/form-fixedvar.ts b/src/app/formulaire/definition/form-fixedvar.ts
index c9fb9ddbc..87b008f0c 100644
--- a/src/app/formulaire/definition/form-fixedvar.ts
+++ b/src/app/formulaire/definition/form-fixedvar.ts
@@ -114,7 +114,6 @@ export class FormulaireFixedVar extends FormulaireDefinition {
         this.runNubCalc(this.currentNub);
         this.refreshFieldsets(); // important: before reaffectResultComponents() or it will break results components localization
         this.reaffectResultComponents();
-        this.refreshFieldsets();
     }
 
     protected reaffectResultComponents() {
-- 
GitLab


From 377c1b0aa69db910f442b16abe55f39b04933ee9 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Fri, 27 Mar 2020 10:38:55 +0100
Subject: [PATCH 09/92] Fix #384 - Cordova: updates notifications

---
 package-lock.json | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/package-lock.json b/package-lock.json
index 3b3f1a16b..24a7c058d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10157,10 +10157,12 @@
     },
     "falafel": {
       "version": "2.1.0",
-      "resolved": "",
+      "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz",
+      "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=",
       "dev": true,
       "requires": {
         "acorn": "^5.0.0",
+        "foreach": "^2.0.5",
         "isarray": "0.0.1",
         "object-keys": "^1.0.6"
       },
@@ -10551,6 +10553,12 @@
       "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
       "dev": true
     },
+    "foreach": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+      "dev": true
+    },
     "forever-agent": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-- 
GitLab


From fc8e66dba698444cf9919cd68d5c442dd191d66d Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Tue, 26 May 2020 09:59:17 +0200
Subject: [PATCH 10/92] Work on GUI for Prebarrage

---
 src/app/app.module.ts                         |   1 +
 src/app/calculators/prebarrage/config.json    |  34 ++
 src/app/calculators/prebarrage/en.json        |  12 +
 src/app/calculators/prebarrage/fr.json        |  10 +
 .../calculator-list.component.ts              |  12 +-
 .../calculator.component.html                 |  52 ++-
 .../calculator.component.scss                 |   4 +
 .../calculator.component.ts                   |  22 +-
 .../pb-schema/pb-schema.component.html        |  62 +++
 .../pb-schema/pb-schema.component.scss        |  58 +++
 .../pb-schema/pb-schema.component.ts          | 399 ++++++++++++++++++
 src/app/config.json                           |   2 +-
 .../formulaire/definition/form-definition.ts  |  12 +
 src/app/formulaire/elements/pab-table.ts      |   1 -
 src/app/formulaire/elements/pb-schema.ts      |  32 ++
 src/locale/messages.en.json                   |   5 +
 src/locale/messages.fr.json                   |   5 +
 17 files changed, 694 insertions(+), 29 deletions(-)
 create mode 100644 src/app/calculators/prebarrage/config.json
 create mode 100644 src/app/calculators/prebarrage/en.json
 create mode 100644 src/app/calculators/prebarrage/fr.json
 create mode 100644 src/app/components/pb-schema/pb-schema.component.html
 create mode 100644 src/app/components/pb-schema/pb-schema.component.scss
 create mode 100644 src/app/components/pb-schema/pb-schema.component.ts
 create mode 100644 src/app/formulaire/elements/pb-schema.ts

diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index d7fa9db45..3dc37b5ae 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -86,6 +86,7 @@ import { LogDrawerComponent } from "./components/log-drawer/log-drawer.component
 import { ParamLinkComponent } from "./components/param-link/param-link.component";
 import { PabProfileChartComponent } from "./components/pab-profile-chart/pab-profile-chart.component";
 import { PabTableComponent } from "./components/pab-table/pab-table.component";
+import { PbSchemaComponent } from './components/pb-schema/pb-schema.component';
 import { VariableResultsSelectorComponent } from "./components/variable-results-selector/variable-results-selector.component";
 import { QuicknavComponent } from "./components/quicknav/quicknav.component";
 import { ModulesDiagramComponent } from "./components/modules-diagram/modules-diagram.component";
diff --git a/src/app/calculators/prebarrage/config.json b/src/app/calculators/prebarrage/config.json
new file mode 100644
index 000000000..754fbc81d
--- /dev/null
+++ b/src/app/calculators/prebarrage/config.json
@@ -0,0 +1,34 @@
+[
+    {
+        "id": "schema_interactif_pb",
+        "type": "pb_schema"
+    },
+    {
+        "id": "fs_params",
+        "type": "fieldset",
+        "fields": [
+            {
+                "id": "select_upstream",
+                "type": "select_reference",
+                "reference": "nub",
+                "source": "upstream_stuff"
+            },
+            {
+                "id": "select_downstream",
+                "type": "select_reference",
+                "reference": "nub",
+                "source": "downstream_stuff"
+            },
+            "Q",
+            "Z1",
+            "Z2"
+        ]
+    },
+    {
+        "type": "options",
+        "selectIds": [ ],
+        "upstreamSelectId": "select_upstream",
+        "downstreamSelectId": "select_downstream",
+        "_help": "prebarrage.html"
+    }
+]
diff --git a/src/app/calculators/prebarrage/en.json b/src/app/calculators/prebarrage/en.json
new file mode 100644
index 000000000..a8e5ea027
--- /dev/null
+++ b/src/app/calculators/prebarrage/en.json
@@ -0,0 +1,12 @@
+{
+    "fs_target": "Target parameter characteristics",
+    "fs_searched": "Searched parameter characteristics",
+
+    "Ytarget": "Value of target parameter",
+    "Xinit": "Initial value for searched parameter",
+    "X": "Value for searched parameter",
+
+    "select_target_nub": "Module and parameter to calculate",
+    "select_target_result": "Targetted result",
+    "select_searched_param": "Searched parameter"
+}
\ No newline at end of file
diff --git a/src/app/calculators/prebarrage/fr.json b/src/app/calculators/prebarrage/fr.json
new file mode 100644
index 000000000..e10e65996
--- /dev/null
+++ b/src/app/calculators/prebarrage/fr.json
@@ -0,0 +1,10 @@
+{
+    "fs_params": "Édition du bassin / de la cloison",
+
+    "Ytarget": "Valeur du paramètre cible",
+    "Xinit": "Valeur initiale du paramètre recherché",
+    "X": "Valeur du paramètre recherché",
+
+    "select_upstream": "Bassin / cloison amont",
+    "select_downstream": "Bassin / cloison aval"
+}
\ No newline at end of file
diff --git a/src/app/components/calculator-list/calculator-list.component.ts b/src/app/components/calculator-list/calculator-list.component.ts
index 6dc05bea1..e4c9a47b2 100644
--- a/src/app/components/calculator-list/calculator-list.component.ts
+++ b/src/app/components/calculator-list/calculator-list.component.ts
@@ -114,10 +114,14 @@ export class CalculatorListComponent implements OnInit {
 
                 for (const t of unusedCalculators) {
                     if ( // those sub-Nub types cannot be built outside a parent
-                        t !== CalculatorType.Structure
-                        && t !== CalculatorType.Section
-                        && t !== CalculatorType.CloisonAval
-                        && t !== CalculatorType.YAXN
+                        ! [
+                            CalculatorType.Structure,
+                            CalculatorType.Section,
+                            CalculatorType.CloisonAval,
+                            CalculatorType.YAXN,
+                            CalculatorType.PbBassin,
+                            CalculatorType.PbCloison
+                        ].includes(t)
                     ) {
                         unusedTheme.calculators.push({
                             type: t,
diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index f5ccefc0f..7660f8a21 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -62,22 +62,42 @@
                     [fxFlex.lt-md]="isWide ? '1 0 auto' : '1 0 500px'"
                     [fxFlex.lt-sm]="isWide ? '1 0 auto' : '1 0 300px'">
 
-                    <ng-template ngFor let-fe [ngForOf]="formElements">
-                        <field-set *ngIf="isFieldset(fe)" [style.display]="getElementStyleDisplay(fe.id)" [fieldSet]=fe
-                            (radio)=onRadioClick($event) (validChange)=onElementValid()
-                            (inputChange)=onInputChange($event) (tabPressed)="onTabPressed($event)">
-                        </field-set>
-
-                        <fieldset-container *ngIf="isFieldsetContainer(fe)"
-                            [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe (radio)=onRadioClick($event)
-                            (validChange)=onElementValid() (inputChange)=onInputChange($event)
-                            (tabPressed)="onTabPressed($event)">
-                        </fieldset-container>
-
-                        <pab-table *ngIf="isPabTable(fe)" [pabTable]=fe (radio)=onRadioClick($event)
-                            (validChange)=onElementValid() (inputChange)=onInputChange($event)>
-                        </pab-table>
-                    </ng-template>
+                    <div id="calc-card-field-sets-container" [fxLayout]="isPB ? 'row wrap' : 'column'">
+                        
+                        <ng-template ngFor let-fe [ngForOf]="formElements">
+                            <field-set *ngIf="isFieldset(fe)" [style.display]="getElementStyleDisplay(fe.id)" [fieldSet]=fe
+                                (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
+                                (tabPressed)="onTabPressed($event)"
+                                [fxFlex.gt-sm]="isPB ? '1 0 400px' : '1 0 auto'"
+                                [fxFlex.lt-md]="isPB ? '1 0 500px' : '1 0 auto'"
+                                [fxFlex.lt-sm]="isPB ? '1 0 300px' : '1 0 auto'">
+                            </field-set>
+
+                            <fieldset-container *ngIf="isFieldsetContainer(fe)" [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe
+                                (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
+                                (tabPressed)="onTabPressed($event)"
+                                fxFlex="1 0 auto">
+                            </fieldset-container>
+
+                            <pab-table *ngIf="isPabTable(fe)" [pabTable]=fe (radio)=onRadioClick($event)
+                                (validChange)=onElementValid() (inputChange)=onInputChange($event)
+                                fxFlex="1 0 auto">
+                            </pab-table>
+
+                            <div *ngIf="isPbSchema(fe)" id="pb-schema-container"
+                                [fxFlex.gt-sm]="isPB ? '1 0 400px' : '1 0 auto'"
+                                [fxFlex.lt-md]="isPB ? '1 0 500px' : '1 0 auto'"
+                                [fxFlex.lt-sm]="isPB ? '1 0 300px' : '1 0 auto'">
+
+                                <pb-schema *ngIf="isPbSchema(fe)" [pbSchema]=fe (radio)=onRadioClick($event)
+                                    (validChange)=onElementValid() (inputChange)=onInputChange($event)>
+                                </pb-schema>
+
+                                <div fxHide.sm fxFlex.gt-sm="0 0 16px"></div>
+                            </div>
+
+                        </ng-template>
+                    </div>
 
                     <mat-card-actions>
                         <!-- bouton calculer -->
diff --git a/src/app/components/generic-calculator/calculator.component.scss b/src/app/components/generic-calculator/calculator.component.scss
index 1aa9e9e26..14be9aa77 100644
--- a/src/app/components/generic-calculator/calculator.component.scss
+++ b/src/app/components/generic-calculator/calculator.component.scss
@@ -26,6 +26,10 @@
     margin-bottom: 1em;
 }
 
+#pb-schema-container {
+    display: block;
+}
+
 mat-card {
     margin-bottom: 2em;
 
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index b662a5000..a377bd939 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -47,6 +47,7 @@ import { PabTable } from "../../formulaire/elements/pab-table";
 import { MultiDimensionResults } from "../../results/multidimension-results";
 import { NgParameter } from "../../formulaire/elements/ngparam";
 import { FormulaireFixedVar } from "../../formulaire/definition/form-fixedvar";
+import { PbSchema } from "../../formulaire/elements/pb-schema";
 
 import { HotkeysService, Hotkey } from "angular2-hotkeys";
 
@@ -168,24 +169,26 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     /**
      * détermine si un FormulaireElement est du type FieldSet
      */
+    /** détermine si un FormulaireElement est du type FieldSet */
     public isFieldset(fe: any): boolean {
         return fe instanceof FieldSet;
     }
 
-    /**
-     * détermine si un FormulaireElement est du type FieldsetContainer
-     */
+    /** détermine si un FormulaireElement est du type FieldsetContainer */
     public isFieldsetContainer(fe: any): boolean {
         return fe instanceof FieldsetContainer;
     }
 
-    /**
-     * détermine si un FormulaireElement est du type PabTable
-     */
+    /** détermine si un FormulaireElement est du type PabTable */
     public isPabTable(fe: any): boolean {
         return fe instanceof PabTable;
     }
 
+    /** détermine si un FormulaireElement est du type PbSchema */
+    public isPbSchema(fe: any): boolean {
+        return fe instanceof PbSchema;
+    }
+
     public get hasForm() {
         return this._formulaire !== undefined;
     }
@@ -583,7 +586,7 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
 
     // for "one wide column" layout
     public get isWide() {
-        return (this.isPAB || this.isMRC);
+        return (this.isPAB || this.isMRC || this.isPB);
     }
 
     // true if current Nub is Solveur
@@ -601,6 +604,11 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         return this.is(CalculatorType.MacroRugoCompound);
     }
 
+    // true if current Nub is PreBarrage
+    public get isPB() {
+        return this.is(CalculatorType.PreBarrage);
+    }
+
     // true if current Nub is Jet
     public get isJet() {
         return this.is(CalculatorType.Jet);
diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
new file mode 100644
index 000000000..80b06a0f1
--- /dev/null
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -0,0 +1,62 @@
+<mat-card-header class="mat-card-header-text-margin-0 bg-accent-light">
+    <mat-card-title>
+        {{ title }}
+    </mat-card-title>
+</mat-card-header>
+
+<mat-card-content>
+
+    <div id="pb-schema-toolbar">
+
+        <div class="hyd-window-btns">
+            <span class="related-entity-title">
+                {{ prefixedItemDescription }}
+            </span>
+            <!-- <mat-select id="add-many-children" [(value)]="childrenToAdd">
+                <mat-option *ngFor="let i of addManyOptionsList" [value]="i">
+                    {{ i }}
+                </mat-option>
+            </mat-select> -->
+            <button type="button" mat-icon-button color="primary" title="example button">
+              <mat-icon>add_box</mat-icon>
+            </button>
+            <!-- <button type="button" mat-icon-button color="primary" [disabled]="! enableAddButton" (click)="onAddClick()"
+              [title]="uitextAdd">
+                <mat-icon>add_box</mat-icon>
+            </button>
+            <button type="button" mat-icon-button color="primary" [disabled]="! enableCopyButton" (click)="onCopyClick()"
+              [title]="uitextCopy">
+                <mat-icon>content_copy</mat-icon>
+            </button>
+            |
+            <button type="button" mat-icon-button color="primary" [disabled]="! enableRemoveButton" (click)="onRemoveClick()"
+              [title]="uitextRemove">
+                <mat-icon>delete</mat-icon>
+            </button>
+            <button type="button" mat-icon-button color="primary" [disabled]="! enableUpButton" (click)="onMoveUpClick()"
+              [title]="uitextMoveUp">
+                <mat-icon *ngIf="! selectionIsOneDevice">arrow_upward</mat-icon>
+                <mat-icon *ngIf="selectionIsOneDevice">arrow_back</mat-icon>
+            </button>
+            <button type="button" mat-icon-button color="primary" [disabled]="! enableDownButton" (click)="onMoveDownClick()"
+              [title]="uitextMoveDown">
+                <mat-icon *ngIf="! selectionIsOneDevice">arrow_downward</mat-icon>
+                <mat-icon *ngIf="selectionIsOneDevice">arrow_forward</mat-icon>
+            </button>
+            |
+            <button type="button" mat-icon-button color="primary" (click)="exportAsSpreadsheet()"
+              [title]="uitextExportAsSpreadsheet">
+                <mat-icon color="primary">file_download</mat-icon>
+            </button> -->
+        </div>
+    </div>
+
+    <div *ngIf="error">{{ uitextDrawingError }}</div>
+
+    <div id="schema" #schema></div>
+
+    <div *ngIf="showDebug">
+        <pre>{{ graphDef }}</pre>
+    </div>
+
+</mat-card-content>
diff --git a/src/app/components/pb-schema/pb-schema.component.scss b/src/app/components/pb-schema/pb-schema.component.scss
new file mode 100644
index 000000000..1b30459a2
--- /dev/null
+++ b/src/app/components/pb-schema/pb-schema.component.scss
@@ -0,0 +1,58 @@
+/** @see additional styles in src/styles.css */
+
+:host {
+    display: block;
+    width: 100%;
+    // reduce margins to avoid inner field-sets being too narrow on 360px display
+    /* margin-left: -8px;
+    margin-right: -8px; */
+}
+
+mat-card-header {
+    /* margin-left: -8px;
+    margin-right: -8px; */
+    margin-left: -16px;
+    margin-right: -16px;
+    padding-left: 16px;
+    padding-top: 8px;
+    color: white;
+
+    // Pourquoi n'est-ce pas hérité de calculator.component.scss ?
+    // À cause de la surcharge de mat-card-header ci-dessus ?
+    mat-card-title {
+        font-size: 16px !important;
+        margin-bottom: 8px;
+    }
+}
+
+mat-card-content {
+    margin-top: 1em;
+}
+
+#pb-schema-toolbar {
+    #edit-pab-table {
+        float: left;
+    }
+    .related-entity-title {
+        vertical-align: middle;
+        font-weight: bold;
+    }
+    .hyd-window-btns {
+        text-align: right;
+
+        #add-many-children {
+            width: 3em;
+            vertical-align: middle;
+        }
+
+        button.mat-icon-button {
+            width: 32px;
+        }
+    }
+}
+
+#schema {
+    margin-top: .5em;
+    margin-bottom: .5em;
+    text-align: center;
+}
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
new file mode 100644
index 000000000..02a921050
--- /dev/null
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -0,0 +1,399 @@
+import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, ViewChild } from "@angular/core";
+
+import {
+    PreBarrage, PbBassin, PbBassinParams, PbCloison
+ } from "jalhyd";
+
+import * as mermaid from "mermaid";
+
+import { I18nService } from "../../services/internationalisation.service";
+import { ApplicationSetupService } from "../../services/app-setup.service";
+import { NotificationsService } from "../../services/notifications.service";
+import { PbSchema } from "../../formulaire/elements/pb-schema";
+
+/**
+ * The interactive schema for calculator type "PreBarrage" (component)
+ */
+@Component({
+    selector: "pb-schema",
+    templateUrl: "./pb-schema.component.html",
+    styleUrls: [
+        "./pb-schema.component.scss"
+    ]
+})
+export class PbSchemaComponent implements AfterViewInit, OnInit {
+
+    @Input()
+    private pbSchema: PbSchema;
+
+    @ViewChild("schema", { static: true })
+    public schema: any;
+
+    /** handle on SVG container */
+    private nativeElement: any;
+
+    public error: boolean;
+
+    /** flag de validité des FieldSet enfants */
+    private _isValid = false;
+
+    private upstreamId = "amont";
+
+    private downstreamId = "aval";
+
+    /** événément de changement de validité */
+    @Output()
+    private validChange = new EventEmitter();
+
+    /** événément de changement de valeur d'un input */
+    @Output()
+    private inputChange = new EventEmitter();
+
+    /** underlying PB */
+    private model: PreBarrage;
+
+    /** Latest clicked item: a PbCloison, a PbBassin or undefined if river "Upstream" or "Downstream" was clicked */
+    private _selectedItem: any;
+
+    public constructor(
+        private i18nService: I18nService,
+        private appSetupService: ApplicationSetupService,
+        private notifService: NotificationsService
+    ) { }
+
+    public get selectedItem(): any {
+        return this._selectedItem;
+    }
+
+    public ngAfterContentInit(): void {
+        this.error = false;
+        mermaid.initialize({
+            flowchart: {
+                curve: "basis"
+            }
+        });
+        this.nativeElement = this.schema.nativeElement;
+
+        // generate graph description
+        const graphDefinition = this.graphDefinition();
+        // draw
+        try {
+            mermaid.render("graphDiv", graphDefinition, (svgCode, bindFunctions) => {
+                this.nativeElement.innerHTML = svgCode;
+            });
+        } catch (e) {
+            console.error(e);
+            this.error = true;
+        }
+    }
+
+    public ngAfterViewInit(): void {
+        this.refreshEventListeners();
+        this.updateValidity();
+    }
+
+    /** Add click listener on every node and link in the graph */
+    private refreshEventListeners() {
+        this.nativeElement.querySelectorAll("g.node").forEach(item => {
+            item.style.cursor = "pointer";
+            item.addEventListener("click", () => {
+                this.selectBasin(item.id);
+            });
+        });
+        this.nativeElement.querySelectorAll("g.edgeLabel").forEach(item => {
+            item.style.cursor = "pointer";
+            item.addEventListener("click", () => {
+                this.selectWall(item);
+            });
+        });
+    }
+
+    /**
+     * Builds a Mermaid graph text definition
+     */
+    private graphDefinition() {
+        const def: string[] = [ "graph TB" ];
+
+        def.push(`${this.upstreamId}("${this.i18nService.localizeText("INFO_LIB_AMONT")}")`);
+        def.push(`${this.downstreamId}("${this.i18nService.localizeText("INFO_LIB_AVAL")}")`);
+
+        // debug
+        const b1 = new PbBassin(new PbBassinParams(0.1, 42));
+        this.model.addChild(b1);
+        const b2 = new PbBassin(new PbBassinParams(0.15, 38));
+        this.model.addChild(b2);
+        this.model.addChild(new PbCloison(undefined, b1));
+        this.model.addChild(new PbCloison(b1, b2));
+        this.model.addChild(new PbCloison(b2, undefined));
+        this.model.addChild(new PbCloison(b1, undefined));
+
+        for (const b of this.model.bassins) {
+            // basin
+            def.push(`${b.uid}("${this.itemDesription(b)}")`);
+            // upstream walls
+            for (const uw of b.cloisonsAmont) {
+                const upstreamBasinId = uw.bassinAmont === undefined ? this.upstreamId : uw.bassinAmont.uid;
+                // upstream wall unique identifier
+                const uwString = `${upstreamBasinId}-->|${this.itemDesription(uw)}|${b.uid}`;
+                if (! def.includes(uwString)) {
+                    def.push(uwString);
+                }
+            }
+            // downstream walls
+            for (const dw of b.cloisonsAval) {
+                const downstreamBasinId = dw.bassinAval === undefined ? this.downstreamId : dw.bassinAval.uid;
+                // downstream wall unique identifier
+                const dwString = `${b.uid}-->|${this.itemDesription(dw)}|${downstreamBasinId}`;
+                if (! def.includes(dwString)) {
+                    def.push(dwString);
+                }
+            }
+        }
+
+        return def.join("\n");
+    }
+
+    private selectBasin(id: string) {
+        if ([ this.upstreamId, this.downstreamId ].includes(id)) {
+            console.log("YOU CLICKED EITHER UPSTREAM OR DOWNSTREAM");
+            this._selectedItem = undefined;
+        } else {
+            let basin: PbBassin;
+            for (const b of this.model.bassins) {
+                if (b.uid === id) {
+                    basin = b;
+                }
+            }
+            this._selectedItem = basin;
+            // @TODO highlight node in schema
+            console.log("BASIN FOUND !", basin);
+        }
+    }
+
+    private selectWall(item: SVGGElement) {
+        // Mermaid does not allow to assign IDs to connectors and labels…
+        const text: string = item.querySelector("span.edgeLabel").textContent;
+        if (text) {
+            const [ uBs, dBs ] = text.split("-");
+            let wall: PbCloison;
+            // clodo test: is there an upstream basin or is it upstream river ?
+            if (uBs === this.i18nService.localizeText("INFO_LIB_AMONT")) {
+                // find wall from downstream basin
+                const dBi = Number(dBs.substring(1));
+                const dB = this.model.bassins[dBi - 1];
+                for (const w of dB.cloisonsAmont) {
+                    // find the one that is connected to upstream river
+                    if (w.bassinAmont === undefined) {
+                        wall = w;
+                    }
+                }
+            } else {
+                // find wall from upstream basin
+                const uBi = Number(uBs.substring(1));
+                const uB = this.model.bassins[uBi - 1];
+                // clodo test again
+                let dB: PbBassin;
+                if (dBs !== this.i18nService.localizeText("INFO_LIB_AVAL")) {
+                    const dBi = Number(dBs.substring(1));
+                    dB = this.model.bassins[dBi - 1];
+                }
+                for (const w of uB.cloisonsAval) {
+                    // find the one that is connected to dB (either a basin or downstream river)
+                    if (w.bassinAval === dB) {
+                        wall = w;
+                    }
+                }
+            }
+            if (wall === undefined) {
+                throw new Error(`PbSchemaComponent.selectWall(): cannot find wall for label "${text}"`);
+            }
+            this._selectedItem = wall;
+            // @TODO highlight label and edge in schema
+            console.log("WALL FOUND !", wall);
+        }
+    }
+
+    public get graphDef(): string {
+        return this.graphDefinition();
+    }
+
+    public get title(): string {
+        return this.i18nService.localizeText("INFO_PB_SCHEMA");
+    }
+
+    /** Global Pb validity */
+    public get isValid() {
+        return this._isValid;
+    }
+
+    /**
+     * Checks that input value is a valid number, according to input[type="number"] algorithm,
+     * and stores it in cell.uiValidity, so that the <td> element can access it and get angry
+     * if input is invalid
+     */
+    public inputValueChanged($event, cell) {
+        if ($event && $event.target && $event.target.validity) {
+            cell.uiValidity = $event.target.validity.valid;
+        }
+        this.updateValidity();
+        // send input change event (used to reset form results)
+        this.inputChange.emit();
+    }
+
+    public get prefixedItemDescription(): string {
+        let desc = this.itemDesription(this._selectedItem);
+        if (this._selectedItem instanceof PbCloison) {
+            desc = this.i18nService.localizeText("INFO_PB_CLOISON") + " " + desc;
+        }
+        if (desc !== "") {
+            desc += " : ";
+        }
+        return desc;
+    }
+
+    /** Returns a short description of the given item: wall or basin */
+    private itemDesription(item: PbCloison | PbBassin): string {
+        let desc = "";
+        if (item instanceof PbCloison) {
+            const upstreamBasinName = item.bassinAmont === undefined
+                ? this.i18nService.localizeText("INFO_LIB_AMONT")
+                : "B" + (item.bassinAmont.findPositionInParent() + 1);
+            const downstreamBasinName = item.bassinAval === undefined
+                ? this.i18nService.localizeText("INFO_LIB_AVAL")
+                : "B" + (item.bassinAval.findPositionInParent() + 1);
+            desc = upstreamBasinName + "-" + downstreamBasinName;
+
+        } else if (item instanceof PbBassin) {
+            desc = this.i18nService.localizeText("INFO_PB_BASSIN_N") + (item.findPositionInParent() + 1);
+        } // else undefined
+        return desc;
+    }
+
+    /**
+     * Returns true if current cell is bound to a model that says its input value is
+     * no valid, or if characters typed in the input field are not a valid number
+     * (read from cell.uiValidity, see inputValueChanged() above)
+     */
+    /* public isInvalid(cell: any): boolean {
+        let valid = true;
+        if (this.hasModel(cell) && cell.model instanceof ParamDefinition) {
+            valid = valid && cell.model.isValid;
+        }
+        if (cell.uiValidity !== undefined) {
+            valid = valid && cell.uiValidity;
+        }
+        return ! valid;
+    } */
+
+    /**
+     * returns true if every wall (including downwall) has its nth device
+     * selected (or has no nth device)
+     */
+    /* public isDeviceColumnSelected(n: number): boolean {
+        let ok = true;
+        for (const c of this.model.children) {
+            const nthChild = c.getChildren()[n];
+            if (nthChild) {
+                ok = ok && this.selectedItems.includes(nthChild);
+            }
+        }
+        const nthChildDW = this.model.downWall.getChildren()[n];
+        if (nthChildDW) {
+            ok = ok && this.selectedItems.includes(nthChildDW);
+        }
+        return ok;
+    } */
+
+    // quick getter for 1st selected item
+    /* public get selectedItem() {
+        if (this.selectedItems.length === 0) {
+            throw new Error("get selectedItem() : no item selected");
+        }
+        return this.selectedItems[0];
+    } */
+
+    // at this time @Input data is supposed to be already populated
+    public ngOnInit() {
+        this.model = this.pbSchema.pb;
+        this.refresh();
+    }
+
+    /** Unselects all selected text (side-effect of shift+clicking) */
+    /* private clearSelection() {
+        if (window.getSelection) {
+            const sel = window.getSelection();
+            sel.removeAllRanges();
+        }
+    } */
+
+    /**
+     * Builds the interactive schema from the PreBarrage model
+     */
+    private refresh() {
+        this.updateValidity();
+    }
+
+    /* public get relatedEntityTitle() {
+        let title = "";
+        if (this.onlyDevicesAreSelected()) {
+            title = this.i18nService.localizeText("INFO_PAB_OUVRAGES");
+        } else if (this.onlyWallsAreSelected()) {
+            title = this.i18nService.localizeText("INFO_PAB_BASSINS");
+        }
+        if (title !== "") {
+            title += " :";
+        }
+        return title;
+    }
+
+    public get enableAddButton() {
+        return (
+            this.onlyDevicesOfTheSameColumnAreSelected()
+            || (
+                this.selectedItems.length === 1
+                && ! (this.selectedItem instanceof CloisonAval) // exclude downwall
+            )
+        );
+    }
+
+    public get enableCopyButton() {
+        return this.enableAddButton;
+    } */
+
+    /**
+     * Computes the global Pab validity : validity of every cell of every row
+     */
+    private updateValidity() {
+        this._isValid = true;
+        /* for (const r of this.rows) {
+            for (const c of r.cells) {
+                this._isValid = this._isValid && ! this.isInvalid(c);
+            }
+        } */
+        this.validChange.emit();
+    }
+
+    /* public exportAsSpreadsheet() {
+        const elem: any = document.getElementById("geometry");
+        const elemCopy = (elem as HTMLElement).cloneNode(true) as HTMLElement;
+        // enrich element copy: replace inputs by their values, so that it appears in the exported spreadsheet
+        const tables: any = elemCopy.getElementsByTagName("table");
+        for (const table of tables) {
+            const tds: any = table.getElementsByTagName("td");
+            for (const td of tds) {
+                // if it contains an input, replace it with the input value
+                const inputs = td.getElementsByTagName("input");
+                if (inputs.length > 0) {
+                    const input = inputs[0];
+                    td.innerHTML = input.value;
+                }
+            }
+        }
+        // export the enriched element copy
+        AppComponent.exportAsSpreadsheet(elemCopy as any);
+    }
+
+    public get uitextExportAsSpreadsheet() {
+        return this.i18nService.localizeText("INFO_RESULTS_EXPORT_AS_SPREADSHEET");
+    } */
+}
diff --git a/src/app/config.json b/src/app/config.json
index 35925d769..6a7b7f921 100644
--- a/src/app/config.json
+++ b/src/app/config.json
@@ -15,7 +15,7 @@
                 "path": "passe-bassin.jpg",
                 "credits": "S. Richard / OFB"
             },
-            "calculators": [ 12, 13, 6, 5, 10, 15 ]
+            "calculators": [ 12, 13, 6, 5, 10, 15, 30 ]
         },
         {
             "name": "PASSE_A_RALENTISSEURS",
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 2baaff2cf..707f0268c 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -24,6 +24,7 @@ import { CalculatorResults } from "../../results/calculator-results";
 import { ServiceFactory } from "../../services/service-factory";
 import { PabTable } from "../elements/pab-table";
 import { SelectEntry } from "../elements/select-entry";
+import { PbSchema } from '../elements/pb-schema';
 
 /**
  * classe de base pour tous les formulaires
@@ -217,6 +218,13 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         this.kids.push(tab);
     }
 
+    private parse_pb_schema(json: {}) {
+        const sch: PbSchema = new PbSchema(this);
+        sch.parseConfig(json);
+        this.kids.push(sch);
+    }
+
+
     /**
      * 1ère passe d'analyse de la configuration
      */
@@ -274,6 +282,10 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
                     this.parse_pab_table(conf);
                     break;
 
+                case "pb_schema": // not generic at all
+                    this.parse_pb_schema(conf);
+                    break;
+
                 default:
                     throw new Error(`type d'objet de module de calcul ${type} non pris en charge`);
             }
diff --git a/src/app/formulaire/elements/pab-table.ts b/src/app/formulaire/elements/pab-table.ts
index 3601cf19b..e9934bb9c 100644
--- a/src/app/formulaire/elements/pab-table.ts
+++ b/src/app/formulaire/elements/pab-table.ts
@@ -1,7 +1,6 @@
 import { Pab } from "jalhyd";
 
 import { FormulaireElement } from "./formulaire-element";
-import { FormulaireNode } from "./formulaire-node";
 import { FormulairePab } from "../definition/form-pab";
 
 /**
diff --git a/src/app/formulaire/elements/pb-schema.ts b/src/app/formulaire/elements/pb-schema.ts
new file mode 100644
index 000000000..0d4243781
--- /dev/null
+++ b/src/app/formulaire/elements/pb-schema.ts
@@ -0,0 +1,32 @@
+import { PreBarrage } from "jalhyd";
+
+import { FormulaireElement } from "./formulaire-element";
+
+/**
+ * The interactive schema for calculator type "PreBarrage" (form element).
+ *
+ * This is just a gateway between the model (Prebarrage)
+ * and the user interface (PbSchemaComponent)
+ */
+export class PbSchema extends FormulaireElement {
+
+    public parseConfig(json: {}) {
+        this._confId = json["id"];
+    }
+
+    /**
+     * Returns the parent FormulairePab
+     */
+    /* public get form(): FormulairePab {
+        return this.parentForm as FormulairePab;
+    } */
+
+    /**
+     * Returns the Prebarrage model associated to the parent form
+     */
+    public get pb(): PreBarrage {
+        if (this.parentForm) {
+            return this.parentForm.currentNub as PreBarrage;
+        }
+    }
+}
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 8f48e654c..09b6c4cfe 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -516,6 +516,11 @@
     "INFO_PARAMFIELD_VARIATED": "Variated",
     "INFO_PARAMMODE_LIST": "Values list",
     "INFO_PARAMMODE_MINMAX": "Min/max",
+    "INFO_PB_BASSIN_N": "Basin #",
+    "INFO_PB_CLOISON": "Wall",
+    "INFO_PB_SCHEMA": "Basins layout",
+    "INFO_PREBARRAGE_TITRE": "Pre-dams",
+    "INFO_PREBARRAGE_TITRE_COURT": "Pre-dams",
     "INFO_QUICKNAV_CHARTS": "charts",
     "INFO_QUICKNAV_INPUT": "input",
     "INFO_QUICKNAV_RESULTS": "results",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 6ce751141..8e418c381 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -517,6 +517,11 @@
     "INFO_PARAMFIELD_VARIATED": "Varié",
     "INFO_PARAMMODE_LIST": "Liste de valeurs",
     "INFO_PARAMMODE_MINMAX": "Min/max",
+    "INFO_PB_BASSIN_N": "Bassin n°",
+    "INFO_PB_CLOISON": "Cloison",
+    "INFO_PB_SCHEMA": "Organisation des bassins",
+    "INFO_PREBARRAGE_TITRE": "Prébarrages",
+    "INFO_PREBARRAGE_TITRE_COURT": "Prébarrages",
     "INFO_QUICKNAV_CHARTS": "graphiques",
     "INFO_QUICKNAV_INPUT": "données",
     "INFO_QUICKNAV_RESULTS": "résultats",
-- 
GitLab


From 504627bf0d4adc6647cc52ec93435cb660e3351e Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Tue, 26 May 2020 16:54:43 +0200
Subject: [PATCH 11/92] Update jalhyd_branch

---
 jalhyd_branch | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/jalhyd_branch b/jalhyd_branch
index 1e054d20c..22284ff35 100644
--- a/jalhyd_branch
+++ b/jalhyd_branch
@@ -1 +1 @@
-223-calage-d-une-par-remplacer-la-cote-de-deversement-par-la-charge
+32-ajout-de-l-outil-prebarrage
-- 
GitLab


From 05c576fc42b8b42c15490005f87092ab00045f51 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Wed, 27 May 2020 12:05:25 +0200
Subject: [PATCH 12/92] Fix bug breaking build

---
 src/app/components/pb-schema/pb-schema.component.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
index 80b06a0f1..da8c17896 100644
--- a/src/app/components/pb-schema/pb-schema.component.html
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -55,8 +55,8 @@
 
     <div id="schema" #schema></div>
 
-    <div *ngIf="showDebug">
+    <!-- <div *ngIf="showDebug">
         <pre>{{ graphDef }}</pre>
-    </div>
+    </div> -->
 
 </mat-card-content>
-- 
GitLab


From 94334f991c2a3a02a9f5fd05a1c62b8de0b9dba3 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Wed, 27 May 2020 14:21:08 +0200
Subject: [PATCH 13/92] Angular: increase anyComponentStyle budget

---
 angular.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/angular.json b/angular.json
index cb5b49b6a..3b4c3abfe 100644
--- a/angular.json
+++ b/angular.json
@@ -58,7 +58,7 @@
               "budgets": [
                 {
                   "type": "anyComponentStyle",
-                  "maximumWarning": "6kb"
+                  "maximumWarning": "10kb"
                 }
               ],
               "optimization": true,
-- 
GitLab


From a9e07c335425891c62326dd7ba027f326be13ac5 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Wed, 27 May 2020 17:01:38 +0200
Subject: [PATCH 14/92] PreBarrage: diagram actions

add basin
remove basin (buggy)
remove wall
---
 .../pb-schema/pb-schema.component.html        |  35 +----
 .../pb-schema/pb-schema.component.scss        |   9 +-
 .../pb-schema/pb-schema.component.ts          | 141 +++++++-----------
 src/locale/messages.en.json                   |   1 +
 src/locale/messages.fr.json                   |   1 +
 5 files changed, 61 insertions(+), 126 deletions(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
index da8c17896..0c35fbbc4 100644
--- a/src/app/components/pb-schema/pb-schema.component.html
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -8,6 +8,10 @@
 
     <div id="pb-schema-toolbar">
 
+        <button type="button" id="add-basin" mat-raised-button color="accent" (click)="onAddBasinClick()">
+            {{ uitextAddBasin }}
+        </button>
+
         <div class="hyd-window-btns">
             <span class="related-entity-title">
                 {{ prefixedItemDescription }}
@@ -16,33 +20,16 @@
                 <mat-option *ngFor="let i of addManyOptionsList" [value]="i">
                     {{ i }}
                 </mat-option>
-            </mat-select> -->
-            <button type="button" mat-icon-button color="primary" title="example button">
-              <mat-icon>add_box</mat-icon>
-            </button>
-            <!-- <button type="button" mat-icon-button color="primary" [disabled]="! enableAddButton" (click)="onAddClick()"
+            </mat-select>
+            <button type="button" mat-icon-button color="primary" [disabled]="! enableAddButton" (click)="onAddClick()"
               [title]="uitextAdd">
                 <mat-icon>add_box</mat-icon>
-            </button>
-            <button type="button" mat-icon-button color="primary" [disabled]="! enableCopyButton" (click)="onCopyClick()"
-              [title]="uitextCopy">
-                <mat-icon>content_copy</mat-icon>
-            </button>
-            |
+            </button> -->
             <button type="button" mat-icon-button color="primary" [disabled]="! enableRemoveButton" (click)="onRemoveClick()"
               [title]="uitextRemove">
                 <mat-icon>delete</mat-icon>
             </button>
-            <button type="button" mat-icon-button color="primary" [disabled]="! enableUpButton" (click)="onMoveUpClick()"
-              [title]="uitextMoveUp">
-                <mat-icon *ngIf="! selectionIsOneDevice">arrow_upward</mat-icon>
-                <mat-icon *ngIf="selectionIsOneDevice">arrow_back</mat-icon>
-            </button>
-            <button type="button" mat-icon-button color="primary" [disabled]="! enableDownButton" (click)="onMoveDownClick()"
-              [title]="uitextMoveDown">
-                <mat-icon *ngIf="! selectionIsOneDevice">arrow_downward</mat-icon>
-                <mat-icon *ngIf="selectionIsOneDevice">arrow_forward</mat-icon>
-            </button>
+            <!-- 
             |
             <button type="button" mat-icon-button color="primary" (click)="exportAsSpreadsheet()"
               [title]="uitextExportAsSpreadsheet">
@@ -51,12 +38,6 @@
         </div>
     </div>
 
-    <div *ngIf="error">{{ uitextDrawingError }}</div>
-
     <div id="schema" #schema></div>
 
-    <!-- <div *ngIf="showDebug">
-        <pre>{{ graphDef }}</pre>
-    </div> -->
-
 </mat-card-content>
diff --git a/src/app/components/pb-schema/pb-schema.component.scss b/src/app/components/pb-schema/pb-schema.component.scss
index 1b30459a2..eccdfe35b 100644
--- a/src/app/components/pb-schema/pb-schema.component.scss
+++ b/src/app/components/pb-schema/pb-schema.component.scss
@@ -3,22 +3,15 @@
 :host {
     display: block;
     width: 100%;
-    // reduce margins to avoid inner field-sets being too narrow on 360px display
-    /* margin-left: -8px;
-    margin-right: -8px; */
 }
 
 mat-card-header {
-    /* margin-left: -8px;
-    margin-right: -8px; */
     margin-left: -16px;
     margin-right: -16px;
     padding-left: 16px;
     padding-top: 8px;
     color: white;
 
-    // Pourquoi n'est-ce pas hérité de calculator.component.scss ?
-    // À cause de la surcharge de mat-card-header ci-dessus ?
     mat-card-title {
         font-size: 16px !important;
         margin-bottom: 8px;
@@ -30,7 +23,7 @@ mat-card-content {
 }
 
 #pb-schema-toolbar {
-    #edit-pab-table {
+    #add-basin {
         float: left;
     }
     .related-entity-title {
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 02a921050..a55569473 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -32,8 +32,6 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     /** handle on SVG container */
     private nativeElement: any;
 
-    public error: boolean;
-
     /** flag de validité des FieldSet enfants */
     private _isValid = false;
 
@@ -66,14 +64,17 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     }
 
     public ngAfterContentInit(): void {
-        this.error = false;
         mermaid.initialize({
             flowchart: {
                 curve: "basis"
             }
         });
         this.nativeElement = this.schema.nativeElement;
+        this.render();
+    }
 
+    private render() {
+        this.nativeElement.innerHTML = ""; // or diagram goes blank when refreshing…
         // generate graph description
         const graphDefinition = this.graphDefinition();
         // draw
@@ -83,10 +84,19 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
             });
         } catch (e) {
             console.error(e);
-            this.error = true;
         }
     }
 
+    /**
+     * Builds the interactive schema from the PreBarrage model
+     */
+    private refresh() {
+        console.log("riz fraîche");
+        this.render();
+        this.refreshEventListeners();
+        this.updateValidity();
+    }
+
     public ngAfterViewInit(): void {
         this.refreshEventListeners();
         this.updateValidity();
@@ -118,14 +128,16 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         def.push(`${this.downstreamId}("${this.i18nService.localizeText("INFO_LIB_AVAL")}")`);
 
         // debug
-        const b1 = new PbBassin(new PbBassinParams(0.1, 42));
-        this.model.addChild(b1);
-        const b2 = new PbBassin(new PbBassinParams(0.15, 38));
-        this.model.addChild(b2);
-        this.model.addChild(new PbCloison(undefined, b1));
-        this.model.addChild(new PbCloison(b1, b2));
-        this.model.addChild(new PbCloison(b2, undefined));
-        this.model.addChild(new PbCloison(b1, undefined));
+        if (this.model.children.length === 0) {
+            const b1 = new PbBassin(new PbBassinParams(0.1, 42));
+            this.model.addChild(b1);
+            const b2 = new PbBassin(new PbBassinParams(0.15, 38));
+            this.model.addChild(b2);
+            this.model.addChild(new PbCloison(undefined, b1));
+            this.model.addChild(new PbCloison(b1, b2));
+            this.model.addChild(new PbCloison(b2, undefined));
+            this.model.addChild(new PbCloison(b1, undefined));
+        }
 
         for (const b of this.model.bassins) {
             // basin
@@ -257,108 +269,55 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         if (item instanceof PbCloison) {
             const upstreamBasinName = item.bassinAmont === undefined
                 ? this.i18nService.localizeText("INFO_LIB_AMONT")
-                : "B" + (item.bassinAmont.findPositionInParent() + 1);
+                : "B" + (this.findBasinPosition(item.bassinAmont) + 1);
             const downstreamBasinName = item.bassinAval === undefined
                 ? this.i18nService.localizeText("INFO_LIB_AVAL")
-                : "B" + (item.bassinAval.findPositionInParent() + 1);
+                : "B" + (this.findBasinPosition(item.bassinAval) + 1);
             desc = upstreamBasinName + "-" + downstreamBasinName;
 
         } else if (item instanceof PbBassin) {
-            desc = this.i18nService.localizeText("INFO_PB_BASSIN_N") + (item.findPositionInParent() + 1);
+            desc = this.i18nService.localizeText("INFO_PB_BASSIN_N") + (this.findBasinPosition(item) + 1);
         } // else undefined
         return desc;
     }
 
-    /**
-     * Returns true if current cell is bound to a model that says its input value is
-     * no valid, or if characters typed in the input field are not a valid number
-     * (read from cell.uiValidity, see inputValueChanged() above)
-     */
-    /* public isInvalid(cell: any): boolean {
-        let valid = true;
-        if (this.hasModel(cell) && cell.model instanceof ParamDefinition) {
-            valid = valid && cell.model.isValid;
-        }
-        if (cell.uiValidity !== undefined) {
-            valid = valid && cell.uiValidity;
-        }
-        return ! valid;
-    } */
-
-    /**
-     * returns true if every wall (including downwall) has its nth device
-     * selected (or has no nth device)
-     */
-    /* public isDeviceColumnSelected(n: number): boolean {
-        let ok = true;
-        for (const c of this.model.children) {
-            const nthChild = c.getChildren()[n];
-            if (nthChild) {
-                ok = ok && this.selectedItems.includes(nthChild);
-            }
-        }
-        const nthChildDW = this.model.downWall.getChildren()[n];
-        if (nthChildDW) {
-            ok = ok && this.selectedItems.includes(nthChildDW);
-        }
-        return ok;
-    } */
-
-    // quick getter for 1st selected item
-    /* public get selectedItem() {
-        if (this.selectedItems.length === 0) {
-            throw new Error("get selectedItem() : no item selected");
+    private findBasinPosition(basin: PbBassin): number {
+        let i = 0;
+        for (const b of this.model.bassins) {
+            if (b === basin) break;
+            i++;
         }
-        return this.selectedItems[0];
-    } */
+        return i;
+    }
 
     // at this time @Input data is supposed to be already populated
     public ngOnInit() {
         this.model = this.pbSchema.pb;
-        this.refresh();
     }
 
-    /** Unselects all selected text (side-effect of shift+clicking) */
-    /* private clearSelection() {
-        if (window.getSelection) {
-            const sel = window.getSelection();
-            sel.removeAllRanges();
-        }
-    } */
+    public get enableRemoveButton() {
+        return (this._selectedItem !== undefined);
+    }
 
-    /**
-     * Builds the interactive schema from the PreBarrage model
-     */
-    private refresh() {
-        this.updateValidity();
+    /** Removes a basin or wall, and all related items */
+    public onRemoveClick() {
+        this.model.deleteChild(this._selectedItem.findPositionInParent());
+        this.refresh();
     }
 
-    /* public get relatedEntityTitle() {
-        let title = "";
-        if (this.onlyDevicesAreSelected()) {
-            title = this.i18nService.localizeText("INFO_PAB_OUVRAGES");
-        } else if (this.onlyWallsAreSelected()) {
-            title = this.i18nService.localizeText("INFO_PAB_BASSINS");
-        }
-        if (title !== "") {
-            title += " :";
-        }
-        return title;
+    public get uitextRemove() {
+        return this.i18nService.localizeText("INFO_FIELDSET_REMOVE");
     }
 
-    public get enableAddButton() {
-        return (
-            this.onlyDevicesOfTheSameColumnAreSelected()
-            || (
-                this.selectedItems.length === 1
-                && ! (this.selectedItem instanceof CloisonAval) // exclude downwall
-            )
-        );
+    public onAddBasinClick() {
+        console.log("Ajoute un bassin, coquin !");
+        this.model.addChild(new PbBassin(new PbBassinParams(20, 99)));
+        this.refresh();
     }
 
-    public get enableCopyButton() {
-        return this.enableAddButton;
-    } */
+    public get uitextAddBasin() {
+        return this.i18nService.localizeText("INFO_PB_ADD_BASIN");
+    }
 
     /**
      * Computes the global Pab validity : validity of every cell of every row
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 09b6c4cfe..57397c48d 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -516,6 +516,7 @@
     "INFO_PARAMFIELD_VARIATED": "Variated",
     "INFO_PARAMMODE_LIST": "Values list",
     "INFO_PARAMMODE_MINMAX": "Min/max",
+    "INFO_PB_ADD_BASIN": "Add new basin",
     "INFO_PB_BASSIN_N": "Basin #",
     "INFO_PB_CLOISON": "Wall",
     "INFO_PB_SCHEMA": "Basins layout",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 8e418c381..3ff3a647d 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -517,6 +517,7 @@
     "INFO_PARAMFIELD_VARIATED": "Varié",
     "INFO_PARAMMODE_LIST": "Liste de valeurs",
     "INFO_PARAMMODE_MINMAX": "Min/max",
+    "INFO_PB_ADD_BASIN": "Ajouter un bassin",
     "INFO_PB_BASSIN_N": "Bassin n°",
     "INFO_PB_CLOISON": "Cloison",
     "INFO_PB_SCHEMA": "Organisation des bassins",
-- 
GitLab


From 8942ad5391fbcfa88edcede9025cf33aadbf93f1 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 28 May 2020 17:05:44 +0200
Subject: [PATCH 15/92] Prebarrage: GUI

grey out Calculate button if basins structure is invalid
use Mermaid Nodes for walls
suffix multiple walls on same basins pair
base Mermaid Nodes on children UIDs
display Mermaid code (debug)
unselect element after deletion
highlight selected element
---
 src/app/calculators/prebarrage/fr.json        |   4 +-
 .../calculator.component.ts                   |  11 ++
 .../pb-schema/pb-schema.component.html        |   2 +
 .../pb-schema/pb-schema.component.scss        |   4 +
 .../pb-schema/pb-schema.component.ts          | 185 +++++++-----------
 5 files changed, 94 insertions(+), 112 deletions(-)

diff --git a/src/app/calculators/prebarrage/fr.json b/src/app/calculators/prebarrage/fr.json
index e10e65996..b770ea7b8 100644
--- a/src/app/calculators/prebarrage/fr.json
+++ b/src/app/calculators/prebarrage/fr.json
@@ -5,6 +5,6 @@
     "Xinit": "Valeur initiale du paramètre recherché",
     "X": "Valeur du paramètre recherché",
 
-    "select_upstream": "Bassin / cloison amont",
-    "select_downstream": "Bassin / cloison aval"
+    "select_upstream": "Bassin amont",
+    "select_downstream": "Bassin aval"
 }
\ No newline at end of file
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index a377bd939..951751efd 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -48,6 +48,7 @@ import { MultiDimensionResults } from "../../results/multidimension-results";
 import { NgParameter } from "../../formulaire/elements/ngparam";
 import { FormulaireFixedVar } from "../../formulaire/definition/form-fixedvar";
 import { PbSchema } from "../../formulaire/elements/pb-schema";
+import { PbSchemaComponent } from "../pb-schema/pb-schema.component";
 
 import { HotkeysService, Hotkey } from "angular2-hotkeys";
 
@@ -77,6 +78,12 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     @ViewChild(PabTableComponent)
     private _pabTableComponent: PabTableComponent;
 
+    /**
+     * PbSchemaComponent if any
+     */
+    @ViewChild(PbSchemaComponent)
+    private _pbSchemaComponent: PbSchemaComponent;
+
     /**
      * composant d'affichage des résultats
      */
@@ -503,6 +510,10 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
                 this._isUIValid = this._isUIValid && this._pabTableComponent.isValid;
             }
         }
+
+        if (this._pbSchemaComponent !== undefined) {
+            this._isUIValid = this._isUIValid && this._pbSchemaComponent.isValid;
+        }
     }
 
     public getElementStyleDisplay(id: string) {
diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
index 0c35fbbc4..d87b406bc 100644
--- a/src/app/components/pb-schema/pb-schema.component.html
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -40,4 +40,6 @@
 
     <div id="schema" #schema></div>
 
+    <pre id="debug">{{ graphDef }} </pre>
+
 </mat-card-content>
diff --git a/src/app/components/pb-schema/pb-schema.component.scss b/src/app/components/pb-schema/pb-schema.component.scss
index eccdfe35b..7c3c8cb0b 100644
--- a/src/app/components/pb-schema/pb-schema.component.scss
+++ b/src/app/components/pb-schema/pb-schema.component.scss
@@ -49,3 +49,7 @@ mat-card-content {
     margin-bottom: .5em;
     text-align: center;
 }
+
+#debug {
+    /* display: none; */
+}
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index a55569473..7b4a8af0c 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -1,7 +1,7 @@
 import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, ViewChild } from "@angular/core";
 
 import {
-    PreBarrage, PbBassin, PbBassinParams, PbCloison
+    PreBarrage, PbBassin, PbBassinParams, PbCloison, CalculatorType
  } from "jalhyd";
 
 import * as mermaid from "mermaid";
@@ -32,7 +32,7 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     /** handle on SVG container */
     private nativeElement: any;
 
-    /** flag de validité des FieldSet enfants */
+    /** flag de validité du composant */
     private _isValid = false;
 
     private upstreamId = "amont";
@@ -51,7 +51,13 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     private model: PreBarrage;
 
     /** Latest clicked item: a PbCloison, a PbBassin or undefined if river "Upstream" or "Downstream" was clicked */
-    private _selectedItem: any;
+    private _selectedItem: PbCloison | PbBassin;
+
+    /** Records existing walls as they are built, to detect if multiple walls connect the same pair of basins */
+    private existingWalls: { [key: string]: number };
+
+    /** Stores appropriate number suffix for a given wall uid (related to existingWalls above) */
+    private wallsSuffixes: { [key: string]: number };
 
     public constructor(
         private i18nService: I18nService,
@@ -91,7 +97,6 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
      * Builds the interactive schema from the PreBarrage model
      */
     private refresh() {
-        console.log("riz fraîche");
         this.render();
         this.refreshEventListeners();
         this.updateValidity();
@@ -107,26 +112,29 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         this.nativeElement.querySelectorAll("g.node").forEach(item => {
             item.style.cursor = "pointer";
             item.addEventListener("click", () => {
-                this.selectBasin(item.id);
-            });
-        });
-        this.nativeElement.querySelectorAll("g.edgeLabel").forEach(item => {
-            item.style.cursor = "pointer";
-            item.addEventListener("click", () => {
-                this.selectWall(item);
+                this.selectNode(item);
             });
         });
     }
 
     /**
-     * Builds a Mermaid graph text definition
+     * Builds a Mermaid graph text definition, using Nodes
+     * to represent basins as well as walls
      */
     private graphDefinition() {
+        this.existingWalls = {};
+        this.wallsSuffixes = {};
         const def: string[] = [ "graph TB" ];
 
+        // river upstream / downstream
         def.push(`${this.upstreamId}("${this.i18nService.localizeText("INFO_LIB_AMONT")}")`);
         def.push(`${this.downstreamId}("${this.i18nService.localizeText("INFO_LIB_AVAL")}")`);
 
+        // styles
+        def.push("classDef wall fill:#e8e8e8,stroke-width:0;");
+        def.push("classDef node-highlighted fill:orange;");
+        // def.push("classDef basin fill:black;");
+
         // debug
         if (this.model.children.length === 0) {
             const b1 = new PbBassin(new PbBassinParams(0.1, 42));
@@ -139,92 +147,58 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
             this.model.addChild(new PbCloison(b1, undefined));
         }
 
-        for (const b of this.model.bassins) {
-            // basin
-            def.push(`${b.uid}("${this.itemDesription(b)}")`);
-            // upstream walls
-            for (const uw of b.cloisonsAmont) {
-                const upstreamBasinId = uw.bassinAmont === undefined ? this.upstreamId : uw.bassinAmont.uid;
-                // upstream wall unique identifier
-                const uwString = `${upstreamBasinId}-->|${this.itemDesription(uw)}|${b.uid}`;
-                if (! def.includes(uwString)) {
-                    def.push(uwString);
+        for (const c of this.model.children) {
+            if (c instanceof PbBassin) {
+                def.push(`${c.uid}("${this.itemDesription(c)}")`); // rounded edges
+                // def.push(`class ${c.uid} basin;`);
+            } else if (c instanceof PbCloison) {
+                const upstreamBasinId = c.bassinAmont === undefined ? this.upstreamId : c.bassinAmont.uid;
+                const downstreamBasinId = c.bassinAval === undefined ? this.downstreamId : c.bassinAval.uid;
+                // record this wall
+                const basinsPair = upstreamBasinId + "-" + downstreamBasinId;
+                if (! (basinsPair in this.existingWalls)) {
+                    this.existingWalls[basinsPair] = 0;
                 }
-            }
-            // downstream walls
-            for (const dw of b.cloisonsAval) {
-                const downstreamBasinId = dw.bassinAval === undefined ? this.downstreamId : dw.bassinAval.uid;
-                // downstream wall unique identifier
-                const dwString = `${b.uid}-->|${this.itemDesription(dw)}|${downstreamBasinId}`;
-                if (! def.includes(dwString)) {
-                    def.push(dwString);
+                // affect suffix if needed
+                if (this.existingWalls[basinsPair] > 0) {
+                    this.wallsSuffixes[c.uid] = this.existingWalls[basinsPair];
                 }
+                this.existingWalls[basinsPair]++;
+                // draw wall Node
+                def.push(`${c.uid}["${this.itemDesription(c)}"]`); // square edges
+                def.push(`class ${c.uid} wall;`);
+                // draw "arrow" with 2 lines
+                def.push(`${upstreamBasinId}---${c.uid}`); // up line
+                def.push(`${c.uid}-->${downstreamBasinId}`); // down arrow
             }
         }
 
         return def.join("\n");
     }
 
-    private selectBasin(id: string) {
-        if ([ this.upstreamId, this.downstreamId ].includes(id)) {
-            console.log("YOU CLICKED EITHER UPSTREAM OR DOWNSTREAM");
+    private selectNode(item: any) {
+        // highlight clicked element
+        this.clearHighlightedItems();
+        item.classList.add("node-highlighted");
+        // find what was clicked
+        if ([ this.upstreamId, this.downstreamId ].includes(item.id)) {
+            console.log("YOU CLICKED EITHER UPSTREAM OR DOWNSTREAM", item.id);
             this._selectedItem = undefined;
         } else {
-            let basin: PbBassin;
-            for (const b of this.model.bassins) {
-                if (b.uid === id) {
-                    basin = b;
+            for (const b of this.model.children) {
+                if (b.uid === item.id) {
+                    this._selectedItem = b;
                 }
             }
-            this._selectedItem = basin;
-            // @TODO highlight node in schema
-            console.log("BASIN FOUND !", basin);
-        }
-    }
-
-    private selectWall(item: SVGGElement) {
-        // Mermaid does not allow to assign IDs to connectors and labels…
-        const text: string = item.querySelector("span.edgeLabel").textContent;
-        if (text) {
-            const [ uBs, dBs ] = text.split("-");
-            let wall: PbCloison;
-            // clodo test: is there an upstream basin or is it upstream river ?
-            if (uBs === this.i18nService.localizeText("INFO_LIB_AMONT")) {
-                // find wall from downstream basin
-                const dBi = Number(dBs.substring(1));
-                const dB = this.model.bassins[dBi - 1];
-                for (const w of dB.cloisonsAmont) {
-                    // find the one that is connected to upstream river
-                    if (w.bassinAmont === undefined) {
-                        wall = w;
-                    }
-                }
+            if (this._selectedItem !== undefined) {
+                console.log(`${this._selectedItem.calcType === CalculatorType.PbBassin ? "BASIN" : "WALL"} FOUND !`, this._selectedItem);
             } else {
-                // find wall from upstream basin
-                const uBi = Number(uBs.substring(1));
-                const uB = this.model.bassins[uBi - 1];
-                // clodo test again
-                let dB: PbBassin;
-                if (dBs !== this.i18nService.localizeText("INFO_LIB_AVAL")) {
-                    const dBi = Number(dBs.substring(1));
-                    dB = this.model.bassins[dBi - 1];
-                }
-                for (const w of uB.cloisonsAval) {
-                    // find the one that is connected to dB (either a basin or downstream river)
-                    if (w.bassinAval === dB) {
-                        wall = w;
-                    }
-                }
+                console.log("watt ze fyook ?");
             }
-            if (wall === undefined) {
-                throw new Error(`PbSchemaComponent.selectWall(): cannot find wall for label "${text}"`);
-            }
-            this._selectedItem = wall;
-            // @TODO highlight label and edge in schema
-            console.log("WALL FOUND !", wall);
         }
     }
 
+    // for debug only
     public get graphDef(): string {
         return this.graphDefinition();
     }
@@ -274,7 +248,10 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
                 ? this.i18nService.localizeText("INFO_LIB_AVAL")
                 : "B" + (this.findBasinPosition(item.bassinAval) + 1);
             desc = upstreamBasinName + "-" + downstreamBasinName;
-
+            // if a similar wall already exists, suffix !
+            if (item.uid in this.wallsSuffixes) {
+                desc += " (" + this.wallsSuffixes[item.uid] + ")";
+            }
         } else if (item instanceof PbBassin) {
             desc = this.i18nService.localizeText("INFO_PB_BASSIN_N") + (this.findBasinPosition(item) + 1);
         } // else undefined
@@ -302,6 +279,7 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     /** Removes a basin or wall, and all related items */
     public onRemoveClick() {
         this.model.deleteChild(this._selectedItem.findPositionInParent());
+        this.unselect();
         this.refresh();
     }
 
@@ -309,9 +287,10 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         return this.i18nService.localizeText("INFO_FIELDSET_REMOVE");
     }
 
+    /** Adds a new lone basin */
     public onAddBasinClick() {
-        console.log("Ajoute un bassin, coquin !");
         this.model.addChild(new PbBassin(new PbBassinParams(20, 99)));
+        this.unselect();
         this.refresh();
     }
 
@@ -323,36 +302,22 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
      * Computes the global Pab validity : validity of every cell of every row
      */
     private updateValidity() {
-        this._isValid = true;
-        /* for (const r of this.rows) {
-            for (const c of r.cells) {
-                this._isValid = this._isValid && ! this.isInvalid(c);
-            }
-        } */
+        // check that at least 1 basin is present and a route from river
+        // upstream to river downstream exists (2nd check includes 1st)
+        this._isValid = this.model.hasUpDownConnection();
         this.validChange.emit();
     }
 
-    /* public exportAsSpreadsheet() {
-        const elem: any = document.getElementById("geometry");
-        const elemCopy = (elem as HTMLElement).cloneNode(true) as HTMLElement;
-        // enrich element copy: replace inputs by their values, so that it appears in the exported spreadsheet
-        const tables: any = elemCopy.getElementsByTagName("table");
-        for (const table of tables) {
-            const tds: any = table.getElementsByTagName("td");
-            for (const td of tds) {
-                // if it contains an input, replace it with the input value
-                const inputs = td.getElementsByTagName("input");
-                if (inputs.length > 0) {
-                    const input = inputs[0];
-                    td.innerHTML = input.value;
-                }
-            }
-        }
-        // export the enriched element copy
-        AppComponent.exportAsSpreadsheet(elemCopy as any);
+    private clearHighlightedItems() {
+        this.nativeElement.querySelectorAll("g.node").forEach(item => {
+            console.log("found an item !");
+            item.classList.remove("node-highlighted");
+        });
+    }
+
+    private unselect() {
+        this._selectedItem = undefined;
+        this.clearHighlightedItems();
     }
 
-    public get uitextExportAsSpreadsheet() {
-        return this.i18nService.localizeText("INFO_RESULTS_EXPORT_AS_SPREADSHEET");
-    } */
 }
-- 
GitLab


From 6635380d706d105c0b377dde8c9b2941606d7a1e Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Fri, 29 May 2020 14:59:45 +0200
Subject: [PATCH 16/92] PreBarrage: command to add walls

---
 src/app/app.module.ts                         | 236 +++++++++---------
 .../dialog-new-pb-cloison.component.html      |  28 +++
 .../dialog-new-pb-cloison.component.scss      |   4 +
 .../dialog-new-pb-cloison.component.ts        |  96 +++++++
 .../pb-schema/pb-schema.component.html        |  14 +-
 .../pb-schema/pb-schema.component.scss        |   4 +
 .../pb-schema/pb-schema.component.ts          |  70 +++++-
 src/app/formulaire/elements/pb-schema.ts      |   7 -
 src/locale/messages.en.json                   |   4 +
 src/locale/messages.fr.json                   |   4 +
 10 files changed, 328 insertions(+), 139 deletions(-)
 create mode 100644 src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.html
 create mode 100644 src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.scss
 create mode 100644 src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts

diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 3dc37b5ae..6c36ede63 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -107,6 +107,7 @@ import { DialogLoadPredefinedEspeceComponent } from "./components/dialog-load-pr
 import { DialogLoadSessionComponent } from "./components/dialog-load-session/dialog-load-session.component";
 import { DialogLogEntriesDetailsComponent } from "./components/dialog-log-entries-details/dialog-log-entries-details.component";
 import { DialogSaveSessionComponent } from "./components/dialog-save-session/dialog-save-session.component";
+import { DialogNewPbCloisonComponent } from "./components/dialog-new-pb-cloison/dialog-new-pb-cloison.component";
 
 import { JalhydAsyncModelValidationDirective } from "./directives/jalhyd-async-model-validation.directive";
 import {
@@ -147,122 +148,125 @@ const appRoutes: Routes = [
                 }
             }
         }),
-        MatBadgeModule,
-        MatButtonModule,
-        MatButtonToggleModule,
-        MatCardModule,
-        MatCheckboxModule,
-        MatDialogModule,
-        MaterialFileInputModule,
-        MatFormFieldModule,
-        MatIconModule,
-        MatInputModule,
-        MatListModule,
-        MatMenuModule,
-        MatProgressBarModule,
-        MatRadioModule,
-        MatSelectModule,
-        MatSidenavModule,
-        MatSnackBarModule,
-        MatTableModule,
-        MatTabsModule,
-        MatToolbarModule,
-        MatTooltipModule,
-        MatomoModule,
-        RouterModule.forRoot(
-            appRoutes,
-            {
-                useHash: true, // prevents reloading whole app when typing url in browser's navigation bar
-                enableTracing: false // debugging purposes only
-            }
-        ),
-        StorageServiceModule,
-        TableModule,
-        // KonamiModule
-    ],
-    declarations: [ // composants, pipes et directives
-        AppComponent,
-        ApplicationSetupComponent,
-        BaseParamInputComponent,
-        CalcCanvasComponent,
-        CalculatorListComponent,
-        CalculatorNameComponent,
-        CalculatorResultsComponent,
-        DialogConfirmCloseCalcComponent,
-        DialogConfirmEmptySessionComponent,
-        DialogEditPabComponent,
-        DialogEditParamComputedComponent,
-        DialogEditParamValuesComponent,
-        DialogGeneratePABComponent,
-        DialogGeneratePARSimulationComponent,
-        DialogLoadSessionComponent,
-        DialogLogEntriesDetailsComponent,
-        DialogSaveSessionComponent,
-        FieldSetComponent,
-        FieldsetContainerComponent,
-        FixedResultsComponent,
-        FixedVarResultsComponent,
-        FlexGtXxsShowHideDirective,
-        FlexLtXsShowHideDirective,
-        FlexXxsShowHideDirective,
-        GenericCalculatorComponent,
-        ChartTypeSelectComponent,
-        JalhydAsyncModelValidationDirective,
-        JalhydModelValidationDirective,
-        JalhydModelValidationMinDirective,
-        JalhydModelValidationMaxDirective,
-        JalhydModelValidationStepDirective,
-        JetResultsComponent,
-        JetTrajectoryChartComponent,
-        LogComponent,
-        LogEntryComponent,
-        ModulesDiagramComponent,
-        NgParamInputComponent,
-        PabProfileChartComponent,
-        PabResultsComponent,
-        PabResultsTableComponent,
-        PabTableComponent,
-        VariableResultsSelectorComponent,
-        MacrorugoCompoundResultsComponent,
-        MacrorugoCompoundResultsTableComponent,
-        ParamComputedComponent,
-        ParamFieldLineComponent,
-        ParamLinkComponent,
-        ParamValuesComponent,
-        QuicknavComponent,
-        RemousResultsComponent,
-        ResultsChartComponent,
-        SectionCanvasComponent,
-        SectionResultsComponent,
-        SelectFieldLineComponent,
-        SelectModelFieldLineComponent,
-        SessionPropertiesComponent,
-        VarResultsComponent
-    ],
-    entryComponents: [
-        DialogConfirmCloseCalcComponent,
-        DialogConfirmEmptySessionComponent,
-        DialogEditPabComponent,
-        DialogEditParamComputedComponent,
-        DialogEditParamValuesComponent,
-        DialogGeneratePABComponent,
-        DialogGeneratePARSimulationComponent,
-        DialogSaveSessionComponent,
-        DialogLoadSessionComponent,
-        DialogLogEntriesDetailsComponent
-    ],
-    providers: [ // services
-        ApplicationSetupService,
-        CustomBreakPointsProvider,
-        FormulaireService,
-        HttpService,
-        I18nService,
-        NotificationsService,
-        {
-            provide: ErrorStateMatcher,
-            useClass: ImmediateErrorStateMatcher
-        }
-    ],
+    MatBadgeModule,
+    MatButtonModule,
+    MatButtonToggleModule,
+    MatCardModule,
+    MatCheckboxModule,
+    MatDialogModule,
+    MaterialFileInputModule,
+    MatFormFieldModule,
+    MatIconModule,
+    MatInputModule,
+    MatListModule,
+    MatMenuModule,
+    MatProgressBarModule,
+    MatRadioModule,
+    MatSelectModule,
+    MatSidenavModule,
+    MatSnackBarModule,
+    MatTableModule,
+    MatTabsModule,
+    MatToolbarModule,
+    MatTooltipModule,
+    MatomoModule,
+    RouterModule.forRoot(
+      appRoutes,
+      {
+        useHash: true, // prevents reloading whole app when typing url in browser's navigation bar
+        enableTracing: false // debugging purposes only
+      }
+    ),
+    StorageServiceModule,
+    TableModule,
+    KonamiModule
+  ],
+  declarations: [ // composants, pipes et directives
+    AppComponent,
+    ApplicationSetupComponent,
+    BaseParamInputComponent,
+    CalcCanvasComponent,
+    CalculatorListComponent,
+    CalculatorNameComponent,
+    CalculatorResultsComponent,
+    DialogConfirmCloseCalcComponent,
+    DialogConfirmEmptySessionComponent,
+    DialogEditPabComponent,
+    DialogEditParamComputedComponent,
+    DialogEditParamValuesComponent,
+    DialogGeneratePABComponent,
+    DialogGeneratePARSimulationComponent,
+    DialogLoadSessionComponent,
+    DialogLogEntriesDetailsComponent,
+    DialogSaveSessionComponent,
+    DialogNewPbCloisonComponent,
+    FieldSetComponent,
+    FieldsetContainerComponent,
+    FixedResultsComponent,
+    FixedVarResultsComponent,
+    FlexGtXxsShowHideDirective,
+    FlexLtXsShowHideDirective,
+    FlexXxsShowHideDirective,
+    GenericCalculatorComponent,
+    ChartTypeSelectComponent,
+    JalhydAsyncModelValidationDirective,
+    JalhydModelValidationDirective,
+    JalhydModelValidationMinDirective,
+    JalhydModelValidationMaxDirective,
+    JalhydModelValidationStepDirective,
+    JetResultsComponent,
+    JetTrajectoryChartComponent,
+    LogComponent,
+    LogEntryComponent,
+    ModulesDiagramComponent,
+    NgParamInputComponent,
+    PabProfileChartComponent,
+    PabResultsComponent,
+    PabResultsTableComponent,
+    PabTableComponent,
+    PbSchemaComponent,
+    VariableResultsSelectorComponent,
+    MacrorugoCompoundResultsComponent,
+    MacrorugoCompoundResultsTableComponent,
+    ParamComputedComponent,
+    ParamFieldLineComponent,
+    ParamLinkComponent,
+    ParamValuesComponent,
+    QuicknavComponent,
+    RemousResultsComponent,
+    ResultsChartComponent,
+    SectionCanvasComponent,
+    SectionResultsComponent,
+    SelectFieldLineComponent,
+    SelectModelFieldLineComponent,
+    SessionPropertiesComponent,
+    VarResultsComponent
+  ],
+  entryComponents: [
+    DialogConfirmCloseCalcComponent,
+    DialogConfirmEmptySessionComponent,
+    DialogEditPabComponent,
+    DialogEditParamComputedComponent,
+    DialogEditParamValuesComponent,
+    DialogGeneratePABComponent,
+    DialogGeneratePARSimulationComponent,
+    DialogSaveSessionComponent,
+    DialogNewPbCloisonComponent,
+    DialogLoadSessionComponent,
+    DialogLogEntriesDetailsComponent
+  ],
+  providers: [ // services
+    ApplicationSetupService,
+    CustomBreakPointsProvider,
+    FormulaireService,
+    HttpService,
+    I18nService,
+    NotificationsService,
+    {
+      provide: ErrorStateMatcher,
+      useClass: ImmediateErrorStateMatcher
+    }
+  ],
   schemas: [ NO_ERRORS_SCHEMA ],
   bootstrap: [ AppComponent ]
 })
diff --git a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.html b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.html
new file mode 100644
index 000000000..aa12a4308
--- /dev/null
+++ b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.html
@@ -0,0 +1,28 @@
+<h1 mat-dialog-title>{{ uitextSelectBasins }}</h1>
+
+<form>
+    <mat-form-field>
+        <mat-select [placeholder]="uiTextUpstreambasin" [(value)]="upstreamIndex" required>
+            <mat-option *ngFor="let b of availableIndexes" [value]="b">
+                {{ basinDescription(b, uitextRiverUpstream) }}
+            </mat-option>
+        </mat-select>
+    </mat-form-field>
+
+    <mat-form-field>
+        <mat-select [placeholder]="uiTextDownstreambasin" [(value)]="downstreamIndex" required>
+            <mat-option *ngFor="let b of availableIndexes" [value]="b">
+                {{ basinDescription(b, uitextRiverDownstream) }}
+            </mat-option>
+        </mat-select>
+    </mat-form-field>
+
+    <div mat-dialog-actions [attr.align]="'end'">
+        <button mat-raised-button color="primary" [mat-dialog-close]="true" cdkFocusInitial>
+            {{ uitextCancel }}
+        </button>
+        <button mat-raised-button color="warn" (click)="onValidate()" [disabled]="! enableValidate">
+            {{ uitextValidate }}
+        </button>
+    </div>
+</form>
diff --git a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.scss b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.scss
new file mode 100644
index 000000000..fc080522e
--- /dev/null
+++ b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.scss
@@ -0,0 +1,4 @@
+mat-form-field {
+    display: block;
+    margin-top: 0.5em;
+}
diff --git a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
new file mode 100644
index 000000000..f5513751b
--- /dev/null
+++ b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
@@ -0,0 +1,96 @@
+import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material/dialog";
+import { Inject, Component, OnInit } from "@angular/core";
+
+import { I18nService } from "../../services/internationalisation.service";
+
+import { PbBassin } from "jalhyd";
+
+@Component({
+    selector: "dialog-new-pb-cloison",
+    templateUrl: "dialog-new-pb-cloison.component.html",
+    styleUrls: ["dialog-new-pb-cloison.component.scss"]
+})
+export class DialogNewPbCloisonComponent implements OnInit {
+
+    /** the selected upstream basin */
+    public upstreamIndex: number;
+
+    /** the selected downstream basin */
+    public downstreamIndex: number;
+
+    /** list of connectable basins, plus reiver upstream / downstrem */
+    protected availableBasins: PbBassin[];
+
+    constructor(
+        public dialogRef: MatDialogRef<DialogNewPbCloisonComponent>,
+        private i18nService: I18nService,
+        @Inject(MAT_DIALOG_DATA) public data: any
+    ) {
+        this.availableBasins = data.basins;
+        this.upstreamIndex = 0;
+        this.downstreamIndex = 1;
+    }
+
+    public get availableIndexes(): number[] {
+        // add river upstream as "0"
+        let ab: number[] = [ 0 ];
+        for (let i = 0; i < this.availableBasins.length; i++) {
+            ab.push(i + 1);
+        }
+        return ab;
+    }
+
+    public basinDescription(i: number, fallback: string): string {
+        if (i === 0) {
+            return fallback;
+        } else {
+            return this.i18nService.localizeText("INFO_PB_BASSIN_N") + i;
+        }
+    }
+
+    public get enableValidate(): boolean {
+        return (this.upstreamIndex !== this.downstreamIndex);
+    }
+
+    public onValidate(close = true) {
+        if (close) {
+            this.dialogRef.close({
+                up: this.upstreamIndex,
+                down: this.downstreamIndex,
+            });
+        }
+        return true;
+    }
+
+    public ngOnInit() {
+        // this.initVariableValues();
+    }
+
+    public get uitextSelectBasins(): string {
+        return this.i18nService.localizeText("INFO_PB_NEW_WALL_SELECT_BASINS");
+    }
+
+    public get uiTextUpstreambasin(): string {
+        return this.i18nService.localizeText("INFO_PB_NEW_WALL_UP_BASIN");
+    }
+
+    public get uiTextDownstreambasin(): string {
+        return this.i18nService.localizeText("INFO_PB_NEW_WALL_DOWN_BASIN");
+    }
+
+    public get uitextRiverUpstream(): string {
+        return this.i18nService.localizeText("INFO_LIB_AMONT");
+    }
+
+    public get uitextRiverDownstream(): string {
+        return this.i18nService.localizeText("INFO_LIB_AVAL");
+    }
+
+    public get uitextValidate() {
+      return this.i18nService.localizeText("INFO_OPTION_VALIDATE");
+    }
+  
+    public get uitextCancel() {
+      return this.i18nService.localizeText("INFO_OPTION_CANCEL");
+    }
+}
diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
index d87b406bc..42f056be8 100644
--- a/src/app/components/pb-schema/pb-schema.component.html
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -12,6 +12,10 @@
             {{ uitextAddBasin }}
         </button>
 
+        <button type="button" id="add-wall" mat-raised-button color="accent" (click)="onAddWallClick()" [disabled]="! enableAddWallButton">
+            {{ uitextAddWall }}
+        </button>
+
         <div class="hyd-window-btns">
             <span class="related-entity-title">
                 {{ prefixedItemDescription }}
@@ -20,11 +24,11 @@
                 <mat-option *ngFor="let i of addManyOptionsList" [value]="i">
                     {{ i }}
                 </mat-option>
-            </mat-select>
-            <button type="button" mat-icon-button color="primary" [disabled]="! enableAddButton" (click)="onAddClick()"
-              [title]="uitextAdd">
-                <mat-icon>add_box</mat-icon>
-            </button> -->
+            </mat-select> -->
+            <button type="button" mat-icon-button color="primary" [disabled]="! enableCopyButton" (click)="onCopyClick()"
+            [title]="uitextCopy">
+              <mat-icon>content_copy</mat-icon>
+          </button>
             <button type="button" mat-icon-button color="primary" [disabled]="! enableRemoveButton" (click)="onRemoveClick()"
               [title]="uitextRemove">
                 <mat-icon>delete</mat-icon>
diff --git a/src/app/components/pb-schema/pb-schema.component.scss b/src/app/components/pb-schema/pb-schema.component.scss
index 7c3c8cb0b..f7b1167f4 100644
--- a/src/app/components/pb-schema/pb-schema.component.scss
+++ b/src/app/components/pb-schema/pb-schema.component.scss
@@ -26,6 +26,10 @@ mat-card-content {
     #add-basin {
         float: left;
     }
+    #add-wall {
+        float: left;
+        margin-left: .5em;
+    }
     .related-entity-title {
         vertical-align: middle;
         font-weight: bold;
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 7b4a8af0c..7f3f21e81 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -1,7 +1,8 @@
 import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, ViewChild } from "@angular/core";
+import { MatDialog } from '@angular/material/dialog';
 
 import {
-    PreBarrage, PbBassin, PbBassinParams, PbCloison, CalculatorType
+    PreBarrage, PbBassin, PbBassinParams, PbCloison
  } from "jalhyd";
 
 import * as mermaid from "mermaid";
@@ -10,6 +11,7 @@ import { I18nService } from "../../services/internationalisation.service";
 import { ApplicationSetupService } from "../../services/app-setup.service";
 import { NotificationsService } from "../../services/notifications.service";
 import { PbSchema } from "../../formulaire/elements/pb-schema";
+import { DialogNewPbCloisonComponent } from "../dialog-new-pb-cloison/dialog-new-pb-cloison.component";
 
 /**
  * The interactive schema for calculator type "PreBarrage" (component)
@@ -61,6 +63,7 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
 
     public constructor(
         private i18nService: I18nService,
+        private newPbCloisonDialog: MatDialog,
         private appSetupService: ApplicationSetupService,
         private notifService: NotificationsService
     ) { }
@@ -132,8 +135,8 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
 
         // styles
         def.push("classDef wall fill:#e8e8e8,stroke-width:0;");
-        def.push("classDef node-highlighted fill:orange;");
-        // def.push("classDef basin fill:black;");
+        def.push("classDef basin fill:#e0f3fb,stroke:#003A80;"); // irstea-ocean 50 / 500
+        def.push("classDef node-highlighted fill:#4DBBE9;"); // irstea-ocean (material "accent"), 300
 
         // debug
         if (this.model.children.length === 0) {
@@ -150,7 +153,7 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         for (const c of this.model.children) {
             if (c instanceof PbBassin) {
                 def.push(`${c.uid}("${this.itemDesription(c)}")`); // rounded edges
-                // def.push(`class ${c.uid} basin;`);
+                def.push(`class ${c.uid} basin;`);
             } else if (c instanceof PbCloison) {
                 const upstreamBasinId = c.bassinAmont === undefined ? this.upstreamId : c.bassinAmont.uid;
                 const downstreamBasinId = c.bassinAval === undefined ? this.downstreamId : c.bassinAval.uid;
@@ -182,7 +185,6 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         item.classList.add("node-highlighted");
         // find what was clicked
         if ([ this.upstreamId, this.downstreamId ].includes(item.id)) {
-            console.log("YOU CLICKED EITHER UPSTREAM OR DOWNSTREAM", item.id);
             this._selectedItem = undefined;
         } else {
             for (const b of this.model.children) {
@@ -190,11 +192,6 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
                     this._selectedItem = b;
                 }
             }
-            if (this._selectedItem !== undefined) {
-                console.log(`${this._selectedItem.calcType === CalculatorType.PbBassin ? "BASIN" : "WALL"} FOUND !`, this._selectedItem);
-            } else {
-                console.log("watt ze fyook ?");
-            }
         }
     }
 
@@ -287,6 +284,23 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         return this.i18nService.localizeText("INFO_FIELDSET_REMOVE");
     }
 
+    public get enableCopyButton() {
+        return (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison);
+    }
+
+    /** Copies a wall */
+    public onCopyClick() {
+        const wall = this._selectedItem as PbCloison
+        const wallCopy = new PbCloison(wall.bassinAmont, wall.bassinAval);
+        this.model.addChild(wallCopy);
+        this.unselect();
+        this.refresh();
+    }
+
+    public get uitextCopy() {
+        return this.i18nService.localizeText("INFO_FIELDSET_COPY");
+    }
+
     /** Adds a new lone basin */
     public onAddBasinClick() {
         this.model.addChild(new PbBassin(new PbBassinParams(20, 99)));
@@ -298,6 +312,41 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         return this.i18nService.localizeText("INFO_PB_ADD_BASIN");
     }
 
+    public get enableAddWallButton(): boolean {
+        return (this.model.bassins.length > 0);
+    }
+
+    /** Adds a new lone wall, opening a modal to choose connected basins */
+    public onAddWallClick() {
+        // open dialog
+        const dialogRef = this.newPbCloisonDialog.open(
+            DialogNewPbCloisonComponent,
+            {
+                data: {
+                    basins: this.model.bassins
+                },
+                disableClose: true
+            }
+        );
+        // apply modifications
+        dialogRef.afterClosed().subscribe(result => {
+            if (result.up !== undefined && result.down !== undefined) {
+                const wall = new PbCloison(
+                    result.up === 0 ? undefined : this.model.bassins[result.up - 1],
+                    result.down === 0 ? undefined : this.model.bassins[result.down - 1]
+                );
+                this.model.addChild(wall);
+                this.unselect();
+                this.refresh();
+            }
+        });
+    }
+
+
+    public get uitextAddWall() {
+        return this.i18nService.localizeText("INFO_PB_ADD_WALL");
+    }
+
     /**
      * Computes the global Pab validity : validity of every cell of every row
      */
@@ -310,7 +359,6 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
 
     private clearHighlightedItems() {
         this.nativeElement.querySelectorAll("g.node").forEach(item => {
-            console.log("found an item !");
             item.classList.remove("node-highlighted");
         });
     }
diff --git a/src/app/formulaire/elements/pb-schema.ts b/src/app/formulaire/elements/pb-schema.ts
index 0d4243781..5be43f62f 100644
--- a/src/app/formulaire/elements/pb-schema.ts
+++ b/src/app/formulaire/elements/pb-schema.ts
@@ -14,13 +14,6 @@ export class PbSchema extends FormulaireElement {
         this._confId = json["id"];
     }
 
-    /**
-     * Returns the parent FormulairePab
-     */
-    /* public get form(): FormulairePab {
-        return this.parentForm as FormulairePab;
-    } */
-
     /**
      * Returns the Prebarrage model associated to the parent form
      */
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 57397c48d..b5004bf82 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -517,8 +517,12 @@
     "INFO_PARAMMODE_LIST": "Values list",
     "INFO_PARAMMODE_MINMAX": "Min/max",
     "INFO_PB_ADD_BASIN": "Add new basin",
+    "INFO_PB_ADD_WALL": "Add new wall",
     "INFO_PB_BASSIN_N": "Basin #",
     "INFO_PB_CLOISON": "Wall",
+    "INFO_PB_NEW_WALL_SELECT_BASINS": "Select basins to connect",
+    "INFO_PB_NEW_WALL_UP_BASIN": "upstream basin",
+    "INFO_PB_NEW_WALL_DOWN_BASIN": "Downstream basin",
     "INFO_PB_SCHEMA": "Basins layout",
     "INFO_PREBARRAGE_TITRE": "Pre-dams",
     "INFO_PREBARRAGE_TITRE_COURT": "Pre-dams",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 3ff3a647d..1f2e4117c 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -518,8 +518,12 @@
     "INFO_PARAMMODE_LIST": "Liste de valeurs",
     "INFO_PARAMMODE_MINMAX": "Min/max",
     "INFO_PB_ADD_BASIN": "Ajouter un bassin",
+    "INFO_PB_ADD_WALL": "Ajouter une cloison",
     "INFO_PB_BASSIN_N": "Bassin n°",
     "INFO_PB_CLOISON": "Cloison",
+    "INFO_PB_NEW_WALL_SELECT_BASINS": "Choisir les bassins à connecter",
+    "INFO_PB_NEW_WALL_UP_BASIN": "Bassin amont",
+    "INFO_PB_NEW_WALL_DOWN_BASIN": "Bassin aval",
     "INFO_PB_SCHEMA": "Organisation des bassins",
     "INFO_PREBARRAGE_TITRE": "Prébarrages",
     "INFO_PREBARRAGE_TITRE_COURT": "Prébarrages",
-- 
GitLab


From bc7f923a31d92e0034e65079feb4a954fc1937c8 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Fri, 29 May 2020 16:50:12 +0200
Subject: [PATCH 17/92] PreBarrage: update wall creation modal

can now create upstream to downstream direct connections
unrelevant list elements are grayed-out
---
 .../dialog-new-pb-cloison.component.html      |  4 +--
 .../dialog-new-pb-cloison.component.ts        | 36 +++++++++++++++++--
 2 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.html b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.html
index aa12a4308..a6587c773 100644
--- a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.html
+++ b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.html
@@ -3,7 +3,7 @@
 <form>
     <mat-form-field>
         <mat-select [placeholder]="uiTextUpstreambasin" [(value)]="upstreamIndex" required>
-            <mat-option *ngFor="let b of availableIndexes" [value]="b">
+            <mat-option *ngFor="let b of availableUpstreamIndexes" [value]="b" [disabled]="! basinIsSelectable(b, false)">
                 {{ basinDescription(b, uitextRiverUpstream) }}
             </mat-option>
         </mat-select>
@@ -11,7 +11,7 @@
 
     <mat-form-field>
         <mat-select [placeholder]="uiTextDownstreambasin" [(value)]="downstreamIndex" required>
-            <mat-option *ngFor="let b of availableIndexes" [value]="b">
+            <mat-option *ngFor="let b of availableDownstreamIndexes" [value]="b" [disabled]="! basinIsSelectable(b, true)">
                 {{ basinDescription(b, uitextRiverDownstream) }}
             </mat-option>
         </mat-select>
diff --git a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
index f5513751b..d562f03d3 100644
--- a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
+++ b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
@@ -28,10 +28,10 @@ export class DialogNewPbCloisonComponent implements OnInit {
     ) {
         this.availableBasins = data.basins;
         this.upstreamIndex = 0;
-        this.downstreamIndex = 1;
+        this.downstreamIndex = 0;
     }
 
-    public get availableIndexes(): number[] {
+    public get availableUpstreamIndexes(): number[] {
         // add river upstream as "0"
         let ab: number[] = [ 0 ];
         for (let i = 0; i < this.availableBasins.length; i++) {
@@ -40,6 +40,32 @@ export class DialogNewPbCloisonComponent implements OnInit {
         return ab;
     }
 
+    public get availableDownstreamIndexes(): number[] {
+        let ab: number[] = [ ];
+        for (let i = 0; i < this.availableBasins.length; i++) {
+            ab.push(i + 1);
+        }
+        // add river downstream as "0"
+        ab.push(0);
+        return ab;
+    }
+
+    /**
+     * Returns true if a basin is selectable in the possible upstream basins list,
+     * considering which downstream basin is currently selected
+     * @param index index of basin
+     * @param downstream if true, inverts the test
+     */
+    public basinIsSelectable(index: number, downstream: boolean = false): boolean {
+        let ok = true;
+        if (downstream) {
+            return (this.upstreamIndex === 0 || index > this.upstreamIndex)
+        } else {
+            return (this.downstreamIndex === 0 || index < this.downstreamIndex)
+        }
+        return ok;
+    }
+
     public basinDescription(i: number, fallback: string): string {
         if (i === 0) {
             return fallback;
@@ -48,8 +74,12 @@ export class DialogNewPbCloisonComponent implements OnInit {
         }
     }
 
+    // @TODO redundant with lists filtering, useless
     public get enableValidate(): boolean {
-        return (this.upstreamIndex !== this.downstreamIndex);
+        return (
+            this.upstreamIndex !== this.downstreamIndex
+            || this.upstreamIndex === 0 // river upstream to river downstream direct connection is allowed
+        );
     }
 
     public onValidate(close = true) {
-- 
GitLab


From cdd02a9373d3323ae7bc6d16a35beb845c2e2d7f Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 8 Jun 2020 11:32:07 +0200
Subject: [PATCH 18/92] PreBarrage: sort graph nodes to prevent lines crossings

---
 .../pb-schema/pb-schema.component.ts          | 102 ++++++++++++++----
 1 file changed, 81 insertions(+), 21 deletions(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 7f3f21e81..d9fc50026 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -122,7 +122,8 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
 
     /**
      * Builds a Mermaid graph text definition, using Nodes
-     * to represent basins as well as walls
+     * to represent basins as well as walls; sorts connexions
+     * to prevent lines crossings
      */
     private graphDefinition() {
         this.existingWalls = {};
@@ -140,45 +141,104 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
 
         // debug
         if (this.model.children.length === 0) {
-            const b1 = new PbBassin(new PbBassinParams(0.1, 42));
+            // EXEMPLE 1 (petit)
+            /* const b1 = new PbBassin(new PbBassinParams(0.1, 42));
             this.model.addChild(b1);
             const b2 = new PbBassin(new PbBassinParams(0.15, 38));
             this.model.addChild(b2);
             this.model.addChild(new PbCloison(undefined, b1));
             this.model.addChild(new PbCloison(b1, b2));
             this.model.addChild(new PbCloison(b2, undefined));
-            this.model.addChild(new PbCloison(b1, undefined));
+            this.model.addChild(new PbCloison(b1, undefined)); */
+
+            // EXEMPLE 2 (grand)
+            this.model.addChild(new PbBassin(new PbBassinParams(13.80, 95)));
+            this.model.addChild(new PbBassin(new PbBassinParams(15.40, 94.70)));
+            this.model.addChild(new PbBassin(new PbBassinParams(16.20, 94.70)));
+            this.model.addChild(new PbBassin(new PbBassinParams(17.50, 94.40)));
+            this.model.addChild(new PbBassin(new PbBassinParams(32.10, 94.25)));
+            this.model.addChild(new PbBassin(new PbBassinParams(35.00, 94.10)));
+            this.model.addChild(new PbCloison(undefined, this.model.children[0] as PbBassin));
+            this.model.addChild(new PbCloison(undefined, this.model.children[1] as PbBassin));
+            this.model.addChild(new PbCloison(undefined, this.model.children[4] as PbBassin));
+            this.model.addChild(new PbCloison(undefined, this.model.children[5] as PbBassin));
+            this.model.addChild(new PbCloison(this.model.children[0] as PbBassin, this.model.children[2] as PbBassin));
+            this.model.addChild(new PbCloison(this.model.children[1] as PbBassin, this.model.children[2] as PbBassin));
+            this.model.addChild(new PbCloison(this.model.children[1] as PbBassin, this.model.children[3] as PbBassin));
+            this.model.addChild(new PbCloison(this.model.children[1] as PbBassin, this.model.children[4] as PbBassin));
+            this.model.addChild(new PbCloison(this.model.children[2] as PbBassin, this.model.children[3] as PbBassin));
+            this.model.addChild(new PbCloison(this.model.children[3] as PbBassin, this.model.children[4] as PbBassin));
+            this.model.addChild(new PbCloison(this.model.children[4] as PbBassin, this.model.children[5] as PbBassin));
+            this.model.addChild(new PbCloison(this.model.children[5] as PbBassin, undefined));
         }
 
+        const sortedWalls: PbCloison[] = [];
         for (const c of this.model.children) {
             if (c instanceof PbBassin) {
                 def.push(`${c.uid}("${this.itemDesription(c)}")`); // rounded edges
                 def.push(`class ${c.uid} basin;`);
             } else if (c instanceof PbCloison) {
-                const upstreamBasinId = c.bassinAmont === undefined ? this.upstreamId : c.bassinAmont.uid;
-                const downstreamBasinId = c.bassinAval === undefined ? this.downstreamId : c.bassinAval.uid;
-                // record this wall
-                const basinsPair = upstreamBasinId + "-" + downstreamBasinId;
-                if (! (basinsPair in this.existingWalls)) {
-                    this.existingWalls[basinsPair] = 0;
-                }
-                // affect suffix if needed
-                if (this.existingWalls[basinsPair] > 0) {
-                    this.wallsSuffixes[c.uid] = this.existingWalls[basinsPair];
-                }
-                this.existingWalls[basinsPair]++;
-                // draw wall Node
-                def.push(`${c.uid}["${this.itemDesription(c)}"]`); // square edges
-                def.push(`class ${c.uid} wall;`);
-                // draw "arrow" with 2 lines
-                def.push(`${upstreamBasinId}---${c.uid}`); // up line
-                def.push(`${c.uid}-->${downstreamBasinId}`); // down arrow
+                // store, to draw later
+                sortedWalls.push(c);
+            }
+        }
+        // sort then draw walls
+        sortedWalls.sort(this.triCloisonsGaucheDroite);
+        for (const c of sortedWalls) {
+            const upstreamBasinId = c.bassinAmont === undefined ? this.upstreamId : c.bassinAmont.uid;
+            const downstreamBasinId = c.bassinAval === undefined ? this.downstreamId : c.bassinAval.uid;
+            // record this wall
+            const basinsPair = upstreamBasinId + "-" + downstreamBasinId;
+            if (! (basinsPair in this.existingWalls)) {
+                this.existingWalls[basinsPair] = 0;
+            }
+            // affect suffix if needed
+            if (this.existingWalls[basinsPair] > 0) {
+                this.wallsSuffixes[c.uid] = this.existingWalls[basinsPair];
             }
+            this.existingWalls[basinsPair]++;
+            // draw wall Node
+            def.push(`${c.uid}["${this.itemDesription(c)}"]`); // square edges
+            def.push(`class ${c.uid} wall;`);
+            // draw "arrow" with 2 lines
+            def.push(`${upstreamBasinId}---${c.uid}-->${downstreamBasinId}`);
         }
 
         return def.join("\n");
     }
 
+    /** gauche d'abord, droite ensuite */
+    private triCloisonsGaucheDroite(a: PbCloison, b: PbCloison) {
+        // ultra-gauchistes
+        if (a.bassinAmont === undefined && a.bassinAval === undefined) {
+            return -1;
+        }
+        if (b.bassinAmont === undefined && b.bassinAval === undefined) {
+            return 1;
+        }
+        // si A est un super-gauchiste
+        if (a.bassinAmont === undefined || a.bassinAval === undefined) {
+            // B est-il aussi un super-gauchiste ?
+            if (b.bassinAmont === undefined || b.bassinAval === undefined) {
+                // comparer le bassin restant
+                const bassinA = (a.bassinAmont === undefined ? a.bassinAval : a.bassinAmont);
+                const bassinB = (b.bassinAmont === undefined ? b.bassinAval : b.bassinAmont);
+                return (bassinA.findPositionInParent() <= bassinB.findPositionInParent()) ? -1 : 1;
+            }
+            // sinon A gagne
+            return -1;
+        }
+        // si B est un super-gauchiste
+        if (b.bassinAmont === undefined || b.bassinAval === undefined) {
+            // B gagne (le cas de A super-gauchiste est éliminé avant)
+            return 1;
+        }
+        // sinon, aucun des deux n'est super-gauchiste, comparaison des bassins amont et aval
+        const sommeA = a.bassinAmont.findPositionInParent() + a.bassinAval.findPositionInParent();
+        const sommeB = b.bassinAmont.findPositionInParent() + b.bassinAval.findPositionInParent();
+        return (sommeA <= sommeB ? -1 : 1);
+    };
+
     private selectNode(item: any) {
         // highlight clicked element
         this.clearHighlightedItems();
-- 
GitLab


From 1b449328be5981b73e3687e808bffc66e78d17c9 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 8 Jun 2020 14:04:17 +0200
Subject: [PATCH 19/92] PreBarrage: show data or results on the right side, not
 both

---
 .../calculator.component.html                 | 31 ++++++++----
 .../calculator.component.scss                 | 49 +++++++++++++++++++
 .../calculator.component.ts                   | 13 ++++-
 .../pb-schema/pb-schema.component.html        |  9 +---
 .../pb-schema/pb-schema.component.scss        |  8 +--
 .../pb-schema/pb-schema.component.ts          |  8 ++-
 6 files changed, 96 insertions(+), 22 deletions(-)

diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index 7660f8a21..fbe397447 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -39,7 +39,18 @@
 
     </mat-card-header>
 
-    <quicknav [fxHide.gt-sm]="! isWide" [items]="quicknavItems" [currentItem]="'input'" [align]="'left'"></quicknav>
+    <quicknav *ngIf="! isPB" [fxHide.gt-sm]="! isWide" [items]="quicknavItems" [currentItem]="'input'" [align]="'left'"></quicknav>
+
+    <div *ngIf="isPB" class="fake-quicknav" id="pb-data-results-selector">
+        <div class="drs-row">
+            <div class="drs-item" [class.current]="showPBInputData">
+                <a (click)="showPBInputData = true;">{{ uitextInputData }}</a>
+            </div>
+            <div class="drs-item" [class.current]="! showPBInputData">
+                <a (click)="showPBInputData = false;">{{ uitextResults }}</a>
+            </div>
+        </div>
+    </div>
 
     <form>
 
@@ -65,7 +76,8 @@
                     <div id="calc-card-field-sets-container" [fxLayout]="isPB ? 'row wrap' : 'column'">
                         
                         <ng-template ngFor let-fe [ngForOf]="formElements">
-                            <field-set *ngIf="isFieldset(fe)" [style.display]="getElementStyleDisplay(fe.id)" [fieldSet]=fe
+                            <field-set *ngIf="isFieldset(fe)"
+                                [hidden]="isPB && ! showPBInputData" [style.display]="getElementStyleDisplay(fe.id)" [fieldSet]=fe
                                 (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
                                 (tabPressed)="onTabPressed($event)"
                                 [fxFlex.gt-sm]="isPB ? '1 0 400px' : '1 0 auto'"
@@ -73,7 +85,8 @@
                                 [fxFlex.lt-sm]="isPB ? '1 0 300px' : '1 0 auto'">
                             </field-set>
 
-                            <fieldset-container *ngIf="isFieldsetContainer(fe)" [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe
+                            <fieldset-container *ngIf="isFieldsetContainer(fe)"
+                                [hidden]="isPB && ! showPBInputData" [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe
                                 (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
                                 (tabPressed)="onTabPressed($event)"
                                 fxFlex="1 0 auto">
@@ -110,15 +123,15 @@
                 </mat-card>
 
                 <!-- résultats -->
-                <mat-card id="calc-card-results" [hidden]="calculateDisabledPermanently" [class.pab-results]="isWide"
-                    [fxFlex.gt-sm]="isWide ? '1 0 auto' : '1 0 400px'"
-                    [fxFlex.lt-md]="isWide ? '1 0 auto' : '1 0 500px'"
-                    [fxFlex.lt-sm]="isWide ? '1 0 auto' : '1 0 300px'">
+                <mat-card id="calc-card-results"
+                  [class.pab-results]="isWide" [hidden]="isPB && showPBInputData"
+                  [fxFlex.gt-sm]="isWide ? '1 0 auto' : '1 0 400px'"
+                  [fxFlex.lt-md]="isWide ? '1 0 auto' : '1 0 500px'"
+                  [fxFlex.lt-sm]="isWide ? '1 0 auto' : '1 0 300px'">
 
                     <div id="fake-results-anchor"></div>
 
-                    <quicknav [ngClass.lt-xs]="'extraSmall'" [fxHide.gt-sm]="! isWide" [items]="quicknavItems"
-                        [currentItem]="'results'" [align]="'left'"></quicknav>
+                    <quicknav *ngIf="! isPB" [ngClass.lt-xs]="'extraSmall'" [fxHide.gt-sm]="! isWide" [items]="quicknavItems" [currentItem]="'results'" [align]="'left'"></quicknav>
 
                     <mat-card-header *ngIf="! isWide" [fxHide.lt-md]="! isWide">
                         <mat-card-title>
diff --git a/src/app/components/generic-calculator/calculator.component.scss b/src/app/components/generic-calculator/calculator.component.scss
index 14be9aa77..2062925a9 100644
--- a/src/app/components/generic-calculator/calculator.component.scss
+++ b/src/app/components/generic-calculator/calculator.component.scss
@@ -30,6 +30,55 @@
     display: block;
 }
 
+/** copy of quicknav style */
+#pb-data-results-selector {
+
+    @import "../../../theme.scss";
+
+    display: block;
+    margin-bottom: .5em;
+    width: 100%;
+
+    .drs-item {
+        display: inline;
+        padding: 0 .5em 3px .5em;
+        text-transform: uppercase;
+        font-size: 18px;
+        font-weight: normal;
+
+        &.current {
+            @extend .border-accent;
+            border-bottom-width: 2px;
+            border-bottom-style: solid;
+            font-size: 24px;
+
+            a {
+                // font-weight: bold;
+                @extend .color-accent;
+            }
+        }
+
+        a {
+            cursor: pointer;
+            color: #cbcbcb;
+            &:focus {
+                outline: none;
+            }
+            &:hover {
+                color: #707070;
+            }
+        }
+    }
+
+    .drs-item:first-of-type {
+        padding-left: 0;
+    }
+
+    .drs-item:last-of-type {
+        padding-right: 0;
+    }
+}
+
 mat-card {
     margin-bottom: 2em;
 
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 951751efd..404e789b9 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -124,6 +124,9 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     /** Allows trigerring afterFirstViewChecked() just after calculator is loaded */
     private firstViewChecked = false;
 
+    /** For PreBarrage only: if true, show input data in the right panel, else show results */
+    public showPBInputData = true;
+
     public get ID() {
         if (this._formulaire) {
             return this._formulaire.uid;
@@ -269,6 +272,14 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         return this.intlService.localizeText("INFO_CALCULATOR_USED_BY");
     }
 
+    public get uitextInputData() {
+        return this.intlService.localizeText("INFO_QUICKNAV_INPUT");
+    }
+
+    public get uitextResults() {
+        return this.intlService.localizeText("INFO_QUICKNAV_RESULTS");
+    }
+
     public get quicknavItems() {
         const elts = [ "input", "results" ];
         if (this.isWide && this.hasResults) {
@@ -597,7 +608,7 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
 
     // for "one wide column" layout
     public get isWide() {
-        return (this.isPAB || this.isMRC || this.isPB);
+        return (this.isPAB || this.isMRC || (this.isPB && this.showPBInputData));
     }
 
     // true if current Nub is Solveur
diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
index 42f056be8..1ac51ca73 100644
--- a/src/app/components/pb-schema/pb-schema.component.html
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -1,4 +1,4 @@
-<mat-card-header class="mat-card-header-text-margin-0 bg-accent-light">
+<mat-card-header class="mat-card-header-text-margin-0 bg-accent-light" [ngClass]="{'side': ! showInputData}">
     <mat-card-title>
         {{ title }}
     </mat-card-title>
@@ -20,11 +20,6 @@
             <span class="related-entity-title">
                 {{ prefixedItemDescription }}
             </span>
-            <!-- <mat-select id="add-many-children" [(value)]="childrenToAdd">
-                <mat-option *ngFor="let i of addManyOptionsList" [value]="i">
-                    {{ i }}
-                </mat-option>
-            </mat-select> -->
             <button type="button" mat-icon-button color="primary" [disabled]="! enableCopyButton" (click)="onCopyClick()"
             [title]="uitextCopy">
               <mat-icon>content_copy</mat-icon>
@@ -44,6 +39,6 @@
 
     <div id="schema" #schema></div>
 
-    <pre id="debug">{{ graphDef }} </pre>
+    <!-- <pre id="debug">{{ graphDef }} </pre> -->
 
 </mat-card-content>
diff --git a/src/app/components/pb-schema/pb-schema.component.scss b/src/app/components/pb-schema/pb-schema.component.scss
index f7b1167f4..a398740b8 100644
--- a/src/app/components/pb-schema/pb-schema.component.scss
+++ b/src/app/components/pb-schema/pb-schema.component.scss
@@ -12,6 +12,10 @@ mat-card-header {
     padding-top: 8px;
     color: white;
 
+    &.side {
+        margin-right: -32px;
+    }
+
     mat-card-title {
         font-size: 16px !important;
         margin-bottom: 8px;
@@ -53,7 +57,3 @@ mat-card-content {
     margin-bottom: .5em;
     text-align: center;
 }
-
-#debug {
-    /* display: none; */
-}
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index d9fc50026..4e2f6952f 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -1,4 +1,4 @@
-import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, ViewChild } from "@angular/core";
+import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, ViewChild, Inject, forwardRef } from "@angular/core";
 import { MatDialog } from '@angular/material/dialog';
 
 import {
@@ -12,6 +12,7 @@ import { ApplicationSetupService } from "../../services/app-setup.service";
 import { NotificationsService } from "../../services/notifications.service";
 import { PbSchema } from "../../formulaire/elements/pb-schema";
 import { DialogNewPbCloisonComponent } from "../dialog-new-pb-cloison/dialog-new-pb-cloison.component";
+import { GenericCalculatorComponent } from '../generic-calculator/calculator.component';
 
 /**
  * The interactive schema for calculator type "PreBarrage" (component)
@@ -62,6 +63,7 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     private wallsSuffixes: { [key: string]: number };
 
     public constructor(
+        @Inject(forwardRef(() => GenericCalculatorComponent)) private calculatorComponent: GenericCalculatorComponent,
         private i18nService: I18nService,
         private newPbCloisonDialog: MatDialog,
         private appSetupService: ApplicationSetupService,
@@ -269,6 +271,10 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         return this._isValid;
     }
 
+    public get showInputData(): boolean {
+        return this.calculatorComponent.showPBInputData;
+    }
+
     /**
      * Checks that input value is a valid number, according to input[type="number"] algorithm,
      * and stores it in cell.uiValidity, so that the <td> element can access it and get angry
-- 
GitLab


From de15f04c51b78b4abe9dd27427d09c4bb0aa8b3e Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 8 Jun 2020 16:45:43 +0200
Subject: [PATCH 20/92] Rewrote Promise.then() with async/await

---
 src/app/app.component.ts                      | 133 ++++++++++++++++++
 .../app-setup/app-setup.component.ts          |   9 +-
 .../calculator-list.component.ts              |  81 +++++------
 .../dialog-load-session.component.ts          |  55 ++++----
 .../fixedvar-results/results.component.ts     |  14 +-
 .../calculator.component.ts                   |  35 ++---
 src/app/services/app-setup.service.ts         |  38 +++--
 src/app/services/formulaire.service.ts        |  25 ++--
 .../services/internationalisation.service.ts  |  10 +-
 9 files changed, 254 insertions(+), 146 deletions(-)

diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 7b79d655a..3b4ad89a8 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -823,6 +823,139 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
             if (itemId) {
                 this.scrollToQuicknav(itemId, "auto");
             }
+        this.loadSessionFile(result.file, result.calculators);
+      }
+    }
+
+  public async loadSessionFile(f: File, info?: any) {
+    // notes merge detection: was there already some notes ?
+    const existingNotes = Session.getInstance().documentation;
+    // load
+    try {
+      const data = await this.formulaireService.loadSession(f, info)
+      if (data.hasErrors) {
+        this.notificationsService.notify(this.intlService.localizeText("ERROR_PROBLEM_LOADING_SESSION"), 3500);
+      } else {
+        if (data.loaded && data.loaded.length > 0) {
+          if (! isDevMode()) {
+            this.matomoTracker.trackEvent("userAction", "loadSession");
+          }
+          // notes merge detection: was there already some notes ?
+          const currentNotes = Session.getInstance().documentation;
+          if (existingNotes !== "" && currentNotes !== existingNotes) {
+            this.notificationsService.notify(this.intlService.localizeText("WARNING_SESSION_LOAD_NOTES_MERGED"), 3500);
+          }
+          // go to calc or diagram depending on what was loaded
+          if (data.loaded.length > 1) {
+            this.toDiagram();
+          } else {
+            this.toCalc(data.loaded[0]);
+          }
+        }
+      }
+    } catch(err) {
+      this.notificationsService.notify(this.intlService.localizeText("ERROR_LOADING_SESSION"), 3500);
+      console.error("error loading session - ", err);
+      // rollback to ensure session is clean
+      this.doEmptySession();
+    }
+  }
+
+  /**
+   * Demande au client d'envoyer un email (génère un lien mailto:), pré-rempli
+   * avec un texte standard, et le contenu de la session au format JSON
+   */
+  public reportBug() {
+    const recipient = "bug@cassiopee.g-eau.fr";
+    const subject = "[ISSUE] " + this.intlService.localizeText("INFO_REPORT_BUG_SUBJECT");
+    let body = this.intlService.localizeText("INFO_REPORT_BUG_BODY");
+
+    // add session description
+
+    // get all forms
+    const list = [];
+    for (const c of this._calculators) {
+      list.push({
+        title: c.title,
+        uid: c.uid,
+        selected: true
+      });
+    }
+    let session = this.buildSessionFile(list);
+
+    // compress
+    session = pako.deflate(session, { to: "string" }); // gzip (zlib)
+    session = btoa(session); // base64
+
+    body += session + "\n";
+    body = encodeURIComponent(body);
+
+    const mailtoURL = `mailto:${recipient}?subject=${subject}&body=${body}`;
+
+    // temporarily disable tab closing alert, as tab won't be closed for real
+    this.appSetupService.warnBeforeTabClose = false;
+    window.location.href = mailtoURL;
+    this.appSetupService.warnBeforeTabClose = true;
+  }
+
+  public get revisionInfo(): any {
+    return {
+      jalhyd: {
+        date: jalhydDateRev,
+        version: jalhydVersion,
+      },
+      nghyd: {
+        date: nghydDateRev,
+        version: nghydVersion
+      }
+    };
+  }
+
+  /**
+   * sauvegarde du/des formulaires
+   * @param form formulaire à sélectionner par défaut dans la liste
+   */
+  public saveForm(form?: FormulaireDefinition) {
+    // liste des formulaires
+    const list = [];
+    for (const c of this._calculators) {
+      const uid = c["uid"];
+      const nub = Session.getInstance().findNubByUid(uid);
+      let required = nub.getTargettedNubs().map((req) => {
+        return req.uid;
+      });
+      required = required.filter(
+        (item, index) => required.indexOf(item) === index // deduplicate
+      );
+      list.push({
+        "children": nub.getChildren().map((child) => {
+          return child.uid;
+        }),
+        "requires": required,
+        "selected": form ? (uid === form.uid) : true,
+        "title": c["title"],
+        "uid": uid
+      });
+    }
+    // dialogue de sélection des formulaires à sauver
+    const dialogRef = this.saveSessionDialog.open(
+      DialogSaveSessionComponent,
+      {
+        data: {
+          calculators: list
+        },
+        disableClose: false
+      }
+    );
+    dialogRef.afterClosed().subscribe(result => {
+      if (result) {
+        let name = result.filename;
+
+        // ajout extension ".json"
+        const re = /.+\.json/;
+        const match = re.exec(name.toLowerCase());
+        if (match === null) {
+          name = name + ".json";
         }
     }
 
diff --git a/src/app/components/app-setup/app-setup.component.ts b/src/app/components/app-setup/app-setup.component.ts
index 66b9df462..1b3c52d15 100644
--- a/src/app/components/app-setup/app-setup.component.ts
+++ b/src/app/components/app-setup/app-setup.component.ts
@@ -135,12 +135,11 @@ export class ApplicationSetupComponent implements Observer, OnInit {
         });
     }
 
-    public restoreDefaultValues() {
+    public async restoreDefaultValues() {
         const text = this.intlService.localizeText("INFO_SNACKBAR_DEFAULT_SETTINGS_RESTORED");
-        this.appSetupService.restoreDefaultValues().then(() => {
-            this.snackBar.open(text, "OK", {
-                duration: 2500
-            });
+        await this.appSetupService.restoreDefaultValues();
+        this.snackBar.open(text, "OK", {
+            duration: 2500
         });
     }
 
diff --git a/src/app/components/calculator-list/calculator-list.component.ts b/src/app/components/calculator-list/calculator-list.component.ts
index e4c9a47b2..f850cdd39 100644
--- a/src/app/components/calculator-list/calculator-list.component.ts
+++ b/src/app/components/calculator-list/calculator-list.component.ts
@@ -142,53 +142,49 @@ export class CalculatorListComponent implements OnInit {
         this.filterItems();
     }
 
-    public create(t: CalculatorType) {
-        const p: Promise<FormulaireDefinition> = ServiceFactory.formulaireService.createFormulaire(t);
-        p.then(f => {
-            this.router.navigate(["/calculator", f.uid]);
-            return f;
-        }).then(f => {
-            // on ajoute un ouvrage après l'ouverture du module de calcul "ouvrages parallèles"
-            if (f instanceof FormulaireParallelStructure) {
-                for (const e of f.allFormElements) {
-                    if (e instanceof FieldsetContainer) {
-                        e.addFromTemplate(0);
-                        break;
-                    }
+    public async create(t: CalculatorType) {
+        const f: FormulaireDefinition = await ServiceFactory.instance.formulaireService.createFormulaire(t);
+        await this.router.navigate(["/calculator", f.uid]);
+        // on ajoute un ouvrage après l'ouverture du module de calcul "ouvrages parallèles"
+        if (f instanceof FormulaireParallelStructure) {
+            for (const e of f.allFormElements) {
+                if (e instanceof FieldsetContainer) {
+                    e.addFromTemplate(0);
+                    break;
                 }
             }
-            // on ajoute un ouvrage après l'ouverture du module de calcul "passe à bassins"
-            if (f instanceof FormulairePab) {
-                for (const e of f.allFormElements) {
-                    if (e instanceof FieldsetContainer) {
-                        e.addFromTemplate(0);
-                        break;
-                    }
+        }
+        // on ajoute un ouvrage après l'ouverture du module de calcul "passe à bassins"
+        if (f instanceof FormulairePab) {
+            for (const e of f.allFormElements) {
+                if (e instanceof FieldsetContainer) {
+                    e.addFromTemplate(0);
+                    break;
                 }
             }
-            // adding GUI for default apron, in MacroRugoCompound
-            if (f instanceof FormulaireMacrorugoCompound) {
-                for (const e of f.allFormElements) {
-                    if (e instanceof FieldsetContainer) {
-                        e.addFromTemplate(0, 0, f.currentNub.getChildren()[0]);
-                        break;
-                    }
+        }
+        // adding GUI for default apron, in MacroRugoCompound
+        if (f instanceof FormulaireMacrorugoCompound) {
+            for (const e of f.allFormElements) {
+                if (e instanceof FieldsetContainer) {
+                    e.addFromTemplate(0, 0, f.currentNub.getChildren()[0]);
+                    break;
                 }
             }
-            // on ajoute un YAXN après l'ouverture du module de calcul "somme / produit de puissances"
-            if (f instanceof FormulaireSPP) {
-                for (const e of f.allFormElements) {
-                    if (e instanceof FieldsetContainer) {
-                        e.addFromTemplate(0);
-                        break;
-                    }
+        }
+        // on ajoute un YAXN après l'ouverture du module de calcul "somme / produit de puissances"
+        if (f instanceof FormulaireSPP) {
+            for (const e of f.allFormElements) {
+                if (e instanceof FieldsetContainer) {
+                    e.addFromTemplate(0);
+                    break;
                 }
             }
+        }
 
-            if (this.appSetupService.enableEmptyFieldsOnFormInit) {
-                f.emptyFields();
-            }
-        });
+        if (this.appSetupService.enableEmptyFieldsOnFormInit) {
+            f.emptyFields();
+        }
     }
 
     public get nbOpenCalculators() {
@@ -276,14 +272,15 @@ export class CalculatorListComponent implements OnInit {
         ];
     }
 
-    public loadExample(path: string) {
+    public async loadExample(path: string) {
         const realPath = "app/examples/" + path;
-        this.httpService.httpGetBlobRequestPromise(realPath).then((d) => {
+        try {
+            const d = await this.httpService.httpGetBlobRequestPromise(realPath);
             const f: any = new Blob([d], { type: "application/json" });
             this.appComponent.loadSessionFile(f);
-        }).catch((e) => {
+        } catch(e) {
             console.error("could not load session file", e);
-        });
+        }
     }
 
     public get uitextWelcomeTitle() {
diff --git a/src/app/components/dialog-load-session/dialog-load-session.component.ts b/src/app/components/dialog-load-session/dialog-load-session.component.ts
index 653cf5ff5..02473fe41 100644
--- a/src/app/components/dialog-load-session/dialog-load-session.component.ts
+++ b/src/app/components/dialog-load-session/dialog-load-session.component.ts
@@ -138,35 +138,34 @@ export class DialogLoadSessionComponent {
         this.checkLinkedParamsAndModelsDependencies();
     }
 
-    public onFileSelected(event: any) {
-        if (event.target.files && event.target.files.length) {
-            this.file = event.target.files[0];
-            // reinit file infos
-            this.calculators = [];
-            this.fileFormatVersion = "";
-            // reinit flags
-            this.loadingError = false;
-            this.loadingComplete = false;
-
-            const formService = ServiceFactory.formulaireService;
-            formService.calculatorInfosFromSessionFile(this.file).then(
-                calcInfos => {
-                    this.fileFormatVersion = calcInfos.formatVersion;
-                    this.calculators = calcInfos.nubs;
-                    for (const n of this.calculators) {
-                        n.selected = true;
-                        // if no title was given, generate a default one
-                        if (!n.title) {
-                            n.title = decode(formService.getLocalisedShortTitleFromCalculatorType(n.type));
-                        }
-                    }
-                    this.loadingComplete = true;
-                }
-            ).catch((err) => {
-                console.error(err);
-                this.loadingError = true;
-            });
+    public async onFileSelected(event: any) {
+      if (event.target.files && event.target.files.length) {
+        this.file = event.target.files[0];
+        // reinit file infos
+        this.calculators = [];
+        this.fileFormatVersion = "";
+        // reinit flags
+        this.loadingError = false;
+        this.loadingComplete = false;
+
+        const formService = ServiceFactory.instance.formulaireService;
+        try {
+          const calcInfos: any = await formService.calculatorInfosFromSessionFile(this.file);
+          this.fileFormatVersion = calcInfos.formatVersion;
+          this.calculators = calcInfos.nubs;
+          for (const n of this.calculators) {
+            n.selected = true;
+            // if no title was given, generate a default one
+            if (! n.title) {
+              n.title = decode(formService.getLocalisedShortTitleFromCalculatorType(n.type));
+            }
+          }
+          this.loadingComplete = true;
+        } catch(err) {
+          console.error(err);
+          this.loadingError = true;
         }
+      }
     }
 
     public loadSession() {
diff --git a/src/app/components/fixedvar-results/results.component.ts b/src/app/components/fixedvar-results/results.component.ts
index 8ba53061a..00d4f84e3 100644
--- a/src/app/components/fixedvar-results/results.component.ts
+++ b/src/app/components/fixedvar-results/results.component.ts
@@ -23,21 +23,19 @@ export class ResultsComponentDirective {
         }
     }
 
-    public setFullscreen(element): Promise<void> {
+    public async setFullscreen(element): Promise<void> {
         const sf = <Screenfull>screenfull;
         if (sf.isEnabled) {
-            return sf.request(element).then(() => {
-                this.fullscreenChange(true);
-            });
+            await sf.request(element);
+            this.fullscreenChange(true);
         }
     }
 
-    public exitFullscreen(): Promise<void> {
+    public async exitFullscreen(): Promise<void> {
         const sf = <Screenfull>screenfull;
         if (sf.isEnabled) {
-            return sf.exit().then(() => {
-                this.fullscreenChange(false);
-            });
+            await sf.exit();
+            this.fullscreenChange(false);
         }
     }
 
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 404e789b9..ca5675539 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -716,10 +716,10 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
             disableClose: false
           }
         );
-        dialogRef.afterClosed().subscribe(result => {
+        dialogRef.afterClosed().subscribe(async result => {
           if (result) {
             if (result.generate) {
-              this.formulaireService.createFormulaire(CalculatorType.Pab).then((f: FormulaireDefinition) => {
+                const f: FormulaireDefinition = await this.formulaireService.createFormulaire(CalculatorType.Pab);
                 const pab = (f.currentNub as Pab);
                 const params = pab.prms;
                 // paramètres hydrauliques
@@ -731,7 +731,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
                 pab.addCloisonsFromModel(this._formulaire.currentNub as Cloisons, result.nbBassins);
                 // go to new PAB
                 this.router.navigate(["/calculator", f.uid]);
-              });
             }
           }
         });
@@ -836,7 +835,7 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
      * @param Ys tirant(s) d'eau
      * @param Ifs pente(s)
      */
-    private generateBiefSP(Ys: number | number[], Ifs: number | number[]) {
+    private async generateBiefSP(Ys: number | number[], Ifs: number | number[]) {
         const bief = (this._formulaire.currentNub as Bief);
         const serialisedSection = bief.section.serialise();
         const sectionCopy = Session.getInstance().unserialiseSingleNub(serialisedSection, false).nub;
@@ -859,18 +858,15 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
             }
         }
 
-        this.formulaireService.createFormulaire(CalculatorType.SectionParametree, secParam)
-            .then((f: FormulaireDefinition) => {
+        const f: FormulaireDefinition = await this.formulaireService.createFormulaire(CalculatorType.SectionParametree, secParam);
                 const sp = (f.currentNub as SectionParametree);
                 sp.section.prms.Y.setValues(Ys);
                 sp.section.prms.If.setValues(Ifs);
                 // calculate
                 f.doCompute();
                 // go to new SP
-                this.router.navigate(["/calculator", f.uid]).then();
+        this.router.navigate(["/calculator", f.uid]);
             }
-        );
-    }
 
     public get generateRuSpEnabled(): boolean {
         return this.hasResults && ! this._formulaire.currentNub.result.hasErrorMessages();
@@ -887,7 +883,7 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     /**
      * Génère une SectionParametree à partir du module RegimeUniforme en cours
      */
-    public generateRuSp() {
+    public async generateRuSp() {
         const ru = (this._formulaire.currentNub as RegimeUniforme);
         // copy section
         const serialisedSection = ru.section.serialise();
@@ -903,14 +899,11 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         }
         Session.getInstance().registerNub(secParam);
 
-        this.formulaireService.createFormulaire(CalculatorType.SectionParametree, secParam)
-            .then((f: FormulaireDefinition) => {
+        const f: FormulaireDefinition = await this.formulaireService.createFormulaire(CalculatorType.SectionParametree, secParam);
                 // calculate
                 f.doCompute();
                 // go to new SP
             }
-        );
-    }
 
     public get generatePARSimulationEnabled(): boolean {
         const parCalage = (this._formulaire.currentNub as Par);
@@ -1008,7 +1001,7 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
      * Creates a new Formulaire with a ParSimulation Nub, using given
      * values as parameters
      */
-    protected doGenerateParSimWithValues(v: any) {
+    protected async doGenerateParSimWithValues(v: any) {
         const parCalage = (this._formulaire.currentNub as Par);
         const psim = new ParSimulationParams(
             round(v.Q, 3),      round(v.Z1, 3),     round(v.Z2, 3),
@@ -1021,14 +1014,11 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         parSimulation.parType = parCalage.parType;
         Session.getInstance().registerNub(parSimulation);
 
-        this.formulaireService.createFormulaire(CalculatorType.ParSimulation, parSimulation)
-            .then((f: FormulaireDefinition) => {
+        const f: FormulaireDefinition = await this.formulaireService.createFormulaire(CalculatorType.ParSimulation, parSimulation);
                 // calculate
                 f.doCompute();
                 // go to new ParSimulation
-                this.router.navigate(["/calculator", f.uid]).then();
-            }
-        );
+        this.router.navigate(["/calculator", f.uid]);
     }
 
     /**
@@ -1078,11 +1068,10 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     /**
      * Duplicates the current calculator form
      */
-    public cloneCalculator() {
+    public async cloneCalculator() {
         const serialisedNub: string = this._formulaire.currentNub.serialise({ title: this._formulaire.calculatorName });
         const nubPointer = Session.getInstance().unserialiseSingleNub(serialisedNub);
-        this.formulaireService.createFormulaire(nubPointer.nub.calcType, nubPointer.nub, nubPointer.meta.title).then((f) => {
+        const f = await this.formulaireService.createFormulaire(nubPointer.nub.calcType, nubPointer.nub, nubPointer.meta.title);
             this.router.navigate(["/calculator", f.uid]);
-        });
     }
 }
diff --git a/src/app/services/app-setup.service.ts b/src/app/services/app-setup.service.ts
index 22db10b3c..e0aab36d0 100644
--- a/src/app/services/app-setup.service.ts
+++ b/src/app/services/app-setup.service.ts
@@ -115,13 +115,12 @@ export class ApplicationSetupService extends Observable {
     /**
      * Restore configuration values
      */
-    public restoreDefaultValues(): Promise<any> {
-        return this.readValuesFromConfig().then(() => {
-            // notify I18nService
-            this.notifyObservers({
-                action: "languagePreferenceChanged",
-                languages: [ this.language ]
-            });
+    public async restoreDefaultValues(): Promise<any> {
+        await this.readValuesFromConfig()
+        // notify I18nService
+        this.notifyObservers({
+            action: "languagePreferenceChanged",
+            languages: [ this.language ]
         });
     }
 
@@ -172,18 +171,17 @@ export class ApplicationSetupService extends Observable {
     /**
      * Read configuration values from config (async)
      */
-    private readValuesFromConfig(): Promise<any> {
-        return this.httpService.httpGetRequestPromise(this.CONFIG_FILE_PATH).then((data: any) => {
-            // get all config values (volontarily non-generic to prevent side-effects)
-            this.displayPrecision = data.params.displayPrecision;
-            this.computePrecision = data.params.computePrecision;
-            this.maxIterations = data.params.maxIterations;
-            this.enableNotifications = data.params.enableNotifications;
-            this.enableHotkeys = data.params.enableHotkeys;
-            this.enableEmptyFieldsOnFormInit = data.params.enableEmptyFieldsOnFormInit;
-            this.language = data.params.language;
-            // load themes for calculators list page
-            this.themes = data.themes;
-        });
+    private async readValuesFromConfig(): Promise<any> {
+        const data: any = await this.httpService.httpGetRequestPromise(this.CONFIG_FILE_PATH);
+        // get all config values (volontarily non-generic to prevent side-effects)
+        this.displayPrecision = data.params.displayPrecision;
+        this.computePrecision = data.params.computePrecision;
+        this.maxIterations = data.params.maxIterations;
+        this.enableNotifications = data.params.enableNotifications;
+        this.enableHotkeys = data.params.enableHotkeys;
+        this.enableEmptyFieldsOnFormInit = data.params.enableEmptyFieldsOnFormInit;
+        this.language = data.params.language;
+        // load themes for calculators list page
+        this.themes = data.themes;
     }
 }
diff --git a/src/app/services/formulaire.service.ts b/src/app/services/formulaire.service.ts
index a9a6a7160..c7fa7a3fb 100644
--- a/src/app/services/formulaire.service.ts
+++ b/src/app/services/formulaire.service.ts
@@ -332,12 +332,12 @@ export class FormulaireService extends Observable {
      * @param nub nub existant à associer au formulaire (chargement de session / duplication de module)
      * @param calculatorName nom du module, à afficher dans l'interface
      */
-    public createFormulaire(ct: CalculatorType, nub?: Nub, calculatorName?: string): Promise<FormulaireDefinition> {
+    public async createFormulaire(ct: CalculatorType, nub?: Nub, calculatorName?: string): Promise<FormulaireDefinition> {
         // Crée un formulaire du bon type
         const f: FormulaireDefinition = this.newFormulaire(ct);
         this._formulaires.push(f);
         // Charge la configuration dépendamment du type
-        return this.loadConfig(ct).then(s => {
+        const s: any = await this.loadConfig(ct);
             f.preparseConfig(s);
 
             // Associe le Nub fourni (chargement de session / duplication de module), sinon en crée un nouveau
@@ -422,16 +422,11 @@ export class FormulaireService extends Observable {
                 newDownWall.addChild(newDownwallDevice);
                 f.pabNub.downWall = newDownWall;
             }
-
-            return f;
-
-        }).then(fi => {
             this.notifyObservers({
                 "action": "createForm",
-                "form": fi
-            });
-            return fi;
+            "form": f
         });
+        return f;
     }
 
     /**
@@ -642,10 +637,13 @@ export class FormulaireService extends Observable {
      * obtient des infos (nom, uid des modules de calcul, dépendances) d'un fichier session
      * @param f fichier session
      */
-    public calculatorInfosFromSessionFile(f: File): Promise<{ nubs: any[], formatVersion: string }> {
-        return this.readSingleFile(f).then(s => {
+    public async calculatorInfosFromSessionFile(f: File): Promise<{ nubs: any[], formatVersion: string }> {
+        const s = await this.readSingleFile(f);
             // return value
-            const res: { nubs: any[], formatVersion: string } = {
+        const res: {
+            nubs: any[];
+            formatVersion: string;
+        } = {
                 nubs: [],
                 formatVersion: ""
             };
@@ -663,7 +661,7 @@ export class FormulaireService extends Observable {
                     // list linked params dependencies for each Nub
                     if (e.parameters) {
                         e.parameters.forEach((p) => {
-                            if (p.targetNub && ! nubInfo.requires.includes(p.targetNub)) {
+                        if (p.targetNub && !nubInfo.requires.includes(p.targetNub)) {
                                 nubInfo.requires.push(p.targetNub);
                             }
                         });
@@ -682,7 +680,6 @@ export class FormulaireService extends Observable {
                 res.formatVersion = data.header.format_version;
             }
             return res;
-        });
     }
 
     public saveForm(f: FormulaireDefinition) {
diff --git a/src/app/services/internationalisation.service.ts b/src/app/services/internationalisation.service.ts
index 451931f1b..4d1dabf05 100644
--- a/src/app/services/internationalisation.service.ts
+++ b/src/app/services/internationalisation.service.ts
@@ -59,7 +59,7 @@ export class I18nService extends Observable implements Observer {
      *
      * @param code ISO 639-1 language code
      */
-    public setLanguage(code: string) {
+    public async setLanguage(code: string) {
         // ensure 2-letter language code
         code = code.substring(0, 2);
         // is language supported ?
@@ -79,7 +79,7 @@ export class I18nService extends Observable implements Observer {
                     promisesList.push(this.loadLocalisation(calcType).catch((err) => { /* silent fail */ }));
                 }
             }
-            Promise.all(promisesList).then(() => {
+            await Promise.all(promisesList).then(() => {
                 this.httpGetMessages(code).then((res: any) => {
                     that._Messages = res;
                     // propagate language change to all application
@@ -128,12 +128,10 @@ export class I18nService extends Observable implements Observer {
      * Loads localized messages from JSON files for the given language
      * (general messages files, not calculator-specific ones)
      */
-    private httpGetMessages(lang: string): Promise<void> {
+    private async httpGetMessages(lang: string): Promise<any> {
         const fileName = "messages." + lang + ".json";
         const filePath = "locale/" + fileName;
-        return this.httpService.httpGetRequestPromise(filePath).then((res: any) => {
-            return res;
-        });
+        return await this.httpService.httpGetRequestPromise(filePath);
     }
 
     private getMessageFromCode(c: MessageCode): string {
-- 
GitLab


From 89c2e88ab2ccae798e14e834f8db9b7e35bd768f Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 8 Jun 2020 17:02:14 +0200
Subject: [PATCH 21/92] [WIP] subform system for PreBarrage

---
 src/app/calculators/prebarrage/config.json    | 131 ++++++++--
 .../calculator.component.html                 |   2 +-
 .../calculator.component.ts                   |  37 +--
 .../pb-schema/pb-schema.component.html        |   2 +-
 .../pb-schema/pb-schema.component.scss        |   4 +
 .../pb-schema/pb-schema.component.ts          |  24 +-
 .../formulaire/definition/form-definition.ts  |  18 +-
 .../formulaire/definition/form-prebarrage.ts  | 116 +++++++++
 src/app/services/formulaire.service.ts        | 229 +++++++++---------
 9 files changed, 390 insertions(+), 173 deletions(-)
 create mode 100644 src/app/formulaire/definition/form-prebarrage.ts

diff --git a/src/app/calculators/prebarrage/config.json b/src/app/calculators/prebarrage/config.json
index 754fbc81d..6c72eac2d 100644
--- a/src/app/calculators/prebarrage/config.json
+++ b/src/app/calculators/prebarrage/config.json
@@ -4,24 +4,127 @@
         "type": "pb_schema"
     },
     {
-        "id": "fs_params",
-        "type": "fieldset",
-        "fields": [
+        "id": "subform_river",
+        "type": "subform",
+        "config": [
             {
-                "id": "select_upstream",
-                "type": "select_reference",
-                "reference": "nub",
-                "source": "upstream_stuff"
+                "id": "fs_river_params",
+                "type": "fieldset",
+                "fields": [
+                    "Q",
+                    "Z1",
+                    "Z2"
+                ]
             },
             {
-                "id": "select_downstream",
-                "type": "select_reference",
-                "reference": "nub",
-                "source": "downstream_stuff"
+                "type": "options",
+                "selectIds": [ ]
+            }
+        ]
+    },
+    {
+        "id": "subform_basin",
+        "type": "subform",
+        "config": [
+            {
+                "id": "fs_basin_params",
+                "type": "fieldset",
+                "fields": [
+                    {
+                        "id": "select_upstream",
+                        "type": "select_reference",
+                        "reference": "nub",
+                        "source": "upstream_stuff"
+                    },
+                    {
+                        "id": "select_downstream",
+                        "type": "select_reference",
+                        "reference": "nub",
+                        "source": "downstream_stuff"
+                    },
+                    "Q",
+                    "Z1",
+                    "Z2"
+                ]
             },
-            "Q",
-            "Z1",
-            "Z2"
+            {
+                "type": "options",
+                "selectIds": [ ]
+            }
+        ]
+    },
+    {
+        "id": "subform_wall",
+        "type": "subform",
+        "config": [
+            {
+                "id": "fs_wall_device",
+                "type": "fieldset_template",
+                "calcType": "Structure",
+                "defaultStructType": "SeuilRectangulaire",
+                "defaultLoiDebit": "WeirSubmergedLarinier",
+                "fields": [
+                    {
+                        "id": "select_structure",
+                        "type": "select",
+                        "property": "structureType",
+                        "source": "device_structure_type"
+                    },
+                    {
+                        "id": "select_loidebit",
+                        "type": "select",
+                        "property": "loiDebit",
+                        "source": "device_loi_debit",
+                        "help": {
+                            "Orifice_OrificeSubmerged": "structures/orifice_noye.html",
+                            "SeuilRectangulaire_WeirVillemonte": "structures/kivi.html",
+                            "SeuilRectangulaire_WeirSubmergedLarinier": "structures/fente_noyee.html",
+                            "SeuilTriangulaire_TriangularWeirFree": "structures/dever_triang.html",
+                            "SeuilTriangulaire_TriangularWeirBroad": "structures/dever_triang.html",
+                            "SeuilTriangulaireTrunc_TriangularTruncWeirFree": "structures/dever_triang_tronque.html"
+                        }
+                    },
+                    "h1",
+                    "L",
+                    "CdWSL",
+                    "CdWR",
+                    "CdGR",
+                    "CdT",
+                    "S",
+                    "alpha2",
+                    "BT",
+                    "ZT"
+                ]
+            },
+            {
+                "id": "fs_wall_params",
+                "type": "fieldset",
+                "fields": [
+                    {
+                        "id": "select_upstream",
+                        "type": "select_reference",
+                        "reference": "nub",
+                        "source": "upstream_stuff"
+                    },
+                    {
+                        "id": "select_downstream",
+                        "type": "select_reference",
+                        "reference": "nub",
+                        "source": "downstream_stuff"
+                    },
+                    {
+                        "id": "devices_container",
+                        "type": "template_container",
+                        "templates": [
+                            "fs_wall_device"
+                        ]
+                    }
+                ]
+            },
+            {
+                "type": "options",
+                "selectIds": [ ]
+            }
         ]
     },
     {
diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index fbe397447..24f7b44e4 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -103,7 +103,7 @@
                                 [fxFlex.lt-sm]="isPB ? '1 0 300px' : '1 0 auto'">
 
                                 <pb-schema *ngIf="isPbSchema(fe)" [pbSchema]=fe (radio)=onRadioClick($event)
-                                    (validChange)=onElementValid() (inputChange)=onInputChange($event)>
+                                    (validChange)=onElementValid() (nodeSelected)="onPBNodeSelected($event)">
                                 </pb-schema>
 
                                 <div fxHide.sm fxFlex.gt-sm="0 0 16px"></div>
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index ca5675539..a06206020 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -586,6 +586,13 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         elt.select();
     }
 
+    /** réception d'un événement de clic sur un nœud du schéma de PréBarrage */
+    public onPBNodeSelected(event: any) {
+        console.log("node selected", event.node ? event.node.constructor.name : "zubi");
+        this.showPBInputData = true;
+        // show proper form depending on what was clicked
+    }
+
     public openHelp() {
         window.open("assets/docs/" + this.appSetupService.language + "/calculators/" + this._formulaire.helpLink, "_blank");
     }
@@ -859,14 +866,14 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         }
 
         const f: FormulaireDefinition = await this.formulaireService.createFormulaire(CalculatorType.SectionParametree, secParam);
-                const sp = (f.currentNub as SectionParametree);
-                sp.section.prms.Y.setValues(Ys);
-                sp.section.prms.If.setValues(Ifs);
-                // calculate
-                f.doCompute();
-                // go to new SP
+        const sp = (f.currentNub as SectionParametree);
+        sp.section.prms.Y.setValues(Ys);
+        sp.section.prms.If.setValues(Ifs);
+        // calculate
+        f.doCompute();
+        // go to new SP
         this.router.navigate(["/calculator", f.uid]);
-            }
+    }
 
     public get generateRuSpEnabled(): boolean {
         return this.hasResults && ! this._formulaire.currentNub.result.hasErrorMessages();
@@ -900,10 +907,10 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         Session.getInstance().registerNub(secParam);
 
         const f: FormulaireDefinition = await this.formulaireService.createFormulaire(CalculatorType.SectionParametree, secParam);
-                // calculate
-                f.doCompute();
-                // go to new SP
-            }
+        // calculate
+        f.doCompute();
+        // go to new SP
+    }
 
     public get generatePARSimulationEnabled(): boolean {
         const parCalage = (this._formulaire.currentNub as Par);
@@ -1015,9 +1022,9 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         Session.getInstance().registerNub(parSimulation);
 
         const f: FormulaireDefinition = await this.formulaireService.createFormulaire(CalculatorType.ParSimulation, parSimulation);
-                // calculate
-                f.doCompute();
-                // go to new ParSimulation
+        // calculate
+        f.doCompute();
+        // go to new ParSimulation
         this.router.navigate(["/calculator", f.uid]);
     }
 
@@ -1072,6 +1079,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         const serialisedNub: string = this._formulaire.currentNub.serialise({ title: this._formulaire.calculatorName });
         const nubPointer = Session.getInstance().unserialiseSingleNub(serialisedNub);
         const f = await this.formulaireService.createFormulaire(nubPointer.nub.calcType, nubPointer.nub, nubPointer.meta.title);
-            this.router.navigate(["/calculator", f.uid]);
+        this.router.navigate(["/calculator", f.uid]);
     }
 }
diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
index 1ac51ca73..f8bb9bbc0 100644
--- a/src/app/components/pb-schema/pb-schema.component.html
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -39,6 +39,6 @@
 
     <div id="schema" #schema></div>
 
-    <!-- <pre id="debug">{{ graphDef }} </pre> -->
+    <pre id="debug">{{ graphDef }} </pre>
 
 </mat-card-content>
diff --git a/src/app/components/pb-schema/pb-schema.component.scss b/src/app/components/pb-schema/pb-schema.component.scss
index a398740b8..c0834e6b7 100644
--- a/src/app/components/pb-schema/pb-schema.component.scss
+++ b/src/app/components/pb-schema/pb-schema.component.scss
@@ -57,3 +57,7 @@ mat-card-content {
     margin-bottom: .5em;
     text-align: center;
 }
+
+#debug {
+    display: none;
+}
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 4e2f6952f..6728c7829 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -46,9 +46,9 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     @Output()
     private validChange = new EventEmitter();
 
-    /** événément de changement de valeur d'un input */
+    /** événément de sélection d'un nœud du graphique Mermaid */
     @Output()
-    private inputChange = new EventEmitter();
+    private nodeSelected = new EventEmitter();
 
     /** underlying PB */
     private model: PreBarrage;
@@ -255,6 +255,10 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
                 }
             }
         }
+        // show proper form, hide results
+        this.nodeSelected.emit({
+            node: this._selectedItem
+        });
     }
 
     // for debug only
@@ -271,24 +275,11 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         return this._isValid;
     }
 
+    /** used for a cosmetics CSS trick only (mat-card-header right margin) */
     public get showInputData(): boolean {
         return this.calculatorComponent.showPBInputData;
     }
 
-    /**
-     * Checks that input value is a valid number, according to input[type="number"] algorithm,
-     * and stores it in cell.uiValidity, so that the <td> element can access it and get angry
-     * if input is invalid
-     */
-    public inputValueChanged($event, cell) {
-        if ($event && $event.target && $event.target.validity) {
-            cell.uiValidity = $event.target.validity.valid;
-        }
-        this.updateValidity();
-        // send input change event (used to reset form results)
-        this.inputChange.emit();
-    }
-
     public get prefixedItemDescription(): string {
         let desc = this.itemDesription(this._selectedItem);
         if (this._selectedItem instanceof PbCloison) {
@@ -420,6 +411,7 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         // check that at least 1 basin is present and a route from river
         // upstream to river downstream exists (2nd check includes 1st)
         this._isValid = this.model.hasUpDownConnection();
+        console.log("schéma valide", this._isValid);
         this.validChange.emit();
     }
 
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 707f0268c..a4a0732ea 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -50,7 +50,7 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
     protected _calculateDisabled = false;
 
     /** fichier de configuration */
-    private _jsonConfig: {};
+    protected _jsonConfig: {};
 
     /** copy of options.resultsHelp read by FormDefinition.parseOptions() */
     public helpLinks: { [key: string]: string };
@@ -200,31 +200,25 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
     public removeFieldset(fs: FieldSet) {
     }
 
-    private parse_fieldset(json: {}, nub?: Nub) {
+    protected parse_fieldset(json: {}, nub?: Nub) {
         const fs = this.createFieldset(this, json, undefined, nub);
         fs.parseConfig(json);
         this.afterParseFieldset(fs);
     }
 
-    private parse_template_container(json: {}, templates: any[]) {
+    protected parse_template_container(json: {}, templates: any[]) {
         const fsc: FieldsetContainer = new FieldsetContainer(this);
         fsc.parseConfig(json, templates);
         this.kids.push(fsc);
     }
 
+    // @TODO move to FormulairePAB by overloading parseConfig()
     private parse_pab_table(json: {}) {
         const tab: PabTable = new PabTable(this);
         tab.parseConfig(json);
         this.kids.push(tab);
     }
 
-    private parse_pb_schema(json: {}) {
-        const sch: PbSchema = new PbSchema(this);
-        sch.parseConfig(json);
-        this.kids.push(sch);
-    }
-
-
     /**
      * 1ère passe d'analyse de la configuration
      */
@@ -282,10 +276,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
                     this.parse_pab_table(conf);
                     break;
 
-                case "pb_schema": // not generic at all
-                    this.parse_pb_schema(conf);
-                    break;
-
                 default:
                     throw new Error(`type d'objet de module de calcul ${type} non pris en charge`);
             }
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
new file mode 100644
index 000000000..d15c13b37
--- /dev/null
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -0,0 +1,116 @@
+import { CalculatorType } from "jalhyd";
+
+import { FormulaireFixedVar } from "./form-fixedvar";
+import { FormulaireParallelStructure } from "./form-parallel-structures";
+import { PbSchema } from "../elements/pb-schema";
+
+/**
+ * Formulaire pour les PréBarrage
+ */
+export class FormulairePrebarrage extends FormulaireFixedVar {
+
+    /** child form for river upstream/downstream elevations and flow */
+    private riverForm: FormulaireFixedVar;
+
+    /** child form for basins dimensions */
+    private basinForm: FormulaireFixedVar;
+
+    /** child form for walls (repeatable devices) */
+    private wallForm: FormulaireParallelStructure;
+
+    public constructor() {
+        super();
+        console.log("Construction du FormPreBarrage !!");
+        this.riverForm = new FormulaireFixedVar();
+        this.riverForm.defaultProperties["calcType"] = CalculatorType.PreBarrage;
+        this.basinForm = new FormulaireFixedVar();
+        this.basinForm.defaultProperties["calcType"] = CalculatorType.PbBassin;
+        this.wallForm = new FormulaireParallelStructure();
+        this.wallForm.defaultProperties["calcType"] = CalculatorType.PbCloison;
+    }
+
+    protected parseOptions(json: {}) {
+        // super.parseOptions(json);
+        // @TODO parse children forms configs
+    }
+
+    public parseConfig(json?: {}) {
+        console.log("> parse confaïgue");
+        if (json !== undefined) {
+            this._jsonConfig = json;
+        }
+        for (const conf_index in this._jsonConfig) {
+            const conf = this._jsonConfig[conf_index];
+            const type: string = conf["type"];
+
+            switch (type) {
+                // options globales
+                case "options":
+                    break;
+
+                case "subform":
+                    this.parse_subform(conf);
+                    break;
+
+                case "pb_schema":
+                    this.parse_pb_schema(conf);
+                    break;
+
+                default:
+                    throw new Error(`type d'objet de module de calcul ${type} non pris en charge`);
+            }
+        }
+        this.completeParse(this._jsonConfig);
+    }
+
+    private parse_subform(json: {}) {
+        console.log("parse sf", json);
+        switch (json["id"]) {
+            case "subform_river":
+                this.riverForm.currentNub = this.currentNub;
+                this.riverForm.parseConfig(json["config"]);
+                break;
+            case "subform_basin":
+                // this.basinForm.currentNub = this.currentNub;
+                this.basinForm.parseConfig(json["config"]);
+                break;
+            case "subform_wall":
+                // this.wallForm.currentNub = this.currentNub;
+                this.wallForm.parseConfig(json["config"]);
+                break;
+        }
+        // console.log(">> triggering parsing of new subform", subform.constructor.name, subform.uid);
+        // subform.parseConfig(json);
+        // this.kids.push(subform);
+        // f.defaultProperties["calcType"] = ct;
+    }
+
+    private parse_pb_schema(json: {}) {
+        const sch: PbSchema = new PbSchema(this);
+        sch.parseConfig(json);
+        this.kids.push(sch);
+    }
+
+    protected completeParse(json: {}, firstNotif: boolean = true) {
+        // super.completeParse(json);
+        // @TODO parse children forms configs
+    }
+
+    // interface Observer
+
+    /* public update(sender: IObservable, data: any) {
+        // copied from FormDefinition, to avoid calling super.update()
+        if (sender instanceof Nub) {
+            switch (data.action) {
+                case "resultUpdated":
+                    // forward Nub results update notification to FormCompute objects
+                    this.reaffectResultComponents();
+                    break;
+            }
+        }
+        // copied from FormFixedVar, to avoid calling super.update()
+        if (data.action === "propertyChange") {
+            this.reset();
+        }
+    } */
+}
diff --git a/src/app/services/formulaire.service.ts b/src/app/services/formulaire.service.ts
index c7fa7a3fb..281e2f6b8 100644
--- a/src/app/services/formulaire.service.ts
+++ b/src/app/services/formulaire.service.ts
@@ -42,6 +42,7 @@ import { FormulaireSection } from "../formulaire/definition/form-section";
 import { FormulairePAR } from "../formulaire/definition/form-par";
 import { FormulaireVerificateur } from "../formulaire/definition/form-verificateur";
 import { FormulaireEspece } from "../formulaire/definition/form-espece";
+import { FormulairePrebarrage } from "../formulaire/definition/form-prebarrage";
 
 @Injectable()
 export class FormulaireService extends Observable {
@@ -317,6 +318,10 @@ export class FormulaireService extends Observable {
                 f = new FormulaireEspece();
                 break;
 
+            case CalculatorType.PreBarrage:
+                f = new FormulairePrebarrage();
+                break;
+
             default:
                 f = new FormulaireFixedVar();
         }
@@ -338,92 +343,92 @@ export class FormulaireService extends Observable {
         this._formulaires.push(f);
         // Charge la configuration dépendamment du type
         const s: any = await this.loadConfig(ct);
-            f.preparseConfig(s);
+        f.preparseConfig(s);
 
-            // Associe le Nub fourni (chargement de session / duplication de module), sinon en crée un nouveau
-            if (nub) {
-                f.currentNub = nub;
-            } else {
-                f.initNub();
-            }
+        // Associe le Nub fourni (chargement de session / duplication de module), sinon en crée un nouveau
+        if (nub) {
+            f.currentNub = nub;
+        } else {
+            f.initNub();
+        }
 
-            // Restaure le nom du module, sinon affecte le nom par défaut
-            let tempName: string;
-            if (calculatorName) {
-                tempName = calculatorName;
-            } else {
-                tempName = decode(this.getLocalisedShortTitleFromCalculatorType(ct));
-            }
-            // Suffixe le nom du module si nécessaire
-            f.calculatorName = this.suffixNameIfNeeded(tempName);
-
-            f.parseConfig();
-
-            // add fieldsets for existing Structures if needed
-            // (when loading session only)
-            if (f.currentNub instanceof ParallelStructure) {
-                for (const struct of f.currentNub.structures) {
-                    for (const e of f.allFormElements) {
-                        if (e instanceof FieldsetContainer) { // @TODO manage many containers one day ?
-                            e.addFromTemplate(0, undefined, struct);
-                        }
+        // Restaure le nom du module, sinon affecte le nom par défaut
+        let tempName: string;
+        if (calculatorName) {
+            tempName = calculatorName;
+        } else {
+            tempName = decode(this.getLocalisedShortTitleFromCalculatorType(ct));
+        }
+        // Suffixe le nom du module si nécessaire
+        f.calculatorName = this.suffixNameIfNeeded(tempName);
+
+        f.parseConfig();
+
+        // add fieldsets for existing Structures if needed
+        // (when loading session only)
+        if (f.currentNub instanceof ParallelStructure) {
+            for (const struct of f.currentNub.structures) {
+                for (const e of f.allFormElements) {
+                    if (e instanceof FieldsetContainer) { // @TODO manage many containers one day ?
+                        e.addFromTemplate(0, undefined, struct);
                     }
                 }
             }
+        }
 
-            // add fieldsets for existing YAXN if needed
-            // (when loading session only)
-            if (f.currentNub instanceof SPP) {
-                for (const c of f.currentNub.getChildren()) {
-                    for (const e of f.allFormElements) {
-                        if (e instanceof FieldsetContainer) { // @TODO manage many containers one day ?
-                            e.addFromTemplate(0, undefined, c);
-                        }
+        // add fieldsets for existing YAXN if needed
+        // (when loading session only)
+        if (f.currentNub instanceof SPP) {
+            for (const c of f.currentNub.getChildren()) {
+                for (const e of f.allFormElements) {
+                    if (e instanceof FieldsetContainer) { // @TODO manage many containers one day ?
+                        e.addFromTemplate(0, undefined, c);
                     }
                 }
             }
+        }
 
-            // when creating a new Pab, add one wall with one device, plus the downwall
-            // (when loading session, those items are already present)
-            if (
-                f instanceof FormulairePab
-                && f.currentNub instanceof Pab
-                && f.currentNub.children.length === 0
-                && f.currentNub.downWall === undefined
-            ) {
-                // 1. one wall
-                const newWall = Session.getInstance().createNub(
-                    new Props({
-                        calcType: CalculatorType.Cloisons
-                    })
-                ) as Cloisons;
-                // add new default device for new wall
-                const newDevice = Session.getInstance().createNub(
-                    new Props({
-                        calcType: CalculatorType.Structure,
-                        loiDebit: newWall.getDefaultLoiDebit()
-                    })
-                );
-                newWall.addChild(newDevice);
-                f.pabNub.addChild(newWall);
-                // 2. downwall
-                const newDownWall = Session.getInstance().createNub(
-                    new Props({
-                        calcType: CalculatorType.CloisonAval
-                    })
-                ) as CloisonAval;
-                // add new default device for new downwall
-                const newDownwallDevice = Session.getInstance().createNub(
-                    new Props({
-                        calcType: CalculatorType.Structure,
-                        loiDebit: newDownWall.getDefaultLoiDebit()
-                    })
-                );
-                newDownWall.addChild(newDownwallDevice);
-                f.pabNub.downWall = newDownWall;
-            }
-            this.notifyObservers({
-                "action": "createForm",
+        // when creating a new Pab, add one wall with one device, plus the downwall
+        // (when loading session, those items are already present)
+        if (
+            f instanceof FormulairePab
+            && f.currentNub instanceof Pab
+            && f.currentNub.children.length === 0
+            && f.currentNub.downWall === undefined
+        ) {
+            // 1. one wall
+            const newWall = Session.getInstance().createNub(
+                new Props({
+                    calcType: CalculatorType.Cloisons
+                })
+            ) as Cloisons;
+            // add new default device for new wall
+            const newDevice = Session.getInstance().createNub(
+                new Props({
+                    calcType: CalculatorType.Structure,
+                    loiDebit: newWall.getDefaultLoiDebit()
+                })
+            );
+            newWall.addChild(newDevice);
+            f.pabNub.addChild(newWall);
+            // 2. downwall
+            const newDownWall = Session.getInstance().createNub(
+                new Props({
+                    calcType: CalculatorType.CloisonAval
+                })
+            ) as CloisonAval;
+            // add new default device for new downwall
+            const newDownwallDevice = Session.getInstance().createNub(
+                new Props({
+                    calcType: CalculatorType.Structure,
+                    loiDebit: newDownWall.getDefaultLoiDebit()
+                })
+            );
+            newDownWall.addChild(newDownwallDevice);
+            f.pabNub.downWall = newDownWall;
+        }
+        this.notifyObservers({
+            "action": "createForm",
             "form": f
         });
         return f;
@@ -639,47 +644,47 @@ export class FormulaireService extends Observable {
      */
     public async calculatorInfosFromSessionFile(f: File): Promise<{ nubs: any[], formatVersion: string }> {
         const s = await this.readSingleFile(f);
-            // return value
+        // return value
         const res: {
             nubs: any[];
             formatVersion: string;
         } = {
-                nubs: [],
-                formatVersion: ""
-            };
-            const data = JSON.parse(s);
-            // liste des noms de modules de calcul
-            if (data.session && Array.isArray(data.session)) {
-                data.session.forEach((e: any) => {
-                    const nubInfo = {
-                        uid: e.uid,
-                        title: e.meta && e.meta.title ? e.meta.title : undefined,
-                        requires: [],
-                        children: [],
-                        type: e.props.calcType
-                    };
-                    // list linked params dependencies for each Nub
-                    if (e.parameters) {
-                        e.parameters.forEach((p) => {
+            nubs: [],
+            formatVersion: ""
+        };
+        const data = JSON.parse(s);
+        // liste des noms de modules de calcul
+        if (data.session && Array.isArray(data.session)) {
+            data.session.forEach((e: any) => {
+                const nubInfo = {
+                    uid: e.uid,
+                    title: e.meta && e.meta.title ? e.meta.title : undefined,
+                    requires: [],
+                    children: [],
+                    type: e.props.calcType
+                };
+                // list linked params dependencies for each Nub
+                if (e.parameters) {
+                    e.parameters.forEach((p) => {
                         if (p.targetNub && !nubInfo.requires.includes(p.targetNub)) {
-                                nubInfo.requires.push(p.targetNub);
-                            }
-                        });
-                    }
-                    // list children nubs for each Nub
-                    if (e.children) {
-                        e.children.forEach((p) => {
-                            nubInfo.children.push(p.uid);
-                        });
-                    }
-                    res.nubs.push(nubInfo);
-                });
-            }
-            // version du format de fichier
-            if (data.header && data.header.format_version) {
-                res.formatVersion = data.header.format_version;
-            }
-            return res;
+                            nubInfo.requires.push(p.targetNub);
+                        }
+                    });
+                }
+                // list children nubs for each Nub
+                if (e.children) {
+                    e.children.forEach((p) => {
+                        nubInfo.children.push(p.uid);
+                    });
+                }
+                res.nubs.push(nubInfo);
+            });
+        }
+        // version du format de fichier
+        if (data.header && data.header.format_version) {
+            res.formatVersion = data.header.format_version;
+        }
+        return res;
     }
 
     public saveForm(f: FormulaireDefinition) {
-- 
GitLab


From 3fa5868d18ce2871c9640ff4338bb16deebe646e Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 9 Jun 2020 11:07:27 +0200
Subject: [PATCH 22/92] Updated dependencies

---
 package-lock.json | 1826 +++++++++++++++++++++++++--------------------
 1 file changed, 1006 insertions(+), 820 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 24a7c058d..4e9c56402 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,9 +21,9 @@
       },
       "dependencies": {
         "rxjs": {
-          "version": "6.5.3",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
-          "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -131,25 +131,11 @@
             "uri-js": "^4.2.2"
           }
         },
-        "chokidar": {
-          "version": "2.1.8",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.3",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "normalize-path": "^3.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.2.1",
-            "upath": "^1.1.1"
-          }
+        "core-js": {
+          "version": "3.6.4",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
+          "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==",
+          "dev": true
         },
         "fast-deep-equal": {
           "version": "3.1.3",
@@ -341,6 +327,52 @@
         "rxjs": "6.5.5"
       },
       "dependencies": {
+        "@angular-devkit/core": {
+          "version": "9.1.7",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.7.tgz",
+          "integrity": "sha512-guvolu9Cl+qYMTtedLZD9wCqustJjdqzJ2psD2C1Sr1LrX9T0mprmDldR/YnhsitThveJEb6sM/0EvqWxoSvKw==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.0",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.5.4",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+          "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+          "dev": true
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+          "dev": true
+        },
+        "magic-string": {
+          "version": "0.25.7",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+          "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+          "dev": true,
+          "requires": {
+            "sourcemap-codec": "^1.4.4"
+          }
+        },
         "rxjs": {
           "version": "6.5.5",
           "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
@@ -348,6 +380,14 @@
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
+          },
+          "dependencies": {
+            "tslib": {
+              "version": "1.13.0",
+              "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+              "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+              "dev": true
+            }
           }
         },
         "tslib": {
@@ -418,6 +458,79 @@
         "uuid": "8.1.0"
       },
       "dependencies": {
+        "@angular-devkit/architect": {
+          "version": "0.901.7",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.7.tgz",
+          "integrity": "sha512-yW/PUEqle55QihOFbmeNXaVTodhfeXkteoFDUpz+YpX3xiQDXDtNbIJSzKOQTojtBKdSMKMvZkQLr+RAa7/1EA==",
+          "dev": true,
+          "requires": {
+            "@angular-devkit/core": "9.1.7",
+            "rxjs": "6.5.4"
+          },
+          "dependencies": {
+            "rxjs": {
+              "version": "6.5.4",
+              "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+              "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+              "dev": true,
+              "requires": {
+                "tslib": "^1.9.0"
+              },
+              "dependencies": {
+                "tslib": {
+                  "version": "1.13.0",
+                  "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+                  "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+                  "dev": true
+                }
+              }
+            }
+          }
+        },
+        "@angular-devkit/core": {
+          "version": "9.1.7",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.7.tgz",
+          "integrity": "sha512-guvolu9Cl+qYMTtedLZD9wCqustJjdqzJ2psD2C1Sr1LrX9T0mprmDldR/YnhsitThveJEb6sM/0EvqWxoSvKw==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.0",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.5.4",
+            "source-map": "0.7.3"
+          },
+          "dependencies": {
+            "rxjs": {
+              "version": "6.5.4",
+              "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+              "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+              "dev": true,
+              "requires": {
+                "tslib": "^1.9.0"
+              },
+              "dependencies": {
+                "tslib": {
+                  "version": "1.13.0",
+                  "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+                  "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+                  "dev": true
+                }
+              }
+            }
+          }
+        },
+        "ajv": {
+          "version": "6.12.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+          "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
         "ansi-colors": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
@@ -522,16 +635,10 @@
             "color-name": "~1.1.4"
           }
         },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-          "dev": true
-        },
-        "fill-range": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
           "dev": true,
           "requires": {
             "locate-path": "^5.0.0",
@@ -579,12 +686,6 @@
             "p-limit": "^2.2.0"
           }
         },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true
-        },
         "minimist": {
           "version": "1.2.5",
           "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
@@ -799,6 +900,17 @@
         "semver": "^5.5.0"
       }
     },
+    "@babel/compat-data": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz",
+      "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.12.0",
+        "invariant": "^2.2.4",
+        "semver": "^5.5.0"
+      }
+    },
     "@babel/core": {
       "version": "7.9.6",
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz",
@@ -1410,790 +1522,297 @@
       }
     },
     "@babel/helper-member-expression-to-functions": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
-      "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz",
+      "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
-      },
-      "dependencies": {
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@babel/types": "^7.10.1"
       }
     },
     "@babel/helper-module-imports": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
-      "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz",
+      "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
-      },
-      "dependencies": {
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@babel/types": "^7.10.1"
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.8.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz",
-      "integrity": "sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz",
+      "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.8.3",
-        "@babel/helper-replace-supers": "^7.8.6",
-        "@babel/helper-simple-access": "^7.8.3",
-        "@babel/helper-split-export-declaration": "^7.8.3",
-        "@babel/template": "^7.8.6",
-        "@babel/types": "^7.8.6",
+        "@babel/helper-module-imports": "^7.10.1",
+        "@babel/helper-replace-supers": "^7.10.1",
+        "@babel/helper-simple-access": "^7.10.1",
+        "@babel/helper-split-export-declaration": "^7.10.1",
+        "@babel/template": "^7.10.1",
+        "@babel/types": "^7.10.1",
         "lodash": "^4.17.13"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.8.3"
-          }
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
-          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
+          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.8.3"
+            "@babel/highlight": "^7.10.1"
           }
         },
         "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
+          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
           "dev": true,
           "requires": {
+            "@babel/helper-validator-identifier": "^7.10.1",
             "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
             "js-tokens": "^4.0.0"
           }
         },
-        "@babel/parser": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
-          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
-          "dev": true
-        },
         "@babel/template": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6"
-          }
-        },
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
+          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
           "dev": true,
           "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
+            "@babel/code-frame": "^7.10.1",
+            "@babel/parser": "^7.10.1",
+            "@babel/types": "^7.10.1"
           }
         }
       }
     },
     "@babel/helper-optimise-call-expression": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
-      "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz",
+      "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
-      },
-      "dependencies": {
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@babel/types": "^7.10.1"
       }
     },
     "@babel/helper-plugin-utils": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
-      "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz",
+      "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==",
       "dev": true
     },
     "@babel/helper-regex": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz",
-      "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz",
+      "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==",
       "dev": true,
       "requires": {
         "lodash": "^4.17.13"
       }
     },
     "@babel/helper-remap-async-to-generator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz",
-      "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz",
+      "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.8.3",
-        "@babel/helper-wrap-function": "^7.8.3",
-        "@babel/template": "^7.8.3",
-        "@babel/traverse": "^7.8.3",
-        "@babel/types": "^7.8.3"
+        "@babel/helper-annotate-as-pure": "^7.10.1",
+        "@babel/helper-wrap-function": "^7.10.1",
+        "@babel/template": "^7.10.1",
+        "@babel/traverse": "^7.10.1",
+        "@babel/types": "^7.10.1"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.8.3"
-          }
-        },
-        "@babel/generator": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
-          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
+          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.8.7",
-            "jsesc": "^2.5.1",
-            "lodash": "^4.17.13",
-            "source-map": "^0.5.0"
+            "@babel/highlight": "^7.10.1"
           }
         },
-        "@babel/helper-function-name": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
-          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+        "@babel/highlight": {
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
+          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
           "dev": true,
           "requires": {
-            "@babel/helper-get-function-arity": "^7.8.3",
-            "@babel/template": "^7.8.3",
-            "@babel/types": "^7.8.3"
+            "@babel/helper-validator-identifier": "^7.10.1",
+            "chalk": "^2.0.0",
+            "js-tokens": "^4.0.0"
           }
         },
-        "@babel/helper-get-function-arity": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
-          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+        "@babel/template": {
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
+          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.8.3"
+            "@babel/code-frame": "^7.10.1",
+            "@babel/parser": "^7.10.1",
+            "@babel/types": "^7.10.1"
           }
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
-          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+        }
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz",
+      "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.10.1",
+        "@babel/helper-optimise-call-expression": "^7.10.1",
+        "@babel/traverse": "^7.10.1",
+        "@babel/types": "^7.10.1"
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz",
+      "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.10.1",
+        "@babel/types": "^7.10.1"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
+          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.8.3"
+            "@babel/highlight": "^7.10.1"
           }
         },
         "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
+          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
           "dev": true,
           "requires": {
+            "@babel/helper-validator-identifier": "^7.10.1",
             "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
             "js-tokens": "^4.0.0"
           }
         },
-        "@babel/parser": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
-          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
-          "dev": true
-        },
-        "@babel/template": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6"
-          }
-        },
-        "@babel/traverse": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
-          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/generator": "^7.8.6",
-            "@babel/helper-function-name": "^7.8.3",
-            "@babel/helper-split-export-declaration": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6",
-            "debug": "^4.1.0",
-            "globals": "^11.1.0",
-            "lodash": "^4.17.13"
-          }
-        },
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "@babel/helper-replace-supers": {
-      "version": "7.8.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
-      "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.8.3",
-        "@babel/helper-optimise-call-expression": "^7.8.3",
-        "@babel/traverse": "^7.8.6",
-        "@babel/types": "^7.8.6"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.8.3"
-          }
-        },
-        "@babel/generator": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
-          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.8.7",
-            "jsesc": "^2.5.1",
-            "lodash": "^4.17.13",
-            "source-map": "^0.5.0"
-          }
-        },
-        "@babel/helper-function-name": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
-          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-get-function-arity": "^7.8.3",
-            "@babel/template": "^7.8.3",
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-get-function-arity": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
-          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
-          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "@babel/parser": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
-          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
-          "dev": true
-        },
-        "@babel/template": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6"
-          }
-        },
-        "@babel/traverse": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
-          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/generator": "^7.8.6",
-            "@babel/helper-function-name": "^7.8.3",
-            "@babel/helper-split-export-declaration": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6",
-            "debug": "^4.1.0",
-            "globals": "^11.1.0",
-            "lodash": "^4.17.13"
-          }
-        },
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "@babel/helper-simple-access": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
-      "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.8.3",
-        "@babel/types": "^7.8.3"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.8.3"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "@babel/parser": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
-          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
-          "dev": true
-        },
-        "@babel/template": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6"
-          }
-        },
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
-      }
-    },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
-      "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.4.4"
-      }
-    },
-    "@babel/helper-wrap-function": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
-      "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.8.3",
-        "@babel/template": "^7.8.3",
-        "@babel/traverse": "^7.8.3",
-        "@babel/types": "^7.8.3"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.8.3"
-          }
-        },
-        "@babel/generator": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
-          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.8.7",
-            "jsesc": "^2.5.1",
-            "lodash": "^4.17.13",
-            "source-map": "^0.5.0"
-          }
-        },
-        "@babel/helper-function-name": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
-          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-get-function-arity": "^7.8.3",
-            "@babel/template": "^7.8.3",
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-get-function-arity": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
-          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
-          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "@babel/parser": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
-          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
-          "dev": true
-        },
-        "@babel/template": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6"
-          }
-        },
-        "@babel/traverse": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
-          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/generator": "^7.8.6",
-            "@babel/helper-function-name": "^7.8.3",
-            "@babel/helper-split-export-declaration": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6",
-            "debug": "^4.1.0",
-            "globals": "^11.1.0",
-            "lodash": "^4.17.13"
-          }
-        },
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+        "@babel/template": {
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
+          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "@babel/code-frame": "^7.10.1",
+            "@babel/parser": "^7.10.1",
+            "@babel/types": "^7.10.1"
           }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
         }
       }
     },
-    "@babel/helpers": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz",
-      "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==",
+    "@babel/helper-split-export-declaration": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz",
+      "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.1"
+      }
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz",
+      "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==",
+      "dev": true
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz",
+      "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.8.3",
-        "@babel/traverse": "^7.8.4",
-        "@babel/types": "^7.8.3"
+        "@babel/helper-function-name": "^7.10.1",
+        "@babel/template": "^7.10.1",
+        "@babel/traverse": "^7.10.1",
+        "@babel/types": "^7.10.1"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.8.3"
-          }
-        },
-        "@babel/generator": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
-          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.8.7",
-            "jsesc": "^2.5.1",
-            "lodash": "^4.17.13",
-            "source-map": "^0.5.0"
-          }
-        },
-        "@babel/helper-function-name": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
-          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-get-function-arity": "^7.8.3",
-            "@babel/template": "^7.8.3",
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-get-function-arity": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
-          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
-          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
+          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.8.3"
+            "@babel/highlight": "^7.10.1"
           }
         },
         "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
+          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
           "dev": true,
           "requires": {
+            "@babel/helper-validator-identifier": "^7.10.1",
             "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
             "js-tokens": "^4.0.0"
           }
         },
-        "@babel/parser": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
-          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
-          "dev": true
-        },
         "@babel/template": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
+          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6"
+            "@babel/code-frame": "^7.10.1",
+            "@babel/parser": "^7.10.1",
+            "@babel/types": "^7.10.1"
           }
-        },
-        "@babel/traverse": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
-          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
+        }
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz",
+      "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.10.1",
+        "@babel/traverse": "^7.10.1",
+        "@babel/types": "^7.10.1"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
+          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/generator": "^7.8.6",
-            "@babel/helper-function-name": "^7.8.3",
-            "@babel/helper-split-export-declaration": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6",
-            "debug": "^4.1.0",
-            "globals": "^11.1.0",
-            "lodash": "^4.17.13"
+            "@babel/highlight": "^7.10.1"
           }
         },
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+        "@babel/highlight": {
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
+          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
           "dev": true,
           "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
+            "@babel/helper-validator-identifier": "^7.10.1",
+            "chalk": "^2.0.0",
+            "js-tokens": "^4.0.0"
           }
         },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+        "@babel/template": {
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
+          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "@babel/code-frame": "^7.10.1",
+            "@babel/parser": "^7.10.1",
+            "@babel/types": "^7.10.1"
           }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
         }
       }
     },
@@ -2217,42 +1836,62 @@
       }
     },
     "@babel/parser": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz",
-      "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==",
+      "version": "7.10.2",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz",
+      "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==",
       "dev": true
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz",
-      "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz",
+      "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/helper-remap-async-to-generator": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.10.1",
+        "@babel/helper-remap-async-to-generator": "^7.10.1",
         "@babel/plugin-syntax-async-generators": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz",
-      "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz",
+      "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.10.1",
         "@babel/plugin-syntax-dynamic-import": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-json-strings": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz",
-      "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz",
+      "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.10.1",
         "@babel/plugin-syntax-json-strings": "^7.8.0"
       }
     },
+    "@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz",
+      "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.1",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-numeric-separator": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz",
+      "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.1",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.1"
+      }
+    },
     "@babel/plugin-proposal-object-rest-spread": {
       "version": "7.11.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz",
@@ -2342,20 +1981,20 @@
     },
     "@babel/plugin-syntax-object-rest-spread": {
       "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
-      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
-    "@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
-      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+    "@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz",
+      "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.10.1"
       }
     },
     "@babel/plugin-syntax-optional-chaining": {
@@ -3349,13 +2988,84 @@
           "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "ms": "^2.1.1"
+          }
+        },
+        "env-paths": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
+          "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
+          "dev": true
+        },
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "@istanbuljs/schema": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
+      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
+      "dev": true
+    },
+    "@jsdevtools/coverage-istanbul-loader": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz",
+      "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==",
+      "dev": true,
+      "requires": {
+        "convert-source-map": "^1.7.0",
+        "istanbul-lib-instrument": "^4.0.1",
+        "loader-utils": "^1.4.0",
+        "merge-source-map": "^1.1.0",
+        "schema-utils": "^2.6.4"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
+          "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "convert-source-map": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+          "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "~5.1.1"
           }
         },
-        "env-paths": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
-          "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
           "dev": true
         },
         "fs-extra": {
@@ -3579,6 +3289,43 @@
         "semver-intersect": "1.4.0"
       },
       "dependencies": {
+        "@angular-devkit/core": {
+          "version": "9.1.7",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.7.tgz",
+          "integrity": "sha512-guvolu9Cl+qYMTtedLZD9wCqustJjdqzJ2psD2C1Sr1LrX9T0mprmDldR/YnhsitThveJEb6sM/0EvqWxoSvKw==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.0",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.5.4",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+          "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+          "dev": true
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+          "dev": true
+        },
         "hosted-git-info": {
           "version": "3.0.5",
           "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
@@ -3597,38 +3344,47 @@
             "yallist": "^4.0.0"
           }
         },
+        "magic-string": {
+          "version": "0.25.7",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+          "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+          "dev": true,
+          "requires": {
+            "sourcemap-codec": "^1.4.4"
+          }
+        },
         "npm-package-arg": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz",
-          "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==",
+          "version": "8.0.1",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz",
+          "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==",
           "dev": true,
           "requires": {
             "hosted-git-info": "^3.0.2",
             "semver": "^7.0.0",
             "validate-npm-package-name": "^3.0.0"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "5.7.1",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-              "dev": true
-            }
           }
         },
         "rxjs": {
-          "version": "6.5.3",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
-          "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
+          },
+          "dependencies": {
+            "tslib": {
+              "version": "1.13.0",
+              "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+              "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+              "dev": true
+            }
           }
         },
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz",
+          "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==",
           "dev": true
         },
         "yallist": {
@@ -4391,12 +4147,30 @@
       },
       "dependencies": {
         "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "ms": "2.1.2"
+          }
+        },
+        "esprima": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+          "dev": true
+        },
+        "fs-extra": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
+          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+          "dev": true,
+          "requires": {
+            "at-least-node": "^1.0.0",
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^1.0.0"
           }
         },
         "esprima": {
@@ -4834,6 +4608,12 @@
             "semver": "^5.6.0"
           }
         },
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+          "dev": true
+        },
         "pify": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
@@ -5232,6 +5012,12 @@
           "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
           "dev": true
         },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "dev": true
+        },
         "widest-line": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
@@ -5563,12 +5349,30 @@
           }
         },
         "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "ms": "2.1.2"
+          }
+        },
+        "esprima": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+          "dev": true
+        },
+        "fs-extra": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
+          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+          "dev": true,
+          "requires": {
+            "at-least-node": "^1.0.0",
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^1.0.0"
           }
         },
         "esprima": {
@@ -5607,6 +5411,12 @@
           "requires": {
             "has-flag": "^4.0.0"
           }
+        },
+        "universalify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "dev": true
         }
       }
     },
@@ -5616,17 +5426,17 @@
       "integrity": "sha512-xBqv+8bg6cfnzAQK1k3OGpfaHg+QkPgIgpEkXNhouZ0WiUkyZCftuRc2LYzQrLucFywpa14Xbc6+hTbpq83yRA==",
       "dev": true,
       "requires": {
-        "debug": "^4.1.1",
+        "debug": "^4.2.0",
         "sax": "^1.2.4"
       },
       "dependencies": {
         "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "ms": "2.1.2"
           }
         },
         "ms": {
@@ -5724,6 +5534,34 @@
             "glob": "^7.1.3"
           }
         },
+        "tar": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz",
+          "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==",
+          "dev": true,
+          "requires": {
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.0.0",
+            "minipass": "^3.0.0",
+            "minizlib": "^2.1.0",
+            "mkdirp": "^1.0.3",
+            "yallist": "^4.0.0"
+          },
+          "dependencies": {
+            "chownr": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+              "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+              "dev": true
+            },
+            "yallist": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+              "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+              "dev": true
+            }
+          }
+        },
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -6206,9 +6044,9 @@
       }
     },
     "cli-spinners": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz",
-      "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz",
+      "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==",
       "dev": true
     },
     "cli-width": {
@@ -8916,6 +8754,32 @@
             "argparse": "^1.0.7",
             "esprima": "^4.0.0"
           }
+        },
+        "js-yaml": {
+          "version": "3.14.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+          "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+          "dev": true,
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          }
+        },
+        "jsonfile": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
+          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^1.0.0"
+          }
+        },
+        "universalify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "dev": true
         }
       }
     },
@@ -9220,12 +9084,40 @@
             "color-name": "~1.1.4"
           }
         },
+        "fs-extra": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
+          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+          "dev": true,
+          "requires": {
+            "at-least-node": "^1.0.0",
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^1.0.0"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+          "dev": true
+        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "jsonfile": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
+          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^1.0.0"
+          }
+        },
         "mime": {
           "version": "2.4.6",
           "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
@@ -9240,6 +9132,12 @@
           "requires": {
             "has-flag": "^4.0.0"
           }
+        },
+        "universalify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "dev": true
         }
       }
     },
@@ -13327,6 +13225,24 @@
             "utils-merge": "1.0.1"
           }
         },
+        "connect": {
+          "version": "3.7.0",
+          "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+          "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "finalhandler": "1.1.2",
+            "parseurl": "~1.3.3",
+            "utils-merge": "1.0.1"
+          }
+        },
+        "eventemitter3": {
+          "version": "4.0.4",
+          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
+          "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
+          "dev": true
+        },
         "fill-range": {
           "version": "7.0.1",
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -13398,13 +13314,53 @@
             "rimraf": "^3.0.0"
           }
         },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.3.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+          "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
           "dev": true,
           "requires": {
-            "is-number": "^7.0.0"
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
           }
         }
       }
@@ -13607,6 +13563,21 @@
         "leven": "^3.1.0"
       }
     },
+    "leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true
+    },
+    "levenary": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
+      "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
+      "dev": true,
+      "requires": {
+        "leven": "^3.1.0"
+      }
+    },
     "levn": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@@ -14014,9 +13985,9 @@
       },
       "dependencies": {
         "cacache": {
-          "version": "12.0.3",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
-          "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
           "dev": true,
           "requires": {
             "bluebird": "^3.5.5",
@@ -14414,9 +14385,9 @@
       }
     },
     "minimist": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
       "dev": true
     },
     "minipass": {
@@ -14531,9 +14502,9 @@
       }
     },
     "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
       "dev": true,
       "requires": {
         "minimist": "^1.2.5"
@@ -14941,9 +14912,9 @@
       }
     },
     "npm-pick-manifest": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz",
-      "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz",
+      "integrity": "sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg==",
       "dev": true,
       "requires": {
         "npm-install-checks": "^4.0.0",
@@ -14995,9 +14966,9 @@
       }
     },
     "npm-registry-fetch": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz",
-      "integrity": "sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz",
+      "integrity": "sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA==",
       "dev": true,
       "requires": {
         "JSONStream": "^1.3.4",
@@ -15019,9 +14990,9 @@
           }
         },
         "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
           "dev": true
         },
         "yallist": {
@@ -15348,9 +15319,9 @@
       }
     },
     "open": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz",
-      "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==",
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz",
+      "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==",
       "dev": true,
       "requires": {
         "is-docker": "^2.0.0",
@@ -15358,10 +15329,13 @@
       },
       "dependencies": {
         "is-wsl": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz",
-          "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==",
-          "dev": true
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
         }
       }
     },
@@ -15395,9 +15369,9 @@
       }
     },
     "ora": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz",
-      "integrity": "sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz",
+      "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==",
       "dev": true,
       "requires": {
         "chalk": "^3.0.0",
@@ -15411,9 +15385,9 @@
       },
       "dependencies": {
         "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
         "ansi-styles": {
@@ -15486,9 +15460,9 @@
           }
         },
         "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
           "dev": true,
           "requires": {
             "ansi-regex": "^5.0.0"
@@ -15631,9 +15605,9 @@
       }
     },
     "pacote": {
-      "version": "9.5.8",
-      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.8.tgz",
-      "integrity": "sha512-0Tl8Oi/K0Lo4MZmH0/6IsT3gpGf9eEAznLXEQPKgPq7FscnbUOyopnVpwXlnQdIbCUaojWy1Wd7VMyqfVsRrIw==",
+      "version": "9.5.12",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz",
+      "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==",
       "dev": true,
       "requires": {
         "bluebird": "^3.5.3",
@@ -15669,9 +15643,9 @@
       },
       "dependencies": {
         "cacache": {
-          "version": "12.0.3",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
-          "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
           "dev": true,
           "requires": {
             "bluebird": "^3.5.5",
@@ -16874,7 +16848,8 @@
     "private": {
       "version": "0.1.8",
       "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
-      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+      "dev": true
     },
     "process": {
       "version": "0.11.10",
@@ -16999,6 +16974,37 @@
             "supports-color": "^2.0.0"
           }
         },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+              "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^5.0.0"
+              }
+            }
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
         "del": {
           "version": "2.2.2",
           "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
@@ -17014,6 +17020,22 @@
             "rimraf": "^2.2.8"
           }
         },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+          "dev": true
+        },
         "globby": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
@@ -17034,6 +17056,12 @@
           "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
           "dev": true
         },
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+          "dev": true
+        },
         "source-map": {
           "version": "0.5.7",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@@ -17049,6 +17077,28 @@
             "source-map": "^0.5.6"
           }
         },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+              "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^5.0.0"
+              }
+            }
+          }
+        },
         "supports-color": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
@@ -17073,6 +17123,67 @@
             "semver": "^5.3.0",
             "xml2js": "^0.4.17"
           }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          },
+          "dependencies": {
+            "ansi-styles": {
+              "version": "4.2.1",
+              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+              "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+              "dev": true,
+              "requires": {
+                "@types/color-name": "^1.1.1",
+                "color-convert": "^2.0.1"
+              }
+            },
+            "strip-ansi": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+              "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^5.0.0"
+              }
+            }
+          }
+        },
+        "yargs": {
+          "version": "15.3.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+          "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
         }
       }
     },
@@ -19834,6 +19945,12 @@
             "source-map": "~0.6.1",
             "source-map-support": "~0.5.12"
           }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
@@ -20042,6 +20159,24 @@
         "make-error": "^1.1.1",
         "source-map-support": "^0.5.17",
         "yn": "3.1.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "source-map-support": {
+          "version": "0.5.19",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+          "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
+          }
+        }
       }
     },
     "ts-pnp": {
@@ -20213,10 +20348,11 @@
       }
     },
     "type-fest": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
-      "dev": true
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+      "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+      "dev": true,
+      "optional": true
     },
     "type-is": {
       "version": "1.6.18",
@@ -20272,6 +20408,12 @@
       "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==",
       "dev": true
     },
+    "ua-parser-js": {
+      "version": "0.7.21",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz",
+      "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==",
+      "dev": true
+    },
     "uglify-js": {
       "version": "3.5.4",
       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.4.tgz",
@@ -20980,6 +21122,7 @@
       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
       "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
       "dev": true,
+      "optional": true,
       "requires": {
         "chokidar": "^3.4.1",
         "graceful-fs": "^4.1.2",
@@ -21379,6 +21522,15 @@
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
+        "serialize-javascript": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
+          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
+          "dev": true,
+          "requires": {
+            "randombytes": "^2.1.0"
+          }
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -21695,6 +21847,34 @@
             "yargs-parser": "^13.1.2"
           }
         },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
         "yargs-parser": {
           "version": "13.1.2",
           "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
@@ -21997,6 +22177,12 @@
           "requires": {
             "ansi-regex": "^5.0.0"
           }
+        },
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+          "dev": true
         }
       }
     },
-- 
GitLab


From ff37917ecd3a791aeb2594a281607c0352f17a28 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 9 Jun 2020 12:25:47 +0200
Subject: [PATCH 23/92] PreBarrage: change form on graph click, edit walls

---
 src/app/calculators/pbbassin/en.json          |   6 +
 src/app/calculators/pbbassin/fr.json          |   6 +
 src/app/calculators/pbcloison/en.json         |   6 +
 src/app/calculators/pbcloison/fr.json         |   6 +
 src/app/calculators/prebarrage/config.json    |  41 ++----
 src/app/calculators/prebarrage/fr.json        |  13 +-
 .../dialog-new-pb-cloison.component.ts        |   2 -
 .../calculator.component.ts                   |   8 +-
 .../pb-schema/pb-schema.component.ts          | 135 +++++++++++++++---
 .../formulaire/definition/form-definition.ts  |   1 +
 .../definition/form-parallel-structures.ts    |   2 +-
 .../formulaire/definition/form-pb-cloison.ts  |  74 ++++++++++
 .../formulaire/definition/form-prebarrage.ts  | 115 +++++++++------
 .../formulaire/elements/formulaire-node.ts    |   2 +-
 src/app/formulaire/elements/pb-schema.ts      |   5 +
 15 files changed, 316 insertions(+), 106 deletions(-)
 create mode 100644 src/app/calculators/pbbassin/en.json
 create mode 100644 src/app/calculators/pbbassin/fr.json
 create mode 100644 src/app/calculators/pbcloison/en.json
 create mode 100644 src/app/calculators/pbcloison/fr.json
 create mode 100644 src/app/formulaire/definition/form-pb-cloison.ts

diff --git a/src/app/calculators/pbbassin/en.json b/src/app/calculators/pbbassin/en.json
new file mode 100644
index 000000000..6566e3fd8
--- /dev/null
+++ b/src/app/calculators/pbbassin/en.json
@@ -0,0 +1,6 @@
+{
+    "fs_basin_params": "Basin parameters",
+
+    "S": "Surface",
+    "ZF": "Bottom elevation"
+}
diff --git a/src/app/calculators/pbbassin/fr.json b/src/app/calculators/pbbassin/fr.json
new file mode 100644
index 000000000..71d54fd77
--- /dev/null
+++ b/src/app/calculators/pbbassin/fr.json
@@ -0,0 +1,6 @@
+{
+    "fs_basin_params": "Paramètres du bassin",
+
+    "S": "Surface",
+    "ZF": "Cote de fond"
+}
diff --git a/src/app/calculators/pbcloison/en.json b/src/app/calculators/pbcloison/en.json
new file mode 100644
index 000000000..bcd280c3a
--- /dev/null
+++ b/src/app/calculators/pbcloison/en.json
@@ -0,0 +1,6 @@
+{
+    "fs_wall_params": "Wall parameters",
+
+    "select_upstream_basin": "Upstream basin",
+    "select_downstream_basin": "Downstream basin"
+}
diff --git a/src/app/calculators/pbcloison/fr.json b/src/app/calculators/pbcloison/fr.json
new file mode 100644
index 000000000..4480513b3
--- /dev/null
+++ b/src/app/calculators/pbcloison/fr.json
@@ -0,0 +1,6 @@
+{
+    "fs_wall_params": "Paramètres de la cloison",
+
+    "select_upstream_basin": "Bassin amont",
+    "select_downstream_basin": "Bassin aval"
+}
diff --git a/src/app/calculators/prebarrage/config.json b/src/app/calculators/prebarrage/config.json
index 6c72eac2d..547346740 100644
--- a/src/app/calculators/prebarrage/config.json
+++ b/src/app/calculators/prebarrage/config.json
@@ -30,21 +30,8 @@
                 "id": "fs_basin_params",
                 "type": "fieldset",
                 "fields": [
-                    {
-                        "id": "select_upstream",
-                        "type": "select_reference",
-                        "reference": "nub",
-                        "source": "upstream_stuff"
-                    },
-                    {
-                        "id": "select_downstream",
-                        "type": "select_reference",
-                        "reference": "nub",
-                        "source": "downstream_stuff"
-                    },
-                    "Q",
-                    "Z1",
-                    "Z2"
+                    "S",
+                    "ZF"
                 ]
             },
             {
@@ -101,28 +88,30 @@
                 "type": "fieldset",
                 "fields": [
                     {
-                        "id": "select_upstream",
+                        "id": "select_upstream_basin",
                         "type": "select_reference",
                         "reference": "nub",
-                        "source": "upstream_stuff"
+                        "source": "upstream_basin"
                     },
                     {
-                        "id": "select_downstream",
+                        "id": "select_downstream_basin",
                         "type": "select_reference",
                         "reference": "nub",
-                        "source": "downstream_stuff"
-                    },
-                    {
-                        "id": "devices_container",
-                        "type": "template_container",
-                        "templates": [
-                            "fs_wall_device"
-                        ]
+                        "source": "downstream_basin"
                     }
                 ]
             },
+            {
+                "id": "struct_container",
+                "type": "template_container",
+                "templates": [
+                    "fs_wall_device"
+                ]
+            },
             {
                 "type": "options",
+                "upstreamBasinSelectId": "select_upstream_basin",
+                "downstreamBasinSelectId": "select_downstream_basin",
                 "selectIds": [ ]
             }
         ]
diff --git a/src/app/calculators/prebarrage/fr.json b/src/app/calculators/prebarrage/fr.json
index b770ea7b8..287b79352 100644
--- a/src/app/calculators/prebarrage/fr.json
+++ b/src/app/calculators/prebarrage/fr.json
@@ -1,10 +1,7 @@
 {
-    "fs_params": "Édition du bassin / de la cloison",
+    "fs_river_params": "Paramètres de la rivière",
 
-    "Ytarget": "Valeur du paramètre cible",
-    "Xinit": "Valeur initiale du paramètre recherché",
-    "X": "Valeur du paramètre recherché",
-
-    "select_upstream": "Bassin amont",
-    "select_downstream": "Bassin aval"
-}
\ No newline at end of file
+    "Q": "Débit",
+    "Z1": "Cote de l'eau amont",
+    "Z2": "Cote de l'eau aval"
+}
diff --git a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
index d562f03d3..7798238d6 100644
--- a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
+++ b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
@@ -57,13 +57,11 @@ export class DialogNewPbCloisonComponent implements OnInit {
      * @param downstream if true, inverts the test
      */
     public basinIsSelectable(index: number, downstream: boolean = false): boolean {
-        let ok = true;
         if (downstream) {
             return (this.upstreamIndex === 0 || index > this.upstreamIndex)
         } else {
             return (this.downstreamIndex === 0 || index < this.downstreamIndex)
         }
-        return ok;
     }
 
     public basinDescription(i: number, fallback: string): string {
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index a06206020..9c26baa5d 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -49,6 +49,7 @@ import { NgParameter } from "../../formulaire/elements/ngparam";
 import { FormulaireFixedVar } from "../../formulaire/definition/form-fixedvar";
 import { PbSchema } from "../../formulaire/elements/pb-schema";
 import { PbSchemaComponent } from "../pb-schema/pb-schema.component";
+import { FormulairePrebarrage } from "../../formulaire/definition/form-prebarrage";
 
 import { HotkeysService, Hotkey } from "angular2-hotkeys";
 
@@ -373,6 +374,7 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         this._formulaire.resetResults([]);
         this.appComponent.showProgressBar = true;
         this._computeClicked = true;
+        this.showPBInputData = false;
         // send resetForm to clear log
         this._formulaire.notifyObservers({
             "action": "resetForm",
@@ -588,9 +590,9 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
 
     /** réception d'un événement de clic sur un nœud du schéma de PréBarrage */
     public onPBNodeSelected(event: any) {
-        console.log("node selected", event.node ? event.node.constructor.name : "zubi");
-        this.showPBInputData = true;
-        // show proper form depending on what was clicked
+        this.showPBInputData = true; // @TODO pas forcément ! (résultats de l'élément cliqué)
+        // show proper form (actually subform elements) depending on what was clicked
+        (this._formulaire as FormulairePrebarrage).nodeSelected(event.node);
     }
 
     public openHelp() {
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 6728c7829..7249b6929 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -1,18 +1,16 @@
-import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, ViewChild, Inject, forwardRef } from "@angular/core";
-import { MatDialog } from '@angular/material/dialog';
+import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, ViewChild, Inject, forwardRef, AfterContentInit } from "@angular/core";
+import { MatDialog } from "@angular/material/dialog";
 
 import {
-    PreBarrage, PbBassin, PbBassinParams, PbCloison
+    PreBarrage, PbBassin, PbBassinParams, PbCloison, CreateStructure, LoiDebit, Structure, Observer, IObservable
  } from "jalhyd";
 
 import * as mermaid from "mermaid";
 
 import { I18nService } from "../../services/internationalisation.service";
-import { ApplicationSetupService } from "../../services/app-setup.service";
-import { NotificationsService } from "../../services/notifications.service";
 import { PbSchema } from "../../formulaire/elements/pb-schema";
 import { DialogNewPbCloisonComponent } from "../dialog-new-pb-cloison/dialog-new-pb-cloison.component";
-import { GenericCalculatorComponent } from '../generic-calculator/calculator.component';
+import { GenericCalculatorComponent } from "../generic-calculator/calculator.component";
 
 /**
  * The interactive schema for calculator type "PreBarrage" (component)
@@ -24,7 +22,7 @@ import { GenericCalculatorComponent } from '../generic-calculator/calculator.com
         "./pb-schema.component.scss"
     ]
 })
-export class PbSchemaComponent implements AfterViewInit, OnInit {
+export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnInit, Observer {
 
     @Input()
     private pbSchema: PbSchema;
@@ -65,9 +63,7 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     public constructor(
         @Inject(forwardRef(() => GenericCalculatorComponent)) private calculatorComponent: GenericCalculatorComponent,
         private i18nService: I18nService,
-        private newPbCloisonDialog: MatDialog,
-        private appSetupService: ApplicationSetupService,
-        private notifService: NotificationsService
+        private newPbCloisonDialog: MatDialog
     ) { }
 
     public get selectedItem(): any {
@@ -110,6 +106,8 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     public ngAfterViewInit(): void {
         this.refreshEventListeners();
         this.updateValidity();
+        // subscribe to "refresh" event passed indirectly by FormulairePbCloison (change upstream/downstream basin)
+        this.pbSchema.addObserver(this);
     }
 
     /** Add click listener on every node and link in the graph */
@@ -122,6 +120,19 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         });
     }
 
+    // debug
+    private createStructure(l: LoiDebit, v: number[]): Structure {
+        const s: Structure = CreateStructure(l);
+        s.prms.Q.singleValue = v[0];
+        s.prms.ZDV.singleValue = v[1];
+        s.prms.Z1.singleValue = v[2];
+        s.prms.Z2.singleValue = v[3];
+        s.getParameter("L").singleValue = v[4];
+        s.getParameter("CdGR").singleValue = v[5];
+        s.prms.W.singleValue = v[6];
+        return s;
+    }
+
     /**
      * Builds a Mermaid graph text definition, using Nodes
      * to represent basins as well as walls; sorts connexions
@@ -161,17 +172,89 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
             this.model.addChild(new PbBassin(new PbBassinParams(32.10, 94.25)));
             this.model.addChild(new PbBassin(new PbBassinParams(35.00, 94.10)));
             this.model.addChild(new PbCloison(undefined, this.model.children[0] as PbBassin));
+            // Session.getInstance().createNub(p, this.currentNub as ParallelStructure) as Structure
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.30, 0, 0, 0.4, 1.04 ])
+            );
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 4.40, 1.04 ])
+            );
+            //  Wall between upstream and basin 2
             this.model.addChild(new PbCloison(undefined, this.model.children[1] as PbBassin));
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.00, 0, 0, 1.00, 1.04 ])
+            );
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 5.00, 0.91 ])
+            );
+            // Wall between upstream and basin 5
             this.model.addChild(new PbCloison(undefined, this.model.children[4] as PbBassin));
+             this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 3.50, 0.99 ])
+            );
+            // Wall between upstream and basin 6
             this.model.addChild(new PbCloison(undefined, this.model.children[5] as PbBassin));
+             this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 3.60, 0.99 ])
+            );
+            // Wall between basin 1 & 3
             this.model.addChild(new PbCloison(this.model.children[0] as PbBassin, this.model.children[2] as PbBassin));
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.00, 0, 0, 0.40, 1.04 ])
+            );
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 5.20, 0.99 ])
+            );
+            // Wall between basin 2 & 3
             this.model.addChild(new PbCloison(this.model.children[1] as PbBassin, this.model.children[2] as PbBassin));
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.85, 0, 0, 4.38, 0.91 ])
+            );
+            // Wall between basin 2 & 4
             this.model.addChild(new PbCloison(this.model.children[1] as PbBassin, this.model.children[3] as PbBassin));
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.85, 0, 0, 3.00, 0.99 ])
+            );
+            // Wall between basin 2 & 5
             this.model.addChild(new PbCloison(this.model.children[1] as PbBassin, this.model.children[4] as PbBassin));
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.50, 0, 0, 1.00, 1.04 ])
+            );
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.75, 0, 0, 3.00, 0.99 ])
+            );
+            // Wall between basin 3 & 4
             this.model.addChild(new PbCloison(this.model.children[2] as PbBassin, this.model.children[3] as PbBassin));
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.70, 0, 0, 0.40, 1.04 ])
+            );
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.65, 0, 0, 5.74, 0.99 ])
+            );
+            // Wall between basin 4 & 5
             this.model.addChild(new PbCloison(this.model.children[3] as PbBassin, this.model.children[4] as PbBassin));
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.40, 0, 0, 0.40, 1.04 ])
+            );
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.35, 0, 0, 6.00, 0.99 ])
+            );
+            // Wall between basin 5 & 6
             this.model.addChild(new PbCloison(this.model.children[4] as PbBassin, this.model.children[5] as PbBassin));
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.25, 0, 0, 0.70, 1.04 ])
+            );
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.05, 0, 0, 9.50, 0.99 ])
+            );
+            // Wall between basin 6 & downstream
             this.model.addChild(new PbCloison(this.model.children[5] as PbBassin, undefined));
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.10, 0, 0, 0.95, 1.04 ])
+            );
+            this.model.children[this.model.children.length - 1].addChild(
+                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.75, 0, 0, 10.20, 0.99 ])
+            );
         }
 
         const sortedWalls: PbCloison[] = [];
@@ -239,7 +322,7 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         const sommeA = a.bassinAmont.findPositionInParent() + a.bassinAval.findPositionInParent();
         const sommeB = b.bassinAmont.findPositionInParent() + b.bassinAval.findPositionInParent();
         return (sommeA <= sommeB ? -1 : 1);
-    };
+    }
 
     private selectNode(item: any) {
         // highlight clicked element
@@ -249,13 +332,9 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
         if ([ this.upstreamId, this.downstreamId ].includes(item.id)) {
             this._selectedItem = undefined;
         } else {
-            for (const b of this.model.children) {
-                if (b.uid === item.id) {
-                    this._selectedItem = b;
-                }
-            }
+            this._selectedItem = this.model.findChild(item.id);
         }
-        // show proper form, hide results
+        // show proper form and hide results
         this.nodeSelected.emit({
             node: this._selectedItem
         });
@@ -315,7 +394,9 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     private findBasinPosition(basin: PbBassin): number {
         let i = 0;
         for (const b of this.model.bassins) {
-            if (b === basin) break;
+            if (b === basin) {
+                break;
+            }
             i++;
         }
         return i;
@@ -347,10 +428,10 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
 
     /** Copies a wall */
     public onCopyClick() {
-        const wall = this._selectedItem as PbCloison
+        const wall = this._selectedItem as PbCloison;
         const wallCopy = new PbCloison(wall.bassinAmont, wall.bassinAval);
         this.model.addChild(wallCopy);
-        this.unselect();
+        this.unselect(); // @TODO select new wall ?
         this.refresh();
     }
 
@@ -361,7 +442,7 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     /** Adds a new lone basin */
     public onAddBasinClick() {
         this.model.addChild(new PbBassin(new PbBassinParams(20, 99)));
-        this.unselect();
+        this.unselect(); // @TODO select new basin ?
         this.refresh();
     }
 
@@ -424,6 +505,18 @@ export class PbSchemaComponent implements AfterViewInit, OnInit {
     private unselect() {
         this._selectedItem = undefined;
         this.clearHighlightedItems();
+        this.nodeSelected.emit({}); // nothing selected
+    }
+
+    // interface Observer
+
+    public update(sender: IObservable, data: any) {
+        if (sender instanceof PbSchema) {
+            if (data.action === "refresh") {
+                this.unselect();
+                this.refresh();
+            }
+        }
     }
 
 }
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index a4a0732ea..c481e906e 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -269,6 +269,7 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
                     break;
 
                 case "template_container":
+                    console.log("parsing template container !", conf);
                     this.parse_template_container(conf, templates);
                     break;
 
diff --git a/src/app/formulaire/definition/form-parallel-structures.ts b/src/app/formulaire/definition/form-parallel-structures.ts
index eaffb9f33..f9e2a99e1 100644
--- a/src/app/formulaire/definition/form-parallel-structures.ts
+++ b/src/app/formulaire/definition/form-parallel-structures.ts
@@ -98,7 +98,7 @@ export class FormulaireParallelStructure extends FormulaireRepeatableFieldset {
     }
 
     protected get fieldsetContainer(): FieldsetContainer {
-        const n = this.getFormulaireNodeById("struct_container");
+        const n = this.getFormulaireNodeById("struct_container"); // @TODO make it generic, do not force ID !
         if (n === undefined || !(n instanceof FieldsetContainer)) {
             throw new Error("l'élément 'struct_container' n'est pas du type FieldsetContainer");
         }
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
new file mode 100644
index 000000000..5ea0bc823
--- /dev/null
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -0,0 +1,74 @@
+import { FormulaireParallelStructure } from "./form-parallel-structures";
+import { SelectFieldNub } from "../elements/select-field-nub";
+
+import { IObservable, Nub, PbCloison, PbBassin } from "jalhyd";
+
+export class FormulairePbCloison extends FormulaireParallelStructure {
+
+    /** id of select configuring upstream basin Nub */
+    private _upstreamBasinSelectId: string;
+
+    /** id of select configuring downstream basin Nub */
+    private _downstreamBasinSelectId: string;
+
+    protected parseOptions(json: {}) {
+        super.parseOptions(json);
+        this._upstreamBasinSelectId = this.getOption(json, "upstreamBasinSelectId");
+        this._downstreamBasinSelectId = this.getOption(json, "downstreamBasinSelectId");
+    }
+
+    protected completeParse(json: {}, firstNotif: boolean = true) {
+        super.completeParse(json);
+        if (this._upstreamBasinSelectId) {
+            const sel = this.getFormulaireNodeById(this._upstreamBasinSelectId);
+            if (sel) {
+                sel.addObserver(this);
+                if (firstNotif) {
+                    // force 1st observation
+                    (sel as SelectFieldNub).notifySelectValueChanged();
+                }
+            }
+        }
+        if (this._downstreamBasinSelectId) {
+            const sel = this.getFormulaireNodeById(this._downstreamBasinSelectId);
+            if (sel) {
+                sel.addObserver(this);
+                if (firstNotif) {
+                    // force 1st observation
+                    (sel as SelectFieldNub).notifySelectValueChanged();
+                }
+            }
+        }
+    }
+
+    // interface Observer
+
+    public update(sender: IObservable, data: any) {
+        // copied from FormDefinition, to avoid calling super.update()
+        if (sender instanceof Nub) {
+            switch (data.action) {
+                case "resultUpdated":
+                    // forward Nub results update notification to FormCompute objects
+                    this.reaffectResultComponents();
+                    break;
+            }
+        }
+        // copied from FormFixedVar, to avoid calling super.update()
+        if (data.action === "propertyChange") {
+            this.reset();
+        }
+
+        if (sender instanceof SelectFieldNub) {
+            const nub = this._currentNub as PbCloison;
+            const pb = nub.parent;
+            // empty "" data.value.value should return undefined, which is good for amont/aval
+            const newBasin = pb.findChild(data.value.value) as PbBassin;
+            if (sender.id === this._upstreamBasinSelectId) {
+                nub.bassinAmont = newBasin;
+            } else if (sender.id === this._downstreamBasinSelectId) {
+                nub.bassinAval = newBasin;
+            }
+            this.notifyObservers({ action: "updateBasin" }, this);
+        }
+    }
+}
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index d15c13b37..95d4ee703 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -1,8 +1,10 @@
-import { CalculatorType } from "jalhyd";
+import { CalculatorType, PbBassin, PbCloison, IObservable } from "jalhyd";
 
 import { FormulaireFixedVar } from "./form-fixedvar";
-import { FormulaireParallelStructure } from "./form-parallel-structures";
 import { PbSchema } from "../elements/pb-schema";
+import { FormulaireDefinition } from "./form-definition";
+import { ServiceFactory } from "../../services/service-factory";
+import { FormulairePbCloison } from "./form-pb-cloison";
 
 /**
  * Formulaire pour les PréBarrage
@@ -15,27 +17,16 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     /** child form for basins dimensions */
     private basinForm: FormulaireFixedVar;
 
+    /** configuration for re-creating basin form every time needed */
+    private basinFormConfig: string;
+
     /** child form for walls (repeatable devices) */
-    private wallForm: FormulaireParallelStructure;
-
-    public constructor() {
-        super();
-        console.log("Construction du FormPreBarrage !!");
-        this.riverForm = new FormulaireFixedVar();
-        this.riverForm.defaultProperties["calcType"] = CalculatorType.PreBarrage;
-        this.basinForm = new FormulaireFixedVar();
-        this.basinForm.defaultProperties["calcType"] = CalculatorType.PbBassin;
-        this.wallForm = new FormulaireParallelStructure();
-        this.wallForm.defaultProperties["calcType"] = CalculatorType.PbCloison;
-    }
+    private wallForm: FormulairePbCloison;
 
-    protected parseOptions(json: {}) {
-        // super.parseOptions(json);
-        // @TODO parse children forms configs
-    }
+    /** configuration for re-creating wall form every time needed */
+    private wallFormConfig: string;
 
     public parseConfig(json?: {}) {
-        console.log("> parse confaïgue");
         if (json !== undefined) {
             this._jsonConfig = json;
         }
@@ -64,25 +55,28 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     }
 
     private parse_subform(json: {}) {
-        console.log("parse sf", json);
         switch (json["id"]) {
             case "subform_river":
+                // parse it and build it once then keep it (it always has the same Nub: PreBarrage)
+                this.riverForm = new FormulaireFixedVar();
+                this.riverForm.defaultProperties["calcType"] = CalculatorType.PreBarrage;
                 this.riverForm.currentNub = this.currentNub;
+                this.riverForm.preparseConfig(json["config"]);
                 this.riverForm.parseConfig(json["config"]);
+                this.kids.push(this.riverForm);
+                // show default form
+                this.showFormElements(this.riverForm);
                 break;
             case "subform_basin":
-                // this.basinForm.currentNub = this.currentNub;
-                this.basinForm.parseConfig(json["config"]);
+                // only store config to create it multiple times on demand
+                this.basinFormConfig = json["config"];
                 break;
             case "subform_wall":
-                // this.wallForm.currentNub = this.currentNub;
-                this.wallForm.parseConfig(json["config"]);
+                // same as above
+                console.log("===> storing wall form config", json["config"]);
+                this.wallFormConfig = json["config"];
                 break;
         }
-        // console.log(">> triggering parsing of new subform", subform.constructor.name, subform.uid);
-        // subform.parseConfig(json);
-        // this.kids.push(subform);
-        // f.defaultProperties["calcType"] = ct;
     }
 
     private parse_pb_schema(json: {}) {
@@ -91,26 +85,59 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         this.kids.push(sch);
     }
 
-    protected completeParse(json: {}, firstNotif: boolean = true) {
-        // super.completeParse(json);
-        // @TODO parse children forms configs
+    public nodeSelected(node: PbBassin | PbCloison) {
+        // show only the relevant form
+        if (node === undefined) {
+            this.showFormElements(this.riverForm);
+
+        } else if (node instanceof PbBassin) {
+            this.basinForm = new FormulaireFixedVar();
+            this.basinForm.defaultProperties["calcType"] = CalculatorType.PbBassin;
+            this.basinForm.currentNub = node;
+            this.basinForm.preparseConfig(this.basinFormConfig);
+            this.basinForm.parseConfig(this.basinFormConfig);
+            ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(this.basinForm);
+            this.showFormElements(this.basinForm);
+
+        } else if (node instanceof PbCloison) {
+            this.wallForm = new FormulairePbCloison();
+            this.wallForm.defaultProperties["calcType"] = CalculatorType.PbCloison;
+            this.wallForm.currentNub = node;
+            this.wallForm.preparseConfig(this.wallFormConfig);
+            this.wallForm.parseConfig(this.wallFormConfig);
+            this.wallForm.addObserver(this); // subscribe to upstream/downstream basin change
+            ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(this.wallForm);
+            this.showFormElements(this.wallForm);
+        }
+    }
+
+    /**
+     * Adds all elements of given Formulaire f to the current form, right
+     * after the PbSchema, replacing any other element already present
+     * @param f Formulaire to display
+     */
+    private showFormElements(f: FormulaireDefinition) {
+        // clear all kids except PbSchema
+        this._kids = [ this.kids[0] ];
+        for (const e of f.kids) {
+            this.kids.push(e);
+        }
+    }
+
+    private refreshSchema() {
+        const pbs = this.kids[0] as PbSchema;
+        pbs.refresh();
     }
 
     // interface Observer
 
-    /* public update(sender: IObservable, data: any) {
-        // copied from FormDefinition, to avoid calling super.update()
-        if (sender instanceof Nub) {
-            switch (data.action) {
-                case "resultUpdated":
-                    // forward Nub results update notification to FormCompute objects
-                    this.reaffectResultComponents();
-                    break;
+    public update(sender: IObservable, data: any) {
+        super.update(sender, data);
+        if (sender instanceof FormulairePbCloison) {
+            // console.log("HOH PUTAIN CE BIG QUATTRO HOYOYOYOYOY", this.kids[0].constructor.name);
+            if (data.action === "updateBasin") {
+                this.refreshSchema();
             }
         }
-        // copied from FormFixedVar, to avoid calling super.update()
-        if (data.action === "propertyChange") {
-            this.reset();
-        }
-    } */
+    }
 }
diff --git a/src/app/formulaire/elements/formulaire-node.ts b/src/app/formulaire/elements/formulaire-node.ts
index 79982717c..7731dfd43 100644
--- a/src/app/formulaire/elements/formulaire-node.ts
+++ b/src/app/formulaire/elements/formulaire-node.ts
@@ -22,7 +22,7 @@ export abstract class FormulaireNode implements IObservable {
     private _parentNode: FormulaireNode;
 
     /** enfants (utilisé entre autres pour FormulaireDefinition, FieldSet et FieldsetContainer) */
-    private _kids: FormulaireNode[];
+    protected _kids: FormulaireNode[];
 
     /** implémentation par délégation de IObservable */
     private _observable: Observable;
diff --git a/src/app/formulaire/elements/pb-schema.ts b/src/app/formulaire/elements/pb-schema.ts
index 5be43f62f..94a7d452a 100644
--- a/src/app/formulaire/elements/pb-schema.ts
+++ b/src/app/formulaire/elements/pb-schema.ts
@@ -22,4 +22,9 @@ export class PbSchema extends FormulaireElement {
             return this.parentForm.currentNub as PreBarrage;
         }
     }
+
+    /** Asks PbSchemaComponent to redraw the schema */
+    public refresh() {
+        this.notifyObservers({ action: "refresh" }, this);
+    }
 }
-- 
GitLab


From 625530bc46e70dc4f1a91bb370c9b92a9ce97daf Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 11 Jun 2020 14:42:27 +0200
Subject: [PATCH 24/92] PreBarrage: move "standalone" basins

---
 .../pb-schema/pb-schema.component.html        | 13 ++++-
 .../pb-schema/pb-schema.component.ts          | 55 ++++++++++++++++++-
 src/locale/messages.en.json                   |  2 +
 src/locale/messages.fr.json                   |  2 +
 4 files changed, 68 insertions(+), 4 deletions(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
index f8bb9bbc0..b9314c653 100644
--- a/src/app/components/pb-schema/pb-schema.component.html
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -21,13 +21,20 @@
                 {{ prefixedItemDescription }}
             </span>
             <button type="button" mat-icon-button color="primary" [disabled]="! enableCopyButton" (click)="onCopyClick()"
-            [title]="uitextCopy">
-              <mat-icon>content_copy</mat-icon>
-          </button>
+              [title]="uitextCopy">
+                <mat-icon>content_copy</mat-icon>
+            </button>
+          |
             <button type="button" mat-icon-button color="primary" [disabled]="! enableRemoveButton" (click)="onRemoveClick()"
               [title]="uitextRemove">
                 <mat-icon>delete</mat-icon>
             </button>
+            <button type="button" mat-icon-button [disabled]="! enableUpButton" (click)="onMoveBasinUpClick()" [title]="uitextMoveBasinUp">
+                <mat-icon>arrow_upward</mat-icon>
+            </button>
+            <button type="button" mat-icon-button [disabled]="! enableDownButton" (click)="onMoveBasinDownClick()" [title]="uitextMoveBasinDown">
+                <mat-icon>arrow_downward</mat-icon>
+            </button>
             <!-- 
             |
             <button type="button" mat-icon-button color="primary" (click)="exportAsSpreadsheet()"
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 7249b6929..695243eab 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -480,11 +480,64 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         });
     }
 
-
     public get uitextAddWall() {
         return this.i18nService.localizeText("INFO_PB_ADD_WALL");
     }
 
+    public get enableUpButton() {
+        return (
+            this._selectedItem instanceof PbBassin
+            && this.findBasinPosition(this._selectedItem) !== 0
+            && this.isStandaloneBasin(this._selectedItem)
+        );
+    }
+
+    public onMoveBasinUpClick() {
+        if (this._selectedItem instanceof PbBassin) {
+            this.model.moveBasin(this._selectedItem.uid, this.findBasinPosition(this._selectedItem) - 1);
+        }
+        this.refresh();
+    }
+
+    public get uitextMoveBasinUp() {
+        return this.i18nService.localizeText("INFO_PB_MOVE_BASIN_UP");
+    }
+
+    public get enableDownButton() {
+        return (
+            this._selectedItem instanceof PbBassin
+            && this.findBasinPosition(this._selectedItem) !== this.model.bassins.length - 1
+            && this.isStandaloneBasin(this._selectedItem)
+        );
+    }
+
+    public onMoveBasinDownClick() {
+        if (this._selectedItem instanceof PbBassin) {
+            this.model.moveBasin(this._selectedItem.uid, this.findBasinPosition(this._selectedItem) + 1);
+        }
+        this.refresh();
+    }
+
+    public get uitextMoveBasinDown() {
+        return this.i18nService.localizeText("INFO_PB_MOVE_BASIN_DOWN");
+    }
+
+    /**
+     * Returns true if given basin is either connected to nothing, or only to
+     * river upstream or downstream
+     */
+    private isStandaloneBasin(basin: PbBassin) {
+        return (
+            (
+                basin.cloisonsAmont.length === 0
+                || basin.cloisonsAmont.map(c => c.bassinAmont).every(e => e === undefined)
+            ) && (
+                basin.cloisonsAval.length === 0
+                || basin.cloisonsAval.map(c => c.bassinAval).every(e => e === undefined)
+            )
+        );
+    }
+
     /**
      * Computes the global Pab validity : validity of every cell of every row
      */
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index b5004bf82..fe62870ce 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -520,6 +520,8 @@
     "INFO_PB_ADD_WALL": "Add new wall",
     "INFO_PB_BASSIN_N": "Basin #",
     "INFO_PB_CLOISON": "Wall",
+    "INFO_PB_MOVE_BASIN_UP": "Move basin up",
+    "INFO_PB_MOVE_BASIN_DOWN": "Move basin down",
     "INFO_PB_NEW_WALL_SELECT_BASINS": "Select basins to connect",
     "INFO_PB_NEW_WALL_UP_BASIN": "upstream basin",
     "INFO_PB_NEW_WALL_DOWN_BASIN": "Downstream basin",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 1f2e4117c..2eb5001d8 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -521,6 +521,8 @@
     "INFO_PB_ADD_WALL": "Ajouter une cloison",
     "INFO_PB_BASSIN_N": "Bassin n°",
     "INFO_PB_CLOISON": "Cloison",
+    "INFO_PB_MOVE_BASIN_UP": "Déplacer le bassin vers le haut",
+    "INFO_PB_MOVE_BASIN_DOWN": "Déplacer le bassin vers le bas",
     "INFO_PB_NEW_WALL_SELECT_BASINS": "Choisir les bassins à connecter",
     "INFO_PB_NEW_WALL_UP_BASIN": "Bassin amont",
     "INFO_PB_NEW_WALL_DOWN_BASIN": "Bassin aval",
-- 
GitLab


From 7cdbfe044d9ae938be5bcb04dfd87df8a11c9f39 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 11 Jun 2020 15:01:00 +0200
Subject: [PATCH 25/92] PreBarrage: enhance node selection on schema

---
 .../pb-schema/pb-schema.component.ts          | 31 +++++++++++++++++--
 .../formulaire/definition/form-pb-cloison.ts  |  5 ++-
 .../formulaire/definition/form-prebarrage.ts  |  6 ++--
 src/app/formulaire/elements/pb-schema.ts      |  7 +++--
 4 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 695243eab..25cee4728 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -391,6 +391,17 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         return desc;
     }
 
+    /**
+     * Selects and highlights on the schema the given wall or basin
+     */
+    private selectNodeOnSchema(element: PbBassin | PbCloison) {
+        this.nativeElement.querySelectorAll("g.node").forEach(item => {
+            if (item.id === element.uid) {
+                this.selectNode(item);
+            }
+        });
+    }
+
     private findBasinPosition(basin: PbBassin): number {
         let i = 0;
         for (const b of this.model.bassins) {
@@ -431,8 +442,9 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         const wall = this._selectedItem as PbCloison;
         const wallCopy = new PbCloison(wall.bassinAmont, wall.bassinAval);
         this.model.addChild(wallCopy);
-        this.unselect(); // @TODO select new wall ?
+        this.unselect();
         this.refresh();
+        this.selectNodeOnSchema(wallCopy);
     }
 
     public get uitextCopy() {
@@ -441,9 +453,11 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
 
     /** Adds a new lone basin */
     public onAddBasinClick() {
-        this.model.addChild(new PbBassin(new PbBassinParams(20, 99)));
-        this.unselect(); // @TODO select new basin ?
+        const newBasin = new PbBassin(new PbBassinParams(20, 99));
+        this.model.addChild(newBasin);
+        this.unselect();
         this.refresh();
+        this.selectNodeOnSchema(newBasin);
     }
 
     public get uitextAddBasin() {
@@ -476,6 +490,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
                 this.model.addChild(wall);
                 this.unselect();
                 this.refresh();
+                this.selectNodeOnSchema(wall);
             }
         });
     }
@@ -496,7 +511,10 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         if (this._selectedItem instanceof PbBassin) {
             this.model.moveBasin(this._selectedItem.uid, this.findBasinPosition(this._selectedItem) - 1);
         }
+        const basin = this._selectedItem;
+        this.unselect();
         this.refresh();
+        this.selectNodeOnSchema(basin);
     }
 
     public get uitextMoveBasinUp() {
@@ -515,7 +533,10 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         if (this._selectedItem instanceof PbBassin) {
             this.model.moveBasin(this._selectedItem.uid, this.findBasinPosition(this._selectedItem) + 1);
         }
+        const basin = this._selectedItem;
+        this.unselect();
         this.refresh();
+        this.selectNodeOnSchema(basin);
     }
 
     public get uitextMoveBasinDown() {
@@ -568,6 +589,10 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
             if (data.action === "refresh") {
                 this.unselect();
                 this.refresh();
+                // select a node on the schema ?
+                if (data.value !== undefined) {
+                    this.selectNodeOnSchema(this.model.findChild(data.value));
+                }
             }
         }
     }
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index 5ea0bc823..d448f6a99 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -68,7 +68,10 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
             } else if (sender.id === this._downstreamBasinSelectId) {
                 nub.bassinAval = newBasin;
             }
-            this.notifyObservers({ action: "updateBasin" }, this);
+            this.notifyObservers({
+                action: "updateBasin",
+                value: nub.uid // node to select on the schema
+            }, this);
         }
     }
 }
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 95d4ee703..dd175247a 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -124,9 +124,9 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         }
     }
 
-    private refreshSchema() {
+    private refreshSchema(nodeUidToSelect: string) {
         const pbs = this.kids[0] as PbSchema;
-        pbs.refresh();
+        pbs.refresh(nodeUidToSelect);
     }
 
     // interface Observer
@@ -136,7 +136,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         if (sender instanceof FormulairePbCloison) {
             // console.log("HOH PUTAIN CE BIG QUATTRO HOYOYOYOYOY", this.kids[0].constructor.name);
             if (data.action === "updateBasin") {
-                this.refreshSchema();
+                this.refreshSchema(data.value);
             }
         }
     }
diff --git a/src/app/formulaire/elements/pb-schema.ts b/src/app/formulaire/elements/pb-schema.ts
index 94a7d452a..07e108890 100644
--- a/src/app/formulaire/elements/pb-schema.ts
+++ b/src/app/formulaire/elements/pb-schema.ts
@@ -24,7 +24,10 @@ export class PbSchema extends FormulaireElement {
     }
 
     /** Asks PbSchemaComponent to redraw the schema */
-    public refresh() {
-        this.notifyObservers({ action: "refresh" }, this);
+    public refresh(nodeUidToSelect: string) {
+        this.notifyObservers({
+            action: "refresh",
+            value: nodeUidToSelect
+        }, this);
     }
 }
-- 
GitLab


From 25b8c8d3c3d4e33b0902ed0b5a1c9614053d63ca Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 22 Jun 2020 16:46:47 +0200
Subject: [PATCH 26/92] PreBarrage: move walls

---
 .../formulaire/definition/form-definition.ts  |  1 -
 .../formulaire/definition/form-pb-cloison.ts  | 26 ++++++++++---------
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index c481e906e..a4a0732ea 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -269,7 +269,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
                     break;
 
                 case "template_container":
-                    console.log("parsing template container !", conf);
                     this.parse_template_container(conf, templates);
                     break;
 
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index d448f6a99..90ac294ec 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -17,26 +17,18 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
         this._downstreamBasinSelectId = this.getOption(json, "downstreamBasinSelectId");
     }
 
-    protected completeParse(json: {}, firstNotif: boolean = true) {
+    protected completeParse(json: {}) {
         super.completeParse(json);
         if (this._upstreamBasinSelectId) {
             const sel = this.getFormulaireNodeById(this._upstreamBasinSelectId);
             if (sel) {
                 sel.addObserver(this);
-                if (firstNotif) {
-                    // force 1st observation
-                    (sel as SelectFieldNub).notifySelectValueChanged();
-                }
             }
         }
         if (this._downstreamBasinSelectId) {
             const sel = this.getFormulaireNodeById(this._downstreamBasinSelectId);
             if (sel) {
                 sel.addObserver(this);
-                if (firstNotif) {
-                    // force 1st observation
-                    (sel as SelectFieldNub).notifySelectValueChanged();
-                }
             }
         }
     }
@@ -64,13 +56,23 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
             // empty "" data.value.value should return undefined, which is good for amont/aval
             const newBasin = pb.findChild(data.value.value) as PbBassin;
             if (sender.id === this._upstreamBasinSelectId) {
-                nub.bassinAmont = newBasin;
+                // remove and recreate wall (easier for pointers consistency)
+                const oldDownstreamBasin = nub.bassinAval;
+                pb.deleteChild(pb.findChildPosition(nub.uid));
+                const newWall = new PbCloison(newBasin, oldDownstreamBasin);
+                pb.addChild(newWall);
+                this.currentNub = newWall;
             } else if (sender.id === this._downstreamBasinSelectId) {
-                nub.bassinAval = newBasin;
+                // remove and recreate wall (easier for pointers consistency)
+                const oldUpstreamBasin = nub.bassinAmont;
+                pb.deleteChild(pb.findChildPosition(nub.uid));
+                const newWall = new PbCloison(oldUpstreamBasin, newBasin);
+                pb.addChild(newWall);
+                this.currentNub = newWall;
             }
             this.notifyObservers({
                 action: "updateBasin",
-                value: nub.uid // node to select on the schema
+                value: this._currentNub.uid // node to select on the schema
             }, this);
         }
     }
-- 
GitLab


From b8a11f9444ea06aedab8d15628591e43dd68e1f5 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Tue, 26 May 2020 09:59:17 +0200
Subject: [PATCH 27/92] Work on GUI for Prebarrage

---
 src/app/formulaire/definition/form-definition.ts | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index a4a0732ea..7bb348414 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -219,6 +219,13 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         this.kids.push(tab);
     }
 
+    private parse_pb_schema(json: {}) {
+        const sch: PbSchema = new PbSchema(this);
+        sch.parseConfig(json);
+        this.kids.push(sch);
+    }
+
+
     /**
      * 1ère passe d'analyse de la configuration
      */
@@ -276,6 +283,10 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
                     this.parse_pab_table(conf);
                     break;
 
+                case "pb_schema": // not generic at all
+                    this.parse_pb_schema(conf);
+                    break;
+
                 default:
                     throw new Error(`type d'objet de module de calcul ${type} non pris en charge`);
             }
-- 
GitLab


From 178ecf4f2541108a916192763ce642aa0dd03a35 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 8 Jun 2020 11:32:07 +0200
Subject: [PATCH 28/92] PreBarrage: sort graph nodes to prevent lines crossings

---
 src/app/components/pb-schema/pb-schema.component.ts | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 25cee4728..cd7ad1415 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -266,6 +266,12 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
                 // store, to draw later
                 sortedWalls.push(c);
             }
+            this.existingWalls[basinsPair]++;
+            // draw wall Node
+            def.push(`${c.uid}["${this.itemDesription(c)}"]`); // square edges
+            def.push(`class ${c.uid} wall;`);
+            // draw "arrow" with 2 lines
+            def.push(`${upstreamBasinId}---${c.uid}-->${downstreamBasinId}`);
         }
         // sort then draw walls
         sortedWalls.sort(this.triCloisonsGaucheDroite);
-- 
GitLab


From afe3f9ce3d336086e95f04469842d74f8cbeac49 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 8 Jun 2020 14:04:17 +0200
Subject: [PATCH 29/92] PreBarrage: show data or results on the right side, not
 both

---
 src/app/components/pb-schema/pb-schema.component.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
index b9314c653..dc5af67fa 100644
--- a/src/app/components/pb-schema/pb-schema.component.html
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -46,6 +46,6 @@
 
     <div id="schema" #schema></div>
 
-    <pre id="debug">{{ graphDef }} </pre>
+    <!-- <pre id="debug">{{ graphDef }} </pre> -->
 
 </mat-card-content>
-- 
GitLab


From 31607d81a08d35976bafab224caa020384d03f3d Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 8 Jun 2020 17:02:14 +0200
Subject: [PATCH 30/92] [WIP] subform system for PreBarrage

---
 src/app/components/pb-schema/pb-schema.component.html |  2 +-
 src/app/formulaire/definition/form-definition.ts      | 11 -----------
 2 files changed, 1 insertion(+), 12 deletions(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.html b/src/app/components/pb-schema/pb-schema.component.html
index dc5af67fa..b9314c653 100644
--- a/src/app/components/pb-schema/pb-schema.component.html
+++ b/src/app/components/pb-schema/pb-schema.component.html
@@ -46,6 +46,6 @@
 
     <div id="schema" #schema></div>
 
-    <!-- <pre id="debug">{{ graphDef }} </pre> -->
+    <pre id="debug">{{ graphDef }} </pre>
 
 </mat-card-content>
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 7bb348414..a4a0732ea 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -219,13 +219,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         this.kids.push(tab);
     }
 
-    private parse_pb_schema(json: {}) {
-        const sch: PbSchema = new PbSchema(this);
-        sch.parseConfig(json);
-        this.kids.push(sch);
-    }
-
-
     /**
      * 1ère passe d'analyse de la configuration
      */
@@ -283,10 +276,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
                     this.parse_pab_table(conf);
                     break;
 
-                case "pb_schema": // not generic at all
-                    this.parse_pb_schema(conf);
-                    break;
-
                 default:
                     throw new Error(`type d'objet de module de calcul ${type} non pris en charge`);
             }
-- 
GitLab


From 500bdbd0b1f3e5df58f97dc94a2c23c45174929b Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 9 Jun 2020 11:07:27 +0200
Subject: [PATCH 31/92] Updated dependencies

---
 package-lock.json | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 4e9c56402..565660bba 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -704,10 +704,16 @@
           "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
           "dev": true
         },
+        "run-async": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+          "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+          "dev": true
+        },
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz",
+          "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==",
           "dev": true
         },
         "source-map": {
-- 
GitLab


From f82f25d511806623cd9982479329ce21d6b6ead1 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 9 Jun 2020 12:25:47 +0200
Subject: [PATCH 32/92] PreBarrage: change form on graph click, edit walls

---
 src/app/components/pb-schema/pb-schema.component.ts | 2 +-
 src/app/formulaire/definition/form-definition.ts    | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index cd7ad1415..8b25d56a4 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -448,7 +448,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         const wall = this._selectedItem as PbCloison;
         const wallCopy = new PbCloison(wall.bassinAmont, wall.bassinAval);
         this.model.addChild(wallCopy);
-        this.unselect();
+        this.unselect(); // @TODO select new wall ?
         this.refresh();
         this.selectNodeOnSchema(wallCopy);
     }
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index a4a0732ea..c481e906e 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -269,6 +269,7 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
                     break;
 
                 case "template_container":
+                    console.log("parsing template container !", conf);
                     this.parse_template_container(conf, templates);
                     break;
 
-- 
GitLab


From af816ece085c59d67200db8a1f94657acbc2d4cb Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 11 Jun 2020 15:01:00 +0200
Subject: [PATCH 33/92] PreBarrage: enhance node selection on schema

---
 src/app/components/pb-schema/pb-schema.component.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 8b25d56a4..cd7ad1415 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -448,7 +448,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         const wall = this._selectedItem as PbCloison;
         const wallCopy = new PbCloison(wall.bassinAmont, wall.bassinAval);
         this.model.addChild(wallCopy);
-        this.unselect(); // @TODO select new wall ?
+        this.unselect();
         this.refresh();
         this.selectNodeOnSchema(wallCopy);
     }
-- 
GitLab


From d990271d2bc90fa80677dd267cc807360e825b2b Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 22 Jun 2020 16:46:47 +0200
Subject: [PATCH 34/92] PreBarrage: move walls

---
 src/app/formulaire/definition/form-definition.ts | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index c481e906e..a4a0732ea 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -269,7 +269,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
                     break;
 
                 case "template_container":
-                    console.log("parsing template container !", conf);
                     this.parse_template_container(conf, templates);
                     break;
 
-- 
GitLab


From e70043b4c1c6371f6c29108de75670938f376e8f Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 23 Jun 2020 16:38:00 +0200
Subject: [PATCH 35/92] [WIP] PbCloison form

---
 .../formulaire/definition/form-prebarrage.ts  | 20 ++++++++++++++++++-
 src/app/formulaire/elements/select-field.ts   | 10 +++++++---
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index dd175247a..7d69abf7a 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -5,6 +5,7 @@ import { PbSchema } from "../elements/pb-schema";
 import { FormulaireDefinition } from "./form-definition";
 import { ServiceFactory } from "../../services/service-factory";
 import { FormulairePbCloison } from "./form-pb-cloison";
+import { FieldsetContainer } from "../elements/fieldset-container";
 
 /**
  * Formulaire pour les PréBarrage
@@ -100,12 +101,29 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.showFormElements(this.basinForm);
 
         } else if (node instanceof PbCloison) {
+            console.log("---------------> new wall form !!");
             this.wallForm = new FormulairePbCloison();
             this.wallForm.defaultProperties["calcType"] = CalculatorType.PbCloison;
             this.wallForm.currentNub = node;
             this.wallForm.preparseConfig(this.wallFormConfig);
             this.wallForm.parseConfig(this.wallFormConfig);
-            this.wallForm.addObserver(this); // subscribe to upstream/downstream basin change
+            // add fieldsets for existing Structures
+            console.log(`Node ${node.uid} : ${node.structures.length} structures, Form ${this.uid} : ${this._kids.length} form elements`);
+            if (node.structures.length > 0) {
+                console.log(">> adding fieldsets for existing structures");
+                for (const struct of node.structures) {
+                    for (const e of this.allFormElements) {
+                        if (e instanceof FieldsetContainer) { // @TODO manage many containers one day ?
+                            e.addFromTemplate(0, undefined, struct);
+                        }
+                    }
+                }
+            } else {
+                // if there was no existing structure, add a default one ! @TODO
+                console.log("TODO add default structure");
+            }
+            // subscribe to upstream/downstream basin change
+            this.wallForm.addObserver(this);
             ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(this.wallForm);
             this.showFormElements(this.wallForm);
         }
diff --git a/src/app/formulaire/elements/select-field.ts b/src/app/formulaire/elements/select-field.ts
index d003d2a6d..ac9525f2c 100644
--- a/src/app/formulaire/elements/select-field.ts
+++ b/src/app/formulaire/elements/select-field.ts
@@ -5,7 +5,8 @@ import {
     StructureType,
     LoiDebit,
     Session,
-    Solveur
+    Solveur,
+    StructureProperties
  } from "jalhyd";
 
 import { Field } from "./field";
@@ -215,9 +216,12 @@ export class SelectField extends Field {
             case "device_loi_debit":
                 // get current structure type from appropriate Nub child
                 const child = nub.getChildren()[this.parent.indexAsKid()];
-                const cst = child.properties.getPropValue("structureType");
                 const la = (nub as ParallelStructure).getLoisAdmissibles();
-                const stName = StructureType[cst];
+                const loiDebit = child.properties.getPropValue("loiDebit");
+                const stCode = StructureProperties.findCompatibleStructure(loiDebit, nub as ParallelStructure);
+                const stName = StructureType[stCode];
+                // console.log(`__device_loi_debit__ : child=${child.constructor.name}, loiDebit=${loiDebit}, stCode=${stCode}, stName=${stName}`);
+                // console.log("(child.properties)", child.properties.props);
                 for (const ld of la[stName]) {
                     const e: SelectEntry = new SelectEntry(this._entriesBaseId + LoiDebit[ld], ld);
                     this.addEntry(e);
-- 
GitLab


From 8fd0d260dbf4cce180ece375751cc17766dc912b Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Wed, 24 Jun 2020 15:51:29 +0200
Subject: [PATCH 36/92] PreBarrage: fix bug in basin number detection

---
 .../pb-schema/pb-schema.component.ts          | 31 +++++--------------
 1 file changed, 7 insertions(+), 24 deletions(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index cd7ad1415..0dddab78b 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -266,12 +266,6 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
                 // store, to draw later
                 sortedWalls.push(c);
             }
-            this.existingWalls[basinsPair]++;
-            // draw wall Node
-            def.push(`${c.uid}["${this.itemDesription(c)}"]`); // square edges
-            def.push(`class ${c.uid} wall;`);
-            // draw "arrow" with 2 lines
-            def.push(`${upstreamBasinId}---${c.uid}-->${downstreamBasinId}`);
         }
         // sort then draw walls
         sortedWalls.sort(this.triCloisonsGaucheDroite);
@@ -382,17 +376,17 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         if (item instanceof PbCloison) {
             const upstreamBasinName = item.bassinAmont === undefined
                 ? this.i18nService.localizeText("INFO_LIB_AMONT")
-                : "B" + (this.findBasinPosition(item.bassinAmont) + 1);
+                : "B" + (this.model.findBasinPosition(item.bassinAmont.uid) + 1);
             const downstreamBasinName = item.bassinAval === undefined
                 ? this.i18nService.localizeText("INFO_LIB_AVAL")
-                : "B" + (this.findBasinPosition(item.bassinAval) + 1);
+                : "B" + (this.model.findBasinPosition(item.bassinAval.uid) + 1);
             desc = upstreamBasinName + "-" + downstreamBasinName;
             // if a similar wall already exists, suffix !
             if (item.uid in this.wallsSuffixes) {
                 desc += " (" + this.wallsSuffixes[item.uid] + ")";
             }
         } else if (item instanceof PbBassin) {
-            desc = this.i18nService.localizeText("INFO_PB_BASSIN_N") + (this.findBasinPosition(item) + 1);
+            desc = this.i18nService.localizeText("INFO_PB_BASSIN_N") + (this.model.findBasinPosition(item.uid) + 1);
         } // else undefined
         return desc;
     }
@@ -408,17 +402,6 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         });
     }
 
-    private findBasinPosition(basin: PbBassin): number {
-        let i = 0;
-        for (const b of this.model.bassins) {
-            if (b === basin) {
-                break;
-            }
-            i++;
-        }
-        return i;
-    }
-
     // at this time @Input data is supposed to be already populated
     public ngOnInit() {
         this.model = this.pbSchema.pb;
@@ -508,14 +491,14 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     public get enableUpButton() {
         return (
             this._selectedItem instanceof PbBassin
-            && this.findBasinPosition(this._selectedItem) !== 0
+            && this.model.findBasinPosition(this._selectedItem.uid) !== 0
             && this.isStandaloneBasin(this._selectedItem)
         );
     }
 
     public onMoveBasinUpClick() {
         if (this._selectedItem instanceof PbBassin) {
-            this.model.moveBasin(this._selectedItem.uid, this.findBasinPosition(this._selectedItem) - 1);
+            this.model.moveBasin(this._selectedItem.uid, this.model.findBasinPosition(this._selectedItem.uid) - 1);
         }
         const basin = this._selectedItem;
         this.unselect();
@@ -530,14 +513,14 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     public get enableDownButton() {
         return (
             this._selectedItem instanceof PbBassin
-            && this.findBasinPosition(this._selectedItem) !== this.model.bassins.length - 1
+            && this.model.findBasinPosition(this._selectedItem.uid) !== this.model.bassins.length - 1
             && this.isStandaloneBasin(this._selectedItem)
         );
     }
 
     public onMoveBasinDownClick() {
         if (this._selectedItem instanceof PbBassin) {
-            this.model.moveBasin(this._selectedItem.uid, this.findBasinPosition(this._selectedItem) + 1);
+            this.model.moveBasin(this._selectedItem.uid, this.model.findBasinPosition(this._selectedItem.uid) + 1);
         }
         const basin = this._selectedItem;
         this.unselect();
-- 
GitLab


From 38b4059ee04b4441054f7466b2f6f0a43c8b9b3c Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 25 Jun 2020 09:24:33 +0200
Subject: [PATCH 37/92] Updated dependencies

---
 package-lock.json | 812 ++++++++++++++++++----------------------------
 1 file changed, 312 insertions(+), 500 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 565660bba..0b0204e51 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -327,52 +327,6 @@
         "rxjs": "6.5.5"
       },
       "dependencies": {
-        "@angular-devkit/core": {
-          "version": "9.1.7",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.7.tgz",
-          "integrity": "sha512-guvolu9Cl+qYMTtedLZD9wCqustJjdqzJ2psD2C1Sr1LrX9T0mprmDldR/YnhsitThveJEb6sM/0EvqWxoSvKw==",
-          "dev": true,
-          "requires": {
-            "ajv": "6.12.0",
-            "fast-json-stable-stringify": "2.1.0",
-            "magic-string": "0.25.7",
-            "rxjs": "6.5.4",
-            "source-map": "0.7.3"
-          }
-        },
-        "ajv": {
-          "version": "6.12.0",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
-          "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-          "dev": true
-        },
-        "fast-json-stable-stringify": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-          "dev": true
-        },
-        "magic-string": {
-          "version": "0.25.7",
-          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-          "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
-          "dev": true,
-          "requires": {
-            "sourcemap-codec": "^1.4.4"
-          }
-        },
         "rxjs": {
           "version": "6.5.5",
           "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
@@ -380,14 +334,6 @@
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
-          },
-          "dependencies": {
-            "tslib": {
-              "version": "1.13.0",
-              "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-              "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
-              "dev": true
-            }
           }
         },
         "tslib": {
@@ -458,79 +404,6 @@
         "uuid": "8.1.0"
       },
       "dependencies": {
-        "@angular-devkit/architect": {
-          "version": "0.901.7",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.7.tgz",
-          "integrity": "sha512-yW/PUEqle55QihOFbmeNXaVTodhfeXkteoFDUpz+YpX3xiQDXDtNbIJSzKOQTojtBKdSMKMvZkQLr+RAa7/1EA==",
-          "dev": true,
-          "requires": {
-            "@angular-devkit/core": "9.1.7",
-            "rxjs": "6.5.4"
-          },
-          "dependencies": {
-            "rxjs": {
-              "version": "6.5.4",
-              "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
-              "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
-              "dev": true,
-              "requires": {
-                "tslib": "^1.9.0"
-              },
-              "dependencies": {
-                "tslib": {
-                  "version": "1.13.0",
-                  "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-                  "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
-                  "dev": true
-                }
-              }
-            }
-          }
-        },
-        "@angular-devkit/core": {
-          "version": "9.1.7",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.7.tgz",
-          "integrity": "sha512-guvolu9Cl+qYMTtedLZD9wCqustJjdqzJ2psD2C1Sr1LrX9T0mprmDldR/YnhsitThveJEb6sM/0EvqWxoSvKw==",
-          "dev": true,
-          "requires": {
-            "ajv": "6.12.0",
-            "fast-json-stable-stringify": "2.1.0",
-            "magic-string": "0.25.7",
-            "rxjs": "6.5.4",
-            "source-map": "0.7.3"
-          },
-          "dependencies": {
-            "rxjs": {
-              "version": "6.5.4",
-              "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
-              "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
-              "dev": true,
-              "requires": {
-                "tslib": "^1.9.0"
-              },
-              "dependencies": {
-                "tslib": {
-                  "version": "1.13.0",
-                  "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-                  "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
-                  "dev": true
-                }
-              }
-            }
-          }
-        },
-        "ajv": {
-          "version": "6.12.0",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
-          "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
         "ansi-colors": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
@@ -615,15 +488,23 @@
             "color-convert": "^2.0.1"
           }
         },
-        "cliui": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
           "dev": true,
           "requires": {
-            "string-width": "^4.2.0",
-            "strip-ansi": "^6.0.0",
-            "wrap-ansi": "^6.2.0"
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "cli-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+          "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^3.1.0"
           }
         },
         "color-convert": {
@@ -635,46 +516,37 @@
             "color-name": "~1.1.4"
           }
         },
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
+            "ms": "^2.1.1"
           }
         },
-        "fs-extra": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz",
-          "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=",
+        "figures": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+          "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
           "dev": true,
           "requires": {
-            "graceful-fs": "^4.1.2",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
+            "escape-string-regexp": "^1.0.5"
           }
         },
-        "get-caller-file": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+        "hosted-git-info": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz",
+          "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==",
           "dev": true,
           "requires": {
-            "p-locate": "^4.1.0"
+            "lru-cache": "^5.1.1"
           }
         },
         "p-locate": {
@@ -683,7 +555,7 @@
           "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
           "dev": true,
           "requires": {
-            "p-limit": "^2.2.0"
+            "yallist": "^3.0.2"
           }
         },
         "minimist": {
@@ -698,12 +570,51 @@
           "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
           "dev": true
         },
-        "require-main-filename": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+        "mute-stream": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+          "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
           "dev": true
         },
+        "npm-package-arg": {
+          "version": "8.0.1",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz",
+          "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^3.0.2",
+            "semver": "^7.0.0",
+            "validate-npm-package-name": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "restore-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+          "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+          "dev": true,
+          "requires": {
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
         "run-async": {
           "version": "2.4.1",
           "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
@@ -716,23 +627,6 @@
           "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==",
           "dev": true
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
-        },
         "strip-ansi": {
           "version": "6.0.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -754,39 +648,75 @@
           "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^4.0.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0"
+            "has-flag": "^4.0.0"
           }
         },
-        "yargs": {
-          "version": "15.3.0",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz",
-          "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==",
-          "dev": true,
-          "requires": {
-            "cliui": "^6.0.0",
-            "decamelize": "^1.2.0",
-            "find-up": "^4.1.0",
-            "get-caller-file": "^2.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^4.2.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^18.1.0"
-          }
+        "uuid": {
+          "version": "7.0.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz",
+          "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==",
+          "dev": true
         },
-        "yargs-parser": {
-          "version": "18.1.3",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "@angular/common": {
+      "version": "9.1.11",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.11.tgz",
+      "integrity": "sha512-Vh5lF7zWwDK9RedmYXUc8vUXyrecR3j1mAWlTlnmcHYxxFThPzN/dr0slQcPi6nyJn0EmyRKUGvAoZx4rIb7wg=="
+    },
+    "@angular/compiler": {
+      "version": "9.1.11",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.11.tgz",
+      "integrity": "sha512-MbVheCG0U8gt6xtiipau20N26mD2sXjLChVmRKgO6rbDruxboNMZfEd94q9NP9JRaUsVnjXvY7GMDldoymdXig=="
+    },
+    "@angular/compiler-cli": {
+      "version": "9.1.11",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.11.tgz",
+      "integrity": "sha512-9qIxbtpRXOQnRm6inxCa5HuH87MSuMzuceD0YBVzl8v+vLtewon9KXYMmF4kTBhWa/LEa8FrajljLh0azf3VLg==",
+      "dev": true,
+      "requires": {
+        "canonical-path": "1.0.0",
+        "chokidar": "^3.0.0",
+        "convert-source-map": "^1.5.1",
+        "dependency-graph": "^0.7.2",
+        "fs-extra": "4.0.2",
+        "magic-string": "^0.25.0",
+        "minimist": "^1.2.0",
+        "reflect-metadata": "^0.1.2",
+        "semver": "^6.3.0",
+        "source-map": "^0.6.1",
+        "sourcemap-codec": "^1.4.8",
+        "yargs": "15.3.0"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz",
+          "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=",
           "dev": true,
           "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
+            "graceful-fs": "^4.1.2",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
           }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
@@ -907,9 +837,9 @@
       }
     },
     "@babel/compat-data": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz",
-      "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==",
+      "version": "7.10.3",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.3.tgz",
+      "integrity": "sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg==",
       "dev": true,
       "requires": {
         "browserslist": "^4.12.0",
@@ -1005,31 +935,6 @@
         "source-map": "^0.5.0"
       },
       "dependencies": {
-        "jsesc": {
-          "version": "2.5.2",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-          "dev": true
-        },
-        "regenerator-transform": {
-          "version": "0.14.2",
-          "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.2.tgz",
-          "integrity": "sha512-V4+lGplCM/ikqi5/mkkpJ06e9Bujq1NFmNLvsCs56zg3ZbzrnUzAtizZ24TXxtRX/W2jcdScwQCnbL0CICTFkQ==",
-          "requires": {
-            "@babel/runtime": "^7.8.4",
-            "private": "^0.1.8"
-          }
-        },
-        "rimraf": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
-          "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
         "source-map": {
           "version": "0.5.7",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@@ -1636,29 +1541,29 @@
           "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.1"
+            "@babel/highlight": "^7.10.3"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
-          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz",
+          "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.1",
+            "@babel/helper-validator-identifier": "^7.10.3",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
         "@babel/template": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
-          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz",
+          "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.1",
-            "@babel/parser": "^7.10.1",
-            "@babel/types": "^7.10.1"
+            "@babel/code-frame": "^7.10.3",
+            "@babel/parser": "^7.10.3",
+            "@babel/types": "^7.10.3"
           }
         }
       }
@@ -1686,34 +1591,34 @@
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
-          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz",
+          "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.1"
+            "@babel/highlight": "^7.10.3"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
-          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz",
+          "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.1",
+            "@babel/helper-validator-identifier": "^7.10.3",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
         "@babel/template": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
-          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz",
+          "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.1",
-            "@babel/parser": "^7.10.1",
-            "@babel/types": "^7.10.1"
+            "@babel/code-frame": "^7.10.3",
+            "@babel/parser": "^7.10.3",
+            "@babel/types": "^7.10.3"
           }
         }
       }
@@ -1728,9 +1633,9 @@
       }
     },
     "@babel/helper-validator-identifier": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz",
-      "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==",
+      "version": "7.10.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz",
+      "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==",
       "dev": true
     },
     "@babel/helper-wrap-function": {
@@ -1746,34 +1651,34 @@
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
-          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz",
+          "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.1"
+            "@babel/highlight": "^7.10.3"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
-          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz",
+          "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.1",
+            "@babel/helper-validator-identifier": "^7.10.3",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
         "@babel/template": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
-          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz",
+          "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.1",
-            "@babel/parser": "^7.10.1",
-            "@babel/types": "^7.10.1"
+            "@babel/code-frame": "^7.10.3",
+            "@babel/parser": "^7.10.3",
+            "@babel/types": "^7.10.3"
           }
         }
       }
@@ -1790,34 +1695,34 @@
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
-          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz",
+          "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.1"
+            "@babel/highlight": "^7.10.3"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
-          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz",
+          "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.1",
+            "@babel/helper-validator-identifier": "^7.10.3",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
         "@babel/template": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
-          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
+          "version": "7.10.3",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz",
+          "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.1",
-            "@babel/parser": "^7.10.1",
-            "@babel/types": "^7.10.1"
+            "@babel/code-frame": "^7.10.3",
+            "@babel/parser": "^7.10.3",
+            "@babel/types": "^7.10.3"
           }
         }
       }
@@ -1842,19 +1747,19 @@
       }
     },
     "@babel/parser": {
-      "version": "7.10.2",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz",
-      "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==",
+      "version": "7.10.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz",
+      "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==",
       "dev": true
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz",
-      "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==",
+      "version": "7.10.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz",
+      "integrity": "sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.1",
-        "@babel/helper-remap-async-to-generator": "^7.10.1",
+        "@babel/helper-plugin-utils": "^7.10.3",
+        "@babel/helper-remap-async-to-generator": "^7.10.3",
         "@babel/plugin-syntax-async-generators": "^7.8.0"
       }
     },
@@ -2405,8 +2310,7 @@
       "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.1"
       }
     },
     "@babel/plugin-transform-unicode-regex": {
@@ -3295,43 +3199,6 @@
         "semver-intersect": "1.4.0"
       },
       "dependencies": {
-        "@angular-devkit/core": {
-          "version": "9.1.7",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.7.tgz",
-          "integrity": "sha512-guvolu9Cl+qYMTtedLZD9wCqustJjdqzJ2psD2C1Sr1LrX9T0mprmDldR/YnhsitThveJEb6sM/0EvqWxoSvKw==",
-          "dev": true,
-          "requires": {
-            "ajv": "6.12.0",
-            "fast-json-stable-stringify": "2.1.0",
-            "magic-string": "0.25.7",
-            "rxjs": "6.5.4",
-            "source-map": "0.7.3"
-          }
-        },
-        "ajv": {
-          "version": "6.12.0",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
-          "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-          "dev": true
-        },
-        "fast-json-stable-stringify": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-          "dev": true
-        },
         "hosted-git-info": {
           "version": "3.0.5",
           "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
@@ -3350,15 +3217,6 @@
             "yallist": "^4.0.0"
           }
         },
-        "magic-string": {
-          "version": "0.25.7",
-          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-          "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
-          "dev": true,
-          "requires": {
-            "sourcemap-codec": "^1.4.4"
-          }
-        },
         "npm-package-arg": {
           "version": "8.0.1",
           "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz",
@@ -3377,14 +3235,6 @@
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
-          },
-          "dependencies": {
-            "tslib": {
-              "version": "1.13.0",
-              "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-              "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
-              "dev": true
-            }
           }
         },
         "semver": {
@@ -3393,6 +3243,12 @@
           "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==",
           "dev": true
         },
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        },
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -4614,12 +4470,6 @@
             "semver": "^5.6.0"
           }
         },
-        "minimist": {
-          "version": "1.2.5",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-          "dev": true
-        },
         "pify": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
@@ -5540,34 +5390,6 @@
             "glob": "^7.1.3"
           }
         },
-        "tar": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz",
-          "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==",
-          "dev": true,
-          "requires": {
-            "chownr": "^2.0.0",
-            "fs-minipass": "^2.0.0",
-            "minipass": "^3.0.0",
-            "minizlib": "^2.1.0",
-            "mkdirp": "^1.0.3",
-            "yallist": "^4.0.0"
-          },
-          "dependencies": {
-            "chownr": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-              "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-              "dev": true
-            },
-            "yallist": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-              "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-              "dev": true
-            }
-          }
-        },
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -10167,9 +9989,9 @@
       }
     },
     "figgy-pudding": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
-      "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
       "dev": true
     },
     "figures": {
@@ -11137,7 +10959,8 @@
     "genfun": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz",
-      "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA=="
+      "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==",
+      "dev": true
     },
     "gensync": {
       "version": "1.0.0-beta.1",
@@ -13243,12 +13066,6 @@
             "utils-merge": "1.0.1"
           }
         },
-        "eventemitter3": {
-          "version": "4.0.4",
-          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
-          "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
-          "dev": true
-        },
         "fill-range": {
           "version": "7.0.1",
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -13329,17 +13146,6 @@
             "is-number": "^7.0.0"
           }
         },
-        "wrap-ansi": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0"
-          }
-        },
         "yargs": {
           "version": "15.3.1",
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
@@ -13358,16 +13164,6 @@
             "y18n": "^4.0.0",
             "yargs-parser": "^18.1.1"
           }
-        },
-        "yargs-parser": {
-          "version": "18.1.3",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
-          }
         }
       }
     },
@@ -13940,9 +13736,9 @@
       "dev": true
     },
     "magic-string": {
-      "version": "0.25.4",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz",
-      "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==",
+      "version": "0.25.7",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
       "dev": true,
       "requires": {
         "sourcemap-codec": "^1.4.4"
@@ -14441,29 +14237,19 @@
       }
     },
     "minizlib": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
-      "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz",
+      "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==",
       "dev": true,
       "requires": {
         "minipass": "^3.0.0",
         "yallist": "^4.0.0"
       },
       "dependencies": {
-        "minipass": {
-          "version": "2.9.0",
-          "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
-          "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.0"
-          }
-        },
         "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
@@ -15132,9 +14918,9 @@
       },
       "dependencies": {
         "es-abstract": {
-          "version": "1.17.4",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
-          "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
+          "version": "1.17.6",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+          "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
           "dev": true,
           "requires": {
             "es-to-primitive": "^1.2.1",
@@ -15168,24 +14954,24 @@
           "dev": true
         },
         "is-callable": {
-          "version": "1.1.5",
-          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
-          "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+          "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
           "dev": true
         },
         "is-regex": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
-          "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
+          "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
           "dev": true,
           "requires": {
             "has-symbols": "^1.0.1"
           }
         },
         "object-inspect": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
-          "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+          "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
           "dev": true
         },
         "object-keys": {
@@ -17281,6 +17067,15 @@
       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
       "dev": true
     },
+    "pupa": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
+      "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
+      "dev": true,
+      "requires": {
+        "escape-goat": "^2.0.0"
+      }
+    },
     "q": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
@@ -18011,6 +17806,12 @@
         "is-promise": "^2.1.0"
       }
     },
+    "run-parallel": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+      "dev": true
+    },
     "run-queue": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
@@ -19370,10 +19171,10 @@
         "function-bind": "^1.0.2"
       }
     },
-    "string.prototype.trimleft": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
-      "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
+    "string.prototype.trimend": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+      "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
       "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
@@ -19445,10 +19246,10 @@
         }
       }
     },
-    "string.prototype.trimright": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
-      "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+    "string.prototype.trimstart": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+      "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
       "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
@@ -19805,9 +19606,9 @@
       "dev": true
     },
     "tar": {
-      "version": "4.4.13",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
-      "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz",
+      "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==",
       "dev": true,
       "requires": {
         "chownr": "^2.0.0",
@@ -19818,29 +19619,22 @@
         "yallist": "^4.0.0"
       },
       "dependencies": {
-        "fs-minipass": {
-          "version": "1.2.7",
-          "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
-          "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
-          "dev": true,
-          "requires": {
-            "minipass": "^2.6.0"
-          }
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+          "dev": true
         },
-        "minipass": {
-          "version": "2.9.0",
-          "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
-          "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.0"
-          }
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
         },
         "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
@@ -20354,11 +20148,10 @@
       }
     },
     "type-fest": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
-      "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
-      "dev": true,
-      "optional": true
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+      "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+      "dev": true
     },
     "type-is": {
       "version": "1.6.18",
@@ -21528,15 +21321,6 @@
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
-        "serialize-javascript": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
-          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
-          "dev": true,
-          "requires": {
-            "randombytes": "^2.1.0"
-          }
-        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -22189,6 +21973,34 @@
           "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
           "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
           "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
         }
       }
     },
-- 
GitLab


From 4c0b6e949c305f026def7451342117b5847e56e5 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 25 Jun 2020 11:36:35 +0200
Subject: [PATCH 38/92] PreBarrage: display structures in Cloison form

---
 src/app/calculators/pbcloison/en.json         | 31 +++++++++++++++++-
 src/app/calculators/pbcloison/fr.json         | 32 ++++++++++++++++++-
 .../pb-schema/pb-schema.component.ts          |  5 +++
 .../formulaire/definition/form-definition.ts  |  3 +-
 .../formulaire/definition/form-pb-cloison.ts  |  8 +++++
 .../formulaire/definition/form-prebarrage.ts  | 26 ++++++---------
 6 files changed, 86 insertions(+), 19 deletions(-)

diff --git a/src/app/calculators/pbcloison/en.json b/src/app/calculators/pbcloison/en.json
index bcd280c3a..2f9e94744 100644
--- a/src/app/calculators/pbcloison/en.json
+++ b/src/app/calculators/pbcloison/en.json
@@ -2,5 +2,34 @@
     "fs_wall_params": "Wall parameters",
 
     "select_upstream_basin": "Upstream basin",
-    "select_downstream_basin": "Downstream basin"
+    "select_downstream_basin": "Downstream basin",
+
+    "select_structure_Orifice": "Orifice",
+    "select_structure_VanneRectangulaire": "Rectangular gate",
+    "select_structure_SeuilRectangulaire": "Rectangular weir",
+    "select_structure_SeuilTriangulaire": "Triangular weir",
+    "select_structure_SeuilTriangulaireTrunc": "Truncated triangular weir",
+
+    "select_loidebit_Orifice_OrificeSubmerged": "Submerged orifice",
+    "select_loidebit_Orifice_OrificeFree": "Free orifice",
+
+    "select_loidebit_VanneRectangulaire_GateCem88d": "Weir/Orifice Cemagref 88",
+    "select_loidebit_VanneRectangulaire_GateCem88v": "Weir/Undershot gate Cemagref 88",
+    "select_loidebit_VanneRectangulaire_GateCunge80": "Cunge (1980)",
+    "select_loidebit_VanneRectangulaire_RectangularOrificeFree": "Free flow gate",
+    "select_loidebit_VanneRectangulaire_RectangularOrificeSubmerged": "Submerged gate",
+
+    "select_loidebit_SeuilTriangulaire_TriangularWeirFree": "V-notch sharp-crested weir (Villemonte)",
+    "select_loidebit_SeuilTriangulaire_TriangularWeirBroad": "V-notch broad-crested weir (Bos)",
+
+    "select_loidebit_SeuilTriangulaireTrunc_TriangularTruncWeirFree": "Truncated triangular weir (Villemonte)",
+
+    "select_loidebit_SeuilRectangulaire_WeirCem88d": "Weir/Orifice Cemagref 88",
+    "select_loidebit_SeuilRectangulaire_WeirCem88v": "Weir/Undershot gate Cemagref 88",
+    "select_loidebit_SeuilRectangulaire_WeirSubmergedLarinier": "Submerged slot (Larinier 1992)",
+    "select_loidebit_SeuilRectangulaire_WeirSubmerged": "Submerged weir",
+    "select_loidebit_SeuilRectangulaire_WeirVillemonte": "Villemonte 1957",
+    "select_loidebit_SeuilRectangulaire_WeirFree": "Free flow weir",
+    "select_loidebit_SeuilRectangulaire_KIVI": "Kindsvater-Carter and Villemonte",
+    "select_loidebit_SeuilRectangulaire_WeirCunge80": "Cunge (1980)"
 }
diff --git a/src/app/calculators/pbcloison/fr.json b/src/app/calculators/pbcloison/fr.json
index 4480513b3..e02e713f3 100644
--- a/src/app/calculators/pbcloison/fr.json
+++ b/src/app/calculators/pbcloison/fr.json
@@ -1,6 +1,36 @@
 {
     "fs_wall_params": "Paramètres de la cloison",
+    "fs_wall_device": "Ouvrage",
 
     "select_upstream_basin": "Bassin amont",
-    "select_downstream_basin": "Bassin aval"
+    "select_downstream_basin": "Bassin aval",
+
+    "select_structure_Orifice": "Orifice",
+    "select_structure_SeuilRectangulaire": "Seuil rectangulaire",
+    "select_structure_SeuilTriangulaire": "Seuil triangulaire",
+    "select_structure_SeuilTriangulaireTrunc": "Seuil triangulaire tronqué",
+    "select_structure_VanneRectangulaire": "Vanne rectangulaire",
+
+    "select_loidebit_Orifice_OrificeSubmerged": "Orifice noyé",
+    "select_loidebit_Orifice_OrificeFree": "Orifice dénoyé",
+
+    "select_loidebit_VanneRectangulaire_GateCem88d": "Déversoir/Orifice Cemagref 88",
+    "select_loidebit_VanneRectangulaire_GateCem88v": "Déversoir/Vanne de fond Cemagref 88",
+    "select_loidebit_VanneRectangulaire_GateCunge80": "Cunge (1980)",
+    "select_loidebit_VanneRectangulaire_RectangularOrificeFree": "Vanne dénoyée",
+    "select_loidebit_VanneRectangulaire_RectangularOrificeSubmerged": "Vanne noyée",
+
+    "select_loidebit_SeuilTriangulaire_TriangularWeirFree": "Déversoir triangulaire mince (Villemonte)",
+    "select_loidebit_SeuilTriangulaire_TriangularWeirBroad": "Déversoir triangulaire épais (Bos)",
+
+    "select_loidebit_SeuilTriangulaireTrunc_TriangularTruncWeirFree": "Déversoir triangulaire tronqué (Villemonte)",
+
+    "select_loidebit_SeuilRectangulaire_WeirCem88d": "Déversoir/Orifice Cemagref 88",
+    "select_loidebit_SeuilRectangulaire_WeirCem88v": "Déversoir/Vanne de fond Cemagref 88",
+    "select_loidebit_SeuilRectangulaire_WeirSubmergedLarinier": "Fente noyée (Larinier 1992)",
+    "select_loidebit_SeuilRectangulaire_WeirSubmerged": "Seuil noyé",
+    "select_loidebit_SeuilRectangulaire_WeirVillemonte": "Villemonte 1957",
+    "select_loidebit_SeuilRectangulaire_WeirFree": "Seuil dénoyé",
+    "select_loidebit_SeuilRectangulaire_KIVI": "Kindsvater-Carter et Villemonte",
+    "select_loidebit_SeuilRectangulaire_WeirCunge80": "Cunge (1980)"
 }
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 0dddab78b..fa57966e7 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -78,6 +78,11 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         });
         this.nativeElement = this.schema.nativeElement;
         this.render();
+        // reset form to river properties (clodo timeout to prevent ExpressionChangedAfterItHasBeenCheckedError)
+        setTimeout(() => {
+            this.unselect();
+        }, 10);
+        // @TODO find a way to remember last selected item ? Through a service ?
     }
 
     private render() {
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index a4a0732ea..5eb6ae295 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -418,7 +418,8 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
     }
 
     public isDisplayed(id: string) {
-        return (<FormulaireElement>this.getFormulaireNodeById(id)).isDisplayed;
+        const fe = <FormulaireElement>this.getFormulaireNodeById(id);
+        return fe !== undefined && fe.isDisplayed;
     }
 
     /**
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index 90ac294ec..cf9801ef6 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -60,6 +60,10 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
                 const oldDownstreamBasin = nub.bassinAval;
                 pb.deleteChild(pb.findChildPosition(nub.uid));
                 const newWall = new PbCloison(newBasin, oldDownstreamBasin);
+                // copy structures
+                for (const s of nub.structures) {
+                    newWall.addChild(s);
+                }
                 pb.addChild(newWall);
                 this.currentNub = newWall;
             } else if (sender.id === this._downstreamBasinSelectId) {
@@ -67,6 +71,10 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
                 const oldUpstreamBasin = nub.bassinAmont;
                 pb.deleteChild(pb.findChildPosition(nub.uid));
                 const newWall = new PbCloison(oldUpstreamBasin, newBasin);
+                // copy structures
+                for (const s of nub.structures) {
+                    newWall.addChild(s);
+                }
                 pb.addChild(newWall);
                 this.currentNub = newWall;
             }
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 7d69abf7a..063d37ecf 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -21,9 +21,6 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     /** configuration for re-creating basin form every time needed */
     private basinFormConfig: string;
 
-    /** child form for walls (repeatable devices) */
-    private wallForm: FormulairePbCloison;
-
     /** configuration for re-creating wall form every time needed */
     private wallFormConfig: string;
 
@@ -74,7 +71,6 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
                 break;
             case "subform_wall":
                 // same as above
-                console.log("===> storing wall form config", json["config"]);
                 this.wallFormConfig = json["config"];
                 break;
         }
@@ -101,18 +97,19 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.showFormElements(this.basinForm);
 
         } else if (node instanceof PbCloison) {
-            console.log("---------------> new wall form !!");
-            this.wallForm = new FormulairePbCloison();
-            this.wallForm.defaultProperties["calcType"] = CalculatorType.PbCloison;
-            this.wallForm.currentNub = node;
-            this.wallForm.preparseConfig(this.wallFormConfig);
-            this.wallForm.parseConfig(this.wallFormConfig);
+            const wallForm = new FormulairePbCloison();
+            wallForm.defaultProperties["calcType"] = CalculatorType.PbCloison;
+            wallForm.currentNub = node;
+            wallForm.preparseConfig(this.wallFormConfig);
+            wallForm.parseConfig(this.wallFormConfig);
+            // subscribe to upstream/downstream basin change
+            wallForm.addObserver(this); // @TODO why not this.form ? wallForm is just a dummy form to extract elements from…
+            ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(wallForm);
             // add fieldsets for existing Structures
             console.log(`Node ${node.uid} : ${node.structures.length} structures, Form ${this.uid} : ${this._kids.length} form elements`);
             if (node.structures.length > 0) {
-                console.log(">> adding fieldsets for existing structures");
                 for (const struct of node.structures) {
-                    for (const e of this.allFormElements) {
+                    for (const e of wallForm.allFormElements) {
                         if (e instanceof FieldsetContainer) { // @TODO manage many containers one day ?
                             e.addFromTemplate(0, undefined, struct);
                         }
@@ -122,10 +119,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
                 // if there was no existing structure, add a default one ! @TODO
                 console.log("TODO add default structure");
             }
-            // subscribe to upstream/downstream basin change
-            this.wallForm.addObserver(this);
-            ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(this.wallForm);
-            this.showFormElements(this.wallForm);
+            this.showFormElements(wallForm);
         }
     }
 
-- 
GitLab


From bb957ee51f5b50cece19ccd7acbb192f7576434c Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 25 Jun 2020 15:30:38 +0200
Subject: [PATCH 39/92] PreBarrage: improved calculator template

---
 .../calculator.component.html                 | 63 ++++++++++++-------
 .../calculator.component.scss                 |  4 ++
 2 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index 24f7b44e4..ff30b8e81 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -74,19 +74,53 @@
                     [fxFlex.lt-sm]="isWide ? '1 0 auto' : '1 0 300px'">
 
                     <div id="calc-card-field-sets-container" [fxLayout]="isPB ? 'row wrap' : 'column'">
-                        
-                        <ng-template ngFor let-fe [ngForOf]="formElements">
+
+                        <!-- PB specific template -->
+                        <div *ngIf="isPB" id="pb-schema-container"
+                            fxFlex.gt-sm="1 0 400px"
+                            fxFlex.lt-md="1 0 500px"
+                            fxFlex.lt-sm="1 0 300px">
+
+                            <pb-schema [pbSchema]="formElements[0]" (radio)=onRadioClick($event)
+                                (validChange)=onElementValid() (nodeSelected)="onPBNodeSelected($event)">
+                            </pb-schema>
+
+                            <div fxHide.sm fxFlex.gt-sm="0 0 16px"></div>
+                        </div>
+                        <!-- PB specific template (2) -->
+                        <div *ngIf="isPB" id="pb-form-container" [hidden]="! showPBInputData"
+                            fxFlex.gt-sm="1 0 400px"
+                            fxFlex.lt-md="1 0 500px"
+                            fxFlex.lt-sm="1 0 300px">
+
+                            <ng-template ngFor let-fe [ngForOf]="formElements">
+                                <field-set *ngIf="isFieldset(fe)"
+                                    [style.display]="getElementStyleDisplay(fe.id)" [fieldSet]=fe
+                                    (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
+                                    (tabPressed)="onTabPressed($event)">
+                                </field-set>
+
+                                <fieldset-container *ngIf="isFieldsetContainer(fe)"
+                                    [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe
+                                    (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
+                                    (tabPressed)="onTabPressed($event)">
+                                </fieldset-container>
+                            </ng-template>
+                        </div>
+
+                        <!-- generic template -->
+                        <ng-template *ngIf="! isPB" ngFor let-fe [ngForOf]="formElements">
                             <field-set *ngIf="isFieldset(fe)"
-                                [hidden]="isPB && ! showPBInputData" [style.display]="getElementStyleDisplay(fe.id)" [fieldSet]=fe
+                                [style.display]="getElementStyleDisplay(fe.id)" [fieldSet]=fe
                                 (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
                                 (tabPressed)="onTabPressed($event)"
-                                [fxFlex.gt-sm]="isPB ? '1 0 400px' : '1 0 auto'"
-                                [fxFlex.lt-md]="isPB ? '1 0 500px' : '1 0 auto'"
-                                [fxFlex.lt-sm]="isPB ? '1 0 300px' : '1 0 auto'">
+                                fxFlex.gt-sm="1 0 auto"
+                                fxFlex.lt-md="1 0 auto"
+                                fxFlex.lt-sm="1 0 auto">
                             </field-set>
 
                             <fieldset-container *ngIf="isFieldsetContainer(fe)"
-                                [hidden]="isPB && ! showPBInputData" [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe
+                                [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe
                                 (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
                                 (tabPressed)="onTabPressed($event)"
                                 fxFlex="1 0 auto">
@@ -96,19 +130,6 @@
                                 (validChange)=onElementValid() (inputChange)=onInputChange($event)
                                 fxFlex="1 0 auto">
                             </pab-table>
-
-                            <div *ngIf="isPbSchema(fe)" id="pb-schema-container"
-                                [fxFlex.gt-sm]="isPB ? '1 0 400px' : '1 0 auto'"
-                                [fxFlex.lt-md]="isPB ? '1 0 500px' : '1 0 auto'"
-                                [fxFlex.lt-sm]="isPB ? '1 0 300px' : '1 0 auto'">
-
-                                <pb-schema *ngIf="isPbSchema(fe)" [pbSchema]=fe (radio)=onRadioClick($event)
-                                    (validChange)=onElementValid() (nodeSelected)="onPBNodeSelected($event)">
-                                </pb-schema>
-
-                                <div fxHide.sm fxFlex.gt-sm="0 0 16px"></div>
-                            </div>
-
                         </ng-template>
                     </div>
 
@@ -133,7 +154,7 @@
 
                     <quicknav *ngIf="! isPB" [ngClass.lt-xs]="'extraSmall'" [fxHide.gt-sm]="! isWide" [items]="quicknavItems" [currentItem]="'results'" [align]="'left'"></quicknav>
 
-                    <mat-card-header *ngIf="! isWide" [fxHide.lt-md]="! isWide">
+                    <mat-card-header *ngIf="! isWide" [fxHide.lt-md]="! isPB && ! isWide">
                         <mat-card-title>
                             <h1 [innerHTML]="uitextResultsTitle"></h1>
                         </mat-card-title>
diff --git a/src/app/components/generic-calculator/calculator.component.scss b/src/app/components/generic-calculator/calculator.component.scss
index 2062925a9..635d9782e 100644
--- a/src/app/components/generic-calculator/calculator.component.scss
+++ b/src/app/components/generic-calculator/calculator.component.scss
@@ -30,6 +30,10 @@
     display: block;
 }
 
+#pb-form-container {
+    display: block;
+}
+
 /** copy of quicknav style */
 #pb-data-results-selector {
 
-- 
GitLab


From 2f9d89b908dc51aa321ecbb657cd16cad1ee49bd Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 25 Jun 2020 16:14:12 +0200
Subject: [PATCH 40/92] PreBarrage: restore select mechanisms on Cloison form

---
 src/app/calculators/prebarrage/config.json       |  6 +++---
 src/app/formulaire/definition/form-pb-cloison.ts | 14 +-------------
 2 files changed, 4 insertions(+), 16 deletions(-)

diff --git a/src/app/calculators/prebarrage/config.json b/src/app/calculators/prebarrage/config.json
index 547346740..7aa71a6d9 100644
--- a/src/app/calculators/prebarrage/config.json
+++ b/src/app/calculators/prebarrage/config.json
@@ -45,7 +45,7 @@
         "type": "subform",
         "config": [
             {
-                "id": "fs_wall_device",
+                "id": "fs_ouvrage",
                 "type": "fieldset_template",
                 "calcType": "Structure",
                 "defaultStructType": "SeuilRectangulaire",
@@ -105,14 +105,14 @@
                 "id": "struct_container",
                 "type": "template_container",
                 "templates": [
-                    "fs_wall_device"
+                    "fs_ouvrage"
                 ]
             },
             {
                 "type": "options",
                 "upstreamBasinSelectId": "select_upstream_basin",
                 "downstreamBasinSelectId": "select_downstream_basin",
-                "selectIds": [ ]
+                "selectIds": [ "select_structure", "select_loidebit" ]
             }
         ]
     },
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index cf9801ef6..db7272f52 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -36,19 +36,7 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
     // interface Observer
 
     public update(sender: IObservable, data: any) {
-        // copied from FormDefinition, to avoid calling super.update()
-        if (sender instanceof Nub) {
-            switch (data.action) {
-                case "resultUpdated":
-                    // forward Nub results update notification to FormCompute objects
-                    this.reaffectResultComponents();
-                    break;
-            }
-        }
-        // copied from FormFixedVar, to avoid calling super.update()
-        if (data.action === "propertyChange") {
-            this.reset();
-        }
+        super.update(sender, data);
 
         if (sender instanceof SelectFieldNub) {
             const nub = this._currentNub as PbCloison;
-- 
GitLab


From b4c7842bebb226dc9232cb7f4db1a52bb6442e26 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Thu, 25 Jun 2020 16:53:57 +0200
Subject: [PATCH 41/92] PreBarrage: add default structure when adding wall

---
 src/app/formulaire/definition/form-prebarrage.ts | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 063d37ecf..0199451c3 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -106,7 +106,6 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             wallForm.addObserver(this); // @TODO why not this.form ? wallForm is just a dummy form to extract elements from…
             ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(wallForm);
             // add fieldsets for existing Structures
-            console.log(`Node ${node.uid} : ${node.structures.length} structures, Form ${this.uid} : ${this._kids.length} form elements`);
             if (node.structures.length > 0) {
                 for (const struct of node.structures) {
                     for (const e of wallForm.allFormElements) {
@@ -116,8 +115,13 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
                     }
                 }
             } else {
-                // if there was no existing structure, add a default one ! @TODO
-                console.log("TODO add default structure");
+                // if there was no existing structure, add a default one
+                for (const e of wallForm.allFormElements) {
+                    if (e instanceof FieldsetContainer) {
+                        e.addFromTemplate(0);
+                        break;
+                    }
+                }
             }
             this.showFormElements(wallForm);
         }
-- 
GitLab


From 0902157f239a07c008973074ba6300e34c9521d8 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Fri, 26 Jun 2020 14:43:40 +0200
Subject: [PATCH 42/92] PreBarrage: restore missing fields in Cloison editor

---
 src/app/calculators/prebarrage/config.json | 26 ++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/app/calculators/prebarrage/config.json b/src/app/calculators/prebarrage/config.json
index 7aa71a6d9..1e6b68147 100644
--- a/src/app/calculators/prebarrage/config.json
+++ b/src/app/calculators/prebarrage/config.json
@@ -63,24 +63,42 @@
                         "property": "loiDebit",
                         "source": "device_loi_debit",
                         "help": {
-                            "Orifice_OrificeSubmerged": "structures/orifice_noye.html",
+                            "SeuilRectangulaire_KIVI": "structures/kivi.html",
                             "SeuilRectangulaire_WeirVillemonte": "structures/kivi.html",
+                            "SeuilRectangulaire_WeirCem88d": "structures/cem_88_d.html",
+                            "SeuilRectangulaire_WeirCem88v": "structures/cem_88_v.html",
+                            "SeuilRectangulaire_WeirCunge80": "structures/cunge_80.html",
+                            "VanneRectangulaire_GateCem88d": "structures/cem_88_d.html",
+                            "VanneRectangulaire_GateCem88v": "structures/cem_88_v.html",
+                            "VanneRectangulaire_GateCunge80": "structures/cunge_80.html",
+                            "Orifice_OrificeSubmerged": "structures/orifice_noye.html",
+                            "Orifice_OrificeFree": "structures/orifice_denoye.html",
                             "SeuilRectangulaire_WeirSubmergedLarinier": "structures/fente_noyee.html",
+                            "SeuilRectangulaire_WeirSubmerged": "structures/seuil_noye.html",
+                            "SeuilRectangulaire_WeirFree": "structures/seuil_denoye.html",
                             "SeuilTriangulaire_TriangularWeirFree": "structures/dever_triang.html",
                             "SeuilTriangulaire_TriangularWeirBroad": "structures/dever_triang.html",
                             "SeuilTriangulaireTrunc_TriangularTruncWeirFree": "structures/dever_triang_tronque.html"
                         }
                     },
-                    "h1",
+                    "S",
+                    "ZDV",
                     "L",
+                    "W",
+                    "CdWS",
                     "CdWSL",
                     "CdWR",
                     "CdGR",
+                    "CdCunge",
                     "CdT",
-                    "S",
+                    "CdO",
+                    "alpha",
+                    "beta",
+                    "ZRAM",
                     "alpha2",
                     "BT",
-                    "ZT"
+                    "ZT",
+                    "Zco"
                 ]
             },
             {
-- 
GitLab


From 31b70944463adfbf1819a52bdc3f47701b6c64bb Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Fri, 26 Jun 2020 14:45:02 +0200
Subject: [PATCH 43/92] PreBarrage

when deleting a wall, leave no basin without connection (connect to river upstream/downstream)
prevent deletion of walls that would be restored by the aforementioned mechanism
"del" hotkey to delete element on schema
---
 .../pb-schema/pb-schema.component.ts          | 52 +++++++++++++++++--
 1 file changed, 49 insertions(+), 3 deletions(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index fa57966e7..abc16fc94 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -7,10 +7,13 @@ import {
 
 import * as mermaid from "mermaid";
 
+import { HotkeysService, Hotkey } from 'angular2-hotkeys';
+
 import { I18nService } from "../../services/internationalisation.service";
 import { PbSchema } from "../../formulaire/elements/pb-schema";
 import { DialogNewPbCloisonComponent } from "../dialog-new-pb-cloison/dialog-new-pb-cloison.component";
 import { GenericCalculatorComponent } from "../generic-calculator/calculator.component";
+import { AppComponent } from "../../app.component";
 
 /**
  * The interactive schema for calculator type "PreBarrage" (component)
@@ -63,8 +66,11 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     public constructor(
         @Inject(forwardRef(() => GenericCalculatorComponent)) private calculatorComponent: GenericCalculatorComponent,
         private i18nService: I18nService,
+        private hotkeysService: HotkeysService,
         private newPbCloisonDialog: MatDialog
-    ) { }
+    ) {
+        this.hotkeysService.add(new Hotkey("del", AppComponent.onHotkey(this.removeOnHotkey, this)));
+    }
 
     public get selectedItem(): any {
         return this._selectedItem;
@@ -413,12 +419,42 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     }
 
     public get enableRemoveButton() {
-        return (this._selectedItem !== undefined);
+        if (this._selectedItem === undefined) {
+            return false;
+        }
+        // if deleting a PbCloison would replace it by a new one at
+        // the same place (@see onRemoveClick), make it not deletable
+        if (this._selectedItem instanceof PbCloison) {
+            if ((
+                this._selectedItem.bassinAmont !== undefined
+                && this._selectedItem.bassinAmont.cloisonsAval.length === 1
+                && this._selectedItem.bassinAval === undefined
+            ) || (
+                this._selectedItem.bassinAval !== undefined
+                && this._selectedItem.bassinAval.cloisonsAmont.length === 1
+                && this._selectedItem.bassinAmont === undefined
+            )) {
+                return false;
+            }
+        }
+        return true;
     }
 
     /** Removes a basin or wall, and all related items */
     public onRemoveClick() {
         this.model.deleteChild(this._selectedItem.findPositionInParent());
+        // never let an unconnected basin ! (not done in model to prevent unwanted
+        // automatic child addition when clearing children)
+        if (this._selectedItem instanceof PbCloison) {
+            // if no downstream connections remain, connect to river downstream
+            if (this._selectedItem.bassinAmont !== undefined && this._selectedItem.bassinAmont.cloisonsAval.length === 0) {
+                this.model.addChild(new PbCloison(this._selectedItem.bassinAmont, undefined));
+            }
+            // if no upstream connections remain, connect to river upstream
+            if (this._selectedItem.bassinAval !== undefined && this._selectedItem.bassinAval.cloisonsAmont.length === 0) {
+                this.model.addChild(new PbCloison(undefined, this._selectedItem.bassinAval));
+            }
+        }
         this.unselect();
         this.refresh();
     }
@@ -427,6 +463,13 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         return this.i18nService.localizeText("INFO_FIELDSET_REMOVE");
     }
 
+    // listener for "del" hotkey
+    protected removeOnHotkey() {
+        if (this.enableRemoveButton) {
+            this.onRemoveClick();
+        }
+    }
+
     public get enableCopyButton() {
         return (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison);
     }
@@ -559,7 +602,10 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     private updateValidity() {
         // check that at least 1 basin is present and a route from river
         // upstream to river downstream exists (2nd check includes 1st)
-        this._isValid = this.model.hasUpDownConnection();
+        this._isValid = (
+            this.model.hasUpDownConnection()
+            && ! this.model.hasBasinNotConnected()
+        );
         console.log("schéma valide", this._isValid);
         this.validChange.emit();
     }
-- 
GitLab


From e988eea8b190041e6b7cf6522698ec97564d8a9a Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 29 Jun 2020 11:15:13 +0200
Subject: [PATCH 44/92] Add new example: PreBarrage

---
 .../calculator-list.component.ts              |   4 +
 .../pb-schema/pb-schema.component.ts          | 118 ---
 src/app/examples/prebarrage.json              | 988 ++++++++++++++++++
 src/locale/messages.en.json                   |   1 +
 src/locale/messages.fr.json                   |   1 +
 5 files changed, 994 insertions(+), 118 deletions(-)
 create mode 100644 src/app/examples/prebarrage.json

diff --git a/src/app/components/calculator-list/calculator-list.component.ts b/src/app/components/calculator-list/calculator-list.component.ts
index f850cdd39..2c23ba423 100644
--- a/src/app/components/calculator-list/calculator-list.component.ts
+++ b/src/app/components/calculator-list/calculator-list.component.ts
@@ -268,6 +268,10 @@ export class CalculatorListComponent implements OnInit {
             {
                 label: this.intlService.localizeText("INFO_EXAMPLE_LABEL_PERR"),
                 path: "perr.json"
+            },
+            {
+                label: this.intlService.localizeText("INFO_EXAMPLE_LABEL_PB"),
+                path: "prebarrage.json"
             }
         ];
     }
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index abc16fc94..3ac6e598c 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -131,19 +131,6 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         });
     }
 
-    // debug
-    private createStructure(l: LoiDebit, v: number[]): Structure {
-        const s: Structure = CreateStructure(l);
-        s.prms.Q.singleValue = v[0];
-        s.prms.ZDV.singleValue = v[1];
-        s.prms.Z1.singleValue = v[2];
-        s.prms.Z2.singleValue = v[3];
-        s.getParameter("L").singleValue = v[4];
-        s.getParameter("CdGR").singleValue = v[5];
-        s.prms.W.singleValue = v[6];
-        return s;
-    }
-
     /**
      * Builds a Mermaid graph text definition, using Nodes
      * to represent basins as well as walls; sorts connexions
@@ -163,111 +150,6 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         def.push("classDef basin fill:#e0f3fb,stroke:#003A80;"); // irstea-ocean 50 / 500
         def.push("classDef node-highlighted fill:#4DBBE9;"); // irstea-ocean (material "accent"), 300
 
-        // debug
-        if (this.model.children.length === 0) {
-            // EXEMPLE 1 (petit)
-            /* const b1 = new PbBassin(new PbBassinParams(0.1, 42));
-            this.model.addChild(b1);
-            const b2 = new PbBassin(new PbBassinParams(0.15, 38));
-            this.model.addChild(b2);
-            this.model.addChild(new PbCloison(undefined, b1));
-            this.model.addChild(new PbCloison(b1, b2));
-            this.model.addChild(new PbCloison(b2, undefined));
-            this.model.addChild(new PbCloison(b1, undefined)); */
-
-            // EXEMPLE 2 (grand)
-            this.model.addChild(new PbBassin(new PbBassinParams(13.80, 95)));
-            this.model.addChild(new PbBassin(new PbBassinParams(15.40, 94.70)));
-            this.model.addChild(new PbBassin(new PbBassinParams(16.20, 94.70)));
-            this.model.addChild(new PbBassin(new PbBassinParams(17.50, 94.40)));
-            this.model.addChild(new PbBassin(new PbBassinParams(32.10, 94.25)));
-            this.model.addChild(new PbBassin(new PbBassinParams(35.00, 94.10)));
-            this.model.addChild(new PbCloison(undefined, this.model.children[0] as PbBassin));
-            // Session.getInstance().createNub(p, this.currentNub as ParallelStructure) as Structure
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.30, 0, 0, 0.4, 1.04 ])
-            );
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 4.40, 1.04 ])
-            );
-            //  Wall between upstream and basin 2
-            this.model.addChild(new PbCloison(undefined, this.model.children[1] as PbBassin));
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.00, 0, 0, 1.00, 1.04 ])
-            );
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 5.00, 0.91 ])
-            );
-            // Wall between upstream and basin 5
-            this.model.addChild(new PbCloison(undefined, this.model.children[4] as PbBassin));
-             this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 3.50, 0.99 ])
-            );
-            // Wall between upstream and basin 6
-            this.model.addChild(new PbCloison(undefined, this.model.children[5] as PbBassin));
-             this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 3.60, 0.99 ])
-            );
-            // Wall between basin 1 & 3
-            this.model.addChild(new PbCloison(this.model.children[0] as PbBassin, this.model.children[2] as PbBassin));
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.00, 0, 0, 0.40, 1.04 ])
-            );
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 96.25, 0, 0, 5.20, 0.99 ])
-            );
-            // Wall between basin 2 & 3
-            this.model.addChild(new PbCloison(this.model.children[1] as PbBassin, this.model.children[2] as PbBassin));
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.85, 0, 0, 4.38, 0.91 ])
-            );
-            // Wall between basin 2 & 4
-            this.model.addChild(new PbCloison(this.model.children[1] as PbBassin, this.model.children[3] as PbBassin));
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.85, 0, 0, 3.00, 0.99 ])
-            );
-            // Wall between basin 2 & 5
-            this.model.addChild(new PbCloison(this.model.children[1] as PbBassin, this.model.children[4] as PbBassin));
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.50, 0, 0, 1.00, 1.04 ])
-            );
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.75, 0, 0, 3.00, 0.99 ])
-            );
-            // Wall between basin 3 & 4
-            this.model.addChild(new PbCloison(this.model.children[2] as PbBassin, this.model.children[3] as PbBassin));
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.70, 0, 0, 0.40, 1.04 ])
-            );
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.65, 0, 0, 5.74, 0.99 ])
-            );
-            // Wall between basin 4 & 5
-            this.model.addChild(new PbCloison(this.model.children[3] as PbBassin, this.model.children[4] as PbBassin));
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.40, 0, 0, 0.40, 1.04 ])
-            );
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.35, 0, 0, 6.00, 0.99 ])
-            );
-            // Wall between basin 5 & 6
-            this.model.addChild(new PbCloison(this.model.children[4] as PbBassin, this.model.children[5] as PbBassin));
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.25, 0, 0, 0.70, 1.04 ])
-            );
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 95.05, 0, 0, 9.50, 0.99 ])
-            );
-            // Wall between basin 6 & downstream
-            this.model.addChild(new PbCloison(this.model.children[5] as PbBassin, undefined));
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.10, 0, 0, 0.95, 1.04 ])
-            );
-            this.model.children[this.model.children.length - 1].addChild(
-                this.createStructure(LoiDebit.WeirCunge80, [ 0, 94.75, 0, 0, 10.20, 0.99 ])
-            );
-        }
-
         const sortedWalls: PbCloison[] = [];
         for (const c of this.model.children) {
             if (c instanceof PbBassin) {
diff --git a/src/app/examples/prebarrage.json b/src/app/examples/prebarrage.json
new file mode 100644
index 000000000..273cd986d
--- /dev/null
+++ b/src/app/examples/prebarrage.json
@@ -0,0 +1,988 @@
+{
+    "header": {
+        "source": "jalhyd",
+        "format_version": "1.3",
+        "created": "2020-06-29T08:37:22.109Z"
+    },
+    "settings": {
+        "precision": 1e-7,
+        "maxIterations": 100,
+        "displayPrecision": 3
+    },
+    "documentation": "",
+    "session": [
+        {
+            "uid": "b2kxNm",
+            "props": {
+                "calcType": "PreBarrage"
+            },
+            "meta": {
+                "title": "Prébarrages"
+            },
+            "children": [
+                {
+                    "uid": "Zjczdz",
+                    "props": {
+                        "calcType": "PbBassin"
+                    },
+                    "children": [],
+                    "parameters": [
+                        {
+                            "symbol": "S",
+                            "mode": "SINGLE",
+                            "value": 13.8
+                        },
+                        {
+                            "symbol": "ZF",
+                            "mode": "SINGLE",
+                            "value": 95
+                        }
+                    ]
+                },
+                {
+                    "uid": "dWJrZX",
+                    "props": {
+                        "calcType": "PbBassin"
+                    },
+                    "children": [],
+                    "parameters": [
+                        {
+                            "symbol": "S",
+                            "mode": "SINGLE",
+                            "value": 15.4
+                        },
+                        {
+                            "symbol": "ZF",
+                            "mode": "SINGLE",
+                            "value": 94.7
+                        }
+                    ]
+                },
+                {
+                    "uid": "dzMxN2",
+                    "props": {
+                        "calcType": "PbBassin"
+                    },
+                    "children": [],
+                    "parameters": [
+                        {
+                            "symbol": "S",
+                            "mode": "SINGLE",
+                            "value": 16.2
+                        },
+                        {
+                            "symbol": "ZF",
+                            "mode": "SINGLE",
+                            "value": 94.7
+                        }
+                    ]
+                },
+                {
+                    "uid": "ZXZua2",
+                    "props": {
+                        "calcType": "PbBassin"
+                    },
+                    "children": [],
+                    "parameters": [
+                        {
+                            "symbol": "S",
+                            "mode": "SINGLE",
+                            "value": 17.5
+                        },
+                        {
+                            "symbol": "ZF",
+                            "mode": "SINGLE",
+                            "value": 94.4
+                        }
+                    ]
+                },
+                {
+                    "uid": "YmR5aD",
+                    "props": {
+                        "calcType": "PbBassin"
+                    },
+                    "children": [],
+                    "parameters": [
+                        {
+                            "symbol": "S",
+                            "mode": "SINGLE",
+                            "value": 32.1
+                        },
+                        {
+                            "symbol": "ZF",
+                            "mode": "SINGLE",
+                            "value": 94.25
+                        }
+                    ]
+                },
+                {
+                    "uid": "bDN2OW",
+                    "props": {
+                        "calcType": "PbBassin"
+                    },
+                    "children": [],
+                    "parameters": [
+                        {
+                            "symbol": "S",
+                            "mode": "SINGLE",
+                            "value": 35
+                        },
+                        {
+                            "symbol": "ZF",
+                            "mode": "SINGLE",
+                            "value": 94.1
+                        }
+                    ]
+                },
+                {
+                    "uid": "MWxycH",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "",
+                        "downstreamBasin": "Zjczdz"
+                    },
+                    "children": [
+                        {
+                            "uid": "MmZ2aG",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 95.3
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 0.4
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        },
+                        {
+                            "uid": "eW9jZH",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 96.25
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 4.4
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "c3Zpb2",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "",
+                        "downstreamBasin": "dWJrZX"
+                    },
+                    "children": [
+                        {
+                            "uid": "bTQ2cG",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 96
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        },
+                        {
+                            "uid": "N24zM2",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 96.25
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 5
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "MG4wNG",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "",
+                        "downstreamBasin": "YmR5aD"
+                    },
+                    "children": [
+                        {
+                            "uid": "azV4dj",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 96.25
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 3.5
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "YjJra2",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "",
+                        "downstreamBasin": "bDN2OW"
+                    },
+                    "children": [
+                        {
+                            "uid": "aDd4Y3",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 96.25
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 3.6
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "enE4cn",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "Zjczdz",
+                        "downstreamBasin": "dzMxN2"
+                    },
+                    "children": [
+                        {
+                            "uid": "ZHczZ2",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 95
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 0.4
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        },
+                        {
+                            "uid": "aXRjZ3",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 96.25
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 5.2
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "NXNoNG",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "dWJrZX",
+                        "downstreamBasin": "dzMxN2"
+                    },
+                    "children": [
+                        {
+                            "uid": "eXFqeH",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 95.85
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 4.38
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "bGhodG",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "dWJrZX",
+                        "downstreamBasin": "ZXZua2"
+                    },
+                    "children": [
+                        {
+                            "uid": "b3Z3OD",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 95.85
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 3
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "MDZ3aH",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "dWJrZX",
+                        "downstreamBasin": "YmR5aD"
+                    },
+                    "children": [
+                        {
+                            "uid": "NTBzZm",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 95.5
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        },
+                        {
+                            "uid": "b3pjZX",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 95.75
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 3
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "emZ2bX",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "dzMxN2",
+                        "downstreamBasin": "ZXZua2"
+                    },
+                    "children": [
+                        {
+                            "uid": "cGllNj",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 94.7
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 0.4
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        },
+                        {
+                            "uid": "aWFseW",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 95.65
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 5.74
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "bG1ucj",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "ZXZua2",
+                        "downstreamBasin": "YmR5aD"
+                    },
+                    "children": [
+                        {
+                            "uid": "MDJsaD",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 94.4
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 0.4
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        },
+                        {
+                            "uid": "ZzY2bT",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 95.35
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 6
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "dGNnZz",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "YmR5aD",
+                        "downstreamBasin": "bDN2OW"
+                    },
+                    "children": [
+                        {
+                            "uid": "dnNqeX",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 94.25
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 0.7
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        },
+                        {
+                            "uid": "ODFkZ2",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 95.05
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 9.5
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                },
+                {
+                    "uid": "amprcm",
+                    "props": {
+                        "calcType": "PbCloison",
+                        "upstreamBasin": "bDN2OW",
+                        "downstreamBasin": ""
+                    },
+                    "children": [
+                        {
+                            "uid": "OG02MT",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 94.1
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 0.95
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        },
+                        {
+                            "uid": "MHVxZn",
+                            "props": {
+                                "calcType": "Structure",
+                                "loiDebit": "WeirCunge80",
+                                "structureType": "SeuilRectangulaire"
+                            },
+                            "children": [],
+                            "parameters": [
+                                {
+                                    "symbol": "ZDV",
+                                    "mode": "SINGLE",
+                                    "value": 94.75
+                                },
+                                {
+                                    "symbol": "L",
+                                    "mode": "SINGLE",
+                                    "value": 10.2
+                                },
+                                {
+                                    "symbol": "CdCunge",
+                                    "mode": "SINGLE",
+                                    "value": 1
+                                }
+                            ]
+                        }
+                    ],
+                    "parameters": [
+                        {
+                            "symbol": "Q",
+                            "mode": "CALCUL"
+                        },
+                        {
+                            "symbol": "Z1",
+                            "mode": "SINGLE",
+                            "value": 0
+                        },
+                        {
+                            "symbol": "Z2",
+                            "mode": "SINGLE",
+                            "value": 0
+                        }
+                    ]
+                }
+            ],
+            "parameters": [
+                {
+                    "symbol": "Q",
+                    "mode": "SINGLE",
+                    "value": 1
+                },
+                {
+                    "symbol": "Z1",
+                    "mode": "CALCUL"
+                },
+                {
+                    "symbol": "Z2",
+                    "mode": "SINGLE",
+                    "value": 100
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index fe62870ce..b74de9221 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -610,6 +610,7 @@
     "INFO_EXAMPLE_LABEL_PAB_COMPLETE": "Standard fish ladder",
     "INFO_EXAMPLE_LABEL_PAB_ECH_TRIANG": "Triangular weirs fish ladder",
     "INFO_EXAMPLE_LABEL_PENTE_CRITIQUE_CANAL": "Canal critical slope",
+    "INFO_EXAMPLE_LABEL_PB": "Pre-dam",
     "INFO_EXAMPLE_LABEL_PERR": "Rock-ramp fish pass",
     "INFO_EXAMPLE_LABEL_WEIR_JET_LENGTH": "Weir jet length",
     "INFO_EXAMPLES_TITLE": "Examples",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 2eb5001d8..3047fac2a 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -611,6 +611,7 @@
     "INFO_EXAMPLE_LABEL_PAB_COMPLETE": "Passe à bassins type",
     "INFO_EXAMPLE_LABEL_PAB_ECH_TRIANG": "Passe à bassins à échancrures triangulaires",
     "INFO_EXAMPLE_LABEL_PENTE_CRITIQUE_CANAL": "Pente critique d'un canal",
+    "INFO_EXAMPLE_LABEL_PB": "Pré-barrage",
     "INFO_EXAMPLE_LABEL_PERR": "Passe à enrochements régulièrement répartis",
     "INFO_EXAMPLE_LABEL_WEIR_JET_LENGTH": "Longueur de jet d'un déversoir",
     "INFO_EXAMPLES_TITLE": "Exemples",
-- 
GitLab


From ce170aaa4e4960c960e4d9896f2c4c50650cdab5 Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 29 Jun 2020 11:15:41 +0200
Subject: [PATCH 45/92] Add default layout when creating new PreBarrage

---
 src/app/services/formulaire.service.ts | 35 +++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/src/app/services/formulaire.service.ts b/src/app/services/formulaire.service.ts
index 281e2f6b8..ccd973610 100644
--- a/src/app/services/formulaire.service.ts
+++ b/src/app/services/formulaire.service.ts
@@ -14,7 +14,14 @@ import {
     Props,
     Cloisons,
     CloisonAval,
-    SPP
+    SPP,
+    PreBarrage,
+    PbBassin,
+    PbBassinParams,
+    LoiDebit,
+    PbCloison,
+    CreateStructure,
+    Structure
 } from "jalhyd";
 
 import { ApplicationSetupService } from "./app-setup.service";
@@ -427,6 +434,32 @@ export class FormulaireService extends Observable {
             newDownWall.addChild(newDownwallDevice);
             f.pabNub.downWall = newDownWall;
         }
+
+        // when creating a new PreBarrage, add one basin and two walls with one
+        // device each (when loading session, those items are already present)
+        if (
+            f instanceof FormulairePrebarrage
+            && f.currentNub instanceof PreBarrage
+            && f.currentNub.children.length === 0
+        ) {
+            // 1 basin
+            f.currentNub.addChild(new PbBassin(new PbBassinParams(13.80, 95)));
+            // 1st wall
+            f.currentNub.addChild(new PbCloison(undefined, f.currentNub.children[0] as PbBassin));
+            const s1: Structure = CreateStructure(LoiDebit.WeirCunge80);
+            s1.prms.ZDV.singleValue = 95.30;
+            s1.getParameter("L").singleValue = 0.4;
+            s1.getParameter("CdGR").singleValue = 1.04;
+            f.currentNub.children[1].addChild(s1);
+            // 2nd wall
+            f.currentNub.addChild(new PbCloison(f.currentNub.children[0] as PbBassin, undefined));
+            const s2: Structure = CreateStructure(LoiDebit.WeirCunge80);
+            s2.prms.ZDV.singleValue = 95.30;
+            s2.getParameter("L").singleValue = 0.4;
+            s2.getParameter("CdGR").singleValue = 1.04;
+            f.currentNub.children[2].addChild(s2);
+        }
+
         this.notifyObservers({
             "action": "createForm",
             "form": f
-- 
GitLab


From ee6f223b92e3cc0e461487e9fbe0d25c047c0b4f Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 29 Jun 2020 15:20:25 +0200
Subject: [PATCH 46/92] Parameter config: option to disable calculability in
 GUI

---
 src/app/formulaire/elements/ngparam.ts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/app/formulaire/elements/ngparam.ts b/src/app/formulaire/elements/ngparam.ts
index 457e68976..967680825 100644
--- a/src/app/formulaire/elements/ngparam.ts
+++ b/src/app/formulaire/elements/ngparam.ts
@@ -468,6 +468,9 @@ export class NgParameter extends InputField implements Observer {
         }
         this.unit = this.paramDefinition.unit;
         this.radioConfig = this.getRadioConfig();
+        if (json["calculable"] !== undefined && json["calculable"] === false) {
+            this.radioConfig = Math.min(ParamCalculability.FREE, this.getRadioConfig());
+        }
     }
 
     // interface Observer
-- 
GitLab


From c03cc744c8537a1bbcb482a98a5b110ddf1e4dcd Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Mon, 29 Jun 2020 15:20:39 +0200
Subject: [PATCH 47/92] Updated PreBarrage example

---
 src/app/calculators/prebarrage/config.json |  90 +++++++--
 src/app/examples/prebarrage.json           | 206 ++-------------------
 2 files changed, 85 insertions(+), 211 deletions(-)

diff --git a/src/app/calculators/prebarrage/config.json b/src/app/calculators/prebarrage/config.json
index 1e6b68147..e68895e29 100644
--- a/src/app/calculators/prebarrage/config.json
+++ b/src/app/calculators/prebarrage/config.json
@@ -81,24 +81,78 @@
                             "SeuilTriangulaireTrunc_TriangularTruncWeirFree": "structures/dever_triang_tronque.html"
                         }
                     },
-                    "S",
-                    "ZDV",
-                    "L",
-                    "W",
-                    "CdWS",
-                    "CdWSL",
-                    "CdWR",
-                    "CdGR",
-                    "CdCunge",
-                    "CdT",
-                    "CdO",
-                    "alpha",
-                    "beta",
-                    "ZRAM",
-                    "alpha2",
-                    "BT",
-                    "ZT",
-                    "Zco"
+                    {
+                        "id": "S",
+                        "calculable": false
+                    },
+                    {
+                        "id": "ZDV",
+                        "calculable": false
+                    },
+                    {
+                        "id": "L",
+                        "calculable": false
+                    },
+                    {
+                        "id": "W",
+                        "calculable": false
+                    },
+                    {
+                        "id": "CdWS",
+                        "calculable": false
+                    },
+                    {
+                        "id": "CdWSL",
+                        "calculable": false
+                    },
+                    {
+                        "id": "CdWR",
+                        "calculable": false
+                    },
+                    {
+                        "id": "CdGR",
+                        "calculable": false
+                    },
+                    {
+                        "id": "CdCunge",
+                        "calculable": false
+                    },
+                    {
+                        "id": "CdT",
+                        "calculable": false
+                    },
+                    {
+                        "id": "CdO",
+                        "calculable": false
+                    },
+                    {
+                        "id": "alpha",
+                        "calculable": false
+                    },
+                    {
+                        "id": "beta",
+                        "calculable": false
+                    },
+                    {
+                        "id": "ZRAM",
+                        "calculable": false
+                    },
+                    {
+                        "id": "alpha2",
+                        "calculable": false
+                    },
+                    {
+                        "id": "BT",
+                        "calculable": false
+                    },
+                    {
+                        "id": "ZT",
+                        "calculable": false
+                    },
+                    {
+                        "id": "Zco",
+                        "calculable": false
+                    }
                 ]
             },
             {
diff --git a/src/app/examples/prebarrage.json b/src/app/examples/prebarrage.json
index 273cd986d..339101438 100644
--- a/src/app/examples/prebarrage.json
+++ b/src/app/examples/prebarrage.json
@@ -2,7 +2,7 @@
     "header": {
         "source": "jalhyd",
         "format_version": "1.3",
-        "created": "2020-06-29T08:37:22.109Z"
+        "created": "2020-06-29T13:15:21.029Z"
     },
     "settings": {
         "precision": 1e-7,
@@ -195,22 +195,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "c3Zpb2",
@@ -273,22 +258,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "MG4wNG",
@@ -325,22 +295,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "YjJra2",
@@ -377,22 +332,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "enE4cn",
@@ -455,22 +395,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "NXNoNG",
@@ -507,22 +432,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "bGhodG",
@@ -559,22 +469,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "MDZ3aH",
@@ -637,22 +532,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "emZ2bX",
@@ -715,22 +595,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "bG1ucj",
@@ -793,22 +658,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "dGNnZz",
@@ -871,22 +721,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 },
                 {
                     "uid": "amprcm",
@@ -949,22 +784,7 @@
                             ]
                         }
                     ],
-                    "parameters": [
-                        {
-                            "symbol": "Q",
-                            "mode": "CALCUL"
-                        },
-                        {
-                            "symbol": "Z1",
-                            "mode": "SINGLE",
-                            "value": 0
-                        },
-                        {
-                            "symbol": "Z2",
-                            "mode": "SINGLE",
-                            "value": 0
-                        }
-                    ]
+                    "parameters": []
                 }
             ],
             "parameters": [
-- 
GitLab


From dffc35d91ab14f5aa0f7212ee5be2fa191d68e18 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 30 Jun 2020 12:14:32 +0200
Subject: [PATCH 48/92] Patch lifecycle issue when switching from a PreBarrage
 to another

---
 .../generic-calculator/calculator.component.html      | 10 +++++++---
 src/app/components/pb-schema/pb-schema.component.ts   | 11 +++++++----
 src/app/formulaire/definition/form-definition.ts      |  6 ------
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index ff30b8e81..906fc6a98 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -81,9 +81,13 @@
                             fxFlex.lt-md="1 0 500px"
                             fxFlex.lt-sm="1 0 300px">
 
-                            <pb-schema [pbSchema]="formElements[0]" (radio)=onRadioClick($event)
-                                (validChange)=onElementValid() (nodeSelected)="onPBNodeSelected($event)">
-                            </pb-schema>
+                            <!-- without this loop, injecting formElements[0] in <pb-schema> makes it not 
+                                trigger lifecycle hooks when switching from a PreBarrage module to another… -->
+                            <ng-template ngFor let-fe [ngForOf]="formElements">
+                                <pb-schema *ngIf="isPbSchema(fe)" [pbSchema]="fe" (radio)=onRadioClick($event)
+                                    (validChange)=onElementValid() (nodeSelected)="onPBNodeSelected($event)">
+                                </pb-schema>
+                            </ng-template>
 
                             <div fxHide.sm fxFlex.gt-sm="0 0 16px"></div>
                         </div>
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 3ac6e598c..615af66cd 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -2,12 +2,12 @@ import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, ViewChil
 import { MatDialog } from "@angular/material/dialog";
 
 import {
-    PreBarrage, PbBassin, PbBassinParams, PbCloison, CreateStructure, LoiDebit, Structure, Observer, IObservable
+    PreBarrage, PbBassin, PbBassinParams, PbCloison, Observer, IObservable
  } from "jalhyd";
 
 import * as mermaid from "mermaid";
 
-import { HotkeysService, Hotkey } from 'angular2-hotkeys';
+import { HotkeysService, Hotkey } from "angular2-hotkeys";
 
 import { I18nService } from "../../services/internationalisation.service";
 import { PbSchema } from "../../formulaire/elements/pb-schema";
@@ -115,10 +115,12 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     }
 
     public ngAfterViewInit(): void {
-        this.refreshEventListeners();
-        this.updateValidity();
         // subscribe to "refresh" event passed indirectly by FormulairePbCloison (change upstream/downstream basin)
         this.pbSchema.addObserver(this);
+        // @WARNING clodo trick to prevent blank diagram when switching from a PreBarrage to another
+        setTimeout(() => {
+            this.refresh();
+        }, 10);
     }
 
     /** Add click listener on every node and link in the graph */
@@ -360,6 +362,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     public onCopyClick() {
         const wall = this._selectedItem as PbCloison;
         const wallCopy = new PbCloison(wall.bassinAmont, wall.bassinAval);
+        wallCopy.loadObjectRepresentation(wall.objectRepresentation());
         this.model.addChild(wallCopy);
         this.unselect();
         this.refresh();
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 5eb6ae295..32b063f9e 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -446,12 +446,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         return new TopFormulaireElementIterator(this);
     }
 
-    /**
-     * Appelé par CalculatorComponent lorsque le Formulaire est chargé dans la vue,
-     * c'est à dire lorsqu'on affiche un module de calcul à l'écran
-     */
-    public onCalculatorInit() {}
-
     //  interface Observer
 
     public update(sender: any, data: any) {
-- 
GitLab


From 65ca48e73765c4ee0a7deb0e1aae4ca384a2b8df Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 30 Jun 2020 16:02:58 +0200
Subject: [PATCH 49/92] Lint code

---
 src/app/app.component.ts                      | 26 +++++++++----------
 src/app/app.module.ts                         |  2 +-
 .../calculator-list.component.ts              |  2 +-
 .../dialog-load-session.component.ts          |  2 +-
 .../dialog-new-pb-cloison.component.ts        | 10 +++----
 src/app/formulaire/elements/select-field.ts   |  2 --
 src/app/services/app-setup.service.ts         |  2 +-
 7 files changed, 21 insertions(+), 25 deletions(-)

diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 3b4ad89a8..75fe1c71b 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -7,7 +7,6 @@ import { CdkDragDrop, moveItemInArray } from "@angular/cdk/drag-drop";
 
 import { Observer, jalhydDateRev, jalhydVersion, CalculatorType, Session } from "jalhyd";
 
-import { environment } from "../environments/environment";
 import { I18nService } from "./services/internationalisation.service";
 import { FormulaireService } from "./services/formulaire.service";
 import { FormulaireDefinition } from "./formulaire/definition/form-definition";
@@ -832,7 +831,7 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
     const existingNotes = Session.getInstance().documentation;
     // load
     try {
-      const data = await this.formulaireService.loadSession(f, info)
+      const data = await this.formulaireService.loadSession(f, info);
       if (data.hasErrors) {
         this.notificationsService.notify(this.intlService.localizeText("ERROR_PROBLEM_LOADING_SESSION"), 3500);
       } else {
@@ -853,7 +852,7 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
           }
         }
       }
-    } catch(err) {
+    } catch (err) {
       this.notificationsService.notify(this.intlService.localizeText("ERROR_LOADING_SESSION"), 3500);
       console.error("error loading session - ", err);
       // rollback to ensure session is clean
@@ -982,17 +981,16 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
         return runningPlatform;
     }
 
-    /**
-     * détection de la fermeture de la page/navigateur et demande de confirmation
-     */
-    @HostListener("window:beforeunload", ["$event"]) confirmExit($event) {
-        if (
-            this.appSetupService.warnBeforeTabClose
-            && environment.production // otherwise prevents dev server to reload app after recompiling
-        ) {
-            // affecter une valeur différente de null provoque l'affichage d'un dialogue de confirmation, mais le texte n'est pas affiché
-            $event.returnValue = "Your data will be lost !";
-        }
+  /**
+   * détection de la fermeture de la page/navigateur et demande de confirmation
+   */
+  @HostListener("window:beforeunload", [ "$event" ]) confirmExit($event) {
+    if (
+      this.appSetupService.warnBeforeTabClose
+      && ! isDevMode() // otherwise prevents dev server to reload app after recompiling
+    ) {
+      // affecter une valeur différente de null provoque l'affichage d'un dialogue de confirmation, mais le texte n'est pas affiché
+      $event.returnValue = "Your data will be lost !";
     }
 
     @HostListener("keydown", ["$event"]) onKeydown(event: any) {
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 6c36ede63..a6f375b49 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -86,7 +86,7 @@ import { LogDrawerComponent } from "./components/log-drawer/log-drawer.component
 import { ParamLinkComponent } from "./components/param-link/param-link.component";
 import { PabProfileChartComponent } from "./components/pab-profile-chart/pab-profile-chart.component";
 import { PabTableComponent } from "./components/pab-table/pab-table.component";
-import { PbSchemaComponent } from './components/pb-schema/pb-schema.component';
+import { PbSchemaComponent } from "./components/pb-schema/pb-schema.component";
 import { VariableResultsSelectorComponent } from "./components/variable-results-selector/variable-results-selector.component";
 import { QuicknavComponent } from "./components/quicknav/quicknav.component";
 import { ModulesDiagramComponent } from "./components/modules-diagram/modules-diagram.component";
diff --git a/src/app/components/calculator-list/calculator-list.component.ts b/src/app/components/calculator-list/calculator-list.component.ts
index 2c23ba423..8a6b1c528 100644
--- a/src/app/components/calculator-list/calculator-list.component.ts
+++ b/src/app/components/calculator-list/calculator-list.component.ts
@@ -282,7 +282,7 @@ export class CalculatorListComponent implements OnInit {
             const d = await this.httpService.httpGetBlobRequestPromise(realPath);
             const f: any = new Blob([d], { type: "application/json" });
             this.appComponent.loadSessionFile(f);
-        } catch(e) {
+        } catch (e) {
             console.error("could not load session file", e);
         }
     }
diff --git a/src/app/components/dialog-load-session/dialog-load-session.component.ts b/src/app/components/dialog-load-session/dialog-load-session.component.ts
index 02473fe41..409358f0a 100644
--- a/src/app/components/dialog-load-session/dialog-load-session.component.ts
+++ b/src/app/components/dialog-load-session/dialog-load-session.component.ts
@@ -161,7 +161,7 @@ export class DialogLoadSessionComponent {
             }
           }
           this.loadingComplete = true;
-        } catch(err) {
+        } catch (err) {
           console.error(err);
           this.loadingError = true;
         }
diff --git a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
index 7798238d6..a249ca814 100644
--- a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
+++ b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
@@ -33,7 +33,7 @@ export class DialogNewPbCloisonComponent implements OnInit {
 
     public get availableUpstreamIndexes(): number[] {
         // add river upstream as "0"
-        let ab: number[] = [ 0 ];
+        const ab: number[] = [ 0 ];
         for (let i = 0; i < this.availableBasins.length; i++) {
             ab.push(i + 1);
         }
@@ -41,7 +41,7 @@ export class DialogNewPbCloisonComponent implements OnInit {
     }
 
     public get availableDownstreamIndexes(): number[] {
-        let ab: number[] = [ ];
+        const ab: number[] = [ ];
         for (let i = 0; i < this.availableBasins.length; i++) {
             ab.push(i + 1);
         }
@@ -58,9 +58,9 @@ export class DialogNewPbCloisonComponent implements OnInit {
      */
     public basinIsSelectable(index: number, downstream: boolean = false): boolean {
         if (downstream) {
-            return (this.upstreamIndex === 0 || index > this.upstreamIndex)
+            return (this.upstreamIndex === 0 || index > this.upstreamIndex);
         } else {
-            return (this.downstreamIndex === 0 || index < this.downstreamIndex)
+            return (this.downstreamIndex === 0 || index < this.downstreamIndex);
         }
     }
 
@@ -117,7 +117,7 @@ export class DialogNewPbCloisonComponent implements OnInit {
     public get uitextValidate() {
       return this.i18nService.localizeText("INFO_OPTION_VALIDATE");
     }
-  
+
     public get uitextCancel() {
       return this.i18nService.localizeText("INFO_OPTION_CANCEL");
     }
diff --git a/src/app/formulaire/elements/select-field.ts b/src/app/formulaire/elements/select-field.ts
index ac9525f2c..0cd055aea 100644
--- a/src/app/formulaire/elements/select-field.ts
+++ b/src/app/formulaire/elements/select-field.ts
@@ -220,8 +220,6 @@ export class SelectField extends Field {
                 const loiDebit = child.properties.getPropValue("loiDebit");
                 const stCode = StructureProperties.findCompatibleStructure(loiDebit, nub as ParallelStructure);
                 const stName = StructureType[stCode];
-                // console.log(`__device_loi_debit__ : child=${child.constructor.name}, loiDebit=${loiDebit}, stCode=${stCode}, stName=${stName}`);
-                // console.log("(child.properties)", child.properties.props);
                 for (const ld of la[stName]) {
                     const e: SelectEntry = new SelectEntry(this._entriesBaseId + LoiDebit[ld], ld);
                     this.addEntry(e);
diff --git a/src/app/services/app-setup.service.ts b/src/app/services/app-setup.service.ts
index e0aab36d0..d1f01b2af 100644
--- a/src/app/services/app-setup.service.ts
+++ b/src/app/services/app-setup.service.ts
@@ -116,7 +116,7 @@ export class ApplicationSetupService extends Observable {
      * Restore configuration values
      */
     public async restoreDefaultValues(): Promise<any> {
-        await this.readValuesFromConfig()
+        await this.readValuesFromConfig();
         // notify I18nService
         this.notifyObservers({
             action: "languagePreferenceChanged",
-- 
GitLab


From 806510e3cae9cfd5f47c6fe4e5782d7cdffd71fe Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 30 Jun 2020 17:13:11 +0200
Subject: [PATCH 50/92] [WIP] PreBarrage results

---
 src/app/app.module.ts                         |   4 +
 src/app/calculators/prebarrage/fr.json        |  15 +-
 .../calculator-results.component.html         |   1 +
 .../calculator-results.component.ts           |  44 ++-
 .../fixed-results.component.html              |   1 -
 .../fixed-results.component.ts                |   1 +
 .../calculator.component.ts                   |   6 +-
 .../pb-results-table.component.html           |  30 ++
 .../pb-results-table.component.scss           |  52 +++
 .../pb-results/pb-results-table.component.ts  | 143 ++++++++
 .../pb-results/pb-results.component.html      |  23 ++
 .../pb-results/pb-results.component.scss      |   4 +
 .../pb-results/pb-results.component.ts        | 324 ++++++++++++++++++
 .../formulaire/definition/form-prebarrage.ts  |  95 ++++-
 src/app/results/prebarrage-results.ts         | 111 ++++++
 src/locale/messages.en.json                   |   1 +
 src/locale/messages.fr.json                   |   1 +
 17 files changed, 836 insertions(+), 20 deletions(-)
 create mode 100644 src/app/components/pb-results/pb-results-table.component.html
 create mode 100644 src/app/components/pb-results/pb-results-table.component.scss
 create mode 100644 src/app/components/pb-results/pb-results-table.component.ts
 create mode 100644 src/app/components/pb-results/pb-results.component.html
 create mode 100644 src/app/components/pb-results/pb-results.component.scss
 create mode 100644 src/app/components/pb-results/pb-results.component.ts
 create mode 100644 src/app/results/prebarrage-results.ts

diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index a6f375b49..d9b61bed6 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -74,6 +74,8 @@ import { ResultsChartComponent } from "./components/results-chart/results-chart.
 import { PabResultsComponent } from "./components/pab-results/pab-results.component";
 import { VerificateurResultsComponent } from "./components/verificateur-results/verificateur-results.component";
 import { PabResultsTableComponent } from "./components/pab-results/pab-results-table.component";
+import { PbResultsComponent } from "./components/pb-results/pb-results.component";
+import { PbResultsTableComponent } from "./components/pb-results/pb-results-table.component";
 import { ChartTypeSelectComponent } from "./components/results-chart/chart-type.component";
 import { CalculatorListComponent } from "./components/calculator-list/calculator-list.component";
 import { ApplicationSetupComponent } from "./components/app-setup/app-setup.component";
@@ -224,6 +226,8 @@ const appRoutes: Routes = [
     PabResultsComponent,
     PabResultsTableComponent,
     PabTableComponent,
+    PbResultsComponent,
+    PbResultsTableComponent,
     PbSchemaComponent,
     VariableResultsSelectorComponent,
     MacrorugoCompoundResultsComponent,
diff --git a/src/app/calculators/prebarrage/fr.json b/src/app/calculators/prebarrage/fr.json
index 287b79352..7b3f06d22 100644
--- a/src/app/calculators/prebarrage/fr.json
+++ b/src/app/calculators/prebarrage/fr.json
@@ -3,5 +3,18 @@
 
     "Q": "Débit",
     "Z1": "Cote de l'eau amont",
-    "Z2": "Cote de l'eau aval"
+    "Z2": "Cote de l'eau aval",
+
+    "Z": "Cote de l'eau",
+    "S": "Surface",
+    "ZF": "Cote de fond",
+    "PV": "Puissance dissipée",
+    "YMOY": "Profondeur moyenne",
+
+    "UNIT_Q": "m³/s",
+    "UNIT_S": "m²",
+    "UNIT_Z": "m",
+    "UNIT_ZF": "m",
+    "UNIT_YMOY": "m",
+    "UNIT_PV": "W/m³"
 }
diff --git a/src/app/components/calculator-results/calculator-results.component.html b/src/app/components/calculator-results/calculator-results.component.html
index 319b3eab3..4befd3308 100644
--- a/src/app/components/calculator-results/calculator-results.component.html
+++ b/src/app/components/calculator-results/calculator-results.component.html
@@ -2,6 +2,7 @@
     <section-results [hidden]="! isSP"></section-results>
     <remous-results [hidden]="! isRemous"></remous-results>
     <pab-results [hidden]="! isPAB"></pab-results>
+    <pb-results [hidden]="! isPB"></pb-results>
     <verificateur-results [hidden]="! isVerificateur"></verificateur-results>
     <macrorugo-compound-results [hidden]="! isMRC"></macrorugo-compound-results>
     <jet-results [hidden]="! isJet"></jet-results>
diff --git a/src/app/components/calculator-results/calculator-results.component.ts b/src/app/components/calculator-results/calculator-results.component.ts
index 900cf877a..c8c6b712f 100644
--- a/src/app/components/calculator-results/calculator-results.component.ts
+++ b/src/app/components/calculator-results/calculator-results.component.ts
@@ -11,6 +11,7 @@ import { GenericCalculatorComponent } from "../generic-calculator/calculator.com
 import { VerificateurResultsComponent } from "../verificateur-results/verificateur-results.component";
 
 import { CalculatorType } from "jalhyd";
+import { PbResultsComponent } from "../pb-results/pb-results.component";
 
 @Component({
     selector: "calc-results",
@@ -50,6 +51,12 @@ export class CalculatorResultsComponent implements AfterViewChecked {
     @ViewChild(VerificateurResultsComponent, { static: true })
     private verificateurResultsComponent: VerificateurResultsComponent;
 
+    /*
+     * composant d'affichage des résultats des prébarrages
+     */
+    @ViewChild(PbResultsComponent, { static: true })
+    private pbResultsComponent: PbResultsComponent;
+
     /**
      * composant d'affichage des résultats des passes à macrorugosités complexes
      */
@@ -77,31 +84,38 @@ export class CalculatorResultsComponent implements AfterViewChecked {
         this._formulaire = f;
         if (this._formulaire === undefined) {
             this.fixedVarResultsComponent.results = undefined;
+            this.sectionResultsComponent.results = undefined;
+            this.pbResultsComponent.results = undefined;
             this.jetResultsComponent.results = undefined;
             this.mrcResultsComponent.results = undefined;
             this.pabResultsComponent.results = undefined;
             this.remousResultsComponent.results = undefined;
-            this.sectionResultsComponent.results = undefined;
             this.verificateurResultsComponent.results = undefined;
         } else {
-            if (this.showGenericResults) { this.fixedVarResultsComponent.results = f.results; }
-            if (this.isJet) { this.jetResultsComponent.results = f.results; }
-            if (this.isMRC) { this.mrcResultsComponent.results = f.results; }
-            if (this.isPAB) { this.pabResultsComponent.results = f.results; }
-            if (this.isRemous) { this.remousResultsComponent.results = f.results; }
-            if (this.isSP) { this.sectionResultsComponent.results = f.results; }
-            if (this.isVerificateur) { this.verificateurResultsComponent.results = f.results; }
+            this.sectionResultsComponent.results = f.results;
+            this.remousResultsComponent.results = f.results;
+            this.pabResultsComponent.results = f.results;
+            this.pbResultsComponent.results = f.results;
+            this.mrcResultsComponent.results = f.results;
+            // FixedVar and Jet are mutually incompatible (the 2nd extend the 1st)
+            if (this.isJet) {
+                this.jetResultsComponent.results = f.results;
+                this.fixedVarResultsComponent.results = undefined;
+            } else {
+                this.fixedVarResultsComponent.results = f.results;
+                this.jetResultsComponent.results = undefined;
+            }
         }
     }
 
     public updateView() {
-        if (this.showGenericResults) { this.fixedVarResultsComponent.updateView(); }
-        if (this.isJet) { this.jetResultsComponent.updateView(); }
-        if (this.isMRC) { this.mrcResultsComponent.updateView(); }
-        if (this.isPAB) { this.pabResultsComponent.updateView(); }
-        if (this.isRemous) { this.remousResultsComponent.updateView(); }
-        if (this.isSP) { this.sectionResultsComponent.updateView(); }
-        if (this.isVerificateur) { this.verificateurResultsComponent.updateView(); }
+        this.fixedVarResultsComponent.updateView();
+        this.sectionResultsComponent.updateView();
+        this.remousResultsComponent.updateView();
+        this.pabResultsComponent.updateView();
+        this.pbResultsComponent.updateView();
+        this.mrcResultsComponent.updateView();
+        this.jetResultsComponent.updateView();
     }
 
     public ngAfterViewChecked() {
diff --git a/src/app/components/fixedvar-results/fixed-results.component.html b/src/app/components/fixedvar-results/fixed-results.component.html
index d9bca9625..849bf9d4e 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.html
+++ b/src/app/components/fixedvar-results/fixed-results.component.html
@@ -5,7 +5,6 @@
             <mat-icon color="primary">file_download</mat-icon>
         </button>
     </div>
-
     <!-- table des résultats fixés -->
     <div class="fixed-results-inner-container" #tableContainer>
         <table mat-table [dataSource]="dataSet" [trackBy]="tbIndex">
diff --git a/src/app/components/fixedvar-results/fixed-results.component.ts b/src/app/components/fixedvar-results/fixed-results.component.ts
index 32660b368..004c46c9c 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.ts
+++ b/src/app/components/fixedvar-results/fixed-results.component.ts
@@ -36,6 +36,7 @@ export class FixedResultsComponent extends ResultsComponentDirective {
     }
 
     public set results(r: FixedResults) {
+        console.log("->->->->-> je suis FRC et j'ai reçu des résultats", r === undefined ? "keud" : r.result);
         this._fixedResults = r;
     }
 
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 9c26baa5d..6c2119744 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -590,9 +590,11 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
 
     /** réception d'un événement de clic sur un nœud du schéma de PréBarrage */
     public onPBNodeSelected(event: any) {
-        this.showPBInputData = true; // @TODO pas forcément ! (résultats de l'élément cliqué)
-        // show proper form (actually subform elements) depending on what was clicked
+        // show proper form (actually subform elements) or proper results,
+        // depending on what was clicked
         (this._formulaire as FormulairePrebarrage).nodeSelected(event.node);
+        // refresh results component
+        this.resultsComponent.updateView();
     }
 
     public openHelp() {
diff --git a/src/app/components/pb-results/pb-results-table.component.html b/src/app/components/pb-results/pb-results-table.component.html
new file mode 100644
index 000000000..75f0451ff
--- /dev/null
+++ b/src/app/components/pb-results/pb-results-table.component.html
@@ -0,0 +1,30 @@
+<div class="pb-results-table-container" #pbResultsTable fxLayout="row wrap" fxLayoutAlign="center center">
+    <div fxFlex="1 1 100%">
+        <div class="pb-results-table-buttons">
+            <button mat-icon-button (click)="exportAsSpreadsheet()" [title]="uitextExportAsSpreadsheet">
+                <mat-icon color="primary">file_download</mat-icon>
+            </button>
+            <button mat-icon-button *ngIf="! isFullscreen" (click)="setFullscreen(pbResultsTable)" [title]="uitextEnterFSTitle">
+                <mat-icon color="primary" class="scaled12">fullscreen</mat-icon>
+            </button>
+            <button mat-icon-button *ngIf="isFullscreen" (click)="exitFullscreen()" [title]="uitextExitFSTitle">
+                <mat-icon color="primary" class="scaled12">fullscreen_exit</mat-icon>
+            </button>
+        </div>
+
+        <div class="pb-results-table-scrollable-container" [ngClass]="{'full-height': isFullscreen}">
+            <!-- scrollable -->
+            <div class="pb-results-table-inner-container" #tableContainer>
+                <table mat-table [dataSource]="dataSet">
+                    <ng-container *ngFor="let h of headers; let i = index" [matColumnDef]="h">
+                        <th mat-header-cell *matHeaderCellDef [innerHTML]="h"></th>
+                        <td mat-cell *matCellDef="let element" [innerHTML]="element[i]"></td>
+                    </ng-container>
+
+                    <tr mat-header-row *matHeaderRowDef="headers"></tr>
+                    <tr mat-row *matRowDef="let row; columns: headers;"></tr>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/src/app/components/pb-results/pb-results-table.component.scss b/src/app/components/pb-results/pb-results-table.component.scss
new file mode 100644
index 000000000..9e49c5ca0
--- /dev/null
+++ b/src/app/components/pb-results/pb-results-table.component.scss
@@ -0,0 +1,52 @@
+/** @see additional styles in src/styles.css */
+
+:host {
+    display: block;
+    margin-bottom: 1.5em;
+}
+
+.pb-results-table-container {
+    background-color: white;
+}
+
+.pb-results-table-buttons {
+    padding-right: 4px;
+    padding-top: 4px;
+    text-align: right;
+    background-color: white;
+
+    button {
+        margin-left: 3px;
+        width: auto;
+
+        mat-icon {
+            &.scaled12 {
+                transform: scale(1.2)
+            }
+        }
+    }
+}
+
+.pb-results-table-scrollable-container {
+    overflow-x: scroll;
+    border: solid #ccc 1px;
+
+    &.full-height {
+        height: calc(100vh - 40px); // rend le mode plein-écran scrollable verticalement, sinon ça dépasse
+    }
+}
+
+table.mat-table {
+
+    .mat-header-row {
+        height: 40px;
+    }
+
+    .mat-row {
+        height: 32px;
+
+        &:nth-child(odd) {
+            background-color: #f4f4f4;
+        }
+    }
+}
diff --git a/src/app/components/pb-results/pb-results-table.component.ts b/src/app/components/pb-results/pb-results-table.component.ts
new file mode 100644
index 000000000..b1ab9838b
--- /dev/null
+++ b/src/app/components/pb-results/pb-results-table.component.ts
@@ -0,0 +1,143 @@
+import { Component, ViewChild, ElementRef } from "@angular/core";
+
+import { PreBarrage, PbBassin } from "jalhyd";
+
+import { I18nService } from "../../services/internationalisation.service";
+import { ResultsComponentDirective } from "../fixedvar-results/results.component";
+import { AppComponent } from "../../app.component";
+import { fv } from "../../util";
+import { PrebarrageResults } from "../../results/prebarrage-results";
+
+@Component({
+    selector: "pb-results-table",
+    templateUrl: "./pb-results-table.component.html",
+    styleUrls: [
+        "./pb-results-table.component.scss"
+    ]
+})
+export class PbResultsTableComponent extends ResultsComponentDirective {
+
+    /** résultats non mis en forme */
+    private _pbResults: PrebarrageResults;
+
+    /** entêtes des colonnes */
+    private _headers: string[];
+
+    /** résultats mis en forme */
+    private _dataSet: any[];
+
+    @ViewChild("tableContainer")
+    table: ElementRef;
+
+    constructor(
+        protected intlService: I18nService
+    ) {
+        super();
+    }
+
+    /* private getJetTypes(re: Result, vi: number): string {
+        // jet type for each device
+        const devices = re.sourceNub.getChildren();
+        const jetTypes: string[] = devices.map((device) => {
+            const jt = device.result.resultElements[vi].getValue("ENUM_StructureJetType");
+            let jetType = this.intlService.localizeText("INFO_ENUM_STRUCTUREJETTYPE_" + jt);
+            if (devices.length > 1) {
+                // evil HTML injection in table cell (simpler)
+                jetType = this.intlService.localizeText("INFO_LIB_FS_OUVRAGE") + " n°"
+                    + (device.findPositionInParent() + 1) + ": " + jetType;
+            }
+            return jetType;
+        });
+        return `<div class="inner-cell-line">` + jetTypes.join(`, </div><div class="inner-cell-line">`) + `</div>`;
+    } */
+
+    public set results(r: PrebarrageResults) {
+        this._pbResults = r;
+        console.log("Set results dans PBRTC !", r);
+
+        this._dataSet = [];
+        if (
+            this._pbResults
+            && this._pbResults.bassinsResults
+            && this._pbResults.bassinsResults.length > 0
+            && ! this._pbResults.hasOnlyErrors()
+        ) {
+            const pr = this._pbResults;
+            const pb = pr.result.sourceNub as PreBarrage;
+            // when a parameter is variating, index of the variating parameter
+            // values to build the data from
+            const vi = pr.variableIndex;
+
+            // refresh headers here if language changed
+            this._headers = pr.headers;
+
+            // upstream line
+            if (pr.result.resultElements[vi].vCalc) { // le calcul peut avoir échoué
+                this._dataSet.push([
+                    this.intlService.localizeText("INFO_LIB_AMONT"),
+                    "", "",
+                    fv(pb.prms.Z1.V),
+                    "", "",
+                    fv(pb.prms.Q.V)
+                ]);
+            }
+
+            // basins 1 - n
+            for (let i = 0; i < pr.bassinsResults.length; i++) {
+                if (
+                    Object.keys(pr.bassinsResults[i].resultElements[vi].values).length > 0 // no vCalc in this case
+                ) {
+                    const rb = pr.bassinsResults[i].resultElements[vi].values;
+                    const basin = pr.bassinsResults[i].sourceNub as PbBassin;
+                    this._dataSet.push([
+                        i + 1, // n° cloison
+                        fv(basin.prms.S.V),
+                        fv(basin.prms.ZF.V),
+                        fv(rb.Z),
+                        fv(rb.PV),
+                        fv(rb.YMOY),
+                        fv(rb.Q)
+                    ]);
+                }
+            }
+
+            // downstream line
+            if (pr.result.resultElements[vi].vCalc) { // le calcul peut avoir échoué
+                this._dataSet.push([
+                    this.intlService.localizeText("INFO_LIB_AVAL"),
+                    "", "",
+                    fv(pb.prms.Z2.V),
+                    "", "",
+                    fv(pb.prms.Q.V)
+                ]);
+            }
+        }
+    }
+
+    public get headers() {
+        return this._headers;
+    }
+
+    /**
+     * Returns a combination of parameters and results for mat-table
+     */
+    public get dataSet() {
+        return this._dataSet;
+    }
+
+    public exportAsSpreadsheet() {
+        AppComponent.exportAsSpreadsheet(this.table.nativeElement);
+    }
+
+    public get uitextExportAsSpreadsheet() {
+        return this.intlService.localizeText("INFO_RESULTS_EXPORT_AS_SPREADSHEET");
+    }
+
+    public get uitextEnterFSTitle() {
+        return this.intlService.localizeText("INFO_CHART_BUTTON_TITLE_ENTER_FS");
+    }
+
+    public get uitextExitFSTitle() {
+        return this.intlService.localizeText("INFO_CHART_BUTTON_TITLE_EXIT_FS");
+    }
+}
diff --git a/src/app/components/pb-results/pb-results.component.html b/src/app/components/pb-results/pb-results.component.html
new file mode 100644
index 000000000..db8aa6d91
--- /dev/null
+++ b/src/app/components/pb-results/pb-results.component.html
@@ -0,0 +1,23 @@
+<div class="container">
+
+    <log #generalLog [logTitle]="uitextGeneralLogTitle">log général</log>
+
+    <variable-results-selector [results]="pbResults" (indexChange)="variableIndexChanged()">
+    </variable-results-selector>
+
+    <log #iterationLog></log>
+
+    <!-- tableau de résultats des bassins -->
+    <pb-results-table *ngIf="showBasinsResults" [results]="pbResults"></pb-results-table>
+
+    <!-- <quicknav *ngIf="hasDisplayableResults" [items]="[ 'input', 'results', 'charts' ]"
+        [currentItem]="'charts'" [align]="'left'"></quicknav> -->
+
+    <!-- <div id="pb-graphs-container" class="container" fxLayout="row wrap" fxLayoutAlign="space-around start">
+        <pb-profile-chart *ngIf="hasDisplayableResults" fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        </pb-profile-chart>
+        <results-chart *ngIf="hasDisplayableResults" fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        </results-chart>
+    </div> -->
+
+</div>
diff --git a/src/app/components/pb-results/pb-results.component.scss b/src/app/components/pb-results/pb-results.component.scss
new file mode 100644
index 000000000..446313ba6
--- /dev/null
+++ b/src/app/components/pb-results/pb-results.component.scss
@@ -0,0 +1,4 @@
+results-chart {
+    margin-left: 1em;
+    margin-right: 1em;
+}
diff --git a/src/app/components/pb-results/pb-results.component.ts b/src/app/components/pb-results/pb-results.component.ts
new file mode 100644
index 000000000..5a031da13
--- /dev/null
+++ b/src/app/components/pb-results/pb-results.component.ts
@@ -0,0 +1,324 @@
+import { Component, ViewChild, DoCheck } from "@angular/core";
+
+import { Result, cLog, Message, MessageCode, MessageSeverity } from "jalhyd";
+
+import { LogComponent } from "../log/log.component";
+import { CalculatorResults } from "../../results/calculator-results";
+import { PbResultsTableComponent } from "./pb-results-table.component";
+import { PrebarrageResults } from "../../results/prebarrage-results";
+import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
+import { I18nService } from "../../services/internationalisation.service";
+import { PabProfileChartComponent } from "../pab-profile-chart/pab-profile-chart.component";
+import { FixedResults } from "../../results/fixed-results";
+
+@Component({
+    selector: "pb-results",
+    templateUrl: "./pb-results.component.html",
+    styleUrls: [
+        "./pb-results.component.scss"
+    ]
+})
+export class PbResultsComponent implements DoCheck {
+
+    /** résultats des bassins, non mis en forme */
+    private _pbResults: PrebarrageResults;
+
+    /** true si les résultats doiventt être remis à jour */
+    private _doUpdate = false;
+
+    @ViewChild(PbResultsTableComponent)
+    private pbResultsTableComponent: PbResultsTableComponent;
+
+    @ViewChild(VariableResultsSelectorComponent)
+    private variableResultsSelectorComponent: VariableResultsSelectorComponent;
+
+    @ViewChild("generalLog")
+    private generalLogComponent: LogComponent;
+
+    @ViewChild("iterationLog")
+    private iterationLogComponent: LogComponent;
+
+    /* @ViewChild(PabProfileChartComponent)
+    private profileChartComponent: PabProfileChartComponent; */
+
+    constructor(
+        private i18nService: I18nService,
+    ) { }
+
+    public set results(rs: CalculatorResults[]) {
+        this._pbResults = undefined;
+        for (const r of rs) {
+            if (r instanceof PrebarrageResults) {
+                this._pbResults = r as PrebarrageResults;
+            }
+        }
+        this.updateView();
+    }
+
+    public get pbResults() {
+        return this._pbResults;
+    }
+
+    public get hasResults(): boolean {
+        return this._pbResults && this._pbResults.hasResults;
+    }
+
+    public get showBasinsResults(): boolean {
+        let ret = this._pbResults && this._pbResults.hasResults;
+        if (
+            this._pbResults
+            && this._pbResults.variatedParameters
+            && this._pbResults.variatedParameters.length > 0
+        ) {
+            ret = ret
+            && this._pbResults.variableIndex !== undefined
+            && this._pbResults.result.resultElements[this._pbResults.variableIndex] !== undefined
+            && this._pbResults.result.resultElements[this._pbResults.variableIndex].ok;
+        }
+        return ret;
+    }
+
+    /**
+     * update results table and chart when the variable index changed (event sent by
+     * PabVariableResultsSelectorComponent); variable index is already set in
+     * pabResults at this time
+     */
+    public variableIndexChanged() {
+        this.updateView();
+    }
+
+    public updateView() {
+        if (this.iterationLogComponent) {
+            this.iterationLogComponent.log = undefined;
+        }
+        if (this.generalLogComponent) {
+            this.generalLogComponent.log = undefined;
+        }
+        if (this.pbResultsTableComponent) {
+            this.pbResultsTableComponent.results = undefined;
+        }
+        if (this.variableResultsSelectorComponent) {
+            this.variableResultsSelectorComponent.results = undefined;
+        }
+        /* if (this.profileChartComponent) {
+            this.profileChartComponent.results = undefined;
+        } */
+        // set _doUpdate flag so that results are rebuilt on the next Angular display cycle
+        this._doUpdate = false;
+        if (this._pbResults !== undefined) {
+            this._doUpdate = this._doUpdate || this._pbResults.hasResults || this._pbResults.hasLog;
+        }
+    }
+
+    public ngDoCheck() {
+        if (this._doUpdate) {
+            this._doUpdate = !this.updateResults();
+        }
+    }
+
+    /* private mergeGlobalLog(result: Result, log: cLog) {
+        if (result) {
+            if (result.hasGlobalLog()) {
+                log.addLog(result.globalLog);
+            }
+            // if no parameter is varying, 1st element log is considered "global"
+            if (this.pbResults.variatedParameters.length === 0) {
+                if (result.hasResultElements() && result.resultElement.hasLog()) {
+                    log.addLog(result.log);
+                }
+            }
+        }
+    } */
+
+    /**
+     * Returns the number of errors, warnings, infos among children logs
+     */
+    /* private logStats(): any {
+        const ret = {
+            info: 0,
+            warning: 0,
+            error: 0
+        };
+        if (this._pbResults.result && this._pbResults.result.hasLog()) {
+            for (const re of this._pbResults.result.resultElements) {
+                if (re.hasLog()) {
+                    for (const m of re.log.messages) {
+                        const s = m.getSeverity();
+                        switch (s) {
+                            case MessageSeverity.INFO:
+                                ret.info ++;
+                                break;
+                            case MessageSeverity.WARNING:
+                                ret.warning ++;
+                                break;
+                            case MessageSeverity.ERROR:
+                                ret.error ++;
+                                break;
+                        }
+                    }
+                }
+            }
+        }
+        for (const cr of this._pbResults.cloisonsResults) {
+            if (cr && cr.hasLog()) {
+                for (const re of cr.resultElements) {
+                    if (re.hasLog()) {
+                        for (const m of re.log.messages) {
+                            const s = m.getSeverity();
+                            switch (s) {
+                                case MessageSeverity.INFO:
+                                    ret.info ++;
+                                    break;
+                                case MessageSeverity.WARNING:
+                                    ret.warning ++;
+                                    break;
+                                case MessageSeverity.ERROR:
+                                    ret.error ++;
+                                    break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        if (this._pbResults.cloisonAvalResults && this._pbResults.cloisonAvalResults.hasLog()) {
+            for (const re of this._pbResults.cloisonAvalResults.resultElements) {
+                if (re.hasLog()) {
+                    for (const m of re.log.messages) {
+                        const s = m.getSeverity();
+                        switch (s) {
+                            case MessageSeverity.INFO:
+                                ret.info ++;
+                                break;
+                            case MessageSeverity.WARNING:
+                                ret.warning ++;
+                                break;
+                            case MessageSeverity.ERROR:
+                                ret.error ++;
+                                break;
+                        }
+                    }
+                }
+            }
+        }
+        return ret;
+    } */
+
+    /*
+     * Retourne les logs à afficher dans le composant de log global, au dessus
+     * du sélecteur d'itération : messages globaux et / ou résumé des messages
+     * spécifiques à chaque ResultElement
+     */
+    /* private get globalLog(): cLog {
+        const l = new cLog();
+        if (this._pbResults && this.pbResults.variatedParameters.length > 0) {
+            this.mergeGlobalLog(this._pbResults.result, l);
+            // un problème avec la PAB en général / les cloisons, à une étape quelconque ?
+            if (
+                (this.pbResults.hasLog)
+                && l.messages.length === 0 // existing global messages make generic message below useless
+            ) {
+                const logStats = this.logStats();
+                const m = new Message(MessageCode.WARNING_PROBLEMS_ENCOUNTERED);
+                m.extraVar.info = "" + logStats.info; // to avoid displaying fixed number of digits
+                m.extraVar.warning = "" + logStats.warning;
+                m.extraVar.error = "" + logStats.error;
+                l.add(m);
+                // l.add(new Message(MessageCode.WARNING_PROBLEMS_ENCOUNTERED));
+            }
+        } // sinon pas de log global (aucun paramètre ne varie)
+        return l;
+    } */
+
+    /**
+     * Retourne les logs à afficher dans le composant de log global, au dessus
+     * du sélecteur d'itération : messages globaux et / ou résumé des messages
+     * spécifiques à chaque ResultElement
+     */
+    /* private get iterationLog(): cLog {
+        const l = new cLog();
+        if (this._pbResults) {
+            if (this.pbResults.variatedParameters.length > 0) {
+                // A. si un paramètre varie
+                const vi = this._pbResults.variableIndex;
+                // log de la PAB pour l'itération en cours
+                if (
+                    this._pbResults.result
+                    && this._pbResults.result.hasResultElements()
+                    && this._pbResults.result.resultElements[vi]
+                    && this._pbResults.result.resultElements[vi].hasLog()
+                ) {
+                    l.addLog(this._pbResults.result.resultElements[vi].log);
+                }
+                // logs des enfants pour l'itération en cours
+                for (const cr of this._pbResults.cloisonsResults) {
+                    if (cr && cr.hasResultElements() && cr.resultElements[vi].hasLog()) {
+                        l.addLog(cr.resultElements[vi].log);
+                    }
+                }
+                if (this._pbResults.cloisonAvalResults && this._pbResults.cloisonAvalResults.resultElements[vi].hasLog()) {
+                    l.addLog(this._pbResults.cloisonAvalResults.resultElements[vi].log);
+                }
+            } else {
+                // B. si aucun paramètre ne varie
+                this.mergeGlobalLog(this._pbResults.result, l); // faut bien mettre le log global quelque part
+                // logs des enfants
+                for (const cr of this._pbResults.cloisonsResults) {
+                    if (cr && cr.hasResultElements() && cr.resultElement.hasLog()) {
+                        l.addLog(cr.resultElement.log);
+                    }
+                }
+                if (this._pbResults.cloisonAvalResults && this._pbResults.cloisonAvalResults.resultElement.hasLog()) {
+                    l.addLog(this._pbResults.cloisonAvalResults.resultElement.log);
+                }
+            }
+        }
+        return l;
+    } */
+
+    /**
+     * met à jour l'affichage des résultats
+     * @returns true si les résultats ont pu être mis à jour
+     */
+    private updateResults() {
+        console.log("------------ update results -----------");
+        let pabUpdated: boolean;
+        let profileChartUpdated: boolean;
+        let selectorUpdated: boolean;
+
+        // results or not, there might be a log
+        const logUpdated = (this.iterationLogComponent !== undefined || this.generalLogComponent !== undefined); // gne ?
+        if (logUpdated) {
+            // order of logs is important !
+            /* this.iterationLogComponent.log = this.iterationLog;
+            this.generalLogComponent.log = this.globalLog; */
+        }
+
+        if (this.hasResults) {
+            pabUpdated = this.pbResultsTableComponent !== undefined;
+            if (pabUpdated) {
+                this.pbResultsTableComponent.results = this._pbResults;
+            }
+            selectorUpdated = this.variableResultsSelectorComponent !== undefined;
+            if (selectorUpdated) {
+                this.variableResultsSelectorComponent.results = this._pbResults;
+            }
+            /* profileChartUpdated = this.profileChartComponent !== undefined;
+            if (profileChartUpdated) {
+                this.profileChartComponent.results = this._pbResults;
+                this.profileChartComponent.updateView();
+            } */
+        } else {
+            pabUpdated = true;
+            profileChartUpdated = true;
+            selectorUpdated = true;
+        }
+
+        return pabUpdated && logUpdated && profileChartUpdated && selectorUpdated;
+    }
+
+    public get uitextGeneralLogTitle(): string {
+        return this.i18nService.localizeText("INFO_TITREJOURNAL_GLOBAL");
+    }
+
+}
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 0199451c3..8cd692893 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -1,4 +1,4 @@
-import { CalculatorType, PbBassin, PbCloison, IObservable } from "jalhyd";
+import { CalculatorType, PbBassin, PbCloison, IObservable, PreBarrage } from "jalhyd";
 
 import { FormulaireFixedVar } from "./form-fixedvar";
 import { PbSchema } from "../elements/pb-schema";
@@ -6,6 +6,9 @@ import { FormulaireDefinition } from "./form-definition";
 import { ServiceFactory } from "../../services/service-factory";
 import { FormulairePbCloison } from "./form-pb-cloison";
 import { FieldsetContainer } from "../elements/fieldset-container";
+import { CalculatorResults } from "../../results/calculator-results";
+import { PrebarrageResults } from "../../results/prebarrage-results";
+import { NgParameter } from "../elements/ngparam";
 
 /**
  * Formulaire pour les PréBarrage
@@ -24,6 +27,34 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     /** configuration for re-creating wall form every time needed */
     private wallFormConfig: string;
 
+    protected _selectedItem: PbBassin | PbCloison;
+
+    protected _pbResults: PrebarrageResults;
+
+    constructor() {
+        super();
+        this._pbResults = new PrebarrageResults();
+    }
+
+    /* public get pbNub(): PreBarrage {
+        return this.currentNub as PreBarrage;
+    } */
+
+    public get pbResults(): PrebarrageResults {
+        return this._pbResults;
+    }
+
+    public get results(): CalculatorResults[] {
+        // ensure help links are propagated
+        this._pbResults.helpLinks = this.helpLinks;
+        console.log("RENVOI", [ this.fixedResults, this._pbResults ]);
+        return [ this.fixedResults, this._pbResults ];
+    }
+
+    public get hasResults(): boolean {
+        return this._pbResults.hasResults;
+    }
+
     public parseConfig(json?: {}) {
         if (json !== undefined) {
             this._jsonConfig = json;
@@ -82,7 +113,15 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         this.kids.push(sch);
     }
 
+    /**
+     * Déclenché par CalculatorComponent lorsque le schéma de prébarrage
+     * envoie un événement "nodeSelected" (on a cliqué sur un nœud)
+     */
     public nodeSelected(node: PbBassin | PbCloison) {
+        // store for results formatting
+        this._selectedItem = node;
+        this.reaffectResultComponents();
+
         // show only the relevant form
         if (node === undefined) {
             this.showFormElements(this.riverForm);
@@ -156,4 +195,58 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             }
         }
     }
+
+    protected compute() {
+        this.runNubCalc(this.currentNub);
+        this.refreshFieldsets(); // important: before reaffectResultComponents() or it will break results components localization
+        // reset variable index to avoid trying to access an index > 0 when nothing varies
+        const pabr = this.pbResults;
+        pabr.variableIndex = 0;
+
+        this.reaffectResultComponents();
+    }
+
+    protected reaffectResultComponents() {
+        const pb: PreBarrage = (this.currentNub as PreBarrage);
+        const computedParam: NgParameter = this.getComputedParameter();
+        const varParams: NgParameter[] = this.getVariatedParameters();
+
+        // pour le sélecteur d'itérations
+        if (varParams) {
+            this.pbResults.variatedParameters = varParams;
+        }
+
+        // résultats selon l'objet sélectionné sur le schéma
+        if (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison) {
+            // cacher les résultats de bassins
+            this.pbResults.reset();
+
+            // afficher les résultats de cloison
+            console.log("RRC => cloison !", this._selectedItem.uid, this._selectedItem.result);
+            this.fixedResults.result = this._selectedItem.result;
+            if (computedParam !== undefined) {
+                this.fixedResults.calculatedParameter = computedParam;
+            }
+        } else {
+            // cacher les résultats de la cloison
+            this.fixedResults.reset();
+            this.addFixedParameters();
+
+            // afficher les résultats des bassins
+            this.pbResults.reset();
+            // résultat général du Nub (amont, aval, débit)
+            this.pbResults.result = pb.result;
+            this.pbResults.calculatedParameter = computedParam;
+            // résultat de chaque bassin
+            for (const b of pb.bassins) {
+                this.pbResults.bassinsResults.push(b.result);
+            }
+        }
+    }
+
+    public resetResults() {
+        super.resetResults();
+        this._fixedResults.reset();
+        this._pbResults.reset();
+    }
 }
diff --git a/src/app/results/prebarrage-results.ts b/src/app/results/prebarrage-results.ts
new file mode 100644
index 000000000..cea988714
--- /dev/null
+++ b/src/app/results/prebarrage-results.ts
@@ -0,0 +1,111 @@
+import { Result } from "jalhyd";
+
+import { ServiceFactory } from "../services/service-factory";
+import { MultiDimensionResults } from "./multidimension-results";
+
+export class PrebarrageResults extends MultiDimensionResults {
+
+    /** résultats des bassins, dans l'ordre */
+    public bassinsResults: Result[];
+
+    /** symboles des colonnes de résultat */
+    protected _columns: string[];
+
+    public constructor() {
+        super();
+        this.reset();
+        // standard headers
+        this._columns = [
+            "BASSIN",
+            "S",
+            "ZF",
+            "Z",
+            "PV",
+            "YMOY",
+            "Q"
+        ];
+    }
+
+    /** headers symbols */
+    public get columns() {
+        return this._columns;
+    }
+
+    /** translated headers texts */
+    public get headers() {
+        return this._columns.map((h) => {
+            // calculator type for translation
+            const sn = this.result.sourceNub;
+            let ct = sn.calcType;
+            if (sn.parent) {
+                ct = sn.parent.calcType;
+            }
+            let label = ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct , h);
+            label += this.getHelpLink(h);
+            return label;
+        });
+    }
+
+    public reset() {
+        super.reset();
+        this.bassinsResults = [];
+        this.result = undefined;
+    }
+
+    /**
+     * Returns true if at least one log message is present in the PAB result or any
+     * of the children results
+     */
+    public get hasLog(): boolean {
+        if (this.bassinsResults) {
+            for (const cr of this.bassinsResults) {
+                if (cr && cr.hasLog()) {
+                    return true;
+                }
+            }
+        }
+        return (this.result && this.result.hasLog());
+    }
+
+    // do not test result.ok else log messages will prevent partial results from being displayed
+    public get hasResults(): boolean {
+        return this.result !== undefined && ! this.result.hasOnlyErrors;
+    }
+
+    /** retourne true si au moins un calcul a échoué (le log a un code négatif) */
+    public hasError(): boolean {
+        let err = false;
+        // log principal
+        err = (err || this.result.hasErrorMessages());
+        // logs des bassins
+        for (const c of this.bassinsResults) {
+            err = (err || c.hasErrorMessages());
+        }
+
+        return err;
+    }
+
+    /** retourne true si le calcul à l'itération i a échoué */
+    public iterationHasError(i: number): boolean {
+        let err = this.result.resultElements[i].hasErrorMessages();
+        // logs des bassins
+        for (const c of this.bassinsResults) {
+            err = (err || c.resultElements[i].hasErrorMessages());
+        }
+
+        return err;
+    }
+
+    /** retourne true si tous les calculs ont échoué */
+    public hasOnlyErrors(): boolean {
+        let err = true;
+        // log principal
+        err = (err && this.result.hasOnlyErrors);
+        // logs des bassins
+        for (const c of this.bassinsResults) {
+            err = (err && c.hasOnlyErrors);
+        }
+
+        return err;
+    }
+}
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index b74de9221..c2c32a603 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -258,6 +258,7 @@
     "INFO_LIB_AMONT": "Upstream",
     "INFO_LIB_AVAL": "Downstream",
     "INFO_LIB_B": "Surface width",
+    "INFO_LIB_BASSIN": "Basin",
     "INFO_LIB_BB": "Pool width",
     "INFO_LIB_BETA": "Beta coefficient",
     "INFO_LIB_BT": "Half opening of the triangle",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 3047fac2a..1dd7eb5cd 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -258,6 +258,7 @@
     "INFO_LIB_AMONT": "Amont",
     "INFO_LIB_AVAL": "Aval",
     "INFO_LIB_B": "Largeur au miroir",
+    "INFO_LIB_BASSIN": "Bassin",
     "INFO_LIB_BB": "Largeur du bassin",
     "INFO_LIB_BETA": "Coefficient béta",
     "INFO_LIB_BT": "Demi-ouverture du triangle",
-- 
GitLab


From fd8627431b251fb547555a9afa5d237c890fcfa3 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 7 Jul 2020 13:45:50 +0200
Subject: [PATCH 51/92] Updated dependencies

---
 package-lock.json | 264 ++++++++++++++++++++++++----------------------
 1 file changed, 138 insertions(+), 126 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 0b0204e51..afd997392 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -837,9 +837,9 @@
       }
     },
     "@babel/compat-data": {
-      "version": "7.10.3",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.3.tgz",
-      "integrity": "sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.4.tgz",
+      "integrity": "sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw==",
       "dev": true,
       "requires": {
         "browserslist": "^4.12.0",
@@ -1541,188 +1541,188 @@
           "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.3"
+            "@babel/highlight": "^7.10.4"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz",
-          "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.3",
+            "@babel/helper-validator-identifier": "^7.10.4",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
         "@babel/template": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz",
-          "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.3",
-            "@babel/parser": "^7.10.3",
-            "@babel/types": "^7.10.3"
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
           }
         }
       }
     },
     "@babel/helper-replace-supers": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz",
-      "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
       "dev": true,
       "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.10.1",
-        "@babel/helper-optimise-call-expression": "^7.10.1",
-        "@babel/traverse": "^7.10.1",
-        "@babel/types": "^7.10.1"
+        "@babel/helper-member-expression-to-functions": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-simple-access": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz",
-      "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
+      "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.10.1",
-        "@babel/types": "^7.10.1"
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz",
-          "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.3"
+            "@babel/highlight": "^7.10.4"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz",
-          "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.3",
+            "@babel/helper-validator-identifier": "^7.10.4",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
         "@babel/template": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz",
-          "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.3",
-            "@babel/parser": "^7.10.3",
-            "@babel/types": "^7.10.3"
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
           }
         }
       }
     },
     "@babel/helper-split-export-declaration": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz",
-      "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz",
+      "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.10.1"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-validator-identifier": {
-      "version": "7.10.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz",
-      "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
       "dev": true
     },
     "@babel/helper-wrap-function": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz",
-      "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
+      "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.10.1",
-        "@babel/template": "^7.10.1",
-        "@babel/traverse": "^7.10.1",
-        "@babel/types": "^7.10.1"
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz",
-          "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.3"
+            "@babel/highlight": "^7.10.4"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz",
-          "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.3",
+            "@babel/helper-validator-identifier": "^7.10.4",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
         "@babel/template": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz",
-          "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.3",
-            "@babel/parser": "^7.10.3",
-            "@babel/types": "^7.10.3"
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
           }
         }
       }
     },
     "@babel/helpers": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz",
-      "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+      "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.10.1",
-        "@babel/traverse": "^7.10.1",
-        "@babel/types": "^7.10.1"
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz",
-          "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.3"
+            "@babel/highlight": "^7.10.4"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz",
-          "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.3",
+            "@babel/helper-validator-identifier": "^7.10.4",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
         "@babel/template": {
-          "version": "7.10.3",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz",
-          "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.3",
-            "@babel/parser": "^7.10.3",
-            "@babel/types": "^7.10.3"
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
           }
         }
       }
@@ -1747,60 +1747,60 @@
       }
     },
     "@babel/parser": {
-      "version": "7.10.3",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz",
-      "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz",
+      "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==",
       "dev": true
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.10.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz",
-      "integrity": "sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz",
+      "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.3",
-        "@babel/helper-remap-async-to-generator": "^7.10.3",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.10.4",
         "@babel/plugin-syntax-async-generators": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz",
-      "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
+      "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.1",
+        "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-dynamic-import": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-json-strings": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz",
-      "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
+      "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.1",
+        "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-json-strings": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-nullish-coalescing-operator": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz",
-      "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
+      "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.1",
+        "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-numeric-separator": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz",
-      "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.1",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.1"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       }
     },
     "@babel/plugin-proposal-object-rest-spread": {
@@ -2310,7 +2310,7 @@
       "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.1"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-unicode-regex": {
@@ -2952,9 +2952,9 @@
       },
       "dependencies": {
         "ajv": {
-          "version": "6.12.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
-          "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
+          "version": "6.12.3",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
+          "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
           "dev": true,
           "requires": {
             "fast-deep-equal": "^3.1.1",
@@ -14758,9 +14758,9 @@
       }
     },
     "npm-registry-fetch": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz",
-      "integrity": "sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA==",
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz",
+      "integrity": "sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q==",
       "dev": true,
       "requires": {
         "JSONStream": "^1.3.4",
@@ -16637,12 +16637,6 @@
         "clipboard": "^2.0.0"
       }
     },
-    "private": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
-      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
-      "dev": true
-    },
     "process": {
       "version": "0.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -19729,6 +19723,15 @@
             "randombytes": "^2.1.0"
           }
         },
+        "serialize-javascript": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
+          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
+          "dev": true,
+          "requires": {
+            "randombytes": "^2.1.0"
+          }
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -21321,6 +21324,15 @@
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
+        "serialize-javascript": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
+          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
+          "dev": true,
+          "requires": {
+            "randombytes": "^2.1.0"
+          }
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-- 
GitLab


From 435faa5edde4b8f630d301b9ba9d4166f94e088b Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 7 Jul 2020 15:51:36 +0200
Subject: [PATCH 52/92] Update to Angular 10

---
 angular.json      |  22 ++++++-
 package-lock.json | 149 ++++++++++++++++++++++++++++------------------
 2 files changed, 112 insertions(+), 59 deletions(-)

diff --git a/angular.json b/angular.json
index 3b4c3abfe..9ff58982c 100644
--- a/angular.json
+++ b/angular.json
@@ -51,7 +51,27 @@
               "node_modules/marked/lib/marked.js",
               "node_modules/katex/dist/katex.min.js"
             ],
-            "showCircularDependencies": false
+            "showCircularDependencies": false,
+            "allowedCommonJsDependencies": [
+              "chartjs-plugin-zoom",
+              "angular2-chartjs/dist/chart.module",
+              "angular2-hotkeys.js",
+              "base-64",
+              "he",
+              "svg-pan-zoom",
+              "mermaid",
+              "pako",
+              "file-saver",
+              "hammerjs",
+              "chart.js",
+              "mousetrap",
+              "xlsx",
+              "scope-css",
+              "lodash",
+              "graphlibrary",
+              "dagre-layout",
+              "dagre-d3-renderer"
+            ]
           },
           "configurations": {
             "production": {
diff --git a/package-lock.json b/package-lock.json
index afd997392..11875c104 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,9 +21,9 @@
       },
       "dependencies": {
         "rxjs": {
-          "version": "6.5.4",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
-          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "version": "6.5.5",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
+          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -622,9 +622,9 @@
           "dev": true
         },
         "semver": {
-          "version": "7.1.3",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz",
-          "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==",
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
         },
         "strip-ansi": {
@@ -652,9 +652,9 @@
           }
         },
         "uuid": {
-          "version": "7.0.2",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz",
-          "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==",
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz",
+          "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==",
           "dev": true
         },
         "yallist": {
@@ -666,19 +666,25 @@
       }
     },
     "@angular/common": {
-      "version": "9.1.11",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.11.tgz",
-      "integrity": "sha512-Vh5lF7zWwDK9RedmYXUc8vUXyrecR3j1mAWlTlnmcHYxxFThPzN/dr0slQcPi6nyJn0EmyRKUGvAoZx4rIb7wg=="
+      "version": "10.0.2",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.2.tgz",
+      "integrity": "sha512-zpNB2XD6jinXZjfihoO5Q1Yg7urfpZTt/fitdmwFHCcQ/1qZ9T2BVh8+VqVRkh6Pjxmtvu0uPnJ1a/aZ5f9r9A==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
     },
     "@angular/compiler": {
-      "version": "9.1.11",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.11.tgz",
-      "integrity": "sha512-MbVheCG0U8gt6xtiipau20N26mD2sXjLChVmRKgO6rbDruxboNMZfEd94q9NP9JRaUsVnjXvY7GMDldoymdXig=="
+      "version": "10.0.2",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.2.tgz",
+      "integrity": "sha512-TNE5ESDlRCVneb/K62HOEgLpxuZZTlw8RcmOy5vt3SngEVc576OE/aYsEA6MCwTlqj16GLSS3jGm9HBJcBKUVw==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
     },
     "@angular/compiler-cli": {
-      "version": "9.1.11",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.11.tgz",
-      "integrity": "sha512-9qIxbtpRXOQnRm6inxCa5HuH87MSuMzuceD0YBVzl8v+vLtewon9KXYMmF4kTBhWa/LEa8FrajljLh0azf3VLg==",
+      "version": "10.0.2",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.2.tgz",
+      "integrity": "sha512-LGX86k1hOyaw5aPCjFfoLuPhVLKMENOdCBeNBzZB+H2CUGHfv8OWFB1EzjZO1N07VGR7JoMx9ZWSP7ornhuS4Q==",
       "dev": true,
       "requires": {
         "canonical-path": "1.0.0",
@@ -692,6 +698,7 @@
         "semver": "^6.3.0",
         "source-map": "^0.6.1",
         "sourcemap-codec": "^1.4.8",
+        "tslib": "^2.0.0",
         "yargs": "15.3.0"
       },
       "dependencies": {
@@ -3229,18 +3236,18 @@
           }
         },
         "rxjs": {
-          "version": "6.5.4",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
-          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "version": "6.5.5",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
+          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
           }
         },
         "semver": {
-          "version": "7.1.3",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz",
-          "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==",
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
         },
         "tslib": {
@@ -4239,8 +4246,7 @@
     "assert-plus": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-      "dev": true
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
     },
     "assign-symbols": {
       "version": "1.0.0",
@@ -4429,6 +4435,24 @@
         "schema-utils": "^2.6.5"
       },
       "dependencies": {
+        "ajv": {
+          "version": "6.12.3",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
+          "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+          "dev": true
+        },
         "find-cache-dir": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
@@ -4476,6 +4500,17 @@
           "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
           "dev": true
         },
+        "schema-utils": {
+          "version": "2.7.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+          "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.4",
+            "ajv": "^6.12.2",
+            "ajv-keywords": "^3.4.1"
+          }
+        },
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -5390,6 +5425,15 @@
             "glob": "^7.1.3"
           }
         },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -5762,9 +5806,9 @@
       }
     },
     "chownr": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
       "dev": true
     },
     "chrome-trace-event": {
@@ -12216,8 +12260,7 @@
     "is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
     },
     "is-fullwidth-code-point": {
       "version": "2.0.0",
@@ -12342,6 +12385,7 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
       "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "dev": true,
       "requires": {
         "has": "^1.0.1"
       }
@@ -14704,9 +14748,9 @@
       }
     },
     "npm-pick-manifest": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz",
-      "integrity": "sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz",
+      "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==",
       "dev": true,
       "requires": {
         "npm-install-checks": "^4.0.0",
@@ -15111,9 +15155,9 @@
       }
     },
     "open": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz",
-      "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz",
+      "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==",
       "dev": true,
       "requires": {
         "is-docker": "^2.0.0",
@@ -15161,9 +15205,9 @@
       }
     },
     "ora": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz",
-      "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz",
+      "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==",
       "dev": true,
       "requires": {
         "chalk": "^3.0.0",
@@ -15708,7 +15752,8 @@
     "path-parse": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
     },
     "path-to-regexp": {
       "version": "0.1.7",
@@ -17359,9 +17404,9 @@
       "dev": true
     },
     "regenerate": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
-      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
+      "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==",
       "dev": true
     },
     "regenerate-unicode-properties": {
@@ -17803,8 +17848,7 @@
     "run-parallel": {
       "version": "1.1.9",
       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
-      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
-      "dev": true
+      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
     },
     "run-queue": {
       "version": "1.0.3",
@@ -19159,6 +19203,7 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
       "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
+      "dev": true,
       "requires": {
         "define-properties": "^1.1.2",
         "es-abstract": "^1.5.0",
@@ -19613,12 +19658,6 @@
         "yallist": "^4.0.0"
       },
       "dependencies": {
-        "chownr": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-          "dev": true
-        },
         "mkdirp": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -19748,12 +19787,6 @@
             "source-map": "~0.6.1",
             "source-map-support": "~0.5.12"
           }
-        },
-        "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-          "dev": true
         }
       }
     },
-- 
GitLab


From caad07aa450b80bcc7c5158186e1fdb9eca42297 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Wed, 8 Jul 2020 14:06:46 +0200
Subject: [PATCH 53/92] Updated protractor.conf

---
 protractor.conf.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/protractor.conf.js b/protractor.conf.js
index d474c230b..3077d88c4 100644
--- a/protractor.conf.js
+++ b/protractor.conf.js
@@ -61,7 +61,7 @@ exports.config = {
     require('ts-node').register({
       project: 'e2e/tsconfig.e2e.json'
     });
-    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
+    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: "pretty" } }));
     browser.manage().window().setSize(1600, 1000);
     browser.driver.sendChromiumCommand('Page.setDownloadBehavior', {
       behavior: 'allow',
-- 
GitLab


From a749af0129c330fbe30421b11bf0dc0178dcb3e7 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 9 Jul 2020 10:34:29 +0200
Subject: [PATCH 54/92] PreBarrage: show results corresponding to selected
 schema item

---
 .../pb-results/pb-results-table.component.ts  | 16 -----
 .../definition/form-parallel-structures.ts    |  6 +-
 .../formulaire/definition/form-pb-cloison.ts  | 64 ++++++++++++++++++-
 .../formulaire/definition/form-prebarrage.ts  | 11 ++--
 4 files changed, 70 insertions(+), 27 deletions(-)

diff --git a/src/app/components/pb-results/pb-results-table.component.ts b/src/app/components/pb-results/pb-results-table.component.ts
index b1ab9838b..de2545a6c 100644
--- a/src/app/components/pb-results/pb-results-table.component.ts
+++ b/src/app/components/pb-results/pb-results-table.component.ts
@@ -35,22 +35,6 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
         super();
     }
 
-    /* private getJetTypes(re: Result, vi: number): string {
-        // jet type for each device
-        const devices = re.sourceNub.getChildren();
-        const jetTypes: string[] = devices.map((device) => {
-            const jt = device.result.resultElements[vi].getValue("ENUM_StructureJetType");
-            let jetType = this.intlService.localizeText("INFO_ENUM_STRUCTUREJETTYPE_" + jt);
-            if (devices.length > 1) {
-                // evil HTML injection in table cell (simpler)
-                jetType = this.intlService.localizeText("INFO_LIB_FS_OUVRAGE") + " n°"
-                    + (device.findPositionInParent() + 1) + ": " + jetType;
-            }
-            return jetType;
-        });
-        return `<div class="inner-cell-line">` + jetTypes.join(`, </div><div class="inner-cell-line">`) + `</div>`;
-    } */
-
     public set results(r: PrebarrageResults) {
         this._pbResults = r;
         console.log("Set results dans PBRTC !", r);
diff --git a/src/app/formulaire/definition/form-parallel-structures.ts b/src/app/formulaire/definition/form-parallel-structures.ts
index f9e2a99e1..5e35710f9 100644
--- a/src/app/formulaire/definition/form-parallel-structures.ts
+++ b/src/app/formulaire/definition/form-parallel-structures.ts
@@ -112,7 +112,7 @@ export class FormulaireParallelStructure extends FormulaireRepeatableFieldset {
      * @param name nom de la propriété qui vient de changer
      * @param val nouvelle valeur de la propriété
      */
-    private adjustProperties(props: Props, name: string, val: any) {
+    protected adjustProperties(props: Props, name: string, val: any) {
         if (name === "structureType") {
             if (! StructureProperties.isCompatibleValues(
                 val, props.getPropValue("loiDebit"), this.currentNub as ParallelStructure
@@ -131,7 +131,7 @@ export class FormulaireParallelStructure extends FormulaireRepeatableFieldset {
     /**
      * abonnement en tant qu'observateur des NgParameter des FieldSet contenus dans le FieldsetContainer
      */
-    private subscribeStructureInputFields(fs: FieldSet) {
+    protected subscribeStructureInputFields(fs: FieldSet) {
         for (const n of fs.allFormElements) {
             if (n instanceof NgParameter) {
                 n.addObserver(this);
@@ -141,7 +141,7 @@ export class FormulaireParallelStructure extends FormulaireRepeatableFieldset {
     /**
      * abonnement en tant qu'observateur du SelectField des FieldSet contenus dans le FieldsetContainer
      */
-    private subscribeStructureSelectFields(fs: FieldSet) {
+    protected subscribeStructureSelectFields(fs: FieldSet) {
         for (const n of fs.allFormElements) {
             if (n instanceof SelectField) {
                 n.addObserver(this);
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index db7272f52..d41333580 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -1,7 +1,10 @@
 import { FormulaireParallelStructure } from "./form-parallel-structures";
 import { SelectFieldNub } from "../elements/select-field-nub";
 
-import { IObservable, Nub, PbCloison, PbBassin } from "jalhyd";
+import { IObservable, Nub, PbCloison, PbBassin, Structure } from "jalhyd";
+import { FieldSet } from '../elements/fieldset';
+import { FormulaireNode } from '../elements/formulaire-node';
+import { FieldsetContainer } from '../elements/fieldset-container';
 
 export class FormulairePbCloison extends FormulaireParallelStructure {
 
@@ -36,7 +39,31 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
     // interface Observer
 
     public update(sender: IObservable, data: any) {
-        super.update(sender, data);
+        // do NOT call super.update() or "newFieldset" action will reset results
+        if (sender instanceof FieldsetContainer) {
+            switch (data.action) {
+                case "newFieldset":
+                    // this.reset();
+                    console.log("||| reset PAS NON PLUS :) |||");
+                    this.subscribeStructureInputFields(data["fieldset"]);
+                    this.subscribeStructureSelectFields(data["fieldset"]);
+            }
+        } else if (sender instanceof FieldSet && data.action === "propertyChange") {
+            switch (sender.id) {
+                case "fs_ouvrage":
+                    const props = sender.properties;
+                    // ensure loiDebit is set
+                    props.setPropValue("loiDebit", data.value);
+                    this.adjustProperties(props, data["name"], data["value"]);
+                    // replace Structure Nub
+                    const newNub = this.replaceNub((sender.nub as Structure), props);
+                    sender.setNub(newNub);
+                    // treat the fieldset as new to re-subscribe to Nub properties change events
+                    this.afterParseFieldset(sender);
+                    this.reset();
+                    break;
+            }
+        }
 
         if (sender instanceof SelectFieldNub) {
             const nub = this._currentNub as PbCloison;
@@ -72,4 +99,37 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
             }, this);
         }
     }
+
+    // do not reset results after adding fieldset (when switching results view
+    // from one wall to another, the form is rebuilt) @TODO anyway, we should
+    // reset when a fieldset is manually added from "input" (form) view
+    public createFieldset(parent: FormulaireNode, json: {}, data?: {}, nub?: Nub): FieldSet {
+        if (json["calcType"] === "Structure") {
+            // indice après lequel insérer le nouveau FieldSet
+            const after = data["after"];
+
+            const res: FieldSet = new FieldSet(parent);
+            let sn: Nub;
+            if (nub) { // use existing Nub (build interface based on model)
+                sn = nub;
+            } else {
+                sn = this.createChildNub(data["template"]);
+                this.currentNub.addChild(sn, after);
+            }
+            res.setNub(sn, false);
+
+            if (after !== undefined) {
+                parent.kids.splice(after + 1, 0, res);
+            } else {
+                parent.kids.push(res);
+            }
+
+            console.log("\\\ reset PAS ///");
+            // this.resetResults();
+
+            return res;
+        } else {
+            return super.createFieldset(parent, json, data);
+        }
+    }
 }
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 8cd692893..302788861 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -47,7 +47,6 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     public get results(): CalculatorResults[] {
         // ensure help links are propagated
         this._pbResults.helpLinks = this.helpLinks;
-        console.log("RENVOI", [ this.fixedResults, this._pbResults ]);
         return [ this.fixedResults, this._pbResults ];
     }
 
@@ -120,7 +119,6 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     public nodeSelected(node: PbBassin | PbCloison) {
         // store for results formatting
         this._selectedItem = node;
-        this.reaffectResultComponents();
 
         // show only the relevant form
         if (node === undefined) {
@@ -164,6 +162,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             }
             this.showFormElements(wallForm);
         }
+        this.reaffectResultComponents();
     }
 
     /**
@@ -216,6 +215,10 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.pbResults.variatedParameters = varParams;
         }
 
+        // cacher les résultats de la cloison
+        this.fixedResults.reset();
+        this.addFixedParameters();
+
         // résultats selon l'objet sélectionné sur le schéma
         if (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison) {
             // cacher les résultats de bassins
@@ -228,10 +231,6 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
                 this.fixedResults.calculatedParameter = computedParam;
             }
         } else {
-            // cacher les résultats de la cloison
-            this.fixedResults.reset();
-            this.addFixedParameters();
-
             // afficher les résultats des bassins
             this.pbResults.reset();
             // résultat général du Nub (amont, aval, débit)
-- 
GitLab


From c20ec0f2804ba207c75296bd2c3c84d79c3175e3 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 9 Jul 2020 12:28:10 +0200
Subject: [PATCH 55/92] PreBarrage: properly reset results when editing
 different forms

---
 .../fixed-results.component.ts                |  1 -
 .../pb-results/pb-results-table.component.ts  |  1 -
 .../pb-results/pb-results.component.ts        |  1 -
 .../pb-schema/pb-schema.component.scss        |  1 +
 .../pb-schema/pb-schema.component.ts          | 11 ++++
 .../formulaire/definition/form-definition.ts  |  4 +-
 .../formulaire/definition/form-fixedvar.ts    |  5 +-
 .../formulaire/definition/form-pb-cloison.ts  | 50 ++++++++++++++++---
 .../formulaire/definition/form-prebarrage.ts  | 27 ++++++++--
 .../formulaire/elements/fieldset-container.ts | 12 +++--
 .../formulaire/elements/fieldset-template.ts  |  7 ++-
 src/app/formulaire/elements/pb-schema.ts      | 10 ++++
 12 files changed, 105 insertions(+), 25 deletions(-)

diff --git a/src/app/components/fixedvar-results/fixed-results.component.ts b/src/app/components/fixedvar-results/fixed-results.component.ts
index 004c46c9c..32660b368 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.ts
+++ b/src/app/components/fixedvar-results/fixed-results.component.ts
@@ -36,7 +36,6 @@ export class FixedResultsComponent extends ResultsComponentDirective {
     }
 
     public set results(r: FixedResults) {
-        console.log("->->->->-> je suis FRC et j'ai reçu des résultats", r === undefined ? "keud" : r.result);
         this._fixedResults = r;
     }
 
diff --git a/src/app/components/pb-results/pb-results-table.component.ts b/src/app/components/pb-results/pb-results-table.component.ts
index de2545a6c..1bab32668 100644
--- a/src/app/components/pb-results/pb-results-table.component.ts
+++ b/src/app/components/pb-results/pb-results-table.component.ts
@@ -37,7 +37,6 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
 
     public set results(r: PrebarrageResults) {
         this._pbResults = r;
-        console.log("Set results dans PBRTC !", r);
 
         this._dataSet = [];
         if (
diff --git a/src/app/components/pb-results/pb-results.component.ts b/src/app/components/pb-results/pb-results.component.ts
index 5a031da13..ed974c71b 100644
--- a/src/app/components/pb-results/pb-results.component.ts
+++ b/src/app/components/pb-results/pb-results.component.ts
@@ -281,7 +281,6 @@ export class PbResultsComponent implements DoCheck {
      * @returns true si les résultats ont pu être mis à jour
      */
     private updateResults() {
-        console.log("------------ update results -----------");
         let pabUpdated: boolean;
         let profileChartUpdated: boolean;
         let selectorUpdated: boolean;
diff --git a/src/app/components/pb-schema/pb-schema.component.scss b/src/app/components/pb-schema/pb-schema.component.scss
index c0834e6b7..72baa1edd 100644
--- a/src/app/components/pb-schema/pb-schema.component.scss
+++ b/src/app/components/pb-schema/pb-schema.component.scss
@@ -37,6 +37,7 @@ mat-card-content {
     .related-entity-title {
         vertical-align: middle;
         font-weight: bold;
+        display: none; // @TODO show it in a way that doesn't make the buttons fall on the next line ?
     }
     .hyd-window-btns {
         text-align: right;
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 615af66cd..6d2503d99 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -341,6 +341,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         }
         this.unselect();
         this.refresh();
+        this.clearResults();
     }
 
     public get uitextRemove() {
@@ -367,6 +368,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         this.unselect();
         this.refresh();
         this.selectNodeOnSchema(wallCopy);
+        this.clearResults();
     }
 
     public get uitextCopy() {
@@ -380,6 +382,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         this.unselect();
         this.refresh();
         this.selectNodeOnSchema(newBasin);
+        this.clearResults();
     }
 
     public get uitextAddBasin() {
@@ -413,6 +416,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
                 this.unselect();
                 this.refresh();
                 this.selectNodeOnSchema(wall);
+                this.clearResults();
             }
         });
     }
@@ -437,6 +441,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         this.unselect();
         this.refresh();
         this.selectNodeOnSchema(basin);
+        this.clearResults();
     }
 
     public get uitextMoveBasinUp() {
@@ -459,6 +464,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         this.unselect();
         this.refresh();
         this.selectNodeOnSchema(basin);
+        this.clearResults();
     }
 
     public get uitextMoveBasinDown() {
@@ -507,6 +513,11 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         this.nodeSelected.emit({}); // nothing selected
     }
 
+    /** clear all PB form results whenever the basins / walls layout is changed */
+    private clearResults() {
+        this.pbSchema.form.reset();
+    }
+
     // interface Observer
 
     public update(sender: IObservable, data: any) {
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 32b063f9e..f77f1d6d0 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -55,8 +55,8 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
     /** copy of options.resultsHelp read by FormDefinition.parseOptions() */
     public helpLinks: { [key: string]: string };
 
-    constructor() {
-        super(undefined);
+    constructor(parent?: FormulaireNode) {
+        super(parent);
     }
 
     // surcharge de FormulaireNode::get:uid()
diff --git a/src/app/formulaire/definition/form-fixedvar.ts b/src/app/formulaire/definition/form-fixedvar.ts
index 87b008f0c..b376cfa7c 100644
--- a/src/app/formulaire/definition/form-fixedvar.ts
+++ b/src/app/formulaire/definition/form-fixedvar.ts
@@ -5,6 +5,7 @@ import { ChartType } from "../../results/chart-type";
 import { CalculatorResults } from "../../results/calculator-results";
 import { ParamRadioConfig, NgParameter } from "../elements/ngparam";
 import { FieldSet } from "../elements/fieldset";
+import { FormulaireNode } from "../elements/formulaire-node";
 
 import { Nub, IObservable } from "jalhyd";
 import { SelectFieldCustom } from "../elements/select-field-custom";
@@ -20,8 +21,8 @@ export class FormulaireFixedVar extends FormulaireDefinition {
     /** ids of "custom" select fields */
     private _customSelectIds: string[] = [];
 
-    constructor() {
-        super();
+    constructor(parent?: FormulaireNode) {
+        super(parent);
         this._fixedResults = new FixedResults();
         this._varResults = new VarResults();
     }
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index d41333580..0327b95aa 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -2,9 +2,10 @@ import { FormulaireParallelStructure } from "./form-parallel-structures";
 import { SelectFieldNub } from "../elements/select-field-nub";
 
 import { IObservable, Nub, PbCloison, PbBassin, Structure } from "jalhyd";
-import { FieldSet } from '../elements/fieldset';
-import { FormulaireNode } from '../elements/formulaire-node';
-import { FieldsetContainer } from '../elements/fieldset-container';
+import { FieldSet } from "../elements/fieldset";
+import { FormulaireNode } from "../elements/formulaire-node";
+import { FieldsetContainer } from "../elements/fieldset-container";
+import { FormulairePrebarrage } from "./form-prebarrage";
 
 export class FormulairePbCloison extends FormulaireParallelStructure {
 
@@ -43,8 +44,10 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
         if (sender instanceof FieldsetContainer) {
             switch (data.action) {
                 case "newFieldset":
-                    // this.reset();
-                    console.log("||| reset PAS NON PLUS :) |||");
+                    // still reset all results when a fieldset if manually added
+                    if (data.resetResults !== false) {
+                        this.reset();
+                    }
                     this.subscribeStructureInputFields(data["fieldset"]);
                     this.subscribeStructureSelectFields(data["fieldset"]);
             }
@@ -124,12 +127,45 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
                 parent.kids.push(res);
             }
 
-            console.log("\\\ reset PAS ///");
-            // this.resetResults();
+            // still reset all results when a fieldset if manually added
+            if (data["resetResults"] !== false) {
+                this.reset();
+                (this.parent as FormulairePrebarrage).reset();
+            }
 
             return res;
         } else {
             return super.createFieldset(parent, json, data);
         }
     }
+
+    /**
+     * réinitialisation du formulaire suite à un changement d'une valeur, d'une option, ... :
+     * effacement des résultats, application des dépendances, ...
+     */
+    public reset() {
+        // also reset parent results (that will reset all its children results)
+        (this.parent as FormulairePrebarrage).reset();
+        // prévenir les composants qu'il faut détecter les changements
+        this.notifyReset();
+    }
+
+    // ensure all PBresults are reset
+    public moveFieldsetUp(fs: FieldSet) {
+        super.moveFieldsetUp(fs);
+        this.reset();
+    }
+
+    // ensure all PBresults are reset
+    public moveFieldsetDown(fs: FieldSet) {
+        super.moveFieldsetDown(fs);
+        this.reset();
+    }
+
+    // ensure all PBresults are reset
+    public removeFieldset(fs: FieldSet) {
+        super.removeFieldset(fs);
+        this.reset();
+    }
+
 }
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 302788861..117612ef1 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -125,7 +125,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.showFormElements(this.riverForm);
 
         } else if (node instanceof PbBassin) {
-            this.basinForm = new FormulaireFixedVar();
+            this.basinForm = new FormulaireFixedVar(this);
             this.basinForm.defaultProperties["calcType"] = CalculatorType.PbBassin;
             this.basinForm.currentNub = node;
             this.basinForm.preparseConfig(this.basinFormConfig);
@@ -134,7 +134,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.showFormElements(this.basinForm);
 
         } else if (node instanceof PbCloison) {
-            const wallForm = new FormulairePbCloison();
+            const wallForm = new FormulairePbCloison(this);
             wallForm.defaultProperties["calcType"] = CalculatorType.PbCloison;
             wallForm.currentNub = node;
             wallForm.preparseConfig(this.wallFormConfig);
@@ -147,7 +147,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
                 for (const struct of node.structures) {
                     for (const e of wallForm.allFormElements) {
                         if (e instanceof FieldsetContainer) { // @TODO manage many containers one day ?
-                            e.addFromTemplate(0, undefined, struct);
+                            e.addFromTemplate(0, undefined, struct, { resetResults: false });
                         }
                     }
                 }
@@ -155,7 +155,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
                 // if there was no existing structure, add a default one
                 for (const e of wallForm.allFormElements) {
                     if (e instanceof FieldsetContainer) {
-                        e.addFromTemplate(0);
+                        e.addFromTemplate(0, undefined, undefined, { resetResults: false });
                         break;
                     }
                 }
@@ -225,7 +225,6 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.pbResults.reset();
 
             // afficher les résultats de cloison
-            console.log("RRC => cloison !", this._selectedItem.uid, this._selectedItem.result);
             this.fixedResults.result = this._selectedItem.result;
             if (computedParam !== undefined) {
                 this.fixedResults.calculatedParameter = computedParam;
@@ -243,9 +242,27 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         }
     }
 
+    /**
+     * réinitialisation du formulaire suite à un changement d'une valeur, d'une option, ... :
+     * effacement des résultats, application des dépendances, ...
+     */
+    public reset() {
+        this.resetResults();
+    }
+
     public resetResults() {
         super.resetResults();
         this._fixedResults.reset();
         this._pbResults.reset();
+        // reset all children nubs
+        for (const c of this.currentNub.getChildren()) {
+            c.resetResult();
+        }
+        // reset all wall forms
+        for (const k of this.kids) {
+            if (k instanceof FormulaireDefinition) {
+                k.reset();
+            }
+        }
     }
 }
diff --git a/src/app/formulaire/elements/fieldset-container.ts b/src/app/formulaire/elements/fieldset-container.ts
index 96f719fcf..a8c1ecbe6 100644
--- a/src/app/formulaire/elements/fieldset-container.ts
+++ b/src/app/formulaire/elements/fieldset-container.ts
@@ -71,19 +71,23 @@ export class FieldsetContainer extends FormulaireElement {
      * crée un FieldSet à partir d'un template
      * @param templateIndex indice du template dans la liste
      * @param after insère le nouveau FieldSet après cette position, à la fin sinon
+     * @param nub attaches the given Nub to the new FieldSet
+     * @param extra extra key-value pairs to add to the "newFieldset" event
      */
-    public addFromTemplate(templateIndex: number, after?: number, nub?: Nub): FieldSet {
+    public addFromTemplate(templateIndex: number, after?: number, nub?: Nub, extra?: any): FieldSet {
         const templ: FieldsetTemplate = this._templates[templateIndex];
 
-        const inst: FieldSet = templ.instantiateTemplate(this, after, nub);
+        const inst: FieldSet = templ.instantiateTemplate(this, after, nub, extra);
 
         this.updateLocalisation();
 
         // notification de création d'un FieldSet
-        this.notifyObservers({
+        let info = {
             "action": "newFieldset",
             "fieldset": inst
-        }, this);
+        };
+        info = { ...info, ...extra };
+        this.notifyObservers(info, this);
 
         return inst;
     }
diff --git a/src/app/formulaire/elements/fieldset-template.ts b/src/app/formulaire/elements/fieldset-template.ts
index 3c9071131..b65b48874 100644
--- a/src/app/formulaire/elements/fieldset-template.ts
+++ b/src/app/formulaire/elements/fieldset-template.ts
@@ -42,10 +42,13 @@ export class FieldsetTemplate {
      * @param cont conteneur
      * @param after position à laquelle on ajoute le nouveau FieldSet
      * @param nub Nub existant à injecter dans le Fieldset
+     * @param extra extra key-value pairs to add to the "newFieldset" event
      */
-    public instantiateTemplate(cont: FieldsetContainer, after: number, nub?: Nub): FieldSet {
+    public instantiateTemplate(cont: FieldsetContainer, after: number, nub?: Nub, extra?: any): FieldSet {
         const parentForm = cont.parent as FormulaireDefinition;
-        const res = parentForm.createFieldset(cont, this._jsonConfig, { "template": this, "after": after }, nub);
+        let info = { "template": this, "after": after };
+        info = { ...info, ... extra };
+        const res = parentForm.createFieldset(cont, this._jsonConfig, info, nub);
         res.parseConfig(this._jsonConfig);
         parentForm.afterParseFieldset(res);
         return res;
diff --git a/src/app/formulaire/elements/pb-schema.ts b/src/app/formulaire/elements/pb-schema.ts
index 07e108890..7ec01a39c 100644
--- a/src/app/formulaire/elements/pb-schema.ts
+++ b/src/app/formulaire/elements/pb-schema.ts
@@ -1,6 +1,7 @@
 import { PreBarrage } from "jalhyd";
 
 import { FormulaireElement } from "./formulaire-element";
+import { FormulairePrebarrage } from "../definition/form-prebarrage";
 
 /**
  * The interactive schema for calculator type "PreBarrage" (form element).
@@ -14,6 +15,15 @@ export class PbSchema extends FormulaireElement {
         this._confId = json["id"];
     }
 
+    /**
+     * Returns the Prebarrage model associated to the parent form
+     */
+    public get form(): FormulairePrebarrage {
+        if (this.parentForm) {
+            return this.parentForm as FormulairePrebarrage;
+        }
+    }
+
     /**
      * Returns the Prebarrage model associated to the parent form
      */
-- 
GitLab


From befb37b1e212b4d35a859d0c2c756f1d7068f273 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 9 Jul 2020 14:05:08 +0200
Subject: [PATCH 56/92] FormPrebarrage: simplify results reset

---
 src/app/formulaire/definition/form-prebarrage.ts | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 117612ef1..999a4ed57 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -246,14 +246,17 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
      * réinitialisation du formulaire suite à un changement d'une valeur, d'une option, ... :
      * effacement des résultats, application des dépendances, ...
      */
-    public reset() {
+    /* public reset() {
         this.resetResults();
+    } */
+
+    public resetFormResults() {
+        this._fixedResults.reset();
+        this._pbResults.reset();
     }
 
     public resetResults() {
         super.resetResults();
-        this._fixedResults.reset();
-        this._pbResults.reset();
         // reset all children nubs
         for (const c of this.currentNub.getChildren()) {
             c.resetResult();
-- 
GitLab


From 456bc3818930ab0229dc5f43c04b920f40b95254 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 9 Jul 2020 15:09:48 +0200
Subject: [PATCH 57/92] Upate PreBarrage example

---
 src/app/examples/prebarrage.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/app/examples/prebarrage.json b/src/app/examples/prebarrage.json
index 339101438..c97e06ca0 100644
--- a/src/app/examples/prebarrage.json
+++ b/src/app/examples/prebarrage.json
@@ -791,7 +791,7 @@
                 {
                     "symbol": "Q",
                     "mode": "SINGLE",
-                    "value": 1
+                    "value": 0.844
                 },
                 {
                     "symbol": "Z1",
@@ -800,7 +800,7 @@
                 {
                     "symbol": "Z2",
                     "mode": "SINGLE",
-                    "value": 100
+                    "value": 94.45
                 }
             ]
         }
-- 
GitLab


From ab837b45dc5ebe2125aa65ef195a15d0e4bce124 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 9 Jul 2020 16:38:59 +0200
Subject: [PATCH 58/92] PreBarrage: remember selected schema node and displayed
 panel (input or results)

---
 .../calculator.component.ts                   | 18 +++++++++--
 .../pb-results/pb-results-table.component.ts  | 32 ++++++++++++++++---
 .../pb-schema/pb-schema.component.ts          | 15 +++++----
 .../formulaire/definition/form-prebarrage.ts  |  9 ++++--
 4 files changed, 57 insertions(+), 17 deletions(-)

diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 6c2119744..c5fa86367 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -125,9 +125,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     /** Allows trigerring afterFirstViewChecked() just after calculator is loaded */
     private firstViewChecked = false;
 
-    /** For PreBarrage only: if true, show input data in the right panel, else show results */
-    public showPBInputData = true;
-
     public get ID() {
         if (this._formulaire) {
             return this._formulaire.uid;
@@ -136,6 +133,21 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         }
     }
 
+    /** For PreBarrage only: if true, show input data in the right panel, else show results */
+    public get showPBInputData(): boolean {
+        if (this.isPB) {
+            return (this._formulaire as FormulairePrebarrage).showInputData;
+        } else {
+            return false; // whatever, should never happen
+        }
+    }
+
+    public set showPBInputData(v: boolean) {
+        if (this.isPB) {
+            (this._formulaire as FormulairePrebarrage).showInputData = v;
+        } // else do nothing, should never happen
+    }
+
     constructor(
         @Inject(forwardRef(() => AppComponent)) private appComponent: AppComponent,
         private route: ActivatedRoute,
diff --git a/src/app/components/pb-results/pb-results-table.component.ts b/src/app/components/pb-results/pb-results-table.component.ts
index 1bab32668..792286c8e 100644
--- a/src/app/components/pb-results/pb-results-table.component.ts
+++ b/src/app/components/pb-results/pb-results-table.component.ts
@@ -1,6 +1,6 @@
 import { Component, ViewChild, ElementRef } from "@angular/core";
 
-import { PreBarrage, PbBassin } from "jalhyd";
+import { PreBarrage, PbBassin, ParamDefinition, ParamValueMode } from "jalhyd";
 
 import { I18nService } from "../../services/internationalisation.service";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
@@ -35,6 +35,26 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
         super();
     }
 
+    /**
+     * Returns value at index i for parameter p, whether it is variating
+     * or not, calculated or not
+     * @param p parameter
+     * @param i index
+     */
+    protected getIthValue(p: ParamDefinition, i: number): string {
+        let value: number;
+        if (p.hasMultipleValues) {
+            if (p.valueMode === ParamValueMode.CALCUL) {
+                value = p.parentNub.result.resultElements[i].vCalc;
+            } else {
+                value = p.getInferredValuesList()[i];
+            }
+        } else {
+            value = p.V;
+        }
+        return fv(value);
+    }
+
     public set results(r: PrebarrageResults) {
         this._pbResults = r;
 
@@ -51,6 +71,8 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
             // values to build the data from
             const vi = pr.variableIndex;
 
+            // @TODO results.size ? To extend values lists…
+
             // refresh headers here if language changed
             this._headers = pr.headers;
 
@@ -59,9 +81,9 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
                 this._dataSet.push([
                     this.intlService.localizeText("INFO_LIB_AMONT"),
                     "", "",
-                    fv(pb.prms.Z1.V),
+                    this.getIthValue(pb.prms.Z1, vi),
                     "", "",
-                    fv(pb.prms.Q.V)
+                    this.getIthValue(pb.prms.Q, vi),
                 ]);
             }
 
@@ -89,9 +111,9 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
                 this._dataSet.push([
                     this.intlService.localizeText("INFO_LIB_AVAL"),
                     "", "",
-                    fv(pb.prms.Z2.V),
+                    this.getIthValue(pb.prms.Z2, vi),
                     "", "",
-                    fv(pb.prms.Q.V)
+                    this.getIthValue(pb.prms.Q, vi),
                 ]);
             }
         }
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 6d2503d99..63e6d00f4 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -84,11 +84,15 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         });
         this.nativeElement = this.schema.nativeElement;
         this.render();
-        // reset form to river properties (clodo timeout to prevent ExpressionChangedAfterItHasBeenCheckedError)
-        setTimeout(() => {
-            this.unselect();
-        }, 10);
-        // @TODO find a way to remember last selected item ? Through a service ?
+        // restore previously selected item
+        this._selectedItem = this.pbSchema.form.selectedItem;
+        if (this._selectedItem !== undefined) {
+            // @WARNING clodo timeout to prevent ExpressionChangedAfterItHasBeenCheckedError
+            // and select schema node after schema is refreshed by ngAfterViewInit()
+            setTimeout(() => {
+                this.selectNodeOnSchema(this._selectedItem);
+            }, 20); // timeout has to be greater than the 10ms of ngAfterViewInit()
+        }
     }
 
     private render() {
@@ -497,7 +501,6 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
             this.model.hasUpDownConnection()
             && ! this.model.hasBasinNotConnected()
         );
-        console.log("schéma valide", this._isValid);
         this.validChange.emit();
     }
 
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 999a4ed57..a3dcb71e8 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -31,14 +31,17 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
 
     protected _pbResults: PrebarrageResults;
 
+    /** if true, show input data in the right panel, else show results */
+    public showInputData = true;
+
     constructor() {
         super();
         this._pbResults = new PrebarrageResults();
     }
 
-    /* public get pbNub(): PreBarrage {
-        return this.currentNub as PreBarrage;
-    } */
+    public get selectedItem(): PbBassin | PbCloison {
+        return this._selectedItem;
+    }
 
     public get pbResults(): PrebarrageResults {
         return this._pbResults;
-- 
GitLab


From 2212c3bd7bd30e6762c13e68c4bfd3563f250137 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 10 Jul 2020 14:38:25 +0200
Subject: [PATCH 59/92] Prebarrage: reorganize results component

---
 angular.json                                  |  1 +
 ...ialog-generate-par-simulation.component.ts |  3 +-
 .../fixed-results.component.html              |  1 -
 .../fixed-results.component.ts                |  8 +-
 .../fixedvar-results.component.ts             |  4 -
 .../fixedvar-results/results.component.ts     |  6 ++
 .../fixedvar-results/var-results.component.ts |  6 +-
 .../calculator.component.ts                   |  5 +-
 .../macrorugo-compound-results.component.ts   |  8 +-
 .../pab-profile-chart.component.ts            |  8 +-
 .../pab-results/pab-results.component.ts      |  9 +--
 .../pb-results/pb-results-table.component.ts  | 12 +--
 .../pb-results/pb-results.component.html      |  6 +-
 .../pb-results/pb-results.component.ts        | 73 ++++++++++++------
 .../pb-schema/pb-schema.component.ts          | 37 ++++-----
 .../variable-results-selector.component.ts    | 38 ++++++++--
 .../definition/form-courbe-remous.ts          |  2 +-
 .../formulaire/definition/form-definition.ts  | 18 ++---
 .../formulaire/definition/form-fixedvar.ts    |  6 +-
 .../definition/form-macrorugo-compound.ts     |  4 +-
 src/app/formulaire/definition/form-pab.ts     |  8 +-
 .../formulaire/definition/form-prebarrage.ts  | 76 +++++++++++++------
 .../definition/form-section-parametree.ts     |  6 +-
 src/app/formulaire/elements/ngparam.ts        |  4 -
 src/app/formulaire/elements/pb-schema.ts      |  3 +
 src/app/results/multidimension-results.ts     |  5 +-
 src/app/results/plottable-data.ts             |  4 +-
 .../plottable-macrorugo-compound-results.ts   |  6 +-
 src/app/results/plottable-pab-results.ts      |  6 +-
 src/app/results/prebarrage-results.ts         | 31 ++++++--
 src/app/results/remous-results.ts             | 12 ++-
 src/app/results/var-results.ts                | 58 +++++++-------
 src/app/services/formulaire.service.ts        |  4 +-
 .../services/internationalisation.service.ts  | 12 ++-
 src/app/util.ts                               | 21 -----
 src/locale/messages.en.json                   |  7 +-
 src/locale/messages.fr.json                   |  7 +-
 37 files changed, 300 insertions(+), 225 deletions(-)

diff --git a/angular.json b/angular.json
index 9ff58982c..0f22c724b 100644
--- a/angular.json
+++ b/angular.json
@@ -54,6 +54,7 @@
             "showCircularDependencies": false,
             "allowedCommonJsDependencies": [
               "chartjs-plugin-zoom",
+              "angular2-chartjs/dist/chart.component",
               "angular2-chartjs/dist/chart.module",
               "angular2-hotkeys.js",
               "base-64",
diff --git a/src/app/components/dialog-generate-par-simulation/dialog-generate-par-simulation.component.ts b/src/app/components/dialog-generate-par-simulation/dialog-generate-par-simulation.component.ts
index ff941247e..1432867c0 100644
--- a/src/app/components/dialog-generate-par-simulation/dialog-generate-par-simulation.component.ts
+++ b/src/app/components/dialog-generate-par-simulation/dialog-generate-par-simulation.component.ts
@@ -3,8 +3,7 @@ import { Inject, Component } from "@angular/core";
 
 import { I18nService } from "../../services/internationalisation.service";
 import { MultiDimensionResults } from "../../results/multidimension-results";
-
-import { fv, longestVarNgParam } from "../../util";
+import { longestVarParam, fv } from "../../util";
 
 @Component({
     selector: "dialog-generate-par-simulation",
diff --git a/src/app/components/fixedvar-results/fixed-results.component.html b/src/app/components/fixedvar-results/fixed-results.component.html
index 849bf9d4e..cfd30782d 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.html
+++ b/src/app/components/fixedvar-results/fixed-results.component.html
@@ -1,5 +1,4 @@
 <div class="fixed-results-container" *ngIf="hasFixedParameters">
-
     <div class="fixed-results-buttons">
         <button mat-icon-button (click)="exportAsSpreadsheet()" [title]="uitextExportAsSpreadsheet">
             <mat-icon color="primary">file_download</mat-icon>
diff --git a/src/app/components/fixedvar-results/fixed-results.component.ts b/src/app/components/fixedvar-results/fixed-results.component.ts
index 32660b368..7607bb47e 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.ts
+++ b/src/app/components/fixedvar-results/fixed-results.component.ts
@@ -63,10 +63,6 @@ export class FixedResultsComponent extends ResultsComponentDirective {
         return this._fixedResults && this._fixedResults.fixedParameters.length > 0;
     }
 
-    public formattedLabel(p: NgParameter): string {
-        return CalculatorResults.paramLabel(p, false);
-    }
-
     /**
      * Returns a set of parameters and results for mat-table
      */
@@ -114,7 +110,7 @@ export class FixedResultsComponent extends ResultsComponentDirective {
                         if (sn.parent) {
                             ct = sn.parent.calcType;
                         }
-                        let unit;
+                        let unit: string;
                         // is k the calculated parameter ? If so, extract its unit
                         try {
                             const p = res.sourceNub.getParameter(k);
@@ -232,7 +228,7 @@ export class FixedResultsComponent extends ResultsComponentDirective {
                 if (sn.parent) {
                     ct = sn.parent.calcType;
                 }
-                let unit;
+                let unit: string;
                 // is k the calculated parameter ? If so, extract its unit
                 try {
                     const p = res.sourceNub.getParameter(k);
diff --git a/src/app/components/fixedvar-results/fixedvar-results.component.ts b/src/app/components/fixedvar-results/fixedvar-results.component.ts
index 84d2cda25..eb491d2d9 100644
--- a/src/app/components/fixedvar-results/fixedvar-results.component.ts
+++ b/src/app/components/fixedvar-results/fixedvar-results.component.ts
@@ -187,10 +187,6 @@ export class FixedVarResultsComponent extends ResultsComponentDirective implemen
         return this._fixedResults;
     }
 
-    public formattedLabel(p: NgParameter): string {
-        return CalculatorResults.paramLabel(p, false);
-    }
-
     public get varResults() {
         return this._varResults;
     }
diff --git a/src/app/components/fixedvar-results/results.component.ts b/src/app/components/fixedvar-results/results.component.ts
index 00d4f84e3..eda93d7c3 100644
--- a/src/app/components/fixedvar-results/results.component.ts
+++ b/src/app/components/fixedvar-results/results.component.ts
@@ -4,6 +4,8 @@ import { Screenfull } from "screenfull"; // @see https://github.com/sindresorhus
 import { NgParameter } from "../../formulaire/elements/ngparam";
 import { ServiceFactory } from "../../services/service-factory";
 import { fv } from "../../util";
+import { CalculatorResults } from "../../results/calculator-results";
+
 import { Directive } from "@angular/core";
 
 /**
@@ -80,6 +82,10 @@ export class ResultsComponentDirective {
         ];
     }
 
+    public formattedLabel(p: NgParameter): string {
+        return CalculatorResults.paramLabel(p, false);
+    }
+
     /**
      * Formats (rounds) the given number (or the value of the given parameter) with the
      * number of decimals specified in app preferences; if given number is too low and
diff --git a/src/app/components/fixedvar-results/var-results.component.ts b/src/app/components/fixedvar-results/var-results.component.ts
index b5a66d774..d1ba56c32 100644
--- a/src/app/components/fixedvar-results/var-results.component.ts
+++ b/src/app/components/fixedvar-results/var-results.component.ts
@@ -8,7 +8,7 @@ import { I18nService } from "../../services/internationalisation.service";
 import { ResultsComponentDirective } from "./results.component";
 import { DialogLogEntriesDetailsComponent } from "../dialog-log-entries-details/dialog-log-entries-details.component";
 import { AppComponent } from "../../app.component";
-import { longestVarNgParam } from "../../../app/util";
+import { longestVarParam } from "../../../app/util";
 
 @Component({
     selector: "var-results",
@@ -68,12 +68,12 @@ export class VarResultsComponent extends ResultsComponentDirective {
             // C. pre-extract variable parameters values
             const varValues = [];
             // find longest list
-            const lvp = longestVarNgParam(this._varResults.variatedParameters);
+            const lvp = longestVarParam(this._varResults.variatedParameters);
             this.size = lvp.size;
             // get extended values lists for each variable parameter
             for (const v of this._varResults.variatedParameters) {
                 const vv = [];
-                const iter = v.getExtendedValuesIterator(this.size);
+                const iter = v.param.getExtendedValuesIterator(this.size);
                 while (iter.hasNext) {
                     const nv = iter.next();
                     vv.push(this.formattedValue(nv.value));
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index c5fa86367..93b0569ee 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -19,7 +19,8 @@ import {
     Par,
     ParSimulationParams,
     ParSimulation,
-    Espece
+    Espece,
+    VariatedDetails
 } from "jalhyd";
 
 import { generateValuesCombination } from "../../util";
@@ -961,7 +962,7 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         const pcal = parCalage.prms;
         let pres: { [key: string]: number } = parCalage.result.values;
 
-        const varParams: NgParameter[] = this._formulaire.getVariatedParameters();
+        const varParams: VariatedDetails[] = this._formulaire.getVariatedParameters();
         if (varParams.length > 0) {
             // open popup to choose combination of varying parameters
             const mdParResults = new MultiDimensionResults();
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
index e15ade96c..d2d932838 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
@@ -15,6 +15,7 @@ import { VariableResultsSelectorComponent } from "../variable-results-selector/v
 import { MacrorugoCompoundResultsTableComponent } from "./macrorugo-compound-results-table.component";
 import { MacrorugoCompoundResults } from "../../results/macrorugo-compound-results";
 import { PlottableMacrorugoCompoundResults } from "../../results/plottable-macrorugo-compound-results";
+import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 
 @Component({
     selector: "macrorugo-compound-results",
@@ -23,7 +24,7 @@ import { PlottableMacrorugoCompoundResults } from "../../results/plottable-macro
         "./macrorugo-compound-results.component.scss"
     ]
 })
-export class MacrorugoCompoundResultsComponent implements DoCheck {
+export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective implements DoCheck {
 
     /** résultats non mis en forme */
     private _mrcResults: MacrorugoCompoundResults;
@@ -53,6 +54,7 @@ export class MacrorugoCompoundResultsComponent implements DoCheck {
         private appSetupService: ApplicationSetupService,
         private i18nService: I18nService,
     ) {
+        super();
         this._plottableResults = new PlottableMacrorugoCompoundResults();
     }
 
@@ -280,10 +282,6 @@ export class MacrorugoCompoundResultsComponent implements DoCheck {
         return this._mrcResults;
     }
 
-    public formattedLabel(p: NgParameter): string {
-        return CalculatorResults.paramLabel(p, false);
-    }
-
     public formattedValue(p: NgParameter): string {
         const nDigits = this.appSetupService.displayPrecision;
         return p.getValue().toFixed(nDigits);
diff --git a/src/app/components/pab-profile-chart/pab-profile-chart.component.ts b/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
index 4b47585b7..ce34f4dae 100644
--- a/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
+++ b/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
@@ -6,7 +6,7 @@ import { I18nService } from "../../services/internationalisation.service";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 import { PabResults } from "../../results/pab-results";
 import { IYSeries } from "../../results/y-series";
-import { fv, longestVarNgParam } from "../../util";
+import { fv, longestVarParam } from "../../util";
 import { AppComponent } from "../../app.component";
 
 import { CloisonAval, Cloisons, LoiDebit } from "jalhyd";
@@ -132,12 +132,12 @@ export class PabProfileChartComponent extends ResultsComponentDirective {
         if (this._results) {
             this.varValues = [];
             // find longest list
-            const lvp = longestVarNgParam(this._results.variatedParameters);
+            const lvp = longestVarParam(this._results.variatedParameters);
             this.size = lvp.size;
             // get extended values lists for each variable parameter
             for (const v of this._results.variatedParameters) {
                 const vv = [];
-                const iter = v.getExtendedValuesIterator(this.size);
+                const iter = v.param.getExtendedValuesIterator(this.size);
                 while (iter.hasNext) {
                     const nv = iter.next();
                     vv.push(fv(nv.value));
@@ -458,7 +458,7 @@ export class PabProfileChartComponent extends ResultsComponentDirective {
             i++;
             let value = "0";
             value = vv[n];
-            return `${vp.symbol} = ${value}`;
+            return `${vp.param.symbol} = ${value}`;
         }).join(", ");
     }
 }
diff --git a/src/app/components/pab-results/pab-results.component.ts b/src/app/components/pab-results/pab-results.component.ts
index 79551c24d..309a6647a 100644
--- a/src/app/components/pab-results/pab-results.component.ts
+++ b/src/app/components/pab-results/pab-results.component.ts
@@ -4,7 +4,6 @@ import { Result, cLog, Message, MessageCode, MessageSeverity } from "jalhyd";
 
 import { LogComponent } from "../../components/log/log.component";
 import { CalculatorResults } from "../../results/calculator-results";
-import { NgParameter } from "../../formulaire/elements/ngparam";
 import { PabResultsTableComponent } from "./pab-results-table.component";
 import { PabResults } from "../../results/pab-results";
 import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
@@ -13,6 +12,7 @@ import { PlottablePabResults } from "../../results/plottable-pab-results";
 import { ResultsChartComponent } from "../results-chart/results-chart.component";
 import { I18nService } from "../../services/internationalisation.service";
 import { PabProfileChartComponent } from "../pab-profile-chart/pab-profile-chart.component";
+import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 
 @Component({
     selector: "pab-results",
@@ -21,7 +21,7 @@ import { PabProfileChartComponent } from "../pab-profile-chart/pab-profile-chart
         "./pab-results.component.scss"
     ]
 })
-export class PabResultsComponent implements DoCheck {
+export class PabResultsComponent extends ResultsComponentDirective implements DoCheck {
 
     /** résultats non mis en forme */
     private _pabResults: PabResults;
@@ -53,6 +53,7 @@ export class PabResultsComponent implements DoCheck {
     constructor(
         private i18nService: I18nService,
     ) {
+        super();
         this._plottableResults = new PlottablePabResults();
     }
 
@@ -316,10 +317,6 @@ export class PabResultsComponent implements DoCheck {
         return this._pabResults;
     }
 
-    public formattedLabel(p: NgParameter): string {
-        return CalculatorResults.paramLabel(p, false);
-    }
-
     public get hasResults(): boolean {
         return this._pabResults && this._pabResults.hasResults;
     }
diff --git a/src/app/components/pb-results/pb-results-table.component.ts b/src/app/components/pb-results/pb-results-table.component.ts
index 792286c8e..c064fabb9 100644
--- a/src/app/components/pb-results/pb-results-table.component.ts
+++ b/src/app/components/pb-results/pb-results-table.component.ts
@@ -41,13 +41,13 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
      * @param p parameter
      * @param i index
      */
-    protected getIthValue(p: ParamDefinition, i: number): string {
+    protected getIthValue(p: ParamDefinition, i: number, extendTo: number): string {
         let value: number;
         if (p.hasMultipleValues) {
             if (p.valueMode === ParamValueMode.CALCUL) {
                 value = p.parentNub.result.resultElements[i].vCalc;
             } else {
-                value = p.getInferredValuesList()[i];
+                value = p.getInferredValuesList(extendTo)[i];
             }
         } else {
             value = p.V;
@@ -81,9 +81,9 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
                 this._dataSet.push([
                     this.intlService.localizeText("INFO_LIB_AMONT"),
                     "", "",
-                    this.getIthValue(pb.prms.Z1, vi),
+                    this.getIthValue(pb.prms.Z1, vi, this._pbResults.size),
                     "", "",
-                    this.getIthValue(pb.prms.Q, vi),
+                    this.getIthValue(pb.prms.Q, vi, this._pbResults.size),
                 ]);
             }
 
@@ -111,9 +111,9 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
                 this._dataSet.push([
                     this.intlService.localizeText("INFO_LIB_AVAL"),
                     "", "",
-                    this.getIthValue(pb.prms.Z2, vi),
+                    this.getIthValue(pb.prms.Z2, vi, this._pbResults.size),
                     "", "",
-                    this.getIthValue(pb.prms.Q, vi),
+                    this.getIthValue(pb.prms.Q, vi, this._pbResults.size),
                 ]);
             }
         }
diff --git a/src/app/components/pb-results/pb-results.component.html b/src/app/components/pb-results/pb-results.component.html
index db8aa6d91..a4a603342 100644
--- a/src/app/components/pb-results/pb-results.component.html
+++ b/src/app/components/pb-results/pb-results.component.html
@@ -1,5 +1,4 @@
 <div class="container">
-
     <log #generalLog [logTitle]="uitextGeneralLogTitle">log général</log>
 
     <variable-results-selector [results]="pbResults" (indexChange)="variableIndexChanged()">
@@ -8,7 +7,10 @@
     <log #iterationLog></log>
 
     <!-- tableau de résultats des bassins -->
-    <pb-results-table *ngIf="showBasinsResults" [results]="pbResults"></pb-results-table>
+    <pb-results-table *ngIf="hasBasinResults" [results]="pbResults"></pb-results-table>
+
+    <!-- table des résultats fixés -->
+    <fixed-results *ngIf="hasWallResults" [results]="pbResults.cloisonResults"></fixed-results>
 
     <!-- <quicknav *ngIf="hasDisplayableResults" [items]="[ 'input', 'results', 'charts' ]"
         [currentItem]="'charts'" [align]="'left'"></quicknav> -->
diff --git a/src/app/components/pb-results/pb-results.component.ts b/src/app/components/pb-results/pb-results.component.ts
index ed974c71b..6623a32ac 100644
--- a/src/app/components/pb-results/pb-results.component.ts
+++ b/src/app/components/pb-results/pb-results.component.ts
@@ -1,16 +1,16 @@
 import { Component, ViewChild, DoCheck } from "@angular/core";
 
-import { Result, cLog, Message, MessageCode, MessageSeverity } from "jalhyd";
-
 import { LogComponent } from "../log/log.component";
 import { CalculatorResults } from "../../results/calculator-results";
 import { PbResultsTableComponent } from "./pb-results-table.component";
 import { PrebarrageResults } from "../../results/prebarrage-results";
 import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
 import { I18nService } from "../../services/internationalisation.service";
-import { PabProfileChartComponent } from "../pab-profile-chart/pab-profile-chart.component";
+import { FixedResultsComponent } from "../fixedvar-results/fixed-results.component";
 import { FixedResults } from "../../results/fixed-results";
 
+import { Result } from "jalhyd";
+
 @Component({
     selector: "pb-results",
     templateUrl: "./pb-results.component.html",
@@ -32,6 +32,9 @@ export class PbResultsComponent implements DoCheck {
     @ViewChild(VariableResultsSelectorComponent)
     private variableResultsSelectorComponent: VariableResultsSelectorComponent;
 
+    @ViewChild(FixedResultsComponent)
+    private fixedResultsComponent: FixedResultsComponent;
+
     @ViewChild("generalLog")
     private generalLogComponent: LogComponent;
 
@@ -59,23 +62,19 @@ export class PbResultsComponent implements DoCheck {
         return this._pbResults;
     }
 
+    // true if any result is present
     public get hasResults(): boolean {
         return this._pbResults && this._pbResults.hasResults;
     }
 
-    public get showBasinsResults(): boolean {
-        let ret = this._pbResults && this._pbResults.hasResults;
-        if (
-            this._pbResults
-            && this._pbResults.variatedParameters
-            && this._pbResults.variatedParameters.length > 0
-        ) {
-            ret = ret
-            && this._pbResults.variableIndex !== undefined
-            && this._pbResults.result.resultElements[this._pbResults.variableIndex] !== undefined
-            && this._pbResults.result.resultElements[this._pbResults.variableIndex].ok;
-        }
-        return ret;
+    // true if basin results are present
+    public get hasBasinResults(): boolean {
+        return this._pbResults && this._pbResults.hasBasinResults;
+    }
+
+    // true if wall results are present
+    public get hasWallResults(): boolean {
+        return this._pbResults && this._pbResults.hasWallResults;
     }
 
     /**
@@ -100,6 +99,9 @@ export class PbResultsComponent implements DoCheck {
         if (this.variableResultsSelectorComponent) {
             this.variableResultsSelectorComponent.results = undefined;
         }
+        if (this.fixedResultsComponent) {
+            this.fixedResultsComponent.results = undefined;
+        }
         /* if (this.profileChartComponent) {
             this.profileChartComponent.results = undefined;
         } */
@@ -281,9 +283,10 @@ export class PbResultsComponent implements DoCheck {
      * @returns true si les résultats ont pu être mis à jour
      */
     private updateResults() {
-        let pabUpdated: boolean;
+        let pbTableUpdated: boolean;
         let profileChartUpdated: boolean;
         let selectorUpdated: boolean;
+        let fixedResultsUpdated: boolean;
 
         // results or not, there might be a log
         const logUpdated = (this.iterationLogComponent !== undefined || this.generalLogComponent !== undefined); // gne ?
@@ -293,27 +296,49 @@ export class PbResultsComponent implements DoCheck {
             this.generalLogComponent.log = this.globalLog; */
         }
 
+        // show selector as long as any result is present
         if (this.hasResults) {
-            pabUpdated = this.pbResultsTableComponent !== undefined;
-            if (pabUpdated) {
-                this.pbResultsTableComponent.results = this._pbResults;
-            }
             selectorUpdated = this.variableResultsSelectorComponent !== undefined;
             if (selectorUpdated) {
                 this.variableResultsSelectorComponent.results = this._pbResults;
             }
+        } else {
+            selectorUpdated = true;
+        }
+        if (this.hasBasinResults) {
+            pbTableUpdated = this.pbResultsTableComponent !== undefined;
+            if (pbTableUpdated) {
+                this.pbResultsTableComponent.results = this._pbResults;
+            }
             /* profileChartUpdated = this.profileChartComponent !== undefined;
             if (profileChartUpdated) {
                 this.profileChartComponent.results = this._pbResults;
                 this.profileChartComponent.updateView();
             } */
         } else {
-            pabUpdated = true;
+            pbTableUpdated = true;
             profileChartUpdated = true;
-            selectorUpdated = true;
+        }
+        if (this.hasWallResults) {
+            fixedResultsUpdated = this.fixedResultsComponent !== undefined;
+            if (fixedResultsUpdated) {
+                // trick to show only the result of a given iteration, without
+                // modifying FixedResultsComponent
+                const iterationResult = new FixedResults();
+                for (const fp of this._pbResults.cloisonResults.fixedParameters) {
+                    iterationResult.addFixedParameter(fp);
+                }
+                iterationResult.result = new Result(
+                    this._pbResults.cloisonResults.result.resultElements[this._pbResults.variableIndex],
+                    this._pbResults.cloisonResults.result.sourceNub
+                );
+                this.fixedResultsComponent.results = iterationResult;
+            }
+        } else {
+            fixedResultsUpdated = true;
         }
 
-        return pabUpdated && logUpdated && profileChartUpdated && selectorUpdated;
+        return pbTableUpdated && logUpdated && profileChartUpdated && selectorUpdated && fixedResultsUpdated;
     }
 
     public get uitextGeneralLogTitle(): string {
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 63e6d00f4..735e7dea7 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -60,9 +60,6 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     /** Records existing walls as they are built, to detect if multiple walls connect the same pair of basins */
     private existingWalls: { [key: string]: number };
 
-    /** Stores appropriate number suffix for a given wall uid (related to existingWalls above) */
-    private wallsSuffixes: { [key: string]: number };
-
     public constructor(
         @Inject(forwardRef(() => GenericCalculatorComponent)) private calculatorComponent: GenericCalculatorComponent,
         private i18nService: I18nService,
@@ -144,7 +141,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
      */
     private graphDefinition() {
         this.existingWalls = {};
-        this.wallsSuffixes = {};
+        this.pbSchema.wallsSuffixes = {};
         const def: string[] = [ "graph TB" ];
 
         // river upstream / downstream
@@ -159,7 +156,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         const sortedWalls: PbCloison[] = [];
         for (const c of this.model.children) {
             if (c instanceof PbBassin) {
-                def.push(`${c.uid}("${this.itemDesription(c)}")`); // rounded edges
+                def.push(`${c.uid}("${this.itemDescription(c)}")`); // rounded edges
                 def.push(`class ${c.uid} basin;`);
             } else if (c instanceof PbCloison) {
                 // store, to draw later
@@ -178,11 +175,11 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
             }
             // affect suffix if needed
             if (this.existingWalls[basinsPair] > 0) {
-                this.wallsSuffixes[c.uid] = this.existingWalls[basinsPair];
+                this.pbSchema.wallsSuffixes[c.uid] = this.existingWalls[basinsPair];
             }
             this.existingWalls[basinsPair]++;
             // draw wall Node
-            def.push(`${c.uid}["${this.itemDesription(c)}"]`); // square edges
+            def.push(`${c.uid}["${this.itemDescription(c)}"]`); // square edges
             def.push(`class ${c.uid} wall;`);
             // draw "arrow" with 2 lines
             def.push(`${upstreamBasinId}---${c.uid}-->${downstreamBasinId}`);
@@ -259,7 +256,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     }
 
     public get prefixedItemDescription(): string {
-        let desc = this.itemDesription(this._selectedItem);
+        let desc = this.itemDescription(this._selectedItem);
         if (this._selectedItem instanceof PbCloison) {
             desc = this.i18nService.localizeText("INFO_PB_CLOISON") + " " + desc;
         }
@@ -270,23 +267,17 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     }
 
     /** Returns a short description of the given item: wall or basin */
-    private itemDesription(item: PbCloison | PbBassin): string {
+    private itemDescription(item: PbCloison | PbBassin): string {
         let desc = "";
-        if (item instanceof PbCloison) {
-            const upstreamBasinName = item.bassinAmont === undefined
-                ? this.i18nService.localizeText("INFO_LIB_AMONT")
-                : "B" + (this.model.findBasinPosition(item.bassinAmont.uid) + 1);
-            const downstreamBasinName = item.bassinAval === undefined
-                ? this.i18nService.localizeText("INFO_LIB_AVAL")
-                : "B" + (this.model.findBasinPosition(item.bassinAval.uid) + 1);
-            desc = upstreamBasinName + "-" + downstreamBasinName;
-            // if a similar wall already exists, suffix !
-            if (item.uid in this.wallsSuffixes) {
-                desc += " (" + this.wallsSuffixes[item.uid] + ")";
+        if (item !== undefined) {
+            desc = this.i18nService.localizeMessage(item.description);
+            if (item instanceof PbCloison) {
+                // there might be multiple walls between the same pair of basins
+                if (item.uid in this.pbSchema.wallsSuffixes) {
+                    desc += " (" + this.pbSchema.wallsSuffixes[item.uid] + ")";
+                }
             }
-        } else if (item instanceof PbBassin) {
-            desc = this.i18nService.localizeText("INFO_PB_BASSIN_N") + (this.model.findBasinPosition(item.uid) + 1);
-        } // else undefined
+        }
         return desc;
     }
 
diff --git a/src/app/components/variable-results-selector/variable-results-selector.component.ts b/src/app/components/variable-results-selector/variable-results-selector.component.ts
index af8dfe927..ff36f82b1 100644
--- a/src/app/components/variable-results-selector/variable-results-selector.component.ts
+++ b/src/app/components/variable-results-selector/variable-results-selector.component.ts
@@ -1,8 +1,11 @@
 import { Component, Output, EventEmitter } from "@angular/core";
 
 import { I18nService } from "../../services/internationalisation.service";
-import { fv, longestVarNgParam } from "../../util";
+import { fv, longestVarParam } from "../../util";
 import { MultiDimensionResults } from "../../results/multidimension-results";
+import { PrebarrageResults } from "../../results/prebarrage-results";
+
+import { CalculatorType, PbCloison, Structure } from "jalhyd";
 
 @Component({
     selector: "variable-results-selector",
@@ -40,12 +43,12 @@ export class VariableResultsSelectorComponent {
             // pre-extract variable parameters values
             this.varValues = [];
             // find longest list
-            const lvp = longestVarNgParam(this._results.variatedParameters);
+            const lvp = longestVarParam(this._results.variatedParameters);
             this.size = lvp.size;
             // get extended values lists for each variable parameter
             for (const v of this._results.variatedParameters) {
                 const vv = [];
-                const iter = v.getExtendedValuesIterator(this.size);
+                const iter = v.param.getExtendedValuesIterator(this.size);
                 while (iter.hasNext) {
                     const nv = iter.next();
                     vv.push(fv(nv.value));
@@ -76,14 +79,33 @@ export class VariableResultsSelectorComponent {
         for (let i = 0; i < this.varValues.length; i++) {
             const vv = this.varValues[i];
             const vp = this._results.variatedParameters[i];
-            let symbol = vp.symbol;
+            let symbol = vp.param.symbol;
             // is vp a parameter of a child Nub ?
             if (
-                vp.paramDefinition.parentNub
-                && vp.paramDefinition.parentNub !== vp.paramDefinition.originNub
+                vp.param.parentNub
+                && vp.param.parentNub !== vp.param.originNub
             ) {
-                const pos = vp.paramDefinition.parentNub.findPositionInParent() + 1;
-                symbol = this.intlService.localizeText("INFO_LIB_RADIER_N_COURT") + pos + "_" + symbol;
+                let childPrefix: string;
+                // prefix the label depending on (grand)children type
+                switch (vp.param.originNub.calcType) {
+                    case CalculatorType.PreBarrage:
+                        const struct = vp.param.parentNub as Structure;
+                        const pbRes = this._results as PrebarrageResults;
+                        const wall = struct.parent as PbCloison;
+                        const posS = struct.findPositionInParent() + 1;
+                        childPrefix = this.intlService.localizeMessage(wall.description);
+                        // there might be multiple walls between the same pair of basins
+                        if (wall.uid in pbRes.wallsSuffixes) {
+                            childPrefix += " (" + pbRes.wallsSuffixes[wall.uid] + ")";
+                        }
+                        childPrefix += "_" + this.intlService.localizeText("INFO_LIB_STRUCTURE_N_COURT") + posS;
+                        break;
+                    case CalculatorType.MacroRugoCompound:
+                        const posMR = vp.param.parentNub.findPositionInParent() + 1;
+                        childPrefix = this.intlService.localizeText("INFO_LIB_RADIER_N_COURT") + posMR;
+                        break;
+                }
+                symbol = childPrefix + "_" + symbol;
             }
             kv.push(`${symbol} = ${vv[index]}`);
         }
diff --git a/src/app/formulaire/definition/form-courbe-remous.ts b/src/app/formulaire/definition/form-courbe-remous.ts
index 844a2c2c8..304fef0ba 100644
--- a/src/app/formulaire/definition/form-courbe-remous.ts
+++ b/src/app/formulaire/definition/form-courbe-remous.ts
@@ -15,7 +15,7 @@ export class FormulaireCourbeRemous extends FormulaireSection {
 
     constructor() {
         super();
-        this._remousResults = new RemousResults();
+        this._remousResults = new RemousResults(this);
         this._props["varCalc"] = ""; // important
     }
 
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index f77f1d6d0..424c4cf41 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -8,7 +8,8 @@ import {
     SectionNub,
     acSection,
     ParamDefinition,
-    Result
+    Result,
+    VariatedDetails
 } from "jalhyd";
 
 import { FormulaireElement } from "../elements/formulaire-element";
@@ -517,18 +518,9 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         return ngparam;
     }
 
-    public getVariatedParameters(): NgParameter[] {
-        let res: NgParameter[] = [];
-        // find variated local parameters
-        res = this.getDisplayedParamListFromState(ParamRadioConfig.VAR);
-        // add variated linked parameters
-        const pms = this.getDisplayedParamListFromState(ParamRadioConfig.LINK);
-        for (const p of pms) {
-            if (p.paramDefinition.hasMultipleValues) {
-                res.push(p);
-            }
-        }
-        return res;
+    /** find variated (possibly linked) parameters from model, and get their values at the same time */
+    public getVariatedParameters(): VariatedDetails[] {
+        return this._currentNub.findVariatedParams();
     }
 
     /**
diff --git a/src/app/formulaire/definition/form-fixedvar.ts b/src/app/formulaire/definition/form-fixedvar.ts
index b376cfa7c..a23e5a623 100644
--- a/src/app/formulaire/definition/form-fixedvar.ts
+++ b/src/app/formulaire/definition/form-fixedvar.ts
@@ -7,8 +7,8 @@ import { ParamRadioConfig, NgParameter } from "../elements/ngparam";
 import { FieldSet } from "../elements/fieldset";
 import { FormulaireNode } from "../elements/formulaire-node";
 
-import { Nub, IObservable } from "jalhyd";
 import { SelectFieldCustom } from "../elements/select-field-custom";
+import { Nub, IObservable, VariatedDetails } from "jalhyd";
 
 export class FormulaireFixedVar extends FormulaireDefinition {
 
@@ -24,7 +24,7 @@ export class FormulaireFixedVar extends FormulaireDefinition {
     constructor(parent?: FormulaireNode) {
         super(parent);
         this._fixedResults = new FixedResults();
-        this._varResults = new VarResults();
+        this._varResults = new VarResults(this);
     }
 
     public get fixedResults() {
@@ -122,7 +122,7 @@ export class FormulaireFixedVar extends FormulaireDefinition {
         const computedParam: NgParameter = this.getComputedParameter();
         this.resetFormResults(); // to avoid adding fixed parameters more than once (see below)
         this.addFixedParameters();
-        const varParams: NgParameter[] = this.getVariatedParameters();
+        const varParams: VariatedDetails[] = this.getVariatedParameters();
 
         if (varParams.length === 0) {
             // pas de paramètre à varier
diff --git a/src/app/formulaire/definition/form-macrorugo-compound.ts b/src/app/formulaire/definition/form-macrorugo-compound.ts
index f04e6ccfe..a8cbc7ac6 100644
--- a/src/app/formulaire/definition/form-macrorugo-compound.ts
+++ b/src/app/formulaire/definition/form-macrorugo-compound.ts
@@ -1,4 +1,4 @@
-import { IObservable, Nub, MacrorugoCompound, Result, MRCInclination } from "jalhyd";
+import { IObservable, Nub, MacrorugoCompound, Result, MRCInclination, VariatedDetails } from "jalhyd";
 
 import { FieldSet } from "../elements/fieldset";
 import { FieldsetContainer } from "../elements/fieldset-container";
@@ -116,7 +116,7 @@ export class FormulaireMacrorugoCompound extends FormulaireRepeatableFieldset {
     protected reaffectResultComponents() {
         const mrc: MacrorugoCompound = (this.currentNub as MacrorugoCompound);
         const computedParam: NgParameter = this.getComputedParameter();
-        const varParams: NgParameter[] = this.getVariatedParameters();
+        const varParams: VariatedDetails[] = this.getVariatedParameters();
 
         // résultat de calcul de la passe à macrorugo complexe
         const mrcr = this.mrcResults;
diff --git a/src/app/formulaire/definition/form-pab.ts b/src/app/formulaire/definition/form-pab.ts
index 593aa219a..d88ae7826 100644
--- a/src/app/formulaire/definition/form-pab.ts
+++ b/src/app/formulaire/definition/form-pab.ts
@@ -1,9 +1,9 @@
-import { Pab, Result } from "jalhyd";
+import { Pab, Result, VariatedDetails } from "jalhyd";
 
 import { FormulaireDefinition } from "./form-definition";
 import { PabResults } from "../../results/pab-results";
 import { NgParameter } from "../elements/ngparam";
-import { longestVarNgParam } from "../../util";
+import { longestVarParam } from "../../util";
 import { CalculatorResults } from "../../results/calculator-results";
 
 /**
@@ -35,7 +35,7 @@ export class FormulairePab extends FormulaireDefinition {
     protected reaffectResultComponents() {
         const pab: Pab = (this.currentNub as Pab);
         const computedParam: NgParameter = this.getComputedParameter();
-        const varParams: NgParameter[] = this.getVariatedParameters();
+        const varParams: VariatedDetails[] = this.getVariatedParameters();
 
         // résultat de calcul de la passe à bassins
         const pabr = this.pabResults;
@@ -55,7 +55,7 @@ export class FormulairePab extends FormulaireDefinition {
         pabr.Z2 = [];
         if (varParams.length > 0) {
             // find longest list
-            const lvp = longestVarNgParam(varParams);
+            const lvp = longestVarParam(varParams);
             const longest = lvp.size;
             // get extended values lists for Z2
             if (pab.prms.Z2.hasMultipleValues) {
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index a3dcb71e8..43f7900af 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -1,4 +1,4 @@
-import { CalculatorType, PbBassin, PbCloison, IObservable, PreBarrage } from "jalhyd";
+import { CalculatorType, PbBassin, PbCloison, IObservable, PreBarrage, VariatedDetails, ParamDefinition, ParamDomainValue } from "jalhyd";
 
 import { FormulaireFixedVar } from "./form-fixedvar";
 import { PbSchema } from "../elements/pb-schema";
@@ -8,7 +8,8 @@ import { FormulairePbCloison } from "./form-pb-cloison";
 import { FieldsetContainer } from "../elements/fieldset-container";
 import { CalculatorResults } from "../../results/calculator-results";
 import { PrebarrageResults } from "../../results/prebarrage-results";
-import { NgParameter } from "../elements/ngparam";
+import { NgParameter, ParamRadioConfig } from "../elements/ngparam";
+import { longestVarParam } from "../../util";
 
 /**
  * Formulaire pour les PréBarrage
@@ -50,7 +51,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     public get results(): CalculatorResults[] {
         // ensure help links are propagated
         this._pbResults.helpLinks = this.helpLinks;
-        return [ this.fixedResults, this._pbResults ];
+        return [ this._pbResults ];
     }
 
     public get hasResults(): boolean {
@@ -191,7 +192,6 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     public update(sender: IObservable, data: any) {
         super.update(sender, data);
         if (sender instanceof FormulairePbCloison) {
-            // console.log("HOH PUTAIN CE BIG QUATTRO HOYOYOYOYOY", this.kids[0].constructor.name);
             if (data.action === "updateBasin") {
                 this.refreshSchema(data.value);
             }
@@ -202,8 +202,8 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         this.runNubCalc(this.currentNub);
         this.refreshFieldsets(); // important: before reaffectResultComponents() or it will break results components localization
         // reset variable index to avoid trying to access an index > 0 when nothing varies
-        const pabr = this.pbResults;
-        pabr.variableIndex = 0;
+        const pbr = this.pbResults;
+        pbr.variableIndex = 0;
 
         this.reaffectResultComponents();
     }
@@ -211,30 +211,52 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     protected reaffectResultComponents() {
         const pb: PreBarrage = (this.currentNub as PreBarrage);
         const computedParam: NgParameter = this.getComputedParameter();
-        const varParams: NgParameter[] = this.getVariatedParameters();
+
+        // cacher les résultats
+        this.pbResults.reset();
+        this.addFixedParameters();
 
         // pour le sélecteur d'itérations
+        const varParams: VariatedDetails[] = this.getVariatedParameters();
         if (varParams) {
             this.pbResults.variatedParameters = varParams;
+            const lvp = longestVarParam(this._pbResults.variatedParameters);
+            this._pbResults.size = lvp.size;
         }
 
-        // cacher les résultats de la cloison
-        this.fixedResults.reset();
-        this.addFixedParameters();
-
         // résultats selon l'objet sélectionné sur le schéma
         if (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison) {
-            // cacher les résultats de bassins
-            this.pbResults.reset();
-
             // afficher les résultats de cloison
-            this.fixedResults.result = this._selectedItem.result;
+            this.pbResults.cloisonResults.result = this._selectedItem.result;
             if (computedParam !== undefined) {
-                this.fixedResults.calculatedParameter = computedParam;
+                this.pbResults.cloisonResults.calculatedParameter = computedParam;
             }
+            // transmission des suffixes de cloisons calculés par l'algo de tri de PbSchemaComponent,
+            // pour le sélecteur de conditions limites
+        const pbs = this.kids[0] as PbSchema;
+            this.pbResults.wallsSuffixes = pbs.wallsSuffixes;
+            // astuce clodo : si un paramètre d'un ouvrage de cette cloison varie, on
+            // l'ajoute sous forme de faux paramètre fixe
+            /* for (const s of this._selectedItem.structures) {
+                for (const p of s.parameterIterator) {
+                    if (p.hasMultipleValues) {
+                        this._pbResults.cloisonResults.addFixedParameter(
+                            new NgParameter(
+                                new ParamDefinition(
+                                    undefined,
+                                    p.symbol,
+                                    ParamDomainValue.ANY,
+                                    p.unit,
+                                    p.getInferredValuesList(this.pbResults.size)[this.pbResults.variableIndex]
+                                ),
+                                this
+                            )
+                        );
+                    }
+                }
+            } */
         } else {
             // afficher les résultats des bassins
-            this.pbResults.reset();
             // résultat général du Nub (amont, aval, débit)
             this.pbResults.result = pb.result;
             this.pbResults.calculatedParameter = computedParam;
@@ -245,16 +267,20 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         }
     }
 
-    /**
-     * réinitialisation du formulaire suite à un changement d'une valeur, d'une option, ... :
-     * effacement des résultats, application des dépendances, ...
-     */
-    /* public reset() {
-        this.resetResults();
-    } */
+    public addFixedParameters() {
+        // @TODO lire dans le modèle !
+        for (const p of this.getDisplayedParamListFromState(ParamRadioConfig.FIX)) {
+            this._pbResults.cloisonResults.addFixedParameter(p);
+        }
+
+        for (const p of this.getDisplayedParamListFromState(ParamRadioConfig.LINK)) {
+            if (!p.paramDefinition.hasMultipleValues) {
+                this._pbResults.cloisonResults.addFixedParameter(p);
+            }
+        }
+    }
 
     public resetFormResults() {
-        this._fixedResults.reset();
         this._pbResults.reset();
     }
 
diff --git a/src/app/formulaire/definition/form-section-parametree.ts b/src/app/formulaire/definition/form-section-parametree.ts
index f4d2319fd..b1d6dcf4a 100644
--- a/src/app/formulaire/definition/form-section-parametree.ts
+++ b/src/app/formulaire/definition/form-section-parametree.ts
@@ -32,7 +32,7 @@ export class FormulaireSectionParametree extends FormulaireSection {
         const sect: acSection = sectNub.section;
         this._sectionResults.section = sect;
 
-        const varParams = this.getSectionVariatedParameters();
+        const varParams = this.getVariatedParameters();
         if (varParams.length > 0) {
             // résultats variés avec tous les résultats complémentaires
             this._varResults.variatedParameters = varParams;
@@ -71,8 +71,4 @@ export class FormulaireSectionParametree extends FormulaireSection {
         res.push(this._sectionResults);
         return res;
     }
-
-    public getSectionVariatedParameters(): NgParameter[] {
-        return this.getDisplayedParamListFromState(ParamRadioConfig.VAR);
-    }
 }
diff --git a/src/app/formulaire/elements/ngparam.ts b/src/app/formulaire/elements/ngparam.ts
index 967680825..7943071ed 100644
--- a/src/app/formulaire/elements/ngparam.ts
+++ b/src/app/formulaire/elements/ngparam.ts
@@ -319,10 +319,6 @@ export class NgParameter extends InputField implements Observer {
         }
     }
 
-    public getExtendedValuesIterator(size: number): INumberIterator {
-        return this._paramDef.getExtendedValuesIterator(size);
-    }
-
     /**
      * notification envoyée après la modification de la valeur du paramètre
      */
diff --git a/src/app/formulaire/elements/pb-schema.ts b/src/app/formulaire/elements/pb-schema.ts
index 7ec01a39c..278b7fe39 100644
--- a/src/app/formulaire/elements/pb-schema.ts
+++ b/src/app/formulaire/elements/pb-schema.ts
@@ -11,6 +11,9 @@ import { FormulairePrebarrage } from "../definition/form-prebarrage";
  */
 export class PbSchema extends FormulaireElement {
 
+    /** Stores appropriate number suffix for a given wall uid (related to existingWalls above) */
+    public wallsSuffixes: { [key: string]: number };
+
     public parseConfig(json: {}) {
         this._confId = json["id"];
     }
diff --git a/src/app/results/multidimension-results.ts b/src/app/results/multidimension-results.ts
index 4b2aee2ed..c3669acfd 100644
--- a/src/app/results/multidimension-results.ts
+++ b/src/app/results/multidimension-results.ts
@@ -1,11 +1,12 @@
 import { CalculatedParamResults } from "./param-calc-results";
-import { NgParameter } from "../formulaire/elements/ngparam";
+
+import { VariatedDetails } from "jalhyd";
 
 
 export class MultiDimensionResults extends CalculatedParamResults {
 
     /** paramètres variés */
-    public variatedParameters: NgParameter[];
+    public variatedParameters: VariatedDetails[];
 
     /** index de la valeur du paramètre varié à afficher dans les résultats */
     public variableIndex = 0;
diff --git a/src/app/results/plottable-data.ts b/src/app/results/plottable-data.ts
index 35da1e4d9..bae4f7709 100644
--- a/src/app/results/plottable-data.ts
+++ b/src/app/results/plottable-data.ts
@@ -1,5 +1,7 @@
 import { ChartType } from "./chart-type";
 
+import { ParamDefinition } from "jalhyd";
+
 /**
  * Une interface pour nourrir un ResultsChartComponent
  */
@@ -20,7 +22,7 @@ export interface PlottableData {
      * Returns the translated name of the given symbol (usually a result or child result)
      * if available, with its unit, but without the symbol itself
      */
-    expandLabelFromSymbol(symbol: string): string;
+    expandLabelFromSymbol(p: ParamDefinition): string;
 
     /**
      * Returns a list of plottable parameters / result elements, that can be defined
diff --git a/src/app/results/plottable-macrorugo-compound-results.ts b/src/app/results/plottable-macrorugo-compound-results.ts
index 82601908c..caf34a119 100644
--- a/src/app/results/plottable-macrorugo-compound-results.ts
+++ b/src/app/results/plottable-macrorugo-compound-results.ts
@@ -2,6 +2,8 @@ import { PlottableData } from "./plottable-data";
 import { ChartType } from "./chart-type";
 import { MacrorugoCompoundResults } from "./macrorugo-compound-results";
 
+import { ParamDefinition } from "jalhyd";
+
 export class PlottableMacrorugoCompoundResults implements PlottableData {
 
     public graphType: ChartType = ChartType.Scatter;
@@ -32,8 +34,8 @@ export class PlottableMacrorugoCompoundResults implements PlottableData {
         return this.mrcResults.headers[this.mrcResults.columns.indexOf(symbol)];
     }
 
-    public expandLabelFromSymbol(symbol: string): string {
-        return symbol;
+    public expandLabelFromSymbol(p: ParamDefinition): string {
+        return p.symbol;
     }
 
     /**
diff --git a/src/app/results/plottable-pab-results.ts b/src/app/results/plottable-pab-results.ts
index 0d45afb05..56ee01671 100644
--- a/src/app/results/plottable-pab-results.ts
+++ b/src/app/results/plottable-pab-results.ts
@@ -3,6 +3,8 @@ import { PabResults } from "./pab-results";
 import { ChartType } from "./chart-type";
 import { ServiceFactory } from "../services/service-factory";
 
+import { ParamDefinition } from "jalhyd";
+
 export class PlottablePabResults implements PlottableData {
 
     public graphType: ChartType = ChartType.Scatter;
@@ -37,8 +39,8 @@ export class PlottablePabResults implements PlottableData {
         }
     }
 
-    public expandLabelFromSymbol(symbol: string): string {
-        return symbol;
+    public expandLabelFromSymbol(p: ParamDefinition): string {
+        return p.symbol;
     }
 
     /**
diff --git a/src/app/results/prebarrage-results.ts b/src/app/results/prebarrage-results.ts
index cea988714..fb92d9fb6 100644
--- a/src/app/results/prebarrage-results.ts
+++ b/src/app/results/prebarrage-results.ts
@@ -2,18 +2,29 @@ import { Result } from "jalhyd";
 
 import { ServiceFactory } from "../services/service-factory";
 import { MultiDimensionResults } from "./multidimension-results";
+import { FixedResults } from "./fixed-results";
 
 export class PrebarrageResults extends MultiDimensionResults {
 
     /** résultats des bassins, dans l'ordre */
     public bassinsResults: Result[];
 
+    /** résultat de la cloison actuellement sélectionnée (nourrit le FixedResultsComponent) */
+    public cloisonResults: FixedResults;
+
     /** symboles des colonnes de résultat */
     protected _columns: string[];
 
+    /** size of the longest variating parameter */
+    public size: number;
+
+    /** Stores appropriate number suffix for a given wall uid (copied from PbSchema) */
+    public wallsSuffixes: { [key: string]: number };
+
     public constructor() {
         super();
         this.reset();
+        this.size = 1; // boulette-proufe
         // standard headers
         this._columns = [
             "BASSIN",
@@ -49,6 +60,7 @@ export class PrebarrageResults extends MultiDimensionResults {
     public reset() {
         super.reset();
         this.bassinsResults = [];
+        this.cloisonResults = new FixedResults();
         this.result = undefined;
     }
 
@@ -64,19 +76,26 @@ export class PrebarrageResults extends MultiDimensionResults {
                 }
             }
         }
-        return (this.result && this.result.hasLog());
+        return (this.cloisonResults && this.cloisonResults.result && this.cloisonResults.result.hasLog());
     }
 
-    // do not test result.ok else log messages will prevent partial results from being displayed
     public get hasResults(): boolean {
-        return this.result !== undefined && ! this.result.hasOnlyErrors;
+        return this.hasBasinResults || this.hasWallResults;
+    }
+
+    public get hasBasinResults(): boolean {
+        return this.bassinsResults.length > 0 && this.bassinsResults[0] && ! this.bassinsResults[0].hasOnlyErrors;
+    }
+
+    public get hasWallResults(): boolean {
+        return this.cloisonResults  && this.cloisonResults.result && ! this.cloisonResults.result.hasOnlyErrors;
     }
 
     /** retourne true si au moins un calcul a échoué (le log a un code négatif) */
     public hasError(): boolean {
         let err = false;
         // log principal
-        err = (err || this.result.hasErrorMessages());
+        err = (err || (this.cloisonResults && this.cloisonResults && this.cloisonResults.result.hasErrorMessages()));
         // logs des bassins
         for (const c of this.bassinsResults) {
             err = (err || c.hasErrorMessages());
@@ -87,7 +106,7 @@ export class PrebarrageResults extends MultiDimensionResults {
 
     /** retourne true si le calcul à l'itération i a échoué */
     public iterationHasError(i: number): boolean {
-        let err = this.result.resultElements[i].hasErrorMessages();
+        let err = this.cloisonResults && this.cloisonResults.result && this.cloisonResults.result.resultElements[i].hasErrorMessages();
         // logs des bassins
         for (const c of this.bassinsResults) {
             err = (err || c.resultElements[i].hasErrorMessages());
@@ -100,7 +119,7 @@ export class PrebarrageResults extends MultiDimensionResults {
     public hasOnlyErrors(): boolean {
         let err = true;
         // log principal
-        err = (err && this.result.hasOnlyErrors);
+        err = (err && this.cloisonResults && this.cloisonResults.result && this.cloisonResults.result.hasOnlyErrors);
         // logs des bassins
         for (const c of this.bassinsResults) {
             err = (err && c.hasOnlyErrors);
diff --git a/src/app/results/remous-results.ts b/src/app/results/remous-results.ts
index c6c9e3b8a..dedfd9a6f 100644
--- a/src/app/results/remous-results.ts
+++ b/src/app/results/remous-results.ts
@@ -2,8 +2,8 @@ import { cLog, CourbeRemousParams, Result, ResultElement, ParamDefinition, Param
 
 import { CalculatorResults } from "./calculator-results";
 import { VarResults } from "./var-results";
-import { NgParameter } from "../formulaire/elements/ngparam";
 import { ServiceFactory } from "../services/service-factory";
+import { FormulaireDefinition } from "../formulaire/definition/form-definition";
 
 export class RemousResults extends CalculatorResults {
 
@@ -51,8 +51,12 @@ export class RemousResults extends CalculatorResults {
     /** journal de calcul */
     private _log: cLog;
 
-    constructor() {
+    /** pointer to form that instantiated this object */
+    protected _form: FormulaireDefinition;
+
+    constructor(form?: FormulaireDefinition) {
         super();
+        this._form = form;
         this.reset();
     }
 
@@ -132,8 +136,8 @@ export class RemousResults extends CalculatorResults {
         this._log.clear();
         this._log.addLog(this._result.globalLog);
 
-        this._varResults = new VarResults();
-        this._varResults.variatedParameters = [ new NgParameter(this._xValues, undefined) ];
+        this._varResults = new VarResults(this._form);
+        this._varResults.variatedParameters = [ { param: this._xValues, values: this._xValues.paramValues } ];
         this._varResults.result = this._result;
         const keys = [];
         keys.push("Y"); // ligne d'eau
diff --git a/src/app/results/var-results.ts b/src/app/results/var-results.ts
index 6e73b5d03..918d70845 100644
--- a/src/app/results/var-results.ts
+++ b/src/app/results/var-results.ts
@@ -1,20 +1,19 @@
-import { CalculatorResults } from "./calculator-results";
 import { CalculatedParamResults } from "./param-calc-results";
-import { NgParameter } from "../formulaire/elements/ngparam";
-import { ResultElement, ParamFamily, capitalize, Nub } from "jalhyd";
 import { ServiceFactory } from "../services/service-factory";
 import { PlottableData } from "./plottable-data";
 import { ChartType } from "./chart-type";
+import { longestVarParam } from "../util";
+import { FormulaireDefinition } from "../formulaire/definition/form-definition";
 
 import { sprintf } from "sprintf-js";
 
-import { longestVarNgParam } from "../util";
+import { ResultElement, ParamFamily, capitalize, Nub, VariatedDetails, ParamDefinition, ParamDomain, ParamDomainValue } from "jalhyd";
 
 export class VarResults extends CalculatedParamResults implements PlottableData {
     /**
      * paramètres variés
      */
-    private _variatedParams: NgParameter[];
+    private _variatedParams: VariatedDetails[];
 
     /**
      * titre des colonnes des résultats variés
@@ -36,6 +35,9 @@ export class VarResults extends CalculatedParamResults implements PlottableData
      */
     protected _graphType: ChartType = ChartType.Scatter;
 
+    /** pointer to form that instantiated this object */
+    protected _form: FormulaireDefinition;
+
     /**
      * variated parameter or result displayed as chart's X-axis
      */
@@ -56,8 +58,9 @@ export class VarResults extends CalculatedParamResults implements PlottableData
      */
     private _yValues: number[] = [];
 
-    constructor() {
+    constructor(form?: FormulaireDefinition) {
         super();
+        this._form = form;
         this.reset();
     }
 
@@ -70,11 +73,11 @@ export class VarResults extends CalculatedParamResults implements PlottableData
         this.longest = 0;
     }
 
-    public get variatedParameters(): NgParameter[] {
+    public get variatedParameters(): VariatedDetails[] {
         return this._variatedParams;
     }
 
-    public set variatedParameters(p: NgParameter[]) {
+    public set variatedParameters(p: VariatedDetails[]) {
         this._variatedParams = p;
     }
 
@@ -110,19 +113,19 @@ export class VarResults extends CalculatedParamResults implements PlottableData
         }
         // 2. variated param ?
         for (let i = 0; i < this.variatedParameters.length; i++) {
-            if (this._variatedParams[i].symbol === symbol) {
+            if (this._variatedParams[i].param.symbol === symbol) {
                 return this.variableParamHeaders[i];
             }
         }
         // 3. Result element / child result
-        return this.expandLabelFromSymbol(symbol);
+        return this.expandLabelFromSymbol(new ParamDefinition(undefined, symbol, ParamDomainValue.ANY));
     }
 
     /**
      * Returns the translated name of the given symbol (usually a result or child result) with
      * its unit, but without the symbol itself
      */
-    public expandLabelFromSymbol(symbol: string): string {
+    public expandLabelFromSymbol(p: ParamDefinition): string {
         let ret = "";
         // calculator type for translation
         const sn = this.result.sourceNub;
@@ -131,7 +134,8 @@ export class VarResults extends CalculatedParamResults implements PlottableData
             ct = sn.parent.calcType;
         }
         // detect children results
-        const match = /^([0-9]+)_(.+)$/.exec(symbol);
+        const match = /^([0-9]+)_(.+)$/.exec(p.symbol);
+        let symbol = p.symbol;
         if (match !== null) {
             const pos = +match[1];
             // only parent translation file is loaded; look for children translations in it // ct = sn.getChildren()[pos].calcType;
@@ -160,16 +164,16 @@ export class VarResults extends CalculatedParamResults implements PlottableData
             // are we looking for a child variated param ?
             if (isChildResult !== null) {
                 const children = this.result.sourceNub.getChildren();
-                const parameterNub = vp.paramDefinition.parentNub;
+                const parameterNub = vp.param.parentNub;
                 if (children.includes(parameterNub)) { // current var param is a child param !
                     const pos = parameterNub.findPositionInParent();
-                    isTheGoodChild = (pos === +isChildResult[1] && vp.symbol === isChildResult[2]);
+                    isTheGoodChild = (pos === +isChildResult[1] && vp.param.symbol === isChildResult[2]);
                 }
             }
             // in any case
-            if (isTheGoodChild || vp.symbol === symbol) {
+            if (isTheGoodChild || vp.param.symbol === symbol) {
                 found = true;
-                const iter = vp.getExtendedValuesIterator(this.size);
+                const iter = vp.param.getExtendedValuesIterator(this.size);
                 for (const v of iter) {
                     series.push(v);
                 }
@@ -259,13 +263,13 @@ export class VarResults extends CalculatedParamResults implements PlottableData
         // variating parameters
         for (const v of this._variatedParams) {
             // exclude pseudo-family "ANY"
-            const fam = v.paramDefinition.family;
+            const fam = v.param.family;
             if (fam !== undefined && fam !== ParamFamily.ANY) {
                 const f = ParamFamily[fam];
                 if (! (f in families)) {
                     families[f] = [];
                 }
-                families[f].push(v.symbol);
+                families[f].push(v.param.symbol);
             }
         }
         // results
@@ -309,15 +313,15 @@ export class VarResults extends CalculatedParamResults implements PlottableData
      */
     public getVariatingParametersSymbols(): string[] {
         if (this.result && this.result.sourceNub) {
-            return this._variatedParams.map(vp => this.getVariatingParameterSymbol(vp, this.result.sourceNub));
+            return this._variatedParams.map(vp => this.getVariatingParameterSymbol(vp.param, this.result.sourceNub));
         } else {
             return [];
         }
     }
 
-    public getVariatingParameterSymbol(vp: NgParameter, sourceNub: Nub): string {
+    public getVariatingParameterSymbol(vp: ParamDefinition, sourceNub: Nub): string {
         // detect if variated param is a children param
-        const parameterNub = vp.paramDefinition.parentNub;
+        const parameterNub = vp.parentNub;
         const children = sourceNub.getChildren();
         let symb = vp.symbol;
         if (children.includes(parameterNub)) {
@@ -329,13 +333,13 @@ export class VarResults extends CalculatedParamResults implements PlottableData
     public update() {
         // refresh param headers
         this._variableParamHeaders = this._variatedParams.map((v) => {
-            let h = CalculatorResults.paramLabel(v, true, this.result.sourceNub);
-            h += this.getHelpLink(v.symbol);
+            let h = this.expandLabelFromSymbol(v.param);
+            h += this.getHelpLink(v.param.symbol);
             return h;
         });
 
         // liste la plus longue
-        const lvp = longestVarNgParam(this._variatedParams);
+        const lvp = longestVarParam(this._variatedParams);
         this.size = lvp.size;
         this.longest = lvp.index;
 
@@ -358,7 +362,7 @@ export class VarResults extends CalculatedParamResults implements PlottableData
         }
         this.chartY = defaultY;
         if (this.chartX === undefined || ! this.getAvailableXAxis().includes(this.chartX)) {
-            this.chartX = this.getVariatingParameterSymbol(this.variatedParameters[this.longest], this.result.sourceNub);
+            this.chartX = this.getVariatingParameterSymbol(this.variatedParameters[this.longest].param, this.result.sourceNub);
         }
 
         // calculator type for translation
@@ -405,10 +409,10 @@ export class VarResults extends CalculatedParamResults implements PlottableData
      */
     public resetDefaultAxisIfNeeded() {
         if (! this.getAvailableXAxis().includes(this.chartX)) {
-            this.chartX = this.variatedParameters[0].symbol;
+            this.chartX = this.variatedParameters[0].param.symbol;
         }
         if (! this.getAvailableYAxis().includes(this.chartY)) {
-            this.chartY = this.variatedParameters[0].symbol;
+            this.chartY = this.variatedParameters[0].param.symbol;
         }
     }
 }
diff --git a/src/app/services/formulaire.service.ts b/src/app/services/formulaire.service.ts
index ccd973610..7b494b9dd 100644
--- a/src/app/services/formulaire.service.ts
+++ b/src/app/services/formulaire.service.ts
@@ -203,7 +203,9 @@ export class FormulaireService extends Observable {
         if (idx !== -1) {
             symbolBase = symbolBase.substring(idx + 2);
         }
-        let unit;
+        let unit: string;
+        // unit of a parameter is supposed to be read from JaLHyd ParadDefinition and passed
+        // through "forceUnit"; keys like "UNIT_*" in the config file are for extra results
         if (forceUnit) {
             unit = forceUnit;
         } else {
diff --git a/src/app/services/internationalisation.service.ts b/src/app/services/internationalisation.service.ts
index 4d1dabf05..683f84565 100644
--- a/src/app/services/internationalisation.service.ts
+++ b/src/app/services/internationalisation.service.ts
@@ -240,7 +240,7 @@ export class I18nService extends Observable implements Observer {
 
         // replace MSG_* with the translation of * ; allows
         // to inject any text translation in a message
-        m = m.replace(/MSG_([^ ,;\.]+)/g, (match, p1) => {
+        m = m.replace(/MSG_([^ ,;\.-]+)/g, (match, p1) => {
             return this.localizeText(p1);
         });
 
@@ -305,13 +305,17 @@ export class I18nService extends Observable implements Observer {
     }
 
     /**
-     * Returns the localized name for the children type of the current Nub
+     * Returns the localized name for the children type of the current Nub; "short" and "plural"
+     * options are mutually exclusive
      * @param plural if true, will return plural name
+     * @param short if true, will return short name
      */
-    public childName(nub: Nub, plural: boolean = false) {
+    public childName(nub: Nub, plural: boolean = false, short: boolean = false) {
         const type: string = nub.childrenType;
         let k = "INFO_CHILD_TYPE_" + type.toUpperCase();
-        if (plural) {
+        if (short) {
+            k += "_SHORT";
+        } else if (plural) {
             k += "_PLUR";
         }
         return this.localizeText(k);
diff --git a/src/app/util.ts b/src/app/util.ts
index 48b0981cc..ecb8604a8 100644
--- a/src/app/util.ts
+++ b/src/app/util.ts
@@ -42,27 +42,6 @@ export function decodeHtml(html: string): string {
     return txt.value;
 }
 
-/**
- * Given a list of variated NgParameter, returns the parameter having the most
- * values, its index in the list, and the number of values it contains
- * @param varParams
- */
-export function longestVarNgParam(varParams: NgParameter[]): { param: NgParameter, index: number, size: number } {
-    const variated: VariatedDetails[] = [];
-    for (const vp of varParams) {
-        variated.push({
-            param: vp.paramDefinition,
-            values: vp.paramDefinition.paramValues
-        });
-    }
-    const { param, index, size } = longestVarParam(variated);
-    return {
-        param: varParams[index],
-        index,
-        size
-    };
-}
-
 /**
  * Given a list of variated ParamDefinition, returns the parameter having the most
  * values, its index in the list, and the number of values it contains
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index c2c32a603..8e52e8a9f 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -207,10 +207,13 @@
     "INFO_CHILD_TYPE_CLOISON_PLUR": "walls",
     "INFO_CHILD_TYPE_OUVRAGE": "device",
     "INFO_CHILD_TYPE_OUVRAGE_PLUR": "devices",
+    "INFO_CHILD_TYPE_OUVRAGE_SHORT": "D",
     "INFO_CHILD_TYPE_MACRORUGO": "apron",
     "INFO_CHILD_TYPE_MACRORUGO_PLUR": "aprons",
+    "INFO_CHILD_TYPE_MACRORUGO_SHORT": "A",
     "INFO_CHILD_TYPE_PUISSANCE": "power",
     "INFO_CHILD_TYPE_PUISSANCE_PLUR": "powers",
+    "INFO_CHILD_TYPE_PUISSANCE_SHORT": "P",
     "INFO_DIALOG_PARSIM_DESC": "Choose a combination of values to generate the simulation",
     "INFO_FIELDSET_ADD": "Add",
     "INFO_FIELDSET_COPY": "Copy",
@@ -517,6 +520,8 @@
     "INFO_PARAMFIELD_VARIATED": "Variated",
     "INFO_PARAMMODE_LIST": "Values list",
     "INFO_PARAMMODE_MINMAX": "Min/max",
+    "INFO_PB_BASSIN_DESCRIPTION": "B%order%",
+    "INFO_PB_CLOISON_DESCRIPTION": "%ub%-%db%",
     "INFO_PB_ADD_BASIN": "Add new basin",
     "INFO_PB_ADD_WALL": "Add new wall",
     "INFO_PB_BASSIN_N": "Basin #",
@@ -543,7 +548,7 @@
     "INFO_REMOUS_LARGEUR_BERGE": "Width at embankment level = %B% m",
     "INFO_REMOUS_RESSAUT_DEHORS": "Hydraulic jump detected %sens% abscissa %x% m",
     "INFO_REMOUS_RESSAUT_HYDRO": "Hydraulic jump detected between abscissa %xmin% and %xmax% m",
-    "INFO_REMOUSRESULTS_ABSCISSE": "Abscissa (m)",
+    "INFO_REMOUSRESULTS_ABSCISSE": "Abscissa",
     "INFO_REMOUSRESULTS_BERGE": "Embankment",
     "INFO_REMOUSRESULTS_FOND": "Bottom",
     "INFO_REMOUSRESULTS_TIRANT": "Draft (m)",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 1dd7eb5cd..b15fb7935 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -207,10 +207,13 @@
     "INFO_CHILD_TYPE_CLOISON_PLUR": "cloisons",
     "INFO_CHILD_TYPE_OUVRAGE": "ouvrage",
     "INFO_CHILD_TYPE_OUVRAGE_PLUR": "ouvrages",
+    "INFO_CHILD_TYPE_OUVRAGE_SHORT": "O",
     "INFO_CHILD_TYPE_MACRORUGO": "radier",
     "INFO_CHILD_TYPE_MACRORUGO_PLUR": "radiers",
+    "INFO_CHILD_TYPE_MACRORUGO_SHORT": "R",
     "INFO_CHILD_TYPE_PUISSANCE": "puissance",
     "INFO_CHILD_TYPE_PUISSANCE_PLUR": "puissances",
+    "INFO_CHILD_TYPE_PUISSANCE_SHORT": "P",
     "INFO_DIALOG_PARSIM_DESC": "Choisir une combinaison de valeurs pour générer la simulation",
     "INFO_FIELDSET_ADD": "Ajouter",
     "INFO_FIELDSET_COPY": "Copier",
@@ -518,6 +521,8 @@
     "INFO_PARAMFIELD_VARIATED": "Varié",
     "INFO_PARAMMODE_LIST": "Liste de valeurs",
     "INFO_PARAMMODE_MINMAX": "Min/max",
+    "INFO_PB_BASSIN_DESCRIPTION": "B%order%",
+    "INFO_PB_CLOISON_DESCRIPTION": "%ub%-%db%",
     "INFO_PB_ADD_BASIN": "Ajouter un bassin",
     "INFO_PB_ADD_WALL": "Ajouter une cloison",
     "INFO_PB_BASSIN_N": "Bassin n°",
@@ -544,7 +549,7 @@
     "INFO_REMOUS_LARGEUR_BERGE": "Largeur au niveau des berges = %B% m",
     "INFO_REMOUS_RESSAUT_DEHORS": "Ressaut hydraulique détecté à l'%sens% de l'abscisse %x% m",
     "INFO_REMOUS_RESSAUT_HYDRO": "Ressaut hydraulique détecté entre les abscisses %xmin% et %xmax% m",
-    "INFO_REMOUSRESULTS_ABSCISSE": "Abscisse (m)",
+    "INFO_REMOUSRESULTS_ABSCISSE": "Abscisse",
     "INFO_REMOUSRESULTS_BERGE": "Berge",
     "INFO_REMOUSRESULTS_FOND": "Fond",
     "INFO_REMOUSRESULTS_TIRANT": "Tirant d'eau (m)",
-- 
GitLab


From 03015f72a8f408e380136912234e721d176d08e8 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 16 Jul 2020 11:30:03 +0200
Subject: [PATCH 60/92] PreBarrage: new not-really-fixed results component for
 Cloison

---
 src/app/app.module.ts                         |  2 +
 .../fixed-results.component.ts                | 39 +++++++++--
 .../pb-cloison-results.component.ts           | 35 ++++++++++
 .../pb-results/pb-results-table.component.ts  | 32 ++-------
 .../pb-results/pb-results.component.html      |  2 +-
 .../pb-results/pb-results.component.ts        | 36 ++++------
 .../formulaire/definition/form-definition.ts  | 64 +++++-------------
 .../formulaire/definition/form-fixedvar.ts    |  8 +--
 .../formulaire/definition/form-prebarrage.ts  | 66 ++++++++-----------
 src/app/results/multidimension-results.ts     | 11 +++-
 src/app/results/pb-cloison-results.ts         | 11 ++++
 src/app/results/prebarrage-results.ts         | 19 +++++-
 src/app/util.ts                               | 22 ++++++-
 src/styles.scss                               |  2 +-
 14 files changed, 196 insertions(+), 153 deletions(-)
 create mode 100644 src/app/components/pb-results/pb-cloison-results.component.ts
 create mode 100644 src/app/results/pb-cloison-results.ts

diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index d9b61bed6..77599ae82 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -89,6 +89,7 @@ import { ParamLinkComponent } from "./components/param-link/param-link.component
 import { PabProfileChartComponent } from "./components/pab-profile-chart/pab-profile-chart.component";
 import { PabTableComponent } from "./components/pab-table/pab-table.component";
 import { PbSchemaComponent } from "./components/pb-schema/pb-schema.component";
+import { PbCloisonResultsComponent } from "./components/pb-results/pb-cloison-results.component";
 import { VariableResultsSelectorComponent } from "./components/variable-results-selector/variable-results-selector.component";
 import { QuicknavComponent } from "./components/quicknav/quicknav.component";
 import { ModulesDiagramComponent } from "./components/modules-diagram/modules-diagram.component";
@@ -227,6 +228,7 @@ const appRoutes: Routes = [
     PabResultsTableComponent,
     PabTableComponent,
     PbResultsComponent,
+    PbCloisonResultsComponent,
     PbResultsTableComponent,
     PbSchemaComponent,
     VariableResultsSelectorComponent,
diff --git a/src/app/components/fixedvar-results/fixed-results.component.ts b/src/app/components/fixedvar-results/fixed-results.component.ts
index 7607bb47e..2f0a18213 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.ts
+++ b/src/app/components/fixedvar-results/fixed-results.component.ts
@@ -1,12 +1,11 @@
 import { Component, ViewChild, ElementRef } from "@angular/core";
 
 import { FixedResults } from "../../results/fixed-results";
-import { NgParameter } from "../../formulaire/elements/ngparam";
-import { CalculatorResults } from "../../results/calculator-results";
 import { I18nService } from "../../services/internationalisation.service";
 import { FormulaireService } from "../../services/formulaire.service";
 import { ResultsComponentDirective } from "./results.component";
 import { AppComponent } from "../../app.component";
+import { NgParameter } from "../../formulaire/elements/ngparam";
 
 import { capitalize } from "jalhyd";
 
@@ -20,8 +19,9 @@ import { sprintf } from "sprintf-js";
     ]
 })
 export class FixedResultsComponent extends ResultsComponentDirective {
+
     /** résultats non mis en forme */
-    private _fixedResults: FixedResults;
+    protected _fixedResults: FixedResults;
 
     @ViewChild("tableContainer")
     table: ElementRef;
@@ -86,6 +86,29 @@ export class FixedResultsComponent extends ResultsComponentDirective {
     protected buildCustomOrderedDataset() {
         const data = [];
         let resultFound: boolean;
+        for (const symbol of this._fixedResults.variablesOrder) {
+
+            // is it a fixed parameter ?
+            for (const fp of this.fixedParams) {
+                if (fp.symbol === symbol) {
+                    let label = this.formattedLabel(fp);
+                    const nub = fp.paramDefinition.parentNub;
+                    // add child type and position before label
+                    if (nub && nub.parent && nub.parent.childrenType) {
+                        const pos = nub.findPositionInParent();
+                        // label = this.intlService.localizeText("INFO_OUVRAGE") + " n°" + (pos + 1) + ": " + label;
+                        const cn = capitalize(this.intlService.childName(nub.parent));
+                        label = sprintf(this.intlService.localizeText("INFO_STUFF_N"), cn)
+                            + (pos + 1) + ": " + label;
+                    }
+                    label += this._fixedResults.getHelpLink(symbol);
+                    data.push({
+                        label: label,
+                        value: this.getFixedParamValue(fp),
+                        isCalcResult: false // for CSS
+                    });
+                }
+            }
 
         for (const symbol of this._fixedResults.variablesOrder) {
             resultFound = false;
@@ -206,7 +229,7 @@ export class FixedResultsComponent extends ResultsComponentDirective {
             label += this._fixedResults.getHelpLink(fp.symbol);
             data.push({
                 label: label,
-                value: this.formattedValue(fp),
+                value: this.getFixedParamValue(fp),
                 isCalcResult: false // for CSS
             });
         }
@@ -272,6 +295,14 @@ export class FixedResultsComponent extends ResultsComponentDirective {
         return data;
     }
 
+    /**
+     * Retourne la valeur du paramètre fixe; redéfini
+     * dans PbCloisonResultsComponent notamment
+     */
+    protected getFixedParamValue(fp: NgParameter): string {
+        return this.formattedValue(fp);
+    }
+
     public exportAsSpreadsheet() {
         AppComponent.exportAsSpreadsheet(this.table.nativeElement, true);
     }
diff --git a/src/app/components/pb-results/pb-cloison-results.component.ts b/src/app/components/pb-results/pb-cloison-results.component.ts
new file mode 100644
index 000000000..404680865
--- /dev/null
+++ b/src/app/components/pb-results/pb-cloison-results.component.ts
@@ -0,0 +1,35 @@
+import { Component } from "@angular/core";
+
+import { FixedResultsComponent } from "../fixedvar-results/fixed-results.component";
+import { NgParameter } from "../../formulaire/elements/ngparam";
+import { getIthValue } from "../../util";
+import { PbCloisonResults } from "../../results/pb-cloison-results";
+
+@Component({
+    selector: "pb-cloison-results",
+    templateUrl: "../fixedvar-results/fixed-results.component.html",
+    styleUrls: [
+        "../fixedvar-results/fixed-results.component.scss"
+    ]
+})
+export class PbCloisonResultsComponent extends FixedResultsComponent {
+
+    public set results(r: PbCloisonResults) {
+        this._fixedResults = r;
+    }
+
+    public get results(): PbCloisonResults {
+        return this._fixedResults as PbCloisonResults;
+    }
+
+    /** Retourne la valeur du paramètre fixe… qui n'en est pas forcément un ici ! */
+    protected getFixedParamValue(fp: NgParameter): string {
+        let val: string;
+        if (fp.paramDefinition.hasMultipleValues) {
+            val = getIthValue(fp.paramDefinition, this.results.variableIndex, this.results.size);
+        } else {
+            val = this.formattedValue(fp.getValue());
+        }
+        return val;
+    }
+}
diff --git a/src/app/components/pb-results/pb-results-table.component.ts b/src/app/components/pb-results/pb-results-table.component.ts
index c064fabb9..925eab960 100644
--- a/src/app/components/pb-results/pb-results-table.component.ts
+++ b/src/app/components/pb-results/pb-results-table.component.ts
@@ -1,11 +1,11 @@
 import { Component, ViewChild, ElementRef } from "@angular/core";
 
-import { PreBarrage, PbBassin, ParamDefinition, ParamValueMode } from "jalhyd";
+import { PreBarrage, PbBassin } from "jalhyd";
 
 import { I18nService } from "../../services/internationalisation.service";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 import { AppComponent } from "../../app.component";
-import { fv } from "../../util";
+import { fv, getIthValue } from "../../util";
 import { PrebarrageResults } from "../../results/prebarrage-results";
 
 @Component({
@@ -35,26 +35,6 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
         super();
     }
 
-    /**
-     * Returns value at index i for parameter p, whether it is variating
-     * or not, calculated or not
-     * @param p parameter
-     * @param i index
-     */
-    protected getIthValue(p: ParamDefinition, i: number, extendTo: number): string {
-        let value: number;
-        if (p.hasMultipleValues) {
-            if (p.valueMode === ParamValueMode.CALCUL) {
-                value = p.parentNub.result.resultElements[i].vCalc;
-            } else {
-                value = p.getInferredValuesList(extendTo)[i];
-            }
-        } else {
-            value = p.V;
-        }
-        return fv(value);
-    }
-
     public set results(r: PrebarrageResults) {
         this._pbResults = r;
 
@@ -81,9 +61,9 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
                 this._dataSet.push([
                     this.intlService.localizeText("INFO_LIB_AMONT"),
                     "", "",
-                    this.getIthValue(pb.prms.Z1, vi, this._pbResults.size),
+                    getIthValue(pb.prms.Z1, vi, this._pbResults.size),
                     "", "",
-                    this.getIthValue(pb.prms.Q, vi, this._pbResults.size),
+                    getIthValue(pb.prms.Q, vi, this._pbResults.size),
                 ]);
             }
 
@@ -111,9 +91,9 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
                 this._dataSet.push([
                     this.intlService.localizeText("INFO_LIB_AVAL"),
                     "", "",
-                    this.getIthValue(pb.prms.Z2, vi, this._pbResults.size),
+                    getIthValue(pb.prms.Z2, vi, this._pbResults.size),
                     "", "",
-                    this.getIthValue(pb.prms.Q, vi, this._pbResults.size),
+                    getIthValue(pb.prms.Q, vi, this._pbResults.size),
                 ]);
             }
         }
diff --git a/src/app/components/pb-results/pb-results.component.html b/src/app/components/pb-results/pb-results.component.html
index a4a603342..80a7d4501 100644
--- a/src/app/components/pb-results/pb-results.component.html
+++ b/src/app/components/pb-results/pb-results.component.html
@@ -10,7 +10,7 @@
     <pb-results-table *ngIf="hasBasinResults" [results]="pbResults"></pb-results-table>
 
     <!-- table des résultats fixés -->
-    <fixed-results *ngIf="hasWallResults" [results]="pbResults.cloisonResults"></fixed-results>
+    <pb-cloison-results *ngIf="hasWallResults" [results]="pbResults.cloisonResults"></pb-cloison-results>
 
     <!-- <quicknav *ngIf="hasDisplayableResults" [items]="[ 'input', 'results', 'charts' ]"
         [currentItem]="'charts'" [align]="'left'"></quicknav> -->
diff --git a/src/app/components/pb-results/pb-results.component.ts b/src/app/components/pb-results/pb-results.component.ts
index 6623a32ac..0362c6b8b 100644
--- a/src/app/components/pb-results/pb-results.component.ts
+++ b/src/app/components/pb-results/pb-results.component.ts
@@ -6,7 +6,7 @@ import { PbResultsTableComponent } from "./pb-results-table.component";
 import { PrebarrageResults } from "../../results/prebarrage-results";
 import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
 import { I18nService } from "../../services/internationalisation.service";
-import { FixedResultsComponent } from "../fixedvar-results/fixed-results.component";
+import { PbCloisonResultsComponent } from "./pb-cloison-results.component";
 import { FixedResults } from "../../results/fixed-results";
 
 import { Result } from "jalhyd";
@@ -32,8 +32,8 @@ export class PbResultsComponent implements DoCheck {
     @ViewChild(VariableResultsSelectorComponent)
     private variableResultsSelectorComponent: VariableResultsSelectorComponent;
 
-    @ViewChild(FixedResultsComponent)
-    private fixedResultsComponent: FixedResultsComponent;
+    @ViewChild(PbCloisonResultsComponent)
+    private pbCloisonResultsComponent: PbCloisonResultsComponent;
 
     @ViewChild("generalLog")
     private generalLogComponent: LogComponent;
@@ -79,8 +79,8 @@ export class PbResultsComponent implements DoCheck {
 
     /**
      * update results table and chart when the variable index changed (event sent by
-     * PabVariableResultsSelectorComponent); variable index is already set in
-     * pabResults at this time
+     * VariableResultsSelectorComponent); variable index is already set in
+     * pbResults at this time
      */
     public variableIndexChanged() {
         this.updateView();
@@ -99,8 +99,8 @@ export class PbResultsComponent implements DoCheck {
         if (this.variableResultsSelectorComponent) {
             this.variableResultsSelectorComponent.results = undefined;
         }
-        if (this.fixedResultsComponent) {
-            this.fixedResultsComponent.results = undefined;
+        if (this.pbCloisonResultsComponent) {
+            this.pbCloisonResultsComponent.results = undefined;
         }
         /* if (this.profileChartComponent) {
             this.profileChartComponent.results = undefined;
@@ -286,7 +286,7 @@ export class PbResultsComponent implements DoCheck {
         let pbTableUpdated: boolean;
         let profileChartUpdated: boolean;
         let selectorUpdated: boolean;
-        let fixedResultsUpdated: boolean;
+        let cloisonResultsUpdated: boolean;
 
         // results or not, there might be a log
         const logUpdated = (this.iterationLogComponent !== undefined || this.generalLogComponent !== undefined); // gne ?
@@ -320,25 +320,15 @@ export class PbResultsComponent implements DoCheck {
             profileChartUpdated = true;
         }
         if (this.hasWallResults) {
-            fixedResultsUpdated = this.fixedResultsComponent !== undefined;
-            if (fixedResultsUpdated) {
-                // trick to show only the result of a given iteration, without
-                // modifying FixedResultsComponent
-                const iterationResult = new FixedResults();
-                for (const fp of this._pbResults.cloisonResults.fixedParameters) {
-                    iterationResult.addFixedParameter(fp);
-                }
-                iterationResult.result = new Result(
-                    this._pbResults.cloisonResults.result.resultElements[this._pbResults.variableIndex],
-                    this._pbResults.cloisonResults.result.sourceNub
-                );
-                this.fixedResultsComponent.results = iterationResult;
+            cloisonResultsUpdated = this.pbCloisonResultsComponent !== undefined;
+            if (cloisonResultsUpdated) {
+                this.pbCloisonResultsComponent.results = this._pbResults.cloisonResults;
             }
         } else {
-            fixedResultsUpdated = true;
+            cloisonResultsUpdated = true;
         }
 
-        return pbTableUpdated && logUpdated && profileChartUpdated && selectorUpdated && fixedResultsUpdated;
+        return pbTableUpdated && logUpdated && profileChartUpdated && selectorUpdated && cloisonResultsUpdated;
     }
 
     public get uitextGeneralLogTitle(): string {
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 424c4cf41..e70898a3a 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -13,12 +13,11 @@ import {
 } from "jalhyd";
 
 import { FormulaireElement } from "../elements/formulaire-element";
-import { NgParameter, ParamRadioConfig } from "../elements/ngparam";
+import { NgParameter } from "../elements/ngparam";
 import { Field } from "../elements/field";
 import { FormulaireNode } from "../elements/formulaire-node";
 import { FieldSet } from "../elements/fieldset";
 import { FieldsetContainer } from "../elements/fieldset-container";
-import { SelectField } from "../elements/select-field";
 import { DeepFieldsetIterator } from "../form-iterator/deep-fieldset-iterator";
 import { TopFormulaireElementIterator } from "../form-iterator/top-element-iterator";
 import { CalculatorResults } from "../../results/calculator-results";
@@ -296,6 +295,11 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         return false;
     }
 
+    /**
+     * Trouve le Ngparameter correspondant au symbole "symbol", parmi tous les
+     * éléments du formulaire
+     * @param symbol string
+     */
     public getParamFromSymbol(symbol: string): NgParameter {
         for (const p of this.allFormElements) {
             if (p instanceof NgParameter) {
@@ -306,26 +310,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         }
     }
 
-    public getDisplayedParamFromState(st: ParamRadioConfig): NgParameter {
-        for (const p of this.allFormElements) {
-            if (p.isDisplayed && p instanceof NgParameter) {
-                if (p.radioState === st) {
-                    return p;
-                }
-            }
-        }
-    }
-
-    public getDisplayedParamListFromState(st: ParamRadioConfig): NgParameter[] {
-        const res = [];
-        for (const p of this.allFormElements) {
-            if (p.isDisplayed && p instanceof NgParameter && p.radioState === st) {
-                res.push(p);
-            }
-        }
-        return res;
-    }
-
     public getFieldById(id: string): Field {
         const res = this.getFormulaireNodeById(id);
         if (res instanceof Field) {
@@ -333,31 +317,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         }
     }
 
-    public getFieldsetById(id: string): FieldSet {
-        const res = this.getFormulaireNodeById(id);
-        if (res instanceof FieldSet) {
-            return res;
-        }
-    }
-
-    public getParameterValue(symbol: string): number {
-        for (const fs of this.allFieldsets) {
-            const p = fs.getNodeParameter(symbol);
-            if (p !== undefined) {
-                switch (p.radioState) {
-                    case ParamRadioConfig.FIX:
-                        return p.getValue();
-
-                    case ParamRadioConfig.VAR:
-                    case ParamRadioConfig.CAL:
-                        return undefined;
-                }
-            }
-        }
-
-        throw new Error(`Formulaire.getNodeParameterValue() : pas de paramètre ${symbol} trouvé`);
-    }
-
     protected notifyReset() {
         this.notifyObservers({
             "action": "resetForm"
@@ -523,6 +482,17 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         return this._currentNub.findVariatedParams();
     }
 
+    /** find fixed (possibly linked) parameters from the given Nub */
+    public getFixedParameters(): NgParameter[] {
+        const fixedParams: ParamDefinition[] = this._currentNub.findFixedParams();
+        let fnp: NgParameter[] = [];
+        for (const fp of fixedParams) {
+            fnp.push(this.getParamFromSymbol(fp.symbol));
+        }
+        fnp = fnp.filter((e) => e !== undefined);
+        return fnp;
+    }
+
     /**
      * Triggers computation of the Nub, updates form results
      */
diff --git a/src/app/formulaire/definition/form-fixedvar.ts b/src/app/formulaire/definition/form-fixedvar.ts
index a23e5a623..acd265fa2 100644
--- a/src/app/formulaire/definition/form-fixedvar.ts
+++ b/src/app/formulaire/definition/form-fixedvar.ts
@@ -45,15 +45,9 @@ export class FormulaireFixedVar extends FormulaireDefinition {
     }
 
     public addFixedParameters() {
-        for (const p of this.getDisplayedParamListFromState(ParamRadioConfig.FIX)) {
+        for (const p of this.getFixedParameters()) {
             this._fixedResults.addFixedParameter(p);
         }
-
-        for (const p of this.getDisplayedParamListFromState(ParamRadioConfig.LINK)) {
-            if (!p.paramDefinition.hasMultipleValues) {
-                this._fixedResults.addFixedParameter(p);
-            }
-        }
     }
 
     public set graphType(t: ChartType) {
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 43f7900af..f6bc246a7 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -1,4 +1,4 @@
-import { CalculatorType, PbBassin, PbCloison, IObservable, PreBarrage, VariatedDetails, ParamDefinition, ParamDomainValue } from "jalhyd";
+import { CalculatorType, PbBassin, PbCloison, IObservable, PreBarrage, VariatedDetails } from "jalhyd";
 
 import { FormulaireFixedVar } from "./form-fixedvar";
 import { PbSchema } from "../elements/pb-schema";
@@ -8,7 +8,7 @@ import { FormulairePbCloison } from "./form-pb-cloison";
 import { FieldsetContainer } from "../elements/fieldset-container";
 import { CalculatorResults } from "../../results/calculator-results";
 import { PrebarrageResults } from "../../results/prebarrage-results";
-import { NgParameter, ParamRadioConfig } from "../elements/ngparam";
+import { NgParameter } from "../elements/ngparam";
 import { longestVarParam } from "../../util";
 
 /**
@@ -25,6 +25,9 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     /** configuration for re-creating basin form every time needed */
     private basinFormConfig: string;
 
+    /** child form for walls */
+    private wallForm: FormulairePbCloison;
+
     /** configuration for re-creating wall form every time needed */
     private wallFormConfig: string;
 
@@ -138,18 +141,18 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.showFormElements(this.basinForm);
 
         } else if (node instanceof PbCloison) {
-            const wallForm = new FormulairePbCloison(this);
-            wallForm.defaultProperties["calcType"] = CalculatorType.PbCloison;
-            wallForm.currentNub = node;
-            wallForm.preparseConfig(this.wallFormConfig);
-            wallForm.parseConfig(this.wallFormConfig);
+            this.wallForm = new FormulairePbCloison(this);
+            this.wallForm.defaultProperties["calcType"] = CalculatorType.PbCloison;
+            this.wallForm.currentNub = node;
+            this.wallForm.preparseConfig(this.wallFormConfig);
+            this.wallForm.parseConfig(this.wallFormConfig);
             // subscribe to upstream/downstream basin change
-            wallForm.addObserver(this); // @TODO why not this.form ? wallForm is just a dummy form to extract elements from…
-            ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(wallForm);
+            this.wallForm.addObserver(this); // @TODO why not this.form ? wallForm is just a dummy form to extract elements from…
+            ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(this.wallForm);
             // add fieldsets for existing Structures
             if (node.structures.length > 0) {
                 for (const struct of node.structures) {
-                    for (const e of wallForm.allFormElements) {
+                    for (const e of this.wallForm.allFormElements) {
                         if (e instanceof FieldsetContainer) { // @TODO manage many containers one day ?
                             e.addFromTemplate(0, undefined, struct, { resetResults: false });
                         }
@@ -157,14 +160,14 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
                 }
             } else {
                 // if there was no existing structure, add a default one
-                for (const e of wallForm.allFormElements) {
+                for (const e of this.wallForm.allFormElements) {
                     if (e instanceof FieldsetContainer) {
                         e.addFromTemplate(0, undefined, undefined, { resetResults: false });
                         break;
                     }
                 }
             }
-            this.showFormElements(wallForm);
+            this.showFormElements(this.wallForm);
         }
         this.reaffectResultComponents();
     }
@@ -222,6 +225,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.pbResults.variatedParameters = varParams;
             const lvp = longestVarParam(this._pbResults.variatedParameters);
             this._pbResults.size = lvp.size;
+            this._pbResults.cloisonResults.size = lvp.size;
         }
 
         // résultats selon l'objet sélectionné sur le schéma
@@ -231,30 +235,19 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             if (computedParam !== undefined) {
                 this.pbResults.cloisonResults.calculatedParameter = computedParam;
             }
-            // transmission des suffixes de cloisons calculés par l'algo de tri de PbSchemaComponent,
-            // pour le sélecteur de conditions limites
-        const pbs = this.kids[0] as PbSchema;
-            this.pbResults.wallsSuffixes = pbs.wallsSuffixes;
-            // astuce clodo : si un paramètre d'un ouvrage de cette cloison varie, on
-            // l'ajoute sous forme de faux paramètre fixe
-            /* for (const s of this._selectedItem.structures) {
+            // if some parameter is variating, add id too (trick with PbResultsComponent
+            for (const s of this._selectedItem.structures) {
                 for (const p of s.parameterIterator) {
                     if (p.hasMultipleValues) {
-                        this._pbResults.cloisonResults.addFixedParameter(
-                            new NgParameter(
-                                new ParamDefinition(
-                                    undefined,
-                                    p.symbol,
-                                    ParamDomainValue.ANY,
-                                    p.unit,
-                                    p.getInferredValuesList(this.pbResults.size)[this.pbResults.variableIndex]
-                                ),
-                                this
-                            )
-                        );
+                        const ngp = this.getParamFromSymbol(p.symbol);
+                        this._pbResults.cloisonResults.addFixedParameter(ngp);
                     }
                 }
-            } */
+            }
+            // transmission des suffixes de cloisons calculés par l'algo de tri de PbSchemaComponent,
+            // pour le sélecteur de conditions limites
+            const pbs = this.kids[0] as PbSchema;
+            this.pbResults.wallsSuffixes = pbs.wallsSuffixes;
         } else {
             // afficher les résultats des bassins
             // résultat général du Nub (amont, aval, débit)
@@ -268,13 +261,8 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     }
 
     public addFixedParameters() {
-        // @TODO lire dans le modèle !
-        for (const p of this.getDisplayedParamListFromState(ParamRadioConfig.FIX)) {
-            this._pbResults.cloisonResults.addFixedParameter(p);
-        }
-
-        for (const p of this.getDisplayedParamListFromState(ParamRadioConfig.LINK)) {
-            if (!p.paramDefinition.hasMultipleValues) {
+        if (this.wallForm !== undefined) {
+            for (const p of this.wallForm.getFixedParameters()) {
                 this._pbResults.cloisonResults.addFixedParameter(p);
             }
         }
diff --git a/src/app/results/multidimension-results.ts b/src/app/results/multidimension-results.ts
index c3669acfd..44967427c 100644
--- a/src/app/results/multidimension-results.ts
+++ b/src/app/results/multidimension-results.ts
@@ -9,5 +9,14 @@ export class MultiDimensionResults extends CalculatedParamResults {
     public variatedParameters: VariatedDetails[];
 
     /** index de la valeur du paramètre varié à afficher dans les résultats */
-    public variableIndex = 0;
+    protected _variableIndex = 0;
+
+    public get variableIndex(): number {
+        return this._variableIndex;
+    }
+
+    /** redéfini par PrebarrageResults notamment */
+    public set variableIndex(v: number) {
+        this._variableIndex = v;
+    }
 }
diff --git a/src/app/results/pb-cloison-results.ts b/src/app/results/pb-cloison-results.ts
new file mode 100644
index 000000000..44524dfac
--- /dev/null
+++ b/src/app/results/pb-cloison-results.ts
@@ -0,0 +1,11 @@
+import { FixedResults } from "./fixed-results";
+
+/** Fixed results, that are not really fixed (trick for PreBarrage) */
+export class PbCloisonResults extends FixedResults {
+
+    /** index de la valeur du paramètre varié à afficher dans les résultats */
+    public variableIndex = 0;
+
+    /** size of the longest variating parameter */
+    public size = 1;
+}
diff --git a/src/app/results/prebarrage-results.ts b/src/app/results/prebarrage-results.ts
index fb92d9fb6..301b8248c 100644
--- a/src/app/results/prebarrage-results.ts
+++ b/src/app/results/prebarrage-results.ts
@@ -2,7 +2,7 @@ import { Result } from "jalhyd";
 
 import { ServiceFactory } from "../services/service-factory";
 import { MultiDimensionResults } from "./multidimension-results";
-import { FixedResults } from "./fixed-results";
+import { PbCloisonResults } from "./pb-cloison-results";
 
 export class PrebarrageResults extends MultiDimensionResults {
 
@@ -10,7 +10,7 @@ export class PrebarrageResults extends MultiDimensionResults {
     public bassinsResults: Result[];
 
     /** résultat de la cloison actuellement sélectionnée (nourrit le FixedResultsComponent) */
-    public cloisonResults: FixedResults;
+    public cloisonResults: PbCloisonResults;
 
     /** symboles des colonnes de résultat */
     protected _columns: string[];
@@ -57,10 +57,23 @@ export class PrebarrageResults extends MultiDimensionResults {
         });
     }
 
+    // redéfinir le set() implique de redéfinir le get(), sinon /i
+    public get variableIndex(): number {
+        return this._variableIndex;
+    }
+
+    public set variableIndex(v: number) {
+        this._variableIndex = v;
+        // set index in pseudo-fixed Cloison results too
+        this.cloisonResults.variableIndex = v;
+    }
+
     public reset() {
         super.reset();
         this.bassinsResults = [];
-        this.cloisonResults = new FixedResults();
+        this.cloisonResults = new PbCloisonResults();
+        this.cloisonResults.variableIndex = this._variableIndex;
+        this.cloisonResults.size = this.size;
         this.result = undefined;
     }
 
diff --git a/src/app/util.ts b/src/app/util.ts
index ecb8604a8..74d0f3329 100644
--- a/src/app/util.ts
+++ b/src/app/util.ts
@@ -1,7 +1,7 @@
 import { NgParameter } from "./formulaire/elements/ngparam";
 import { ServiceFactory } from "./services/service-factory";
 
-import { formattedValue, Nub, VariatedDetails, ParamDefinition } from "jalhyd";
+import { formattedValue, Nub, VariatedDetails, ParamDefinition, ParamValueMode } from "jalhyd";
 
 export function logObject(obj: {}, m?: string) {
     // évite le message "Value below was evaluated just now" dans le debugger de Chrome
@@ -31,6 +31,26 @@ export function fv(p: NgParameter | number): string {
     return formattedValue(value, nDigits);
 }
 
+/**
+ * Returns value at index i for parameter p, whether it is variating
+ * or not, calculated or not
+ * @param p parameter
+ * @param i index
+ */
+export function getIthValue(p: ParamDefinition, i: number, extendTo: number): string {
+    let value: number;
+    if (p.hasMultipleValues) {
+        if (p.valueMode === ParamValueMode.CALCUL) {
+            value = p.parentNub.result.resultElements[i].vCalc;
+        } else {
+            value = p.getInferredValuesList(extendTo)[i];
+        }
+    } else {
+        value = p.V;
+    }
+    return fv(value);
+}
+
 /**
  * Trick to decode HTML entities in a string
  * https://stackoverflow.com/a/7394787/5986614
diff --git a/src/styles.scss b/src/styles.scss
index 11ffd2a86..4f086079e 100644
--- a/src/styles.scss
+++ b/src/styles.scss
@@ -365,7 +365,7 @@ var-results {
     }
 }
 
-fixed-results {
+fixed-results, pb-cloison-results {
 
     table.mat-table {
 
-- 
GitLab


From f4dbed72dd4f94564e4d8ea5281c0feff52566f6 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 16 Jul 2020 14:14:38 +0200
Subject: [PATCH 61/92] PreBarrage: enhance Cloison results

---
 .../fixed-results.component.ts                | 34 ++++++++++++-------
 .../pb-cloison-results.component.ts           |  7 ++++
 src/app/results/prebarrage-results.ts         |  2 +-
 3 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/src/app/components/fixedvar-results/fixed-results.component.ts b/src/app/components/fixedvar-results/fixed-results.component.ts
index 2f0a18213..30de6df58 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.ts
+++ b/src/app/components/fixedvar-results/fixed-results.component.ts
@@ -7,7 +7,7 @@ import { ResultsComponentDirective } from "./results.component";
 import { AppComponent } from "../../app.component";
 import { NgParameter } from "../../formulaire/elements/ngparam";
 
-import { capitalize } from "jalhyd";
+import { capitalize, Result, ResultElement } from "jalhyd";
 
 import { sprintf } from "sprintf-js";
 
@@ -117,17 +117,17 @@ export class FixedResultsComponent extends ResultsComponentDirective {
             if (
                 res
                 && res.resultElements.length > 0
-                && res.resultElement
-                && res.resultElement.count() > 0
+                && this.getResultElement(res)
+                && this.getResultElement(res).count() > 0
             ) {
                 const sn = this._fixedResults.result.sourceNub;
                 let found = false;
 
                 // 2.1 all results
-                for (const k of res.resultElement.keys) {
+                for (const k of this.getResultElement(res).keys) {
                     if (k === symbol) {
                         found = true;
-                        const er: number = res.resultElement.getValue(k);
+                        const er: number = this.getResultElement(res).getValue(k);
                         // calculator type for translation
                         let ct = sn.calcType;
                         if (sn.parent) {
@@ -156,10 +156,10 @@ export class FixedResultsComponent extends ResultsComponentDirective {
                 if (! found) {
                     for (const c of sn.getChildren()) {
                         if (c.result) {
-                            for (const k of c.result.resultElement.keys) {
+                            for (const k of this.getResultElement(c.result).keys) {
                                 if (k === symbol) {
                                     resultFound = true;
-                                    const er: number = c.result.resultElement.getValue(k);
+                                    const er: number = this.getResultElement(c.result).getValue(k);
                                     // calculator type for translation
                                     let ct = sn.calcType;
                                     if (sn.parent) {
@@ -238,14 +238,14 @@ export class FixedResultsComponent extends ResultsComponentDirective {
         if (
             res
             && res.resultElements.length > 0
-            && res.resultElement
-            && res.resultElement.count() > 0
+            && this.getResultElement(res)
+            && this.getResultElement(res).count() > 0
         ) {
             const sn = this._fixedResults.result.sourceNub;
 
             // 2.1 all results
-            for (const k of res.resultElement.keys) {
-                const er: number = res.resultElement.getValue(k);
+            for (const k of this.getResultElement(res).keys) {
+                const er: number = this.getResultElement(res).getValue(k);
                 // calculator type for translation
                 let ct = sn.calcType;
                 if (sn.parent) {
@@ -271,8 +271,8 @@ export class FixedResultsComponent extends ResultsComponentDirective {
             // 2.2. children results
             for (const c of sn.getChildren()) {
                 if (c.result) {
-                    for (const k of c.result.resultElement.keys) {
-                        const er: number = c.result.resultElement.getValue(k);
+                    for (const k of this.getResultElement(c.result).keys) {
+                        const er: number = this.getResultElement(c.result).getValue(k);
                         // calculator type for translation
                         let ct = sn.calcType;
                         if (sn.parent) {
@@ -303,6 +303,14 @@ export class FixedResultsComponent extends ResultsComponentDirective {
         return this.formattedValue(fp);
     }
 
+    /**
+     * Retourne l'élément de résultat en cours pour le résultat donné;
+     * redéfini dans PbCloisonResultsComponent notamment
+     */
+    protected getResultElement(r: Result): ResultElement {
+        return r.resultElement;
+    }
+
     public exportAsSpreadsheet() {
         AppComponent.exportAsSpreadsheet(this.table.nativeElement, true);
     }
diff --git a/src/app/components/pb-results/pb-cloison-results.component.ts b/src/app/components/pb-results/pb-cloison-results.component.ts
index 404680865..0d2fe30cc 100644
--- a/src/app/components/pb-results/pb-cloison-results.component.ts
+++ b/src/app/components/pb-results/pb-cloison-results.component.ts
@@ -5,6 +5,8 @@ import { NgParameter } from "../../formulaire/elements/ngparam";
 import { getIthValue } from "../../util";
 import { PbCloisonResults } from "../../results/pb-cloison-results";
 
+import { Result, ResultElement } from "jalhyd";
+
 @Component({
     selector: "pb-cloison-results",
     templateUrl: "../fixedvar-results/fixed-results.component.html",
@@ -32,4 +34,9 @@ export class PbCloisonResultsComponent extends FixedResultsComponent {
         }
         return val;
     }
+
+    /** Retourne l'élément de résultat en cours, en fonction de l'index variable */
+    protected getResultElement(r: Result): ResultElement {
+        return r.resultElements[this.results.variableIndex];
+    }
 }
diff --git a/src/app/results/prebarrage-results.ts b/src/app/results/prebarrage-results.ts
index 301b8248c..36ad3f189 100644
--- a/src/app/results/prebarrage-results.ts
+++ b/src/app/results/prebarrage-results.ts
@@ -19,7 +19,7 @@ export class PrebarrageResults extends MultiDimensionResults {
     public size: number;
 
     /** Stores appropriate number suffix for a given wall uid (copied from PbSchema) */
-    public wallsSuffixes: { [key: string]: number };
+    public wallsSuffixes: { [key: string]: number } = {};
 
     public constructor() {
         super();
-- 
GitLab


From e686923a67222e51a6873037b51170913c636027 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 16 Jul 2020 14:14:58 +0200
Subject: [PATCH 62/92] e2e: add new tested calc types

---
 e2e/tested_calctypes.ts | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/e2e/tested_calctypes.ts b/e2e/tested_calctypes.ts
index e4eed0389..49b141aac 100644
--- a/e2e/tested_calctypes.ts
+++ b/e2e/tested_calctypes.ts
@@ -9,5 +9,6 @@ export const testedCalcTypes = [
     // omit 16 - CloisonAval
     17, 18, 19, 20, 21, 22, 23, 24, 25,
     // omit 26 - YAXN
-    27, 29
+    27, 28, 29, 30
+    // omit 31 - PbCloison and 32 - PbBassin
 ];
-- 
GitLab


From 23a029ecd38f2e8de869d444a5b015addfe5d8f2 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 16 Jul 2020 14:16:43 +0200
Subject: [PATCH 63/92] Modules Diagram: fix blank diagram issue with
 PreBarrage

---
 .../modules-diagram.component.ts              | 66 ++++++++++---------
 1 file changed, 36 insertions(+), 30 deletions(-)

diff --git a/src/app/components/modules-diagram/modules-diagram.component.ts b/src/app/components/modules-diagram/modules-diagram.component.ts
index 80d08b7b7..79118556f 100644
--- a/src/app/components/modules-diagram/modules-diagram.component.ts
+++ b/src/app/components/modules-diagram/modules-diagram.component.ts
@@ -111,41 +111,47 @@ export class ModulesDiagramComponent implements AfterContentInit, AfterViewCheck
     }
 
     public ngAfterViewInit(): void {
-        // add click listener on every calculator node in the graph, that
-        // corresponds to an open module
-        this.nativeElement.querySelectorAll("g.node").forEach(item => {
-            if (item.id && this.formIsOpen(item.id)) {
-                item.style.cursor = "pointer";
-                item.addEventListener("click", () => {
-                    this.openCalc(item.id);
-                });
-            }
-        });
+        setTimeout(() => { // clodo trick
+            // add click listener on every calculator node in the graph, that
+            // corresponds to an open module
+            this.nativeElement.querySelectorAll("g.node").forEach(item => {
+                if (item.id && this.formIsOpen(item.id)) {
+                    item.style.cursor = "pointer";
+                    item.addEventListener("click", () => {
+                        this.openCalc(item.id);
+                    });
+                }
+            });
+        }, 20); // @WARNING keep timeout > the one in ngAfterContentInit() below
     }
 
     public ngAfterContentInit(): void {
         this.error = false;
-        mermaid.initialize({
-            // theme: "forest"
-            flowchart: {
-                curve: "basis"
-            }
-        });
-        this.nativeElement = this.diagram.nativeElement;
-
-        if (this.hasModules) {
-            // generate graph description
-            const graphDefinition = this.graphDefinition();
-            // draw
-            try {
-                mermaid.render("graphDiv", graphDefinition, (svgCode, bindFunctions) => {
-                    this.nativeElement.innerHTML = svgCode;
-                });
-            } catch (e) {
-                console.error(e);
-                this.error = true;
+        // clodo trick or displaying modules diagram coming from a
+        // PreBarrage module results in a blank diagram
+        setTimeout(() => {
+            mermaid.initialize({
+                // theme: "forest"
+                flowchart: {
+                    curve: "basis"
+                }
+            });
+            this.nativeElement = this.diagram.nativeElement;
+
+            if (this.hasModules) {
+                // generate graph description
+                const graphDefinition = this.graphDefinition();
+                // draw
+                try {
+                    mermaid.render("graphDiv", graphDefinition, (svgCode, bindFunctions) => {
+                        this.nativeElement.innerHTML = svgCode;
+                    });
+                } catch (e) {
+                    console.error(e);
+                    this.error = true;
+                }
             }
-        }
+        }, 10);
     }
 
     public resetZoom() {
-- 
GitLab


From af13a9e3d93e1d6d359e018bc704f3a1ca081815 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 17 Jul 2020 12:25:39 +0200
Subject: [PATCH 64/92] English translations for PreBarrage

---
 src/app/calculators/pbcloison/en.json  |  1 +
 src/app/calculators/prebarrage/en.json | 26 +++++++++++++++++---------
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/src/app/calculators/pbcloison/en.json b/src/app/calculators/pbcloison/en.json
index 2f9e94744..83f004a88 100644
--- a/src/app/calculators/pbcloison/en.json
+++ b/src/app/calculators/pbcloison/en.json
@@ -1,5 +1,6 @@
 {
     "fs_wall_params": "Wall parameters",
+    "fs_wall_device": "Device",
 
     "select_upstream_basin": "Upstream basin",
     "select_downstream_basin": "Downstream basin",
diff --git a/src/app/calculators/prebarrage/en.json b/src/app/calculators/prebarrage/en.json
index a8e5ea027..8fb6bf3da 100644
--- a/src/app/calculators/prebarrage/en.json
+++ b/src/app/calculators/prebarrage/en.json
@@ -1,12 +1,20 @@
 {
-    "fs_target": "Target parameter characteristics",
-    "fs_searched": "Searched parameter characteristics",
+    "fs_river_params": "River parameters",
 
-    "Ytarget": "Value of target parameter",
-    "Xinit": "Initial value for searched parameter",
-    "X": "Value for searched parameter",
+    "Q": "Flow",
+    "Z1": "Upstream water elevation",
+    "Z2": "Downstream water elevation",
 
-    "select_target_nub": "Module and parameter to calculate",
-    "select_target_result": "Targetted result",
-    "select_searched_param": "Searched parameter"
-}
\ No newline at end of file
+    "Z": "Water elevation",
+    "S": "Surface",
+    "ZF": "Bottom elevation",
+    "PV": "Dissipated power",
+    "YMOY": "Mean depth",
+
+    "UNIT_Q": "m³/s",
+    "UNIT_S": "m²",
+    "UNIT_Z": "m",
+    "UNIT_ZF": "m",
+    "UNIT_YMOY": "m",
+    "UNIT_PV": "W/m³"
+}
-- 
GitLab


From 334f51ac92cd0f171ccab83426b24ebbe09af714 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 17 Jul 2020 14:18:33 +0200
Subject: [PATCH 65/92] Use TypeScript's "Optional Chaining" syntax

---
 .../fieldset-container/fieldset-container.component.ts    | 2 +-
 .../fixedvar-results/fixedvar-results.component.ts        | 2 +-
 src/app/components/jet-results/jet-results.component.ts   | 4 ++--
 src/app/components/log/log.component.ts                   | 4 ++--
 src/app/components/pab-table/pab-table.component.ts       | 8 ++++----
 src/app/components/pb-schema/pb-schema.component.ts       | 4 ++--
 .../components/remous-results/remous-results.component.ts | 6 +++---
 src/app/formulaire/definition/form-definition.ts          | 2 +-
 src/app/formulaire/definition/form-section-parametree.ts  | 6 +++---
 src/app/formulaire/elements/select-field.ts               | 4 ++--
 10 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/src/app/components/fieldset-container/fieldset-container.component.ts b/src/app/components/fieldset-container/fieldset-container.component.ts
index 65bdb84eb..45b87262e 100644
--- a/src/app/components/fieldset-container/fieldset-container.component.ts
+++ b/src/app/components/fieldset-container/fieldset-container.component.ts
@@ -126,7 +126,7 @@ export class FieldsetContainerComponent implements DoCheck, AfterViewInit {
     private updateValidity() {
         this._isValid = false;
 
-        if (this._fieldsetComponents !== undefined && this._fieldsetComponents.length > 0) {
+        if (this._fieldsetComponents?.length > 0) {
             this._isValid = this._fieldsetComponents.reduce(
                 // callback
                 (
diff --git a/src/app/components/fixedvar-results/fixedvar-results.component.ts b/src/app/components/fixedvar-results/fixedvar-results.component.ts
index eb491d2d9..04136deb5 100644
--- a/src/app/components/fixedvar-results/fixedvar-results.component.ts
+++ b/src/app/components/fixedvar-results/fixedvar-results.component.ts
@@ -192,6 +192,6 @@ export class FixedVarResultsComponent extends ResultsComponentDirective implemen
     }
 
     public get hasResults(): boolean {
-        return this._fixedResults !== undefined && this._fixedResults.hasResults;
+        return this._fixedResults?.hasResults;
     }
 }
diff --git a/src/app/components/jet-results/jet-results.component.ts b/src/app/components/jet-results/jet-results.component.ts
index 0e5c86aa3..04e068fb0 100644
--- a/src/app/components/jet-results/jet-results.component.ts
+++ b/src/app/components/jet-results/jet-results.component.ts
@@ -18,9 +18,9 @@ export class JetResultsComponent extends FixedVarResultsComponent {
 
     public get hasResults(): boolean {
         return (
-            (this._fixedResults !== undefined && this._fixedResults.hasResults)
+            (this._fixedResults?.hasResults)
             ||
-            (this._varResults !== undefined && this._varResults.hasResults)
+            (this._varResults?.hasResults)
         );
     }
 
diff --git a/src/app/components/log/log.component.ts b/src/app/components/log/log.component.ts
index 622fdd914..350e544fe 100644
--- a/src/app/components/log/log.component.ts
+++ b/src/app/components/log/log.component.ts
@@ -34,11 +34,11 @@ export class LogComponent {
     }
 
     public get hasEntries(): boolean {
-        return this._log !== undefined && this._log.messages.length !== 0;
+        return this._log?.messages?.length > 0;
     }
 
     public get messages(): Message[] {
-        return this._log.messages;
+        return this._log?.messages;
     }
 
     public set log(log: cLog) {
diff --git a/src/app/components/pab-table/pab-table.component.ts b/src/app/components/pab-table/pab-table.component.ts
index 012f8773e..b3c8934ec 100644
--- a/src/app/components/pab-table/pab-table.component.ts
+++ b/src/app/components/pab-table/pab-table.component.ts
@@ -96,7 +96,7 @@ export class PabTableComponent implements AfterViewInit, OnInit {
 
     /** returns true if the cell has an underlying model (ie. is editable) */
     public hasModel(cell: any): boolean {
-        return (cell !== undefined && cell.model !== undefined);
+        return (cell?.model !== undefined);
     }
 
     /** returns true if the cell is an editable number */
@@ -124,7 +124,7 @@ export class PabTableComponent implements AfterViewInit, OnInit {
 
     /** "title" tooltip to display in a cell */
     public cellTitle(cell: any) {
-        if (cell !== undefined && cell.title !== undefined) {
+        if (cell?.title !== undefined) {
             return cell.title;
         } else {
             return "";
@@ -132,14 +132,14 @@ export class PabTableComponent implements AfterViewInit, OnInit {
     }
 
     public rowSpan(cell: any) {
-        if (cell !== undefined && cell.rowspan) {
+        if (cell?.rowspan) {
             return cell.rowspan;
         }
         return undefined;
     }
 
     public colSpan(cell: any) {
-        if (cell !== undefined && cell.colspan) {
+        if (cell?.colspan) {
             return cell.colspan;
         }
         return undefined;
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 735e7dea7..7a9ed20fe 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -326,11 +326,11 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         // automatic child addition when clearing children)
         if (this._selectedItem instanceof PbCloison) {
             // if no downstream connections remain, connect to river downstream
-            if (this._selectedItem.bassinAmont !== undefined && this._selectedItem.bassinAmont.cloisonsAval.length === 0) {
+            if (this._selectedItem.bassinAmont?.cloisonsAval.length === 0) {
                 this.model.addChild(new PbCloison(this._selectedItem.bassinAmont, undefined));
             }
             // if no upstream connections remain, connect to river upstream
-            if (this._selectedItem.bassinAval !== undefined && this._selectedItem.bassinAval.cloisonsAmont.length === 0) {
+            if (this._selectedItem.bassinAval?.cloisonsAmont.length === 0) {
                 this.model.addChild(new PbCloison(undefined, this._selectedItem.bassinAval));
             }
         }
diff --git a/src/app/components/remous-results/remous-results.component.ts b/src/app/components/remous-results/remous-results.component.ts
index db14a54ce..ecf98435a 100644
--- a/src/app/components/remous-results/remous-results.component.ts
+++ b/src/app/components/remous-results/remous-results.component.ts
@@ -142,7 +142,7 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
     }
 
     public get hasResults(): boolean {
-        return this._remousResults !== undefined && this._remousResults.hasResults;
+        return this._remousResults?.hasResults;
     }
 
     public get hasData(): boolean {
@@ -315,7 +315,7 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
         }
 
         // hauteur normale
-        if (this._remousResults.hautNormale !== undefined && this._remousResults.hautNormale.ok) {
+        if (this._remousResults.hautNormale?.ok) {
             const Yn = this._remousResults.hautNormale.vCalc;
             gr1.drawSimpleLine(Yn + ZF1, Yn + ZF2,
                 5, "#A4C537", this.uitextTirantNormal
@@ -323,7 +323,7 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
         }
 
         // hauteur critique
-        if (this._remousResults.hautCritique !== undefined && this._remousResults.hautCritique.ok) {
+        if (this._remousResults.hautCritique?.ok) {
             const Yc = this._remousResults.hautCritique.vCalc;
             gr1.drawSimpleLine(Yc + ZF1, Yc + ZF2,
                 6, "#FF0000", this.uitextTirantCritique
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index e70898a3a..f378eba70 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -379,7 +379,7 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
 
     public isDisplayed(id: string) {
         const fe = <FormulaireElement>this.getFormulaireNodeById(id);
-        return fe !== undefined && fe.isDisplayed;
+        return fe?.isDisplayed;
     }
 
     /**
diff --git a/src/app/formulaire/definition/form-section-parametree.ts b/src/app/formulaire/definition/form-section-parametree.ts
index b1d6dcf4a..743880b5d 100644
--- a/src/app/formulaire/definition/form-section-parametree.ts
+++ b/src/app/formulaire/definition/form-section-parametree.ts
@@ -55,9 +55,9 @@ export class FormulaireSectionParametree extends FormulaireSection {
     }
 
     public get hasResults(): boolean {
-        return (this._fixedResults !== undefined && this._fixedResults.hasResults)
-            || (this._varResults !== undefined && this._varResults.hasResults)
-            || (this._sectionResults !== undefined && this._sectionResults.hasResults);
+        return (this._fixedResults?.hasResults)
+            || (this._varResults?.hasResults)
+            || (this._sectionResults?.hasResults);
     }
 
     public get results(): CalculatorResults[] {
diff --git a/src/app/formulaire/elements/select-field.ts b/src/app/formulaire/elements/select-field.ts
index 0cd055aea..6a0183d22 100644
--- a/src/app/formulaire/elements/select-field.ts
+++ b/src/app/formulaire/elements/select-field.ts
@@ -192,11 +192,11 @@ export class SelectField extends Field {
                 // @WARNING for localisation, @see hack in this.updateLocalisation()
                 // 1. calculated param
                 const ntc = (nub as Solveur).nubToCalculate;
-                if (ntc !== undefined && ntc.calculatedParam !== undefined) { // some nubs have no calculatedParam, for ex. SectionParam
+                if (ntc?.calculatedParam !== undefined) { // some nubs have no calculatedParam, for ex. SectionParam
                     this.addEntry(new SelectEntry(this._entriesBaseId + "none", ""));
                 }
                 // 2. extra results
-                if (ntc !== undefined && ntc.resultsFamilies !== undefined) {
+                if (ntc?.resultsFamilies !== undefined) {
                     for (const er of Object.keys(ntc.resultsFamilies)) {
                         const e: SelectEntry = new SelectEntry(this._entriesBaseId + er, er);
                         this.addEntry(e);
-- 
GitLab


From 4902d338032a3dceac6cf16fbf0ceb561f197894 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 17 Jul 2020 15:37:18 +0200
Subject: [PATCH 66/92] Update e2e calculate-all-params for PreBarrage

---
 e2e/calculate-all-params.e2e-spec.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/e2e/calculate-all-params.e2e-spec.ts b/e2e/calculate-all-params.e2e-spec.ts
index d8fafc252..18a2f844b 100644
--- a/e2e/calculate-all-params.e2e-spec.ts
+++ b/e2e/calculate-all-params.e2e-spec.ts
@@ -2,7 +2,7 @@ import { ListPage } from "./list.po";
 import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
-import { browser } from "protractor";
+import { browser, element, by, ElementFinder } from "protractor";
 import { testedCalcTypes } from "./tested_calctypes";
 
 /**
-- 
GitLab


From 6ca4b07956f53536eac30615a947ef72f8320cac Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Wed, 22 Jul 2020 16:31:13 +0200
Subject: [PATCH 67/92] Fix bug in PbCloison parameters display in results
 table

---
 .../formulaire/definition/form-prebarrage.ts  | 41 +++++++++++++------
 src/locale/messages.en.json                   |  1 +
 src/locale/messages.fr.json                   |  1 +
 3 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index f6bc246a7..d791856ac 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -1,4 +1,4 @@
-import { CalculatorType, PbBassin, PbCloison, IObservable, PreBarrage, VariatedDetails } from "jalhyd";
+import { CalculatorType, PbBassin, PbCloison, IObservable, PreBarrage, VariatedDetails, ParamDefinition } from "jalhyd";
 
 import { FormulaireFixedVar } from "./form-fixedvar";
 import { PbSchema } from "../elements/pb-schema";
@@ -235,15 +235,6 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             if (computedParam !== undefined) {
                 this.pbResults.cloisonResults.calculatedParameter = computedParam;
             }
-            // if some parameter is variating, add id too (trick with PbResultsComponent
-            for (const s of this._selectedItem.structures) {
-                for (const p of s.parameterIterator) {
-                    if (p.hasMultipleValues) {
-                        const ngp = this.getParamFromSymbol(p.symbol);
-                        this._pbResults.cloisonResults.addFixedParameter(ngp);
-                    }
-                }
-            }
             // transmission des suffixes de cloisons calculés par l'algo de tri de PbSchemaComponent,
             // pour le sélecteur de conditions limites
             const pbs = this.kids[0] as PbSchema;
@@ -260,10 +251,34 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         }
     }
 
+    /**
+     * Trouve le Ngparameter correspondant au paramètre "p", parmi tous les
+     * éléments du formulaire de PbCloison, qui peut contenir plusieurs
+     * structures ayant des paramètres de même nom
+     * @param param ParamDefinition
+     */
+    public getCloisonParam(param: ParamDefinition): NgParameter {
+        for (const p of this.allFormElements) {
+            if (p instanceof NgParameter) {
+                if (p.paramDefinition === param) {
+                    return p;
+                }
+            }
+        }
+    }
+
     public addFixedParameters() {
-        if (this.wallForm !== undefined) {
-            for (const p of this.wallForm.getFixedParameters()) {
-                this._pbResults.cloisonResults.addFixedParameter(p);
+        if (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison) {
+            for (const s of this._selectedItem.structures) {
+                for (const p of s.parameterIterator) {
+                    // if some parameter is variating, add id too (trick with PbResultsComponent)
+                    if (p.visible) {
+                        const ngp = this.getCloisonParam(p);
+                        if (ngp) {
+                            this._pbResults.cloisonResults.addFixedParameter(ngp);
+                        }
+                    }
+                }
             }
         }
     }
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 8e52e8a9f..9f3f67c26 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -344,6 +344,7 @@
     "INFO_LIB_STRUCTURE_SEUILTRIANGULAIRE": "Triangular weir",
     "INFO_LIB_STRUCTURE_SEUILTRIANGULAIRETRUNC": "Truncated triangular weir",
     "INFO_LIB_STRUCTURE_VANNERECTANGULAIRE": "Rectangular gate",
+    "INFO_LIB_STRUCTURE_N_COURT": "D",
     "INFO_LIB_TAU0": "Tractive force",
     "INFO_LIB_TOR": "Supercritical water line",
     "INFO_LIB_TOTAL": "Total",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index b15fb7935..e71c1d1a2 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -345,6 +345,7 @@
     "INFO_LIB_STRUCTURE_SEUILTRIANGULAIRE": "Seuil triangulaire",
     "INFO_LIB_STRUCTURE_SEUILTRIANGULAIRETRUNC": "Seuil triangulaire tronqué",
     "INFO_LIB_STRUCTURE_VANNERECTANGULAIRE": "Vanne rectangulaire",
+    "INFO_LIB_STRUCTURE_N_COURT": "O",
     "INFO_LIB_TAU0": "Force tractrice",
     "INFO_LIB_TOR": "Ligne d'eau torrentielle",
     "INFO_LIB_TOTAL": "Total",
-- 
GitLab


From 0fd443b38d4e176e3fb0391d7b0a76ae0e3bfdfb Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 3 Sep 2020 15:41:09 +0200
Subject: [PATCH 68/92] Linit code

---
 src/app/app.component.ts                      | 162 ++----------------
 src/app/app.module.ts                         |   1 -
 .../fixed-results.component.ts                |   1 +
 .../formulaire/definition/form-definition.ts  |   2 +-
 4 files changed, 17 insertions(+), 149 deletions(-)

diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 75fe1c71b..713ba435a 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -822,139 +822,6 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
             if (itemId) {
                 this.scrollToQuicknav(itemId, "auto");
             }
-        this.loadSessionFile(result.file, result.calculators);
-      }
-    }
-
-  public async loadSessionFile(f: File, info?: any) {
-    // notes merge detection: was there already some notes ?
-    const existingNotes = Session.getInstance().documentation;
-    // load
-    try {
-      const data = await this.formulaireService.loadSession(f, info);
-      if (data.hasErrors) {
-        this.notificationsService.notify(this.intlService.localizeText("ERROR_PROBLEM_LOADING_SESSION"), 3500);
-      } else {
-        if (data.loaded && data.loaded.length > 0) {
-          if (! isDevMode()) {
-            this.matomoTracker.trackEvent("userAction", "loadSession");
-          }
-          // notes merge detection: was there already some notes ?
-          const currentNotes = Session.getInstance().documentation;
-          if (existingNotes !== "" && currentNotes !== existingNotes) {
-            this.notificationsService.notify(this.intlService.localizeText("WARNING_SESSION_LOAD_NOTES_MERGED"), 3500);
-          }
-          // go to calc or diagram depending on what was loaded
-          if (data.loaded.length > 1) {
-            this.toDiagram();
-          } else {
-            this.toCalc(data.loaded[0]);
-          }
-        }
-      }
-    } catch (err) {
-      this.notificationsService.notify(this.intlService.localizeText("ERROR_LOADING_SESSION"), 3500);
-      console.error("error loading session - ", err);
-      // rollback to ensure session is clean
-      this.doEmptySession();
-    }
-  }
-
-  /**
-   * Demande au client d'envoyer un email (génère un lien mailto:), pré-rempli
-   * avec un texte standard, et le contenu de la session au format JSON
-   */
-  public reportBug() {
-    const recipient = "bug@cassiopee.g-eau.fr";
-    const subject = "[ISSUE] " + this.intlService.localizeText("INFO_REPORT_BUG_SUBJECT");
-    let body = this.intlService.localizeText("INFO_REPORT_BUG_BODY");
-
-    // add session description
-
-    // get all forms
-    const list = [];
-    for (const c of this._calculators) {
-      list.push({
-        title: c.title,
-        uid: c.uid,
-        selected: true
-      });
-    }
-    let session = this.buildSessionFile(list);
-
-    // compress
-    session = pako.deflate(session, { to: "string" }); // gzip (zlib)
-    session = btoa(session); // base64
-
-    body += session + "\n";
-    body = encodeURIComponent(body);
-
-    const mailtoURL = `mailto:${recipient}?subject=${subject}&body=${body}`;
-
-    // temporarily disable tab closing alert, as tab won't be closed for real
-    this.appSetupService.warnBeforeTabClose = false;
-    window.location.href = mailtoURL;
-    this.appSetupService.warnBeforeTabClose = true;
-  }
-
-  public get revisionInfo(): any {
-    return {
-      jalhyd: {
-        date: jalhydDateRev,
-        version: jalhydVersion,
-      },
-      nghyd: {
-        date: nghydDateRev,
-        version: nghydVersion
-      }
-    };
-  }
-
-  /**
-   * sauvegarde du/des formulaires
-   * @param form formulaire à sélectionner par défaut dans la liste
-   */
-  public saveForm(form?: FormulaireDefinition) {
-    // liste des formulaires
-    const list = [];
-    for (const c of this._calculators) {
-      const uid = c["uid"];
-      const nub = Session.getInstance().findNubByUid(uid);
-      let required = nub.getTargettedNubs().map((req) => {
-        return req.uid;
-      });
-      required = required.filter(
-        (item, index) => required.indexOf(item) === index // deduplicate
-      );
-      list.push({
-        "children": nub.getChildren().map((child) => {
-          return child.uid;
-        }),
-        "requires": required,
-        "selected": form ? (uid === form.uid) : true,
-        "title": c["title"],
-        "uid": uid
-      });
-    }
-    // dialogue de sélection des formulaires à sauver
-    const dialogRef = this.saveSessionDialog.open(
-      DialogSaveSessionComponent,
-      {
-        data: {
-          calculators: list
-        },
-        disableClose: false
-      }
-    );
-    dialogRef.afterClosed().subscribe(result => {
-      if (result) {
-        let name = result.filename;
-
-        // ajout extension ".json"
-        const re = /.+\.json/;
-        const match = re.exec(name.toLowerCase());
-        if (match === null) {
-          name = name + ".json";
         }
     }
 
@@ -981,22 +848,23 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
         return runningPlatform;
     }
 
-  /**
-   * détection de la fermeture de la page/navigateur et demande de confirmation
-   */
-  @HostListener("window:beforeunload", [ "$event" ]) confirmExit($event) {
-    if (
-      this.appSetupService.warnBeforeTabClose
-      && ! isDevMode() // otherwise prevents dev server to reload app after recompiling
-    ) {
-      // affecter une valeur différente de null provoque l'affichage d'un dialogue de confirmation, mais le texte n'est pas affiché
-      $event.returnValue = "Your data will be lost !";
+    /**
+     * détection de la fermeture de la page/navigateur et demande de confirmation
+     */
+    @HostListener("window:beforeunload", [ "$event" ]) confirmExit($event) {
+        if (
+        this.appSetupService.warnBeforeTabClose
+        && ! isDevMode() // otherwise prevents dev server to reload app after recompiling
+        ) {
+        // affecter une valeur différente de null provoque l'affichage d'un dialogue de confirmation, mais le texte n'est pas affiché
+        $event.returnValue = "Your data will be lost !";
+        }
     }
 
-    @HostListener("keydown", ["$event"]) onKeydown(event: any) {
-        if (event.which === 38 || event.which === 40) { // up / down arrow
-            if (event.srcElement.type === "number") {
-                event.preventDefault();
+    @HostListener("keydown", ["$event"]) onKeyDown($event: any) {
+        if ($event.which === 38 || $event.which === 40) { // up / down arrow
+            if ($event.srcElement.type === "number") {
+                $event.preventDefault();
             }
         }
     }
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 77599ae82..1342dd089 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -180,7 +180,6 @@ const appRoutes: Routes = [
         enableTracing: false // debugging purposes only
       }
     ),
-    StorageServiceModule,
     TableModule,
     KonamiModule
   ],
diff --git a/src/app/components/fixedvar-results/fixed-results.component.ts b/src/app/components/fixedvar-results/fixed-results.component.ts
index 30de6df58..8477e6cef 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.ts
+++ b/src/app/components/fixedvar-results/fixed-results.component.ts
@@ -109,6 +109,7 @@ export class FixedResultsComponent extends ResultsComponentDirective {
                     });
                 }
             }
+        }
 
         for (const symbol of this._fixedResults.variablesOrder) {
             resultFound = false;
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index f378eba70..eb1dc8ad5 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -24,7 +24,7 @@ import { CalculatorResults } from "../../results/calculator-results";
 import { ServiceFactory } from "../../services/service-factory";
 import { PabTable } from "../elements/pab-table";
 import { SelectEntry } from "../elements/select-entry";
-import { PbSchema } from '../elements/pb-schema';
+import { SelectField } from "../elements/select-field";
 
 /**
  * classe de base pour tous les formulaires
-- 
GitLab


From e97a12b1483a823d0754407f1aa52a833e91be95 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 4 Sep 2020 09:17:26 +0200
Subject: [PATCH 69/92] Fix errors due to rebase

---
 package-lock.json                             | 2129 ++++++++---------
 src/app/app.module.ts                         |  240 +-
 .../calculator-list.component.ts              |    2 +-
 .../calculator-results.component.ts           |    4 +
 ...ialog-generate-par-simulation.component.ts |   14 +-
 .../dialog-load-session.component.ts          |    2 +-
 .../field-set/field-set.component.ts          |    2 +-
 .../calculator.component.ts                   |    2 -
 .../formulaire/definition/form-pb-cloison.ts  |    8 +-
 .../formulaire/definition/form-prebarrage.ts  |    6 +-
 .../definition/form-verificateur.ts           |    5 +-
 src/app/results/prebarrage-results.ts         |    2 +-
 12 files changed, 1142 insertions(+), 1274 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 11875c104..3586fa901 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -418,60 +418,7 @@
           "requires": {
             "type-fest": "^0.11.0"
           }
-        }
-      }
-    },
-    "@angular/common": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.12.tgz",
-      "integrity": "sha512-nIWXeLEWU3v4/GprKUtucFoVwNWpoD9DL1RWvOkyXT3tXm/Z8zGwXGKPJ13O2p6E22nChx3GauLKjSUmg1SWww==",
-      "requires": {
-        "tslib": "^2.0.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
-          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
-        }
-      }
-    },
-    "@angular/compiler": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.12.tgz",
-      "integrity": "sha512-g7BBC69/LW8Qd98IKL+YAY8vSJyc1WHuMejdMq56hU4h8FzLUKJZeKfsDe9MbiIqoPr9DWcDu4dtcg/g4Rc5/w==",
-      "requires": {
-        "tslib": "^2.0.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
-          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
-        }
-      }
-    },
-    "@angular/compiler-cli": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.12.tgz",
-      "integrity": "sha512-biFAxoQKxARpu/PMs8McS5flaPTnAFQ6y/xbBg8ItstzxdTjyuQSuYdvgK48Vd0c8eRv8mEgne3f/Cf7U43nDA==",
-      "dev": true,
-      "requires": {
-        "canonical-path": "1.0.0",
-        "chokidar": "^3.0.0",
-        "convert-source-map": "^1.5.1",
-        "dependency-graph": "^0.7.2",
-        "fs-extra": "4.0.2",
-        "magic-string": "^0.25.0",
-        "minimist": "^1.2.0",
-        "reflect-metadata": "^0.1.2",
-        "semver": "^6.3.0",
-        "source-map": "^0.6.1",
-        "sourcemap-codec": "^1.4.8",
-        "tslib": "^2.0.0",
-        "yargs": "15.3.0"
-      },
-      "dependencies": {
+        },
         "ansi-regex": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
@@ -541,39 +488,39 @@
           "dev": true
         },
         "hosted-git-info": {
-          "version": "3.0.4",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz",
-          "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==",
+          "version": "3.0.5",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
+          "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==",
           "dev": true,
           "requires": {
-            "lru-cache": "^5.1.1"
+            "lru-cache": "^6.0.0"
           }
         },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "yallist": "^3.0.2"
+        "inquirer": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
+          "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "^4.2.1",
+            "chalk": "^3.0.0",
+            "cli-cursor": "^3.1.0",
+            "cli-width": "^2.0.0",
+            "external-editor": "^3.0.3",
+            "figures": "^3.0.0",
+            "lodash": "^4.17.15",
+            "mute-stream": "0.0.8",
+            "run-async": "^2.4.0",
+            "rxjs": "^6.5.3",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0",
+            "through": "^2.3.6"
           }
         },
-        "minimist": {
-          "version": "1.2.5",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-          "dev": true
-        },
-        "normalize-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-          "dev": true
-        },
-        "mute-stream": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
-          "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
           "dev": true
         },
         "npm-package-arg": {
@@ -587,15 +534,6 @@
             "validate-npm-package-name": "^3.0.0"
           }
         },
-        "onetime": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
-          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
-          "dev": true,
-          "requires": {
-            "mimic-fn": "^2.1.0"
-          }
-        },
         "restore-cursor": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -636,16 +574,10 @@
             "ansi-regex": "^5.0.0"
           }
         },
-        "tslib": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
-          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==",
-          "dev": true
-        },
-        "wrap-ansi": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
@@ -656,35 +588,29 @@
           "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz",
           "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==",
           "dev": true
-        },
-        "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-          "dev": true
         }
       }
     },
     "@angular/common": {
-      "version": "10.0.2",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.2.tgz",
-      "integrity": "sha512-zpNB2XD6jinXZjfihoO5Q1Yg7urfpZTt/fitdmwFHCcQ/1qZ9T2BVh8+VqVRkh6Pjxmtvu0uPnJ1a/aZ5f9r9A==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.1.0.tgz",
+      "integrity": "sha512-LdDa6adSv9b+uCSyYuH8I7LS40CdJCVMOv8Y44p/JBr9b54Datslf8nygG1RhU+HkIMzdtw6qjcHbwF+27cLZw==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/compiler": {
-      "version": "10.0.2",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.2.tgz",
-      "integrity": "sha512-TNE5ESDlRCVneb/K62HOEgLpxuZZTlw8RcmOy5vt3SngEVc576OE/aYsEA6MCwTlqj16GLSS3jGm9HBJcBKUVw==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.1.0.tgz",
+      "integrity": "sha512-PBHH59B2yTT/h2HxrlGGm8W5taHkcEk39FXiycSBrbt3T5QiExUXMJoUERviPQCUeHCWWsi1Fpu9wK2fgnP/Qw==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/compiler-cli": {
-      "version": "10.0.2",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.2.tgz",
-      "integrity": "sha512-LGX86k1hOyaw5aPCjFfoLuPhVLKMENOdCBeNBzZB+H2CUGHfv8OWFB1EzjZO1N07VGR7JoMx9ZWSP7ornhuS4Q==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.1.0.tgz",
+      "integrity": "sha512-4AvjGNNvGcBakI4djt6W8GhmuKGf3eySthVQCh0GRYErYLvXYSW+69Yi0FzbjieHZht2P3LFVbunWFksBwp+rw==",
       "dev": true,
       "requires": {
         "canonical-path": "1.0.0",
@@ -702,6 +628,16 @@
         "yargs": "15.3.0"
       },
       "dependencies": {
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
         "fs-extra": {
           "version": "4.0.2",
           "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz",
@@ -713,6 +649,30 @@
             "universalify": "^0.1.0"
           }
         },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -724,6 +684,25 @@
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "yargs": {
+          "version": "15.3.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz",
+          "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.0"
+          }
         }
       }
     },
@@ -830,17 +809,18 @@
       "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
       "requires": {
         "@babel/highlight": "^7.10.4"
-      }
-    },
-    "@babel/compat-data": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz",
-      "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.12.0",
-        "invariant": "^2.2.4",
-        "semver": "^5.5.0"
+      },
+      "dependencies": {
+        "@babel/highlight": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "chalk": "^2.0.0",
+            "js-tokens": "^4.0.0"
+          }
+        }
       }
     },
     "@babel/compat-data": {
@@ -991,6 +971,17 @@
         "@babel/helper-annotate-as-pure": "^7.10.4",
         "@babel/helper-regex": "^7.10.4",
         "regexpu-core": "^4.7.0"
+      },
+      "dependencies": {
+        "@babel/helper-regex": {
+          "version": "7.10.5",
+          "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+          "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
+          "dev": true,
+          "requires": {
+            "lodash": "^4.17.19"
+          }
+        }
       }
     },
     "@babel/helper-define-map": {
@@ -1078,167 +1069,101 @@
         "@babel/types": "^7.10.4"
       }
     },
-    "@babel/helper-member-expression-to-functions": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
-      "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.11.0"
-      }
-    },
     "@babel/helper-module-imports": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
-      "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz",
+      "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.10.4"
+        "@babel/types": "^7.10.1"
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
-      "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz",
+      "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.10.4",
-        "@babel/helper-simple-access": "^7.10.4",
-        "@babel/helper-split-export-declaration": "^7.11.0",
-        "@babel/template": "^7.10.4",
-        "@babel/types": "^7.11.0",
-        "lodash": "^4.17.19"
+        "@babel/helper-module-imports": "^7.10.1",
+        "@babel/helper-replace-supers": "^7.10.1",
+        "@babel/helper-simple-access": "^7.10.1",
+        "@babel/helper-split-export-declaration": "^7.10.1",
+        "@babel/template": "^7.10.1",
+        "@babel/types": "^7.10.1",
+        "lodash": "^4.17.13"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
+          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.4"
+            "@babel/highlight": "^7.10.1"
           }
         },
         "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
+          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
+            "@babel/helper-validator-identifier": "^7.10.1",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
         "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "version": "7.10.1",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
+          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
+            "@babel/code-frame": "^7.10.1",
+            "@babel/parser": "^7.10.1",
+            "@babel/types": "^7.10.1"
           }
-        },
-        "lodash": {
-          "version": "4.17.20",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-          "dev": true
         }
       }
     },
-    "@babel/helper-optimise-call-expression": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
-      "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.10.4"
-      }
-    },
     "@babel/helper-plugin-utils": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz",
+      "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==",
       "dev": true
     },
-    "@babel/helper-regex": {
-      "version": "7.10.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
-      "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.19"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "4.17.20",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/helper-remap-async-to-generator": {
-      "version": "7.11.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz",
-      "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==",
+    "@babel/helper-replace-supers": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "@babel/helper-wrap-function": "^7.10.4",
-        "@babel/template": "^7.10.4",
+        "@babel/helper-member-expression-to-functions": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
         "@babel/types": "^7.10.4"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+        "@babel/helper-member-expression-to-functions": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
+          "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.4"
+            "@babel/types": "^7.11.0"
           }
         },
-        "@babel/highlight": {
+        "@babel/helper-optimise-call-expression": {
           "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+          "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
             "@babel/types": "^7.10.4"
           }
         }
       }
     },
-    "@babel/helper-replace-supers": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
-      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.10.4",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/traverse": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
     "@babel/helper-simple-access": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
@@ -1292,11 +1217,12 @@
       }
     },
     "@babel/helper-split-export-declaration": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz",
+      "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==",
+      "dev": true,
       "requires": {
-        "@babel/types": "^7.11.0"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-validator-identifier": {
@@ -1393,333 +1319,39 @@
         }
       }
     },
-    "@babel/highlight": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      }
-    },
     "@babel/parser": {
-      "version": "7.11.4",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz",
-      "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA=="
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz",
+      "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA=="
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.10.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
-      "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz",
+      "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-remap-async-to-generator": "^7.10.4",
         "@babel/plugin-syntax-async-generators": "^7.8.0"
-      }
-    },
-    "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
-      "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.0"
-      }
-    },
-    "@babel/plugin-proposal-json-strings": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
-      "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-json-strings": "^7.8.0"
-      }
-    },
-    "@babel/helper-member-expression-to-functions": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz",
-      "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.10.1"
-      }
-    },
-    "@babel/helper-module-imports": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz",
-      "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.10.1"
-      }
-    },
-    "@babel/helper-module-transforms": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz",
-      "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.10.1",
-        "@babel/helper-replace-supers": "^7.10.1",
-        "@babel/helper-simple-access": "^7.10.1",
-        "@babel/helper-split-export-declaration": "^7.10.1",
-        "@babel/template": "^7.10.1",
-        "@babel/types": "^7.10.1",
-        "lodash": "^4.17.13"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
-          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.1"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
-          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.1",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
-          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.1",
-            "@babel/parser": "^7.10.1",
-            "@babel/types": "^7.10.1"
-          }
-        }
-      }
-    },
-    "@babel/helper-optimise-call-expression": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz",
-      "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.10.1"
-      }
-    },
-    "@babel/helper-plugin-utils": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz",
-      "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==",
-      "dev": true
-    },
-    "@babel/helper-regex": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz",
-      "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.13"
-      }
-    },
-    "@babel/helper-remap-async-to-generator": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz",
-      "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.10.1",
-        "@babel/helper-wrap-function": "^7.10.1",
-        "@babel/template": "^7.10.1",
-        "@babel/traverse": "^7.10.1",
-        "@babel/types": "^7.10.1"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
-          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
-      }
-    },
-    "@babel/helper-replace-supers": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
-      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.10.4",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/traverse": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@babel/helper-simple-access": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
-      "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.10.4",
-        "@babel/types": "^7.10.4"
       },
       "dependencies": {
-        "@babel/code-frame": {
+        "@babel/helper-plugin-utils": {
           "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
-      }
-    },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz",
-      "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@babel/helper-validator-identifier": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-      "dev": true
-    },
-    "@babel/helper-wrap-function": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
-      "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
         },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+        "@babel/helper-remap-async-to-generator": {
+          "version": "7.11.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz",
+          "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
+            "@babel/helper-annotate-as-pure": "^7.10.4",
+            "@babel/helper-wrap-function": "^7.10.4",
+            "@babel/template": "^7.10.4",
             "@babel/types": "^7.10.4"
           }
-        }
-      }
-    },
-    "@babel/helpers": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
-      "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
         },
         "@babel/template": {
           "version": "7.10.4",
@@ -1734,42 +1366,6 @@
         }
       }
     },
-    "@babel/highlight": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
-      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.0.0",
-        "esutils": "^2.0.2",
-        "js-tokens": "^4.0.0"
-      },
-      "dependencies": {
-        "js-tokens": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/parser": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz",
-      "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==",
-      "dev": true
-    },
-    "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz",
-      "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-remap-async-to-generator": "^7.10.4",
-        "@babel/plugin-syntax-async-generators": "^7.8.0"
-      }
-    },
     "@babel/plugin-proposal-dynamic-import": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
@@ -1778,6 +1374,14 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-proposal-json-strings": {
@@ -1788,6 +1392,14 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-json-strings": "^7.8.0"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-proposal-nullish-coalescing-operator": {
@@ -1798,6 +1410,14 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-proposal-numeric-separator": {
@@ -1808,6 +1428,23 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        },
+        "@babel/plugin-syntax-numeric-separator": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+          "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/plugin-proposal-object-rest-spread": {
@@ -1819,6 +1456,14 @@
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
         "@babel/plugin-transform-parameters": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-proposal-optional-catch-binding": {
@@ -1829,6 +1474,14 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-proposal-optional-chaining": {
@@ -1840,6 +1493,14 @@
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0",
         "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-proposal-unicode-property-regex": {
@@ -1850,6 +1511,14 @@
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-syntax-async-generators": {
@@ -1889,12 +1558,12 @@
       }
     },
     "@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "version": "7.10.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz",
+      "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.10.1"
       }
     },
     "@babel/plugin-syntax-object-rest-spread": {
@@ -1906,13 +1575,13 @@
         "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
-    "@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz",
-      "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==",
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.1"
+        "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
     "@babel/plugin-syntax-optional-chaining": {
@@ -1931,6 +1600,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-arrow-functions": {
@@ -1940,6 +1617,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-async-to-generator": {
@@ -1951,6 +1636,46 @@
         "@babel/helper-module-imports": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-remap-async-to-generator": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-module-imports": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        },
+        "@babel/helper-remap-async-to-generator": {
+          "version": "7.11.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz",
+          "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-annotate-as-pure": "^7.10.4",
+            "@babel/helper-wrap-function": "^7.10.4",
+            "@babel/template": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/plugin-transform-block-scoped-functions": {
@@ -1960,6 +1685,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-block-scoping": {
@@ -1969,6 +1702,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-classes": {
@@ -1987,81 +1728,50 @@
         "globals": "^11.1.0"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.8.3"
-          }
-        },
         "@babel/helper-function-name": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
-          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-get-function-arity": "^7.8.3",
-            "@babel/template": "^7.8.3",
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-get-function-arity": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
-          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
-          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+          "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.8.3"
+            "@babel/helper-get-function-arity": "^7.10.4",
+            "@babel/template": "^7.10.4",
+            "@babel/types": "^7.10.4"
           }
         },
-        "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+        "@babel/helper-optimise-call-expression": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+          "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
           "dev": true,
           "requires": {
-            "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
-            "js-tokens": "^4.0.0"
+            "@babel/types": "^7.10.4"
           }
         },
-        "@babel/parser": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
-          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
           "dev": true
         },
-        "@babel/template": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+        "@babel/helper-split-export-declaration": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6"
+            "@babel/types": "^7.11.0"
           }
         },
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
           "dev": true,
           "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
           }
         }
       }
@@ -2073,6 +1783,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-destructuring": {
@@ -2082,6 +1800,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-dotall-regex": {
@@ -2092,6 +1818,14 @@
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-duplicate-keys": {
@@ -2101,6 +1835,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-exponentiation-operator": {
@@ -2111,6 +1853,14 @@
       "requires": {
         "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-for-of": {
@@ -2120,6 +1870,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-function-name": {
@@ -2130,6 +1888,14 @@
       "requires": {
         "@babel/helper-function-name": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-literals": {
@@ -2139,6 +1905,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-member-expression-literals": {
@@ -2148,6 +1922,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-modules-amd": {
@@ -2159,6 +1941,58 @@
         "@babel/helper-module-transforms": "^7.10.5",
         "@babel/helper-plugin-utils": "^7.10.4",
         "babel-plugin-dynamic-import-node": "^2.3.3"
+      },
+      "dependencies": {
+        "@babel/helper-module-imports": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-module-transforms": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+          "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-module-imports": "^7.10.4",
+            "@babel/helper-replace-supers": "^7.10.4",
+            "@babel/helper-simple-access": "^7.10.4",
+            "@babel/helper-split-export-declaration": "^7.11.0",
+            "@babel/template": "^7.10.4",
+            "@babel/types": "^7.11.0",
+            "lodash": "^4.17.19"
+          }
+        },
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.11.0"
+          }
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/plugin-transform-modules-commonjs": {
@@ -2171,6 +2005,58 @@
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-simple-access": "^7.10.4",
         "babel-plugin-dynamic-import-node": "^2.3.3"
+      },
+      "dependencies": {
+        "@babel/helper-module-imports": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-module-transforms": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+          "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-module-imports": "^7.10.4",
+            "@babel/helper-replace-supers": "^7.10.4",
+            "@babel/helper-simple-access": "^7.10.4",
+            "@babel/helper-split-export-declaration": "^7.11.0",
+            "@babel/template": "^7.10.4",
+            "@babel/types": "^7.11.0",
+            "lodash": "^4.17.19"
+          }
+        },
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.11.0"
+          }
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/plugin-transform-modules-systemjs": {
@@ -2183,6 +2069,58 @@
         "@babel/helper-module-transforms": "^7.10.5",
         "@babel/helper-plugin-utils": "^7.10.4",
         "babel-plugin-dynamic-import-node": "^2.3.3"
+      },
+      "dependencies": {
+        "@babel/helper-module-imports": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-module-transforms": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+          "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-module-imports": "^7.10.4",
+            "@babel/helper-replace-supers": "^7.10.4",
+            "@babel/helper-simple-access": "^7.10.4",
+            "@babel/helper-split-export-declaration": "^7.11.0",
+            "@babel/template": "^7.10.4",
+            "@babel/types": "^7.11.0",
+            "lodash": "^4.17.19"
+          }
+        },
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.11.0"
+          }
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/plugin-transform-modules-umd": {
@@ -2193,6 +2131,58 @@
       "requires": {
         "@babel/helper-module-transforms": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-module-imports": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-module-transforms": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+          "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-module-imports": "^7.10.4",
+            "@babel/helper-replace-supers": "^7.10.4",
+            "@babel/helper-simple-access": "^7.10.4",
+            "@babel/helper-split-export-declaration": "^7.11.0",
+            "@babel/template": "^7.10.4",
+            "@babel/types": "^7.11.0",
+            "lodash": "^4.17.19"
+          }
+        },
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.11.0"
+          }
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/plugin-transform-named-capturing-groups-regex": {
@@ -2211,6 +2201,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-object-super": {
@@ -2221,6 +2219,14 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-replace-supers": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-parameters": {
@@ -2231,6 +2237,14 @@
       "requires": {
         "@babel/helper-get-function-arity": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-property-literals": {
@@ -2240,6 +2254,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-regenerator": {
@@ -2258,6 +2280,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-runtime": {
@@ -2279,6 +2309,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-spread": {
@@ -2289,6 +2327,14 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-sticky-regex": {
@@ -2299,6 +2345,23 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-regex": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        },
+        "@babel/helper-regex": {
+          "version": "7.10.5",
+          "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+          "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
+          "dev": true,
+          "requires": {
+            "lodash": "^4.17.19"
+          }
+        }
       }
     },
     "@babel/plugin-transform-template-literals": {
@@ -2309,6 +2372,14 @@
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-typeof-symbol": {
@@ -2318,6 +2389,14 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/plugin-transform-unicode-regex": {
@@ -2328,6 +2407,14 @@
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+          "dev": true
+        }
       }
     },
     "@babel/preset-env": {
@@ -2495,6 +2582,14 @@
             "source-map": "^0.5.0"
           }
         },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+          "requires": {
+            "@babel/types": "^7.11.0"
+          }
+        },
         "@babel/highlight": {
           "version": "7.10.4",
           "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
@@ -2505,6 +2600,11 @@
             "js-tokens": "^4.0.0"
           }
         },
+        "@babel/parser": {
+          "version": "7.11.5",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz",
+          "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q=="
+        },
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -2848,120 +2948,14 @@
       "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==",
       "dev": true,
       "requires": {
-        "ajv": "^6.12.0",
-        "ajv-keywords": "^3.4.1"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "6.12.4",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
-          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-          "dev": true
-        }
-      }
-    },
-    "@dsherret/to-absolute-glob": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
-      "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=",
-      "dev": true,
-      "requires": {
-        "is-absolute": "^1.0.0",
-        "is-negated-glob": "^1.0.0"
-      }
-    },
-    "@electron/get": {
-      "version": "1.12.2",
-      "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz",
-      "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.1",
-        "env-paths": "^2.2.0",
-        "fs-extra": "^8.1.0",
-        "global-agent": "^2.0.2",
-        "global-tunnel-ng": "^2.7.1",
-        "got": "^9.6.0",
-        "progress": "^2.0.3",
-        "sanitize-filename": "^1.6.2",
-        "sumchecker": "^3.0.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "env-paths": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
-          "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
-          "dev": true
-        },
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.4",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
-          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
-      }
-    },
-    "@istanbuljs/schema": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
-      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
-      "dev": true
-    },
-    "@jsdevtools/coverage-istanbul-loader": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz",
-      "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==",
-      "dev": true,
-      "requires": {
-        "convert-source-map": "^1.7.0",
-        "istanbul-lib-instrument": "^4.0.1",
-        "loader-utils": "^1.4.0",
-        "merge-source-map": "^1.1.0",
-        "schema-utils": "^2.6.4"
+        "ajv": "^6.12.0",
+        "ajv-keywords": "^3.4.1"
       },
       "dependencies": {
         "ajv": {
-          "version": "6.12.3",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
-          "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
           "dev": true,
           "requires": {
             "fast-deep-equal": "^3.1.1",
@@ -2970,20 +2964,55 @@
             "uri-js": "^4.2.2"
           }
         },
-        "convert-source-map": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-          "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.1"
-          }
-        },
         "fast-deep-equal": {
           "version": "3.1.3",
           "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
           "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
           "dev": true
+        }
+      }
+    },
+    "@dsherret/to-absolute-glob": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
+      "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=",
+      "dev": true,
+      "requires": {
+        "is-absolute": "^1.0.0",
+        "is-negated-glob": "^1.0.0"
+      }
+    },
+    "@electron/get": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz",
+      "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "env-paths": "^2.2.0",
+        "fs-extra": "^8.1.0",
+        "global-agent": "^2.0.2",
+        "global-tunnel-ng": "^2.7.1",
+        "got": "^9.6.0",
+        "progress": "^2.0.3",
+        "sanitize-filename": "^1.6.2",
+        "sumchecker": "^3.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "env-paths": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
+          "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
+          "dev": true
         },
         "fs-extra": {
           "version": "8.1.0",
@@ -3213,15 +3242,31 @@
           "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
+          },
+          "dependencies": {
+            "lru-cache": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+              "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+              "dev": true,
+              "requires": {
+                "yallist": "^4.0.0"
+              }
+            },
+            "yallist": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+              "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+              "dev": true
+            }
           }
         },
         "lru-cache": {
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
           "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-          "dev": true,
           "requires": {
-            "yallist": "^4.0.0"
+            "yallist": "^3.0.2"
           }
         },
         "npm-package-arg": {
@@ -3259,8 +3304,7 @@
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-          "dev": true
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
         }
       }
     },
@@ -3926,7 +3970,6 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
       "requires": {
         "color-convert": "^1.9.0"
       },
@@ -3935,7 +3978,6 @@
           "version": "1.9.3",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
           "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
           "requires": {
             "color-name": "1.1.3"
           }
@@ -3943,8 +3985,7 @@
         "color-name": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
         }
       }
     },
@@ -4042,10 +4083,10 @@
             "universalify": "^1.0.0"
           }
         },
-        "esprima": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+        "graceful-fs": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
           "dev": true
         },
         "hosted-git-info": {
@@ -4057,6 +4098,12 @@
             "lru-cache": "^6.0.0"
           }
         },
+        "isbinaryfile": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz",
+          "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==",
+          "dev": true
+        },
         "js-yaml": {
           "version": "3.14.0",
           "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
@@ -4067,6 +4114,16 @@
             "esprima": "^4.0.0"
           }
         },
+        "jsonfile": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
+          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^1.0.0"
+          }
+        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -4078,6 +4135,12 @@
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
           "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
+        },
+        "universalify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "dev": true
         }
       }
     },
@@ -5266,10 +5329,10 @@
             "universalify": "^1.0.0"
           }
         },
-        "esprima": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+        "graceful-fs": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
           "dev": true
         },
         "has-flag": {
@@ -5288,6 +5351,16 @@
             "esprima": "^4.0.0"
           }
         },
+        "jsonfile": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
+          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^1.0.0"
+          }
+        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -5317,7 +5390,7 @@
       "integrity": "sha512-xBqv+8bg6cfnzAQK1k3OGpfaHg+QkPgIgpEkXNhouZ0WiUkyZCftuRc2LYzQrLucFywpa14Xbc6+hTbpq83yRA==",
       "dev": true,
       "requires": {
-        "debug": "^4.2.0",
+        "debug": "^4.1.1",
         "sax": "^1.2.4"
       },
       "dependencies": {
@@ -5425,15 +5498,6 @@
             "glob": "^7.1.3"
           }
         },
-        "rimraf": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
         "yallist": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -5598,7 +5662,6 @@
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
       "requires": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -5609,7 +5672,6 @@
           "version": "5.5.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
           "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
           "requires": {
             "has-flag": "^3.0.0"
           }
@@ -8627,21 +8689,10 @@
             "esprima": "^4.0.0"
           }
         },
-        "js-yaml": {
-          "version": "3.14.0",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
-          "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
         "jsonfile": {
           "version": "6.0.1",
           "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
           "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
-          "dev": true,
           "requires": {
             "graceful-fs": "^4.1.6",
             "universalify": "^1.0.0"
@@ -8650,8 +8701,7 @@
         "universalify": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
-          "dev": true
+          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug=="
         }
       }
     },
@@ -9086,7 +9136,7 @@
       "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
       "dev": true,
       "requires": {
-        "iconv-lite": "^0.6.2"
+        "iconv-lite": "~0.4.13"
       },
       "dependencies": {
         "iconv-lite": {
@@ -9394,13 +9444,7 @@
     "escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
-    },
-    "escaper": {
-      "version": "2.5.3",
-      "resolved": "https://registry.npmjs.org/escaper/-/escaper-2.5.3.tgz",
-      "integrity": "sha512-QGb9sFxBVpbzMggrKTX0ry1oiI4CSDAl9vIL702hzl1jGW8VZs7qfqTRX7WDOjoNDoEVGcEtu1ZOQgReSfT2kQ=="
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
     },
     "escodegen": {
       "version": "1.9.1",
@@ -9469,8 +9513,7 @@
     "esutils": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-      "dev": true
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
     },
     "etag": {
       "version": "1.8.1",
@@ -11129,8 +11172,7 @@
     "globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
     },
     "globalthis": {
       "version": "1.0.1",
@@ -11326,8 +11368,7 @@
     "graceful-fs": {
       "version": "4.1.15",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
-      "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
-      "dev": true
+      "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
     },
     "graphlib": {
       "version": "2.1.8",
@@ -11435,8 +11476,7 @@
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
     "has-symbols": {
       "version": "1.0.0",
@@ -12277,15 +12317,6 @@
         "is-extglob": "^2.1.1"
       }
     },
-    "is-installed-globally": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
-      "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
     "is-interactive": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@@ -12375,26 +12406,6 @@
       "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
       "dev": true
     },
-    "is-redirect": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
-      "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
-      "dev": true
-    },
-    "is-regex": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
-      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.1"
-      }
-    },
-    "is-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
-    },
     "is-relative": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
@@ -12465,110 +12476,30 @@
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
       "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
-      "dev": true
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
-    },
-    "isbinaryfile": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.4.tgz",
-      "integrity": "sha512-pEutbN134CzcjlLS1myKX/uxNjwU5eBVSprvkpv3+3dqhBHUZLIWJQowC40w5c0Zf19vBY8mrZl88y5J4RAPbQ==",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
-    },
-    "isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true
-    },
-    "istanbul-api": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz",
-      "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==",
-      "dev": true,
-      "requires": {
-        "async": "^2.6.2",
-        "compare-versions": "^3.4.0",
-        "fileset": "^2.0.3",
-        "istanbul-lib-coverage": "^2.0.5",
-        "istanbul-lib-hook": "^2.0.7",
-        "istanbul-lib-instrument": "^3.3.0",
-        "istanbul-lib-report": "^2.0.8",
-        "istanbul-lib-source-maps": "^3.0.6",
-        "istanbul-reports": "^2.2.4",
-        "js-yaml": "^3.13.1",
-        "make-dir": "^2.1.0",
-        "minimatch": "^3.0.4",
-        "once": "^1.4.0"
-      },
-      "dependencies": {
-        "istanbul-lib-coverage": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
-          "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
-          "dev": true
-        },
-        "istanbul-lib-instrument": {
-          "version": "3.3.0",
-          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
-          "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
-          "dev": true,
-          "requires": {
-            "@babel/generator": "^7.4.0",
-            "@babel/parser": "^7.4.3",
-            "@babel/template": "^7.4.0",
-            "@babel/traverse": "^7.4.3",
-            "@babel/types": "^7.4.0",
-            "istanbul-lib-coverage": "^2.0.5",
-            "semver": "^6.0.0"
-          }
-        },
-        "make-dir": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
-          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
-          "dev": true,
-          "requires": {
-            "pify": "^4.0.1",
-            "semver": "^5.6.0"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "5.7.1",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-              "dev": true
-            }
-          }
-        },
-        "pify": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-          "dev": true
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
     },
     "istanbul-lib-coverage": {
       "version": "3.0.0",
@@ -12592,7 +12523,6 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
           "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "dev": true,
           "requires": {
             "@babel/highlight": "^7.8.3"
           }
@@ -12601,19 +12531,16 @@
           "version": "7.8.8",
           "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
           "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
-          "dev": true,
           "requires": {
             "@babel/types": "^7.8.7",
             "jsesc": "^2.5.1",
-            "lodash": "^4.17.13",
-            "source-map": "^0.5.0"
+            "lodash": "^4.17.13"
           }
         },
         "@babel/helper-function-name": {
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
           "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
-          "dev": true,
           "requires": {
             "@babel/helper-get-function-arity": "^7.8.3",
             "@babel/template": "^7.8.3",
@@ -12624,7 +12551,6 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
           "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
-          "dev": true,
           "requires": {
             "@babel/types": "^7.8.3"
           }
@@ -12633,7 +12559,6 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
           "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
-          "dev": true,
           "requires": {
             "@babel/types": "^7.8.3"
           }
@@ -12642,7 +12567,6 @@
           "version": "7.8.3",
           "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
           "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
-          "dev": true,
           "requires": {
             "chalk": "^2.0.0",
             "esutils": "^2.0.2",
@@ -12652,14 +12576,12 @@
         "@babel/parser": {
           "version": "7.8.8",
           "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
-          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
-          "dev": true
+          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA=="
         },
         "@babel/template": {
           "version": "7.8.6",
           "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
           "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
-          "dev": true,
           "requires": {
             "@babel/code-frame": "^7.8.3",
             "@babel/parser": "^7.8.6",
@@ -12670,7 +12592,6 @@
           "version": "7.8.6",
           "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
           "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
-          "dev": true,
           "requires": {
             "@babel/code-frame": "^7.8.3",
             "@babel/generator": "^7.8.6",
@@ -12687,7 +12608,6 @@
           "version": "7.8.7",
           "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
           "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "dev": true,
           "requires": {
             "esutils": "^2.0.2",
             "lodash": "^4.17.13",
@@ -12698,7 +12618,6 @@
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
           "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
           "requires": {
             "ms": "^2.1.1"
           }
@@ -12706,8 +12625,7 @@
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
         },
         "semver": {
           "version": "6.3.0",
@@ -12928,8 +12846,7 @@
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
     "js-yaml": {
       "version": "3.13.1",
@@ -12958,8 +12875,7 @@
     "jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
     },
     "json-buffer": {
       "version": "3.0.0",
@@ -13098,18 +13014,6 @@
             "utils-merge": "1.0.1"
           }
         },
-        "connect": {
-          "version": "3.7.0",
-          "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
-          "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
-          "dev": true,
-          "requires": {
-            "debug": "2.6.9",
-            "finalhandler": "1.1.2",
-            "parseurl": "~1.3.3",
-            "utils-merge": "1.0.1"
-          }
-        },
         "fill-range": {
           "version": "7.0.1",
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -13119,6 +13023,16 @@
             "to-regex-range": "^5.0.1"
           }
         },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
         "glob": {
           "version": "7.1.6",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
@@ -13145,18 +13059,48 @@
           "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
           "dev": true
         },
+        "isbinaryfile": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz",
+          "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
         "mime": {
           "version": "2.4.6",
           "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
           "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
           "dev": true
         },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
         "parseurl": {
           "version": "1.3.3",
           "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
           "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
           "dev": true
         },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
         "rimraf": {
           "version": "3.0.2",
           "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -13409,21 +13353,6 @@
         "leven": "^3.1.0"
       }
     },
-    "leven": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
-      "dev": true
-    },
-    "levenary": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
-      "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
-      "dev": true,
-      "requires": {
-        "leven": "^3.1.0"
-      }
-    },
     "levn": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@@ -14280,24 +14209,6 @@
         "minipass": "^3.0.0"
       }
     },
-    "minizlib": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz",
-      "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0",
-        "yallist": "^4.0.0"
-      },
-      "dependencies": {
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
-        }
-      }
-    },
     "mississippi": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
@@ -15752,8 +15663,7 @@
     "path-parse": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-      "dev": true
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
     },
     "path-to-regexp": {
       "version": "0.1.7",
@@ -16786,6 +16696,12 @@
           "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
           "dev": true
         },
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
         "ansi-styles": {
           "version": "2.2.1",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
@@ -16881,6 +16797,36 @@
             "pinkie-promise": "^2.0.0"
           }
         },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
         "pify": {
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
@@ -17184,7 +17130,6 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dev": true,
       "requires": {
         "safe-buffer": "^5.1.0"
       }
@@ -17882,8 +17827,7 @@
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
     },
     "safe-regex": {
       "version": "1.1.0",
@@ -19199,17 +19143,6 @@
       "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz",
       "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="
     },
-    "string.prototype.trim": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
-      "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.2",
-        "es-abstract": "^1.5.0",
-        "function-bind": "^1.0.2"
-      }
-    },
     "string.prototype.trimend": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
@@ -19653,11 +19586,21 @@
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
         "minipass": "^3.0.0",
-        "minizlib": "^2.1.1",
+        "minizlib": "^2.1.0",
         "mkdirp": "^1.0.3",
         "yallist": "^4.0.0"
       },
       "dependencies": {
+        "minizlib": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+          "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.0.0",
+            "yallist": "^4.0.0"
+          }
+        },
         "mkdirp": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -19762,15 +19705,6 @@
             "randombytes": "^2.1.0"
           }
         },
-        "serialize-javascript": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
-          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
-          "dev": true,
-          "requires": {
-            "randombytes": "^2.1.0"
-          }
-        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -19869,8 +19803,7 @@
     "to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "dev": true
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
     },
     "to-object-path": {
       "version": "0.3.0",
@@ -20243,12 +20176,6 @@
       "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==",
       "dev": true
     },
-    "ua-parser-js": {
-      "version": "0.7.21",
-      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz",
-      "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==",
-      "dev": true
-    },
     "uglify-js": {
       "version": "3.5.4",
       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.4.tgz",
@@ -20957,7 +20884,6 @@
       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
       "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
       "dev": true,
-      "optional": true,
       "requires": {
         "chokidar": "^3.4.1",
         "graceful-fs": "^4.1.2",
@@ -21361,7 +21287,6 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
           "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
-          "dev": true,
           "requires": {
             "randombytes": "^2.1.0"
           }
@@ -21396,6 +21321,17 @@
             "terser": "^4.1.2",
             "webpack-sources": "^1.4.0",
             "worker-farm": "^1.7.0"
+          },
+          "dependencies": {
+            "serialize-javascript": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+              "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+              "dev": true,
+              "requires": {
+                "randombytes": "^2.1.0"
+              }
+            }
           }
         },
         "yallist": {
@@ -21682,34 +21618,6 @@
             "yargs-parser": "^13.1.2"
           }
         },
-        "yargs-parser": {
-          "version": "13.1.2",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
-          }
-        },
-        "yargs": {
-          "version": "13.3.2",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
-          "dev": true,
-          "requires": {
-            "cliui": "^5.0.0",
-            "find-up": "^3.0.0",
-            "get-caller-file": "^2.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^3.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^13.1.2"
-          }
-        },
         "yargs-parser": {
           "version": "13.1.2",
           "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
@@ -22004,39 +21912,10 @@
             "color-name": "~1.1.4"
           }
         },
-        "strip-ansi": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^5.0.0"
-          }
-        },
         "minimist": {
           "version": "1.2.5",
           "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
-          "dev": true,
-          "requires": {
-            "@types/color-name": "^1.1.1",
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
         },
         "strip-ansi": {
           "version": "6.0.0",
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 1342dd089..42fdd64be 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -44,7 +44,6 @@ import { HttpClientModule } from "@angular/common/http";
 import { FormsModule, ReactiveFormsModule } from "@angular/forms"; // <-- NgModel lives here
 import { ChartModule } from "angular2-chartjs";
 import { RouterModule, Routes } from "@angular/router";
-import { StorageServiceModule } from "ngx-webstorage-service";
 import { HotkeyModule } from "angular2-hotkeys";
 import { MatomoModule } from "ngx-matomo";
 
@@ -72,7 +71,6 @@ import { SectionCanvasComponent } from "./components/section-canvas/section-canv
 import { RemousResultsComponent } from "./components/remous-results/remous-results.component";
 import { ResultsChartComponent } from "./components/results-chart/results-chart.component";
 import { PabResultsComponent } from "./components/pab-results/pab-results.component";
-import { VerificateurResultsComponent } from "./components/verificateur-results/verificateur-results.component";
 import { PabResultsTableComponent } from "./components/pab-results/pab-results-table.component";
 import { PbResultsComponent } from "./components/pb-results/pb-results.component";
 import { PbResultsTableComponent } from "./components/pb-results/pb-results-table.component";
@@ -83,8 +81,8 @@ import { BaseParamInputComponent } from "./components/base-param-input/base-para
 import { FixedResultsComponent } from "./components/fixedvar-results/fixed-results.component";
 import { VarResultsComponent } from "./components/fixedvar-results/var-results.component";
 import { LogComponent } from "./components/log/log.component";
-import { LogEntryComponent } from "./components/log-entry/log-entry.component";
 import { LogDrawerComponent } from "./components/log-drawer/log-drawer.component";
+import { LogEntryComponent } from "./components/log-entry/log-entry.component";
 import { ParamLinkComponent } from "./components/param-link/param-link.component";
 import { PabProfileChartComponent } from "./components/pab-profile-chart/pab-profile-chart.component";
 import { PabTableComponent } from "./components/pab-table/pab-table.component";
@@ -98,6 +96,7 @@ import { MacrorugoCompoundResultsComponent } from "./components/macrorugo-compou
 import { JetResultsComponent } from "./components/jet-results/jet-results.component";
 import { JetTrajectoryChartComponent } from "./components/jet-trajectory-chart/jet-trajectory-chart.component";
 import { SessionPropertiesComponent } from "./components/session-properties/session-properties.component";
+import { VerificateurResultsComponent } from "./components/verificateur-results/verificateur-results.component";
 
 import { DialogConfirmEmptySessionComponent } from "./components/dialog-confirm-empty-session/dialog-confirm-empty-session.component";
 import { DialogConfirmCloseCalcComponent } from "./components/dialog-confirm-close-calc/dialog-confirm-close-calc.component";
@@ -106,11 +105,11 @@ import { DialogEditParamComputedComponent } from "./components/dialog-edit-param
 import { DialogEditParamValuesComponent } from "./components/dialog-edit-param-values/dialog-edit-param-values.component";
 import { DialogGeneratePABComponent } from "./components/dialog-generate-pab/dialog-generate-pab.component";
 import { DialogGeneratePARSimulationComponent } from "./components/dialog-generate-par-simulation/dialog-generate-par-simulation.component";
-import { DialogLoadPredefinedEspeceComponent } from "./components/dialog-load-predefined-espece/dialog-load-predefined-espece.component";
 import { DialogLoadSessionComponent } from "./components/dialog-load-session/dialog-load-session.component";
 import { DialogLogEntriesDetailsComponent } from "./components/dialog-log-entries-details/dialog-log-entries-details.component";
 import { DialogSaveSessionComponent } from "./components/dialog-save-session/dialog-save-session.component";
 import { DialogNewPbCloisonComponent } from "./components/dialog-new-pb-cloison/dialog-new-pb-cloison.component";
+import { DialogLoadPredefinedEspeceComponent } from "./components/dialog-load-predefined-espece/dialog-load-predefined-espece.component";
 
 import { JalhydAsyncModelValidationDirective } from "./directives/jalhyd-async-model-validation.directive";
 import {
@@ -151,129 +150,118 @@ const appRoutes: Routes = [
                 }
             }
         }),
-    MatBadgeModule,
-    MatButtonModule,
-    MatButtonToggleModule,
-    MatCardModule,
-    MatCheckboxModule,
-    MatDialogModule,
-    MaterialFileInputModule,
-    MatFormFieldModule,
-    MatIconModule,
-    MatInputModule,
-    MatListModule,
-    MatMenuModule,
-    MatProgressBarModule,
-    MatRadioModule,
-    MatSelectModule,
-    MatSidenavModule,
-    MatSnackBarModule,
-    MatTableModule,
-    MatTabsModule,
-    MatToolbarModule,
-    MatTooltipModule,
-    MatomoModule,
-    RouterModule.forRoot(
-      appRoutes,
-      {
-        useHash: true, // prevents reloading whole app when typing url in browser's navigation bar
-        enableTracing: false // debugging purposes only
-      }
-    ),
-    TableModule,
-    KonamiModule
-  ],
-  declarations: [ // composants, pipes et directives
-    AppComponent,
-    ApplicationSetupComponent,
-    BaseParamInputComponent,
-    CalcCanvasComponent,
-    CalculatorListComponent,
-    CalculatorNameComponent,
-    CalculatorResultsComponent,
-    DialogConfirmCloseCalcComponent,
-    DialogConfirmEmptySessionComponent,
-    DialogEditPabComponent,
-    DialogEditParamComputedComponent,
-    DialogEditParamValuesComponent,
-    DialogGeneratePABComponent,
-    DialogGeneratePARSimulationComponent,
-    DialogLoadSessionComponent,
-    DialogLogEntriesDetailsComponent,
-    DialogSaveSessionComponent,
-    DialogNewPbCloisonComponent,
-    FieldSetComponent,
-    FieldsetContainerComponent,
-    FixedResultsComponent,
-    FixedVarResultsComponent,
-    FlexGtXxsShowHideDirective,
-    FlexLtXsShowHideDirective,
-    FlexXxsShowHideDirective,
-    GenericCalculatorComponent,
-    ChartTypeSelectComponent,
-    JalhydAsyncModelValidationDirective,
-    JalhydModelValidationDirective,
-    JalhydModelValidationMinDirective,
-    JalhydModelValidationMaxDirective,
-    JalhydModelValidationStepDirective,
-    JetResultsComponent,
-    JetTrajectoryChartComponent,
-    LogComponent,
-    LogEntryComponent,
-    ModulesDiagramComponent,
-    NgParamInputComponent,
-    PabProfileChartComponent,
-    PabResultsComponent,
-    PabResultsTableComponent,
-    PabTableComponent,
-    PbResultsComponent,
-    PbCloisonResultsComponent,
-    PbResultsTableComponent,
-    PbSchemaComponent,
-    VariableResultsSelectorComponent,
-    MacrorugoCompoundResultsComponent,
-    MacrorugoCompoundResultsTableComponent,
-    ParamComputedComponent,
-    ParamFieldLineComponent,
-    ParamLinkComponent,
-    ParamValuesComponent,
-    QuicknavComponent,
-    RemousResultsComponent,
-    ResultsChartComponent,
-    SectionCanvasComponent,
-    SectionResultsComponent,
-    SelectFieldLineComponent,
-    SelectModelFieldLineComponent,
-    SessionPropertiesComponent,
-    VarResultsComponent
-  ],
-  entryComponents: [
-    DialogConfirmCloseCalcComponent,
-    DialogConfirmEmptySessionComponent,
-    DialogEditPabComponent,
-    DialogEditParamComputedComponent,
-    DialogEditParamValuesComponent,
-    DialogGeneratePABComponent,
-    DialogGeneratePARSimulationComponent,
-    DialogSaveSessionComponent,
-    DialogNewPbCloisonComponent,
-    DialogLoadSessionComponent,
-    DialogLogEntriesDetailsComponent
-  ],
+        MatBadgeModule,
+        MatButtonModule,
+        MatButtonToggleModule,
+        MatCardModule,
+        MatCheckboxModule,
+        MatDialogModule,
+        MaterialFileInputModule,
+        MatFormFieldModule,
+        MatIconModule,
+        MatInputModule,
+        MatListModule,
+        MatMenuModule,
+        MatProgressBarModule,
+        MatRadioModule,
+        MatSelectModule,
+        MatSidenavModule,
+        MatSnackBarModule,
+        MatTableModule,
+        MatTabsModule,
+        MatToolbarModule,
+        MatTooltipModule,
+        MatomoModule,
+        RouterModule.forRoot(
+        appRoutes,
+        {
+            useHash: true, // prevents reloading whole app when typing url in browser's navigation bar
+            enableTracing: false // debugging purposes only
+        }
+        ),
+        TableModule,
+        KonamiModule
+    ],
+    declarations: [ // composants, pipes et directives
+        AppComponent,
+        ApplicationSetupComponent,
+        BaseParamInputComponent,
+        CalcCanvasComponent,
+        CalculatorListComponent,
+        CalculatorNameComponent,
+        CalculatorResultsComponent,
+        DialogConfirmCloseCalcComponent,
+        DialogConfirmEmptySessionComponent,
+        DialogEditPabComponent,
+        DialogEditParamComputedComponent,
+        DialogEditParamValuesComponent,
+        DialogGeneratePABComponent,
+        DialogGeneratePARSimulationComponent,
+        DialogLoadSessionComponent,
+        DialogLogEntriesDetailsComponent,
+        DialogSaveSessionComponent,
+        DialogNewPbCloisonComponent,
+        DialogLoadPredefinedEspeceComponent,
+        FieldSetComponent,
+        FieldsetContainerComponent,
+        FixedResultsComponent,
+        FixedVarResultsComponent,
+        FlexGtXxsShowHideDirective,
+        FlexLtXsShowHideDirective,
+        FlexXxsShowHideDirective,
+        GenericCalculatorComponent,
+        ChartTypeSelectComponent,
+        JalhydAsyncModelValidationDirective,
+        JalhydModelValidationDirective,
+        JalhydModelValidationMinDirective,
+        JalhydModelValidationMaxDirective,
+        JalhydModelValidationStepDirective,
+        JetResultsComponent,
+        JetTrajectoryChartComponent,
+        LogComponent,
+        LogDrawerComponent,
+        LogEntryComponent,
+        ModulesDiagramComponent,
+        NgParamInputComponent,
+        PabProfileChartComponent,
+        PabResultsComponent,
+        PabResultsTableComponent,
+        PabTableComponent,
+        PbResultsComponent,
+        PbCloisonResultsComponent,
+        PbResultsTableComponent,
+        PbSchemaComponent,
+        VariableResultsSelectorComponent,
+        MacrorugoCompoundResultsComponent,
+        MacrorugoCompoundResultsTableComponent,
+        ParamComputedComponent,
+        ParamFieldLineComponent,
+        ParamLinkComponent,
+        ParamValuesComponent,
+        QuicknavComponent,
+        RemousResultsComponent,
+        ResultsChartComponent,
+        SectionCanvasComponent,
+        SectionResultsComponent,
+        SelectFieldLineComponent,
+        SessionPropertiesComponent,
+        VarResultsComponent,
+        VerificateurResultsComponent
+    ],
   providers: [ // services
-    ApplicationSetupService,
-    CustomBreakPointsProvider,
-    FormulaireService,
-    HttpService,
-    I18nService,
-    NotificationsService,
-    {
-      provide: ErrorStateMatcher,
-      useClass: ImmediateErrorStateMatcher
-    }
-  ],
-  schemas: [ NO_ERRORS_SCHEMA ],
-  bootstrap: [ AppComponent ]
+        ApplicationSetupService,
+        CustomBreakPointsProvider,
+        FormulaireService,
+        HttpService,
+        I18nService,
+        NotificationsService,
+        {
+        provide: ErrorStateMatcher,
+        useClass: ImmediateErrorStateMatcher
+        }
+    ],
+    schemas: [ NO_ERRORS_SCHEMA ],
+    bootstrap: [ AppComponent ]
 })
 
 export class AppModule { }
diff --git a/src/app/components/calculator-list/calculator-list.component.ts b/src/app/components/calculator-list/calculator-list.component.ts
index 8a6b1c528..fcc96d90f 100644
--- a/src/app/components/calculator-list/calculator-list.component.ts
+++ b/src/app/components/calculator-list/calculator-list.component.ts
@@ -143,7 +143,7 @@ export class CalculatorListComponent implements OnInit {
     }
 
     public async create(t: CalculatorType) {
-        const f: FormulaireDefinition = await ServiceFactory.instance.formulaireService.createFormulaire(t);
+        const f: FormulaireDefinition = await ServiceFactory.formulaireService.createFormulaire(t);
         await this.router.navigate(["/calculator", f.uid]);
         // on ajoute un ouvrage après l'ouverture du module de calcul "ouvrages parallèles"
         if (f instanceof FormulaireParallelStructure) {
diff --git a/src/app/components/calculator-results/calculator-results.component.ts b/src/app/components/calculator-results/calculator-results.component.ts
index c8c6b712f..8c36c651c 100644
--- a/src/app/components/calculator-results/calculator-results.component.ts
+++ b/src/app/components/calculator-results/calculator-results.component.ts
@@ -146,6 +146,10 @@ export class CalculatorResultsComponent implements AfterViewChecked {
         return this.calculatorComponent.isPAB;
     }
 
+    public get isPB(): boolean {
+        return this.calculatorComponent.is(CalculatorType.PreBarrage);
+    }
+
     public get isRemous(): boolean {
         return this.calculatorComponent.is(CalculatorType.CourbeRemous);
     }
diff --git a/src/app/components/dialog-generate-par-simulation/dialog-generate-par-simulation.component.ts b/src/app/components/dialog-generate-par-simulation/dialog-generate-par-simulation.component.ts
index 1432867c0..b7aaf61d7 100644
--- a/src/app/components/dialog-generate-par-simulation/dialog-generate-par-simulation.component.ts
+++ b/src/app/components/dialog-generate-par-simulation/dialog-generate-par-simulation.component.ts
@@ -3,7 +3,7 @@ import { Inject, Component } from "@angular/core";
 
 import { I18nService } from "../../services/internationalisation.service";
 import { MultiDimensionResults } from "../../results/multidimension-results";
-import { longestVarParam, fv } from "../../util";
+import { fv, longestVarParam } from "../../util";
 
 @Component({
     selector: "dialog-generate-par-simulation",
@@ -35,12 +35,12 @@ export class DialogGeneratePARSimulationComponent {
             // pre-extract variable parameters values
             this.varValues = [];
             // find longest list
-            const lvp = longestVarNgParam(this._results.variatedParameters);
+            const lvp = longestVarParam(this._results.variatedParameters);
             this.size = lvp.size;
             // get extended values lists for each variable parameter
             for (const v of this._results.variatedParameters) {
                 const vv = [];
-                const iter = v.getExtendedValuesIterator(this.size);
+                const iter = v.param.getExtendedValuesIterator(this.size);
                 while (iter.hasNext) {
                     const nv = iter.next();
                     vv.push(fv(nv.value));
@@ -87,13 +87,13 @@ export class DialogGeneratePARSimulationComponent {
         for (let i = 0; i < this.varValues.length; i++) {
             const vv = this.varValues[i];
             const vp = this._results.variatedParameters[i];
-            let symbol = vp.symbol;
+            let symbol = vp.param.symbol;
             // is vp a parameter of a child Nub ?
             if (
-                vp.paramDefinition.parentNub
-                && vp.paramDefinition.parentNub !== vp.paramDefinition.originNub
+                vp.param.parentNub
+                && vp.param.parentNub !== vp.param.originNub
             ) {
-                const pos = vp.paramDefinition.parentNub.findPositionInParent() + 1;
+                const pos = vp.param.parentNub.findPositionInParent() + 1;
                 symbol = this.intlService.localizeText("INFO_LIB_RADIER_N_COURT") + pos + "_" + symbol;
             }
             kv.push(`${symbol} = ${vv[index]}`);
diff --git a/src/app/components/dialog-load-session/dialog-load-session.component.ts b/src/app/components/dialog-load-session/dialog-load-session.component.ts
index 409358f0a..c9d6f5793 100644
--- a/src/app/components/dialog-load-session/dialog-load-session.component.ts
+++ b/src/app/components/dialog-load-session/dialog-load-session.component.ts
@@ -148,7 +148,7 @@ export class DialogLoadSessionComponent {
         this.loadingError = false;
         this.loadingComplete = false;
 
-        const formService = ServiceFactory.instance.formulaireService;
+        const formService = ServiceFactory.formulaireService;
         try {
           const calcInfos: any = await formService.calculatorInfosFromSessionFile(this.file);
           this.fileFormatVersion = calcInfos.formatVersion;
diff --git a/src/app/components/field-set/field-set.component.ts b/src/app/components/field-set/field-set.component.ts
index 2d53d8e4d..2dba32318 100644
--- a/src/app/components/field-set/field-set.component.ts
+++ b/src/app/components/field-set/field-set.component.ts
@@ -221,7 +221,7 @@ export class FieldSetComponent implements DoCheck {
 
     /**
      * calcul de la validité de tous les ParamFieldLineComponent et tous les
-     * SelectModelFieldLineComponent de la vue
+     * SelectFieldLineComponent de la vue
      */
     private updateValidity() {
         this._isValid = false;
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 93b0569ee..4951178b6 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -471,8 +471,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
                     this._calculatorNameComponent.model = this._formulaire;
                     // reload localisation in all cases (it does not eat bread)
                     this.formulaireService.updateFormulaireLocalisation(this._formulaire);
-                    // call Form init hook
-                    this._formulaire.onCalculatorInit();
                     break;
             }
         } else if (sender instanceof FormulaireDefinition) {
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index 0327b95aa..e8b9a8835 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -1,11 +1,11 @@
 import { FormulaireParallelStructure } from "./form-parallel-structures";
-import { SelectFieldNub } from "../elements/select-field-nub";
 
 import { IObservable, Nub, PbCloison, PbBassin, Structure } from "jalhyd";
 import { FieldSet } from "../elements/fieldset";
 import { FormulaireNode } from "../elements/formulaire-node";
 import { FieldsetContainer } from "../elements/fieldset-container";
 import { FormulairePrebarrage } from "./form-prebarrage";
+import { SelectFieldCustom } from "../elements/select-field-custom";
 
 export class FormulairePbCloison extends FormulaireParallelStructure {
 
@@ -21,8 +21,8 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
         this._downstreamBasinSelectId = this.getOption(json, "downstreamBasinSelectId");
     }
 
-    protected completeParse(json: {}) {
-        super.completeParse(json);
+    protected completeParse(firstNotif: boolean = true) {
+        super.completeParse(firstNotif);
         if (this._upstreamBasinSelectId) {
             const sel = this.getFormulaireNodeById(this._upstreamBasinSelectId);
             if (sel) {
@@ -68,7 +68,7 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
             }
         }
 
-        if (sender instanceof SelectFieldNub) {
+        if (sender instanceof SelectFieldCustom) {
             const nub = this._currentNub as PbCloison;
             const pb = nub.parent;
             // empty "" data.value.value should return undefined, which is good for amont/aval
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index d791856ac..ef81a7f79 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -86,7 +86,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
                     throw new Error(`type d'objet de module de calcul ${type} non pris en charge`);
             }
         }
-        this.completeParse(this._jsonConfig);
+        this.completeParse();
     }
 
     private parse_subform(json: {}) {
@@ -137,7 +137,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.basinForm.currentNub = node;
             this.basinForm.preparseConfig(this.basinFormConfig);
             this.basinForm.parseConfig(this.basinFormConfig);
-            ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(this.basinForm);
+            ServiceFactory.formulaireService.updateFormulaireLocalisation(this.basinForm);
             this.showFormElements(this.basinForm);
 
         } else if (node instanceof PbCloison) {
@@ -148,7 +148,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
             this.wallForm.parseConfig(this.wallFormConfig);
             // subscribe to upstream/downstream basin change
             this.wallForm.addObserver(this); // @TODO why not this.form ? wallForm is just a dummy form to extract elements from…
-            ServiceFactory.instance.formulaireService.loadUpdateFormulaireLocalisation(this.wallForm);
+            ServiceFactory.formulaireService.updateFormulaireLocalisation(this.wallForm);
             // add fieldsets for existing Structures
             if (node.structures.length > 0) {
                 for (const struct of node.structures) {
diff --git a/src/app/formulaire/definition/form-verificateur.ts b/src/app/formulaire/definition/form-verificateur.ts
index 1f712ada6..b357c4a0d 100644
--- a/src/app/formulaire/definition/form-verificateur.ts
+++ b/src/app/formulaire/definition/form-verificateur.ts
@@ -1,10 +1,9 @@
-import { IObservable, Nub, Verificateur, Result } from "jalhyd";
+import { IObservable, Nub, Verificateur, Result, VariatedDetails } from "jalhyd";
 
 import { SelectFieldCustom } from "../elements/select-field-custom";
 import { FormulaireFixedVar } from "./form-fixedvar";
 import { VerificateurResults } from "../../results/verificateur-results";
 import { CalculatorResults } from "../../results/calculator-results";
-import { NgParameter } from "../elements/ngparam";
 import { ServiceFactory } from "../../services/service-factory";
 
 /**
@@ -36,7 +35,7 @@ export class FormulaireVerificateur extends FormulaireFixedVar {
         this.reaffectResultComponents();
     }
 
-    protected findPassVariatedParameters(): NgParameter[] {
+    protected findPassVariatedParameters(): VariatedDetails[] {
         let pvp = [];
         const passUid = this.verificateurNub.nubToVerify.uid;
         const passForm = ServiceFactory.formulaireService.getFormulaireFromNubId(passUid);
diff --git a/src/app/results/prebarrage-results.ts b/src/app/results/prebarrage-results.ts
index 36ad3f189..4fba21da8 100644
--- a/src/app/results/prebarrage-results.ts
+++ b/src/app/results/prebarrage-results.ts
@@ -51,7 +51,7 @@ export class PrebarrageResults extends MultiDimensionResults {
             if (sn.parent) {
                 ct = sn.parent.calcType;
             }
-            let label = ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct , h);
+            let label = ServiceFactory.formulaireService.expandVariableNameAndUnit(ct , h);
             label += this.getHelpLink(h);
             return label;
         });
-- 
GitLab


From f3a00fd9a95790e973105e27fd733ba68177e76c Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 4 Sep 2020 12:14:44 +0200
Subject: [PATCH 70/92] Fix missing translations

---
 src/app/calculators/pbcloison/en.json | 31 +--------------------------
 src/app/calculators/pbcloison/fr.json | 31 +--------------------------
 src/locale/messages.en.json           |  2 ++
 src/locale/messages.fr.json           |  2 ++
 4 files changed, 6 insertions(+), 60 deletions(-)

diff --git a/src/app/calculators/pbcloison/en.json b/src/app/calculators/pbcloison/en.json
index 83f004a88..e621e15fb 100644
--- a/src/app/calculators/pbcloison/en.json
+++ b/src/app/calculators/pbcloison/en.json
@@ -3,34 +3,5 @@
     "fs_wall_device": "Device",
 
     "select_upstream_basin": "Upstream basin",
-    "select_downstream_basin": "Downstream basin",
-
-    "select_structure_Orifice": "Orifice",
-    "select_structure_VanneRectangulaire": "Rectangular gate",
-    "select_structure_SeuilRectangulaire": "Rectangular weir",
-    "select_structure_SeuilTriangulaire": "Triangular weir",
-    "select_structure_SeuilTriangulaireTrunc": "Truncated triangular weir",
-
-    "select_loidebit_Orifice_OrificeSubmerged": "Submerged orifice",
-    "select_loidebit_Orifice_OrificeFree": "Free orifice",
-
-    "select_loidebit_VanneRectangulaire_GateCem88d": "Weir/Orifice Cemagref 88",
-    "select_loidebit_VanneRectangulaire_GateCem88v": "Weir/Undershot gate Cemagref 88",
-    "select_loidebit_VanneRectangulaire_GateCunge80": "Cunge (1980)",
-    "select_loidebit_VanneRectangulaire_RectangularOrificeFree": "Free flow gate",
-    "select_loidebit_VanneRectangulaire_RectangularOrificeSubmerged": "Submerged gate",
-
-    "select_loidebit_SeuilTriangulaire_TriangularWeirFree": "V-notch sharp-crested weir (Villemonte)",
-    "select_loidebit_SeuilTriangulaire_TriangularWeirBroad": "V-notch broad-crested weir (Bos)",
-
-    "select_loidebit_SeuilTriangulaireTrunc_TriangularTruncWeirFree": "Truncated triangular weir (Villemonte)",
-
-    "select_loidebit_SeuilRectangulaire_WeirCem88d": "Weir/Orifice Cemagref 88",
-    "select_loidebit_SeuilRectangulaire_WeirCem88v": "Weir/Undershot gate Cemagref 88",
-    "select_loidebit_SeuilRectangulaire_WeirSubmergedLarinier": "Submerged slot (Larinier 1992)",
-    "select_loidebit_SeuilRectangulaire_WeirSubmerged": "Submerged weir",
-    "select_loidebit_SeuilRectangulaire_WeirVillemonte": "Villemonte 1957",
-    "select_loidebit_SeuilRectangulaire_WeirFree": "Free flow weir",
-    "select_loidebit_SeuilRectangulaire_KIVI": "Kindsvater-Carter and Villemonte",
-    "select_loidebit_SeuilRectangulaire_WeirCunge80": "Cunge (1980)"
+    "select_downstream_basin": "Downstream basin"
 }
diff --git a/src/app/calculators/pbcloison/fr.json b/src/app/calculators/pbcloison/fr.json
index e02e713f3..472d7d897 100644
--- a/src/app/calculators/pbcloison/fr.json
+++ b/src/app/calculators/pbcloison/fr.json
@@ -3,34 +3,5 @@
     "fs_wall_device": "Ouvrage",
 
     "select_upstream_basin": "Bassin amont",
-    "select_downstream_basin": "Bassin aval",
-
-    "select_structure_Orifice": "Orifice",
-    "select_structure_SeuilRectangulaire": "Seuil rectangulaire",
-    "select_structure_SeuilTriangulaire": "Seuil triangulaire",
-    "select_structure_SeuilTriangulaireTrunc": "Seuil triangulaire tronqué",
-    "select_structure_VanneRectangulaire": "Vanne rectangulaire",
-
-    "select_loidebit_Orifice_OrificeSubmerged": "Orifice noyé",
-    "select_loidebit_Orifice_OrificeFree": "Orifice dénoyé",
-
-    "select_loidebit_VanneRectangulaire_GateCem88d": "Déversoir/Orifice Cemagref 88",
-    "select_loidebit_VanneRectangulaire_GateCem88v": "Déversoir/Vanne de fond Cemagref 88",
-    "select_loidebit_VanneRectangulaire_GateCunge80": "Cunge (1980)",
-    "select_loidebit_VanneRectangulaire_RectangularOrificeFree": "Vanne dénoyée",
-    "select_loidebit_VanneRectangulaire_RectangularOrificeSubmerged": "Vanne noyée",
-
-    "select_loidebit_SeuilTriangulaire_TriangularWeirFree": "Déversoir triangulaire mince (Villemonte)",
-    "select_loidebit_SeuilTriangulaire_TriangularWeirBroad": "Déversoir triangulaire épais (Bos)",
-
-    "select_loidebit_SeuilTriangulaireTrunc_TriangularTruncWeirFree": "Déversoir triangulaire tronqué (Villemonte)",
-
-    "select_loidebit_SeuilRectangulaire_WeirCem88d": "Déversoir/Orifice Cemagref 88",
-    "select_loidebit_SeuilRectangulaire_WeirCem88v": "Déversoir/Vanne de fond Cemagref 88",
-    "select_loidebit_SeuilRectangulaire_WeirSubmergedLarinier": "Fente noyée (Larinier 1992)",
-    "select_loidebit_SeuilRectangulaire_WeirSubmerged": "Seuil noyé",
-    "select_loidebit_SeuilRectangulaire_WeirVillemonte": "Villemonte 1957",
-    "select_loidebit_SeuilRectangulaire_WeirFree": "Seuil dénoyé",
-    "select_loidebit_SeuilRectangulaire_KIVI": "Kindsvater-Carter et Villemonte",
-    "select_loidebit_SeuilRectangulaire_WeirCunge80": "Cunge (1980)"
+    "select_downstream_basin": "Bassin aval"
 }
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 9f3f67c26..c0e3e9e1a 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -52,8 +52,10 @@
     "ERROR_PARAMDEF_VALUE_UNDEFINED": "value of '%symbol%' parameter is undefined",
     "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "invalid %minValue%/%maxValue% min/max boundaries for 'interval' parameter definition domain",
     "ERROR_PARAMDOMAIN_INVALID": "parameter '%symbol%: non supported '%domain%' definition domain",
+    "ERROR_PREBARRAGE_NON_CONVERGENCE": "Pre-sam: non-convergence of the calculation",
     "ERROR_PROBLEM_LOADING_SESSION": "Session loaded, with errors",
     "ERROR_REMOUS_NO_WATER_LINE": "No water line can be calculated",
+    "ERROR_STRUCTURE_AU_MOINS_UNE": "A structure needs at least one device",
     "WARNING_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Upstream boundary condition < Critical elevation: no possible calculation from upstream",
     "WARNING_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Downstream boundary condition < Critical elevation: no possible calculation from downstream",
     "ERROR_REMOUS_PAS_CALCUL": "No possible calculation, neither from upstream nor from downstream",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index e71c1d1a2..e83b62b87 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -52,8 +52,10 @@
     "ERROR_PARAMDEF_VALUE_UNDEFINED": "La valeur du paramètre %symbol% n'est pas définie",
     "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "Les bornes (%minValue%/%maxValue%) de l'intervalle sont incorrectes",
     "ERROR_PARAMDOMAIN_INVALID": "Paramètre '%symbol%'&nbsp;: le domaine de définition '%domain%' est incorrect",
+    "ERROR_PREBARRAGE_NON_CONVERGENCE": "Pré-barrage&nbsp;: non convergence du calcul",
     "ERROR_PROBLEM_LOADING_SESSION": "Session chargée, avec des erreurs",
     "ERROR_REMOUS_NO_WATER_LINE": "Aucune ligne d'eau ne peut être calculée",
+    "ERROR_STRUCTURE_AU_MOINS_UNE": "Il faut au moins un ouvrage dans une structure",
     "WARNING_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Condition limite amont > Hauteur critique&nbsp;: pas de calcul possible depuis l'amont",
     "WARNING_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Condition limite aval < Hauteur critique&nbsp;: pas de calcul possible depuis l'aval",
     "ERROR_REMOUS_PAS_CALCUL": "Aucun calcul possible ni depuis l'amont ni depuis l'aval",
-- 
GitLab


From 3410bfb71c414377a1e7d59501d5ddccd24d6726 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 4 Sep 2020 12:30:22 +0200
Subject: [PATCH 71/92] Restore entry component (rebase bug)

---
 src/app/app.module.ts | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 42fdd64be..59f49747f 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -248,7 +248,21 @@ const appRoutes: Routes = [
         VarResultsComponent,
         VerificateurResultsComponent
     ],
-  providers: [ // services
+    entryComponents: [
+        DialogConfirmCloseCalcComponent,
+        DialogConfirmEmptySessionComponent,
+        DialogEditPabComponent,
+        DialogEditParamComputedComponent,
+        DialogEditParamValuesComponent,
+        DialogGeneratePABComponent,
+        DialogGeneratePARSimulationComponent,
+        DialogLoadPredefinedEspeceComponent,
+        DialogSaveSessionComponent,
+        DialogNewPbCloisonComponent,
+        DialogLoadSessionComponent,
+        DialogLogEntriesDetailsComponent
+    ],
+    providers: [ // services
         ApplicationSetupService,
         CustomBreakPointsProvider,
         FormulaireService,
-- 
GitLab


From 8fa2f3024cfa3071ca49680da62e3212578d0c57 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 4 Sep 2020 15:48:50 +0200
Subject: [PATCH 72/92] Update e2e for Prebarrage

---
 e2e/calculate-all-params.e2e-spec.ts    | 19 ++++++++++++++++---
 e2e/calculate-linked-params.e2e-spec.ts |  4 ++--
 e2e/calculator.po.ts                    |  8 +++++---
 e2e/tested_calctypes.ts                 |  3 ++-
 src/app/config.json                     |  2 +-
 src/locale/messages.en.json             |  1 +
 src/locale/messages.fr.json             |  1 +
 7 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/e2e/calculate-all-params.e2e-spec.ts b/e2e/calculate-all-params.e2e-spec.ts
index 18a2f844b..a74e4e138 100644
--- a/e2e/calculate-all-params.e2e-spec.ts
+++ b/e2e/calculate-all-params.e2e-spec.ts
@@ -2,7 +2,7 @@ import { ListPage } from "./list.po";
 import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
-import { browser, element, by, ElementFinder } from "protractor";
+import { browser, element, by } from "protractor";
 import { testedCalcTypes } from "./tested_calctypes";
 
 /**
@@ -36,8 +36,13 @@ describe("ngHyd − calculate all parameters of all calculators", async () => {
 
     // for each calculator
     for (const ct of calcTypes) {
-        if (ct === 22) {
-            // omit 22 - Solveur is not calculated here because it is not independent
+        if ([ 22, 31, 32, 33, 34 ].includes(ct)) {
+            // omit 22 - Solveur
+            // omit 31 - PbCloison
+            // omit 32 - PbBassin
+            // omit 33 - Espece
+            // omit 34 - Verificateur
+            // (not calculated here because they are not independent)
             continue;
         }
         describe(" − calculate all parameters of calculator type [" + ct + "]", async () => {
@@ -53,6 +58,14 @@ describe("ngHyd − calculate all parameters of all calculators", async () => {
                 if (inputs.length > 0) {
                     // for each param
                     for (let i = 0; i < inputs.length; i++) {
+                        // for PreBarrage, switch back to "input" after calculating, so
+                        // that the calculable parameters are shown
+                        if (ct === 30 && i > 0) {
+                            // prevents "Element is not clickable at point"
+                            await browser.executeScript("window.scrollTo(0, 0);");
+                            const inputLink = element(by.css("#pb-data-results-selector .drs-item a"));
+                            await inputLink.click();
+                        }
                         // grab input again because calculating the module just refreshed all the fieldsets
                         const input = (await calcPage.getParamInputsHavingCalcMode())[i];
                         // click "calc" mode button for this parameter
diff --git a/e2e/calculate-linked-params.e2e-spec.ts b/e2e/calculate-linked-params.e2e-spec.ts
index 443e7939b..3436c8092 100644
--- a/e2e/calculate-linked-params.e2e-spec.ts
+++ b/e2e/calculate-linked-params.e2e-spec.ts
@@ -287,7 +287,7 @@ describe("ngHyd − calculate with linked parameters", () => {
         let frt = calcPage.getFixedResultsTable();
         let volumeRow = calcPage.getNthRow(frt, 3);
         let volumeCol = calcPage.getNthColumn(volumeRow, 2);
-        let volume = await volumeCol.getText();
+        let volume = await volumeCol.getAttribute("textContent");
         expect(Number(volume)).toBeCloseTo(44.565, 3);
 
         // click PAB-Nombre tab
@@ -302,7 +302,7 @@ describe("ngHyd − calculate with linked parameters", () => {
         frt = calcPage.getFixedResultsTable();
         volumeRow = calcPage.getNthRow(frt, 3);
         volumeCol = calcPage.getNthColumn(volumeRow, 2);
-        volume = await volumeCol.getText();
+        volume = await volumeCol.getAttribute("textContent");
         expect(Number(volume)).toBeCloseTo(44.565, 3);
     });
 
diff --git a/e2e/calculator.po.ts b/e2e/calculator.po.ts
index 6053029af..1194295c9 100644
--- a/e2e/calculator.po.ts
+++ b/e2e/calculator.po.ts
@@ -80,11 +80,11 @@ export class CalculatorPage {
     }
 
     getAllVariatedResultsTableHeaders() {
-        return element.all(by.css("var-results table thead th"));
+        return element.all(by.css("fixedvar-results var-results table thead th"));
     }
 
     getAllVariatedResultsRows() {
-        return element.all(by.css("var-results table tbody tr"));
+        return element.all(by.css("fixedvar-results var-results table tbody tr"));
     }
 
     scrollTo(elt: ElementFinder) {
@@ -131,6 +131,8 @@ export class CalculatorPage {
             ||
             await this.presentAndVisible("pab-results pab-results-table")
             ||
+            await this.presentAndVisible("pb-results pb-results-table")
+            ||
             await this.presentAndVisible("macrorugo-compound-results macrorugo-compound-results-table")
             ||
             await this.presentAndVisible("jet-results .fixed-results-container")
@@ -294,7 +296,7 @@ export class CalculatorPage {
                 if (!hasDot && !hasExponent && !isN) {
                     keys = "." + keys;
                 }
-                if (! isOb) {
+                if (! isOb && await i.getAttribute("disabled") === null) {
                     await i.sendKeys(keys);
                 }
             }
diff --git a/e2e/tested_calctypes.ts b/e2e/tested_calctypes.ts
index 49b141aac..cdd1fc766 100644
--- a/e2e/tested_calctypes.ts
+++ b/e2e/tested_calctypes.ts
@@ -9,6 +9,7 @@ export const testedCalcTypes = [
     // omit 16 - CloisonAval
     17, 18, 19, 20, 21, 22, 23, 24, 25,
     // omit 26 - YAXN
-    27, 28, 29, 30
+    27, 28, 29, 30,
     // omit 31 - PbCloison and 32 - PbBassin
+    33, 34
 ];
diff --git a/src/app/config.json b/src/app/config.json
index 6a7b7f921..97f3c60d6 100644
--- a/src/app/config.json
+++ b/src/app/config.json
@@ -39,7 +39,7 @@
                 "path": "verification.jpg",
                 "credits": "S. Richard / OFB"
             },
-            "calculators": [ 31, 30 ]
+            "calculators": [ 34, 33 ]
         },
         {
             "name": "DEVALAISON",
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index c0e3e9e1a..2e3202b0d 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -536,6 +536,7 @@
     "INFO_PB_NEW_WALL_DOWN_BASIN": "Downstream basin",
     "INFO_PB_SCHEMA": "Basins layout",
     "INFO_PREBARRAGE_TITRE": "Pre-dams",
+    "INFO_PREBARRAGE_DESCRIPTION": "fishes basins cross-walls barrages",
     "INFO_PREBARRAGE_TITRE_COURT": "Pre-dams",
     "INFO_QUICKNAV_CHARTS": "charts",
     "INFO_QUICKNAV_INPUT": "input",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index e83b62b87..ac6778e51 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -537,6 +537,7 @@
     "INFO_PB_NEW_WALL_DOWN_BASIN": "Bassin aval",
     "INFO_PB_SCHEMA": "Organisation des bassins",
     "INFO_PREBARRAGE_TITRE": "Prébarrages",
+    "INFO_PREBARRAGE_DESCRIPTION": "poissons cloisons bassins",
     "INFO_PREBARRAGE_TITRE_COURT": "Prébarrages",
     "INFO_QUICKNAV_CHARTS": "graphiques",
     "INFO_QUICKNAV_INPUT": "données",
-- 
GitLab


From e845326e2a3e4d3bf9fbc599af2179926f8aca9a Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 4 Sep 2020 16:09:27 +0200
Subject: [PATCH 73/92] Convert remaining promises to async/await

---
 src/app/app.component.ts                      | 55 +++++++++----------
 .../services/internationalisation.service.ts  | 31 +++++------
 2 files changed, 42 insertions(+), 44 deletions(-)

diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 713ba435a..6ffb143b0 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -642,39 +642,38 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
         });
     }
 
-    public loadSessionFile(f: File, info?: any) {
+    public async loadSessionFile(f: File, info?: any) {
         // notes merge detection: was there already some notes ?
         const existingNotes = Session.getInstance().documentation;
         // load
-        this.formulaireService.loadSession(f, info)
-            .then((data) => {
-                if (data.hasErrors) {
-                    this.notificationsService.notify(this.intlService.localizeText("ERROR_PROBLEM_LOADING_SESSION"), 3500);
-                } else {
-                    if (data.loaded && data.loaded.length > 0) {
-                        if (!isDevMode()) {
-                            this.matomoTracker.trackEvent("userAction", "loadSession");
-                        }
-                        // notes merge detection: was there already some notes ?
-                        const currentNotes = Session.getInstance().documentation;
-                        if (existingNotes !== "" && currentNotes !== existingNotes) {
-                            this.notificationsService.notify(this.intlService.localizeText("WARNING_SESSION_LOAD_NOTES_MERGED"), 3500);
-                        }
-                        // go to calc or diagram depending on what was loaded
-                        if (data.loaded.length > 1) {
-                            this.toDiagram();
-                        } else {
-                            this.toCalc(data.loaded[0]);
-                        }
+        try {
+            const data = await this.formulaireService.loadSession(f, info);
+            if (data.hasErrors) {
+                this.notificationsService.notify(this.intlService.localizeText("ERROR_PROBLEM_LOADING_SESSION"), 3500);
+            } else {
+                if (data.loaded && data.loaded.length > 0) {
+                    if (!isDevMode()) {
+                        this.matomoTracker.trackEvent("userAction", "loadSession");
+                    }
+                    // notes merge detection: was there already some notes ?
+                    const currentNotes = Session.getInstance().documentation;
+                    if (existingNotes !== "" && currentNotes !== existingNotes) {
+                        this.notificationsService.notify(this.intlService.localizeText("WARNING_SESSION_LOAD_NOTES_MERGED"), 3500);
+                    }
+                    // go to calc or diagram depending on what was loaded
+                    if (data.loaded.length > 1) {
+                        this.toDiagram();
+                    } else {
+                        this.toCalc(data.loaded[0]);
                     }
                 }
-            })
-            .catch((err) => {
-                this.notificationsService.notify(this.intlService.localizeText("ERROR_LOADING_SESSION"), 3500);
-                console.error("error loading session - ", err);
-                // rollback to ensure session is clean
-                this.doEmptySession();
-            });
+            }
+        } catch (err) {
+            this.notificationsService.notify(this.intlService.localizeText("ERROR_LOADING_SESSION"), 3500);
+            console.error("error loading session - ", err);
+            // rollback to ensure session is clean
+            this.doEmptySession();
+        }
     }
 
     /**
diff --git a/src/app/services/internationalisation.service.ts b/src/app/services/internationalisation.service.ts
index 683f84565..05af49767 100644
--- a/src/app/services/internationalisation.service.ts
+++ b/src/app/services/internationalisation.service.ts
@@ -79,44 +79,43 @@ export class I18nService extends Observable implements Observer {
                     promisesList.push(this.loadLocalisation(calcType).catch((err) => { /* silent fail */ }));
                 }
             }
-            await Promise.all(promisesList).then(() => {
-                this.httpGetMessages(code).then((res: any) => {
-                    that._Messages = res;
-                    // propagate language change to all application
-                    that.notifyObservers(undefined);
-                });
-            });
+            await Promise.all(promisesList);
+            const res = await this.httpGetMessages(code);
+            that._Messages = res;
+            // propagate language change to all application
+            that.notifyObservers(undefined);
         }
     }
 
     /**
      * Loads the localisation file dedicated to calculator type ct; uses cache if available
      */
-    public loadLocalisation(calc: CalculatorType): Promise<any> {
+    public async loadLocalisation(calc: CalculatorType): Promise<any> {
         const lang = this.currentLanguage;
-        return this.loadLocalisationForLang(calc, lang).then((localisation) => {
-            return localisation as StringMap;
-        }).catch((e) => {
+        try {
+            return await this.loadLocalisationForLang(calc, lang) as StringMap;
+        } catch (e) {
             return "";
-        });
+        };
     }
 
     /**
      * Loads the localisation file dedicated to calculator type ct for language lang;
      * keeps it in cache for subsequent calls ()
      */
-    private loadLocalisationForLang(calc: CalculatorType, lang: string): Promise<any> {
+    private async loadLocalisationForLang(calc: CalculatorType, lang: string): Promise<any> {
         const ct = String(calc);
         // if not already in cache
         if (! Object.keys(this._languageCache).includes(ct) || ! Object.keys(this._languageCache[calc]).includes(lang)) {
             const f: string = FormulaireService.getConfigPathPrefix(calc) + lang + ".json";
-            return this.httpService.httpGetRequestPromise(f).then((localisation) => {
+            try {
+                const localisation = await this.httpService.httpGetRequestPromise(f);
                 this._languageCache[ct] = this._languageCache[ct] || {};
                 this._languageCache[ct][lang] = localisation;
                 return localisation as StringMap;
-            }).catch((e) => {
+            } catch (e) {
                 throw new Error(`LOCALISATION_FILE_NOT_FOUND "${f}"`);
-            });
+            }
         } else {
             return new Promise((resolve, reject) => {
                 resolve(); // does nothing but complies with Promise expectation
-- 
GitLab


From f9821ad647b8113254b2e408ce71fb4110e66a36 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 4 Sep 2020 16:15:20 +0200
Subject: [PATCH 74/92] Updated dependencies

---
 package-lock.json | 2634 ++++++++++++++-------------------------------
 package.json      |   32 +-
 2 files changed, 813 insertions(+), 1853 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3586fa901..a6ac34cc9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,12 +11,12 @@
       "dev": true
     },
     "@angular-devkit/architect": {
-      "version": "0.1000.7",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.7.tgz",
-      "integrity": "sha512-6pa98C5i+OrBumWobEjjGAeVNbv8m3h3LQQnXtihv9tjxCWceg25jtDhaNzeS6L8D/NsBnVb61MhTaOKUj7kUA==",
+      "version": "0.1000.8",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.8.tgz",
+      "integrity": "sha512-2AqPbiEugtPxNz4MGhLh+imUVelhW9h1cdJs2AbxZosIxftPb5DNDQUSAwVmRGp4CtcXVrlvcDwc0f4Fw1aiIA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.7",
+        "@angular-devkit/core": "10.0.8",
         "rxjs": "6.5.5"
       },
       "dependencies": {
@@ -38,15 +38,15 @@
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "0.1000.7",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1000.7.tgz",
-      "integrity": "sha512-EeA+X+pu4w8Io+SpmKBkvVUxuhzgcwaRBi42lKM3D4ot0MtrsSJi6E40t5E/Km6kohibRkDBYY32uT0eG4WHsw==",
+      "version": "0.1000.8",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1000.8.tgz",
+      "integrity": "sha512-wwDN2oadQvYPL7lDmvGsoWQjW++0ZnxWk1QVlABGhBSIs8Uxs26Hjd5YNUSsvJavBkqb1UZIOilqzb4dig5MIA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.1000.7",
-        "@angular-devkit/build-optimizer": "0.1000.7",
-        "@angular-devkit/build-webpack": "0.1000.7",
-        "@angular-devkit/core": "10.0.7",
+        "@angular-devkit/architect": "0.1000.8",
+        "@angular-devkit/build-optimizer": "0.1000.8",
+        "@angular-devkit/build-webpack": "0.1000.8",
+        "@angular-devkit/core": "10.0.8",
         "@babel/core": "7.9.6",
         "@babel/generator": "7.9.6",
         "@babel/plugin-transform-runtime": "7.9.6",
@@ -54,7 +54,7 @@
         "@babel/runtime": "7.9.6",
         "@babel/template": "7.8.6",
         "@jsdevtools/coverage-istanbul-loader": "3.0.3",
-        "@ngtools/webpack": "10.0.7",
+        "@ngtools/webpack": "10.0.8",
         "ajv": "6.12.3",
         "autoprefixer": "9.8.0",
         "babel-loader": "8.1.0",
@@ -215,9 +215,9 @@
       }
     },
     "@angular-devkit/build-optimizer": {
-      "version": "0.1000.7",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.7.tgz",
-      "integrity": "sha512-7vnj++astDMnsTPEiXgpXCTwo/zbFmJadKTIlHoU9VHxQNwSfPwSCtPuPlxynquJu5zxhs24CNUBLXXH8z9ztQ==",
+      "version": "0.1000.8",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.8.tgz",
+      "integrity": "sha512-esODHuTGEEMx1SmLUq03VAMly8gZUd1vRuvZeKS5HqKwDg8ZzcI7/25BuuUSlyST+6BEdjo2gnmagQnG0VBdQw==",
       "dev": true,
       "requires": {
         "loader-utils": "2.0.0",
@@ -235,13 +235,13 @@
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.1000.7",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1000.7.tgz",
-      "integrity": "sha512-+QYsEBcpZGVFFwrIlfH/NbChVdfIlnxtoTPjjR7xI5DOgl57sb79hOo4Ev0mPkbbgfn5tjSHvE3rmVQmlYqzcg==",
+      "version": "0.1000.8",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1000.8.tgz",
+      "integrity": "sha512-y/U+dV5N8W7KECncGSKQWoUH/DFNZCseczyl6LAd8bc0fMr8Z0TAIe8OXj+5CSRRdejWfRIxGtNWM+L2kTCU8A==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.1000.7",
-        "@angular-devkit/core": "10.0.7",
+        "@angular-devkit/architect": "0.1000.8",
+        "@angular-devkit/core": "10.0.8",
         "rxjs": "6.5.5"
       },
       "dependencies": {
@@ -263,9 +263,9 @@
       }
     },
     "@angular-devkit/core": {
-      "version": "10.0.7",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.7.tgz",
-      "integrity": "sha512-pXaZgsQ8LHpRx4QGAUYDE8GwBQLAtoqPh6oUCwRJwBExm5rl13OGPTBWewHiq0ysV/SnFXvOjxwAaHQvC1AgZw==",
+      "version": "10.0.8",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz",
+      "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==",
       "dev": true,
       "requires": {
         "ajv": "6.12.3",
@@ -317,52 +317,67 @@
       }
     },
     "@angular-devkit/schematics": {
-      "version": "10.0.7",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.7.tgz",
-      "integrity": "sha512-eyyYPgpjtr3h7WbnNbkDubJ/p+8TgKU6abWd+NmBfTvyeHrpVFUYZabNRcdXwUDSVzfTQKdmLynIkESj/KROrg==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.1.0.tgz",
+      "integrity": "sha512-5Vl32bHpcB/oj0oNR8nPLXF7DwPVuzrJjosch8G+sPG2gAG6OpwjUhQjY1U6E4xJGDR6j7fX8jw+TwC2cMgUbQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.7",
-        "ora": "4.0.4",
-        "rxjs": "6.5.5"
+        "@angular-devkit/core": "10.1.0",
+        "ora": "5.0.0",
+        "rxjs": "6.6.2"
       },
       "dependencies": {
-        "rxjs": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
-          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
+        "@angular-devkit/core": {
+          "version": "10.1.0",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.0.tgz",
+          "integrity": "sha512-oNRwAX+5uEwgheS3UUc1W+AerbimqGojCOTdWWcq5XtSviZnBCp1FeMZV+eB6XgUWfbmbWBu39S3sCYmXVHLwg==",
           "dev": true,
           "requires": {
-            "tslib": "^1.9.0"
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
           }
         },
-        "tslib": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+          "dev": true
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
           "dev": true
         }
       }
     },
     "@angular/animations": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.12.tgz",
-      "integrity": "sha512-SnY25jLtAkH0jZAH1vhnGUsIb/qeMvnO379gMdVTtRR2mMqQnyz+d4IwRd7qOb2gYVSKiXQOEiLFV8TGJbx5mQ==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.1.0.tgz",
+      "integrity": "sha512-0S2UKHDwIw/ZEISDrzhDhn4eVTNwjJW+msOYSaIm6ASRArtSVrwBz1ckD92HhurnnkHVwgTQsnU7yDYKfheaow==",
       "requires": {
         "tslib": "^2.0.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
-          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
-        }
       }
     },
     "@angular/cdk": {
-      "version": "10.1.3",
-      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-10.1.3.tgz",
-      "integrity": "sha512-xMV1M41mfuaQod4rtAG/duYiWffGIC2C87E1YuyHTh8SEcHopGVRQd2C8PWH+iwinPbes7AjU1uzCEvmOYikrA==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-10.2.0.tgz",
+      "integrity": "sha512-KYEBOuGimnWtYS8KvLz/dPWC2pzDzKh1ETkvyJCSm5yXZgNPdj1XatbGQrnQgy9vJwxjbZQ1s8P9tzWx1Dj7dg==",
       "requires": {
         "parse5": "^5.0.0",
         "tslib": "^2.0.0"
@@ -377,33 +392,68 @@
       }
     },
     "@angular/cli": {
-      "version": "10.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.0.7.tgz",
-      "integrity": "sha512-o7aLZ5tIndtWodAGjG58XoKqaQMRyTwxad7s/6LGulH/XPo0v7Nk6f+yopKe2HnZJaIh7sVLaBAUxEvp9F1vaQ==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.1.0.tgz",
+      "integrity": "sha512-sWGEVeQQ5PXKuu517fRFEQQ5qopzoWeW+8qBUTrmJt8FztiL2ASyu412iJse56wyGxZvqwUmtzpti5kWHR9XIw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.1000.7",
-        "@angular-devkit/core": "10.0.7",
-        "@angular-devkit/schematics": "10.0.7",
-        "@schematics/angular": "10.0.7",
-        "@schematics/update": "0.1000.7",
+        "@angular-devkit/architect": "0.1001.0",
+        "@angular-devkit/core": "10.1.0",
+        "@angular-devkit/schematics": "10.1.0",
+        "@schematics/angular": "10.1.0",
+        "@schematics/update": "0.1001.0",
         "@yarnpkg/lockfile": "1.1.0",
         "ansi-colors": "4.1.1",
         "debug": "4.1.1",
         "ini": "1.3.5",
-        "inquirer": "7.1.0",
+        "inquirer": "7.3.3",
         "npm-package-arg": "8.0.1",
         "npm-pick-manifest": "6.1.0",
-        "open": "7.0.4",
+        "open": "7.2.0",
         "pacote": "9.5.12",
         "read-package-tree": "5.3.1",
         "rimraf": "3.0.2",
         "semver": "7.3.2",
         "symbol-observable": "1.2.0",
-        "universal-analytics": "0.4.20",
-        "uuid": "8.1.0"
+        "universal-analytics": "0.4.23",
+        "uuid": "8.3.0"
       },
       "dependencies": {
+        "@angular-devkit/architect": {
+          "version": "0.1001.0",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1001.0.tgz",
+          "integrity": "sha512-mJYy9tqy7ZfqAJYlQPgcHVUiaAxWnxEEpiTAftsKz/yqdO45YFkzehYXJfCqbAXYr4r7hYY3KqKMgj41ixkS8Q==",
+          "dev": true,
+          "requires": {
+            "@angular-devkit/core": "10.1.0",
+            "rxjs": "6.6.2"
+          }
+        },
+        "@angular-devkit/core": {
+          "version": "10.1.0",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.0.tgz",
+          "integrity": "sha512-oNRwAX+5uEwgheS3UUc1W+AerbimqGojCOTdWWcq5XtSviZnBCp1FeMZV+eB6XgUWfbmbWBu39S3sCYmXVHLwg==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
         "ansi-colors": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
@@ -436,9 +486,9 @@
           }
         },
         "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
@@ -454,6 +504,12 @@
             "restore-cursor": "^3.1.0"
           }
         },
+        "cli-width": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+          "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+          "dev": true
+        },
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -472,6 +528,18 @@
             "ms": "^2.1.1"
           }
         },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+          "dev": true
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+          "dev": true
+        },
         "figures": {
           "version": "3.2.0",
           "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -497,26 +565,35 @@
           }
         },
         "inquirer": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
-          "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+          "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
           "dev": true,
           "requires": {
             "ansi-escapes": "^4.2.1",
-            "chalk": "^3.0.0",
+            "chalk": "^4.1.0",
             "cli-cursor": "^3.1.0",
-            "cli-width": "^2.0.0",
+            "cli-width": "^3.0.0",
             "external-editor": "^3.0.3",
             "figures": "^3.0.0",
-            "lodash": "^4.17.15",
+            "lodash": "^4.17.19",
             "mute-stream": "0.0.8",
             "run-async": "^2.4.0",
-            "rxjs": "^6.5.3",
+            "rxjs": "^6.6.0",
             "string-width": "^4.1.0",
             "strip-ansi": "^6.0.0",
             "through": "^2.3.6"
           }
         },
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -534,6 +611,16 @@
             "validate-npm-package-name": "^3.0.0"
           }
         },
+        "open": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz",
+          "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0",
+            "is-wsl": "^2.1.1"
+          }
+        },
         "restore-cursor": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -584,9 +671,9 @@
           }
         },
         "uuid": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz",
-          "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==",
+          "version": "8.3.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
+          "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==",
           "dev": true
         }
       }
@@ -707,18 +794,11 @@
       }
     },
     "@angular/core": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.12.tgz",
-      "integrity": "sha512-qwnZ95HtWH2PBZs93iTXa9fvYCg203c/CnbzHNfMTZXcwaEBEEA7nuUBmjQt+VA8ib2BjO8CkepLNJI0pgo29w==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.1.0.tgz",
+      "integrity": "sha512-lENt8Wk1vVsIiHeZVzXCZoHY13BxkqmulEw/AdUOh4VQxoU5K3z1o7fC1cvPHBvBEUnhbD2pDC1UHcY1G9yLRw==",
       "requires": {
         "tslib": "^2.0.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
-          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
-        }
       }
     },
     "@angular/flex-layout": {
@@ -730,77 +810,49 @@
       }
     },
     "@angular/forms": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.12.tgz",
-      "integrity": "sha512-otFD0ASqD1RMlpnI1OGHCSSDBRsnnz+/Hp5TV7TzqqIsyN9n0SyRw1/ZHMTNLx9JQf+QWhq2pXOOGBYqSiG54Q==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.1.0.tgz",
+      "integrity": "sha512-1onL5To+QAaI1v642WcjfchwwJrUqIPrJ40a4l5yvcd/iZydOBHS/bbw1nYjQDiKeGL2+gzpP04qrh4nHeG7OA==",
       "requires": {
         "tslib": "^2.0.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
-          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
-        }
       }
     },
     "@angular/language-service": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.0.12.tgz",
-      "integrity": "sha512-zsEzFu5D1Wm14we625R5IsvYKxuLxCE0VkZVVB402vJFImJNUNrXt/prY5mEnqePnK8fAjJLtJfpn64q8IWXBg==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.1.0.tgz",
+      "integrity": "sha512-+36OfWzn+JgHeKDxWPS4+rEUQnmwqvm7U9ciqZiaa0V49j9+MJOtM5Ax5WXQhYHFBxuG9zQIowAsm7UYxvWiDg==",
       "dev": true
     },
     "@angular/material": {
-      "version": "10.1.3",
-      "resolved": "https://registry.npmjs.org/@angular/material/-/material-10.1.3.tgz",
-      "integrity": "sha512-6ygbCVcejFydmZUlOcNreiWQTvL4kOrEp/M51DV70hqffTnxajCzaRe2MQhxisENB/bR8mtMvf8YY3Rsys/HCw==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/material/-/material-10.2.0.tgz",
+      "integrity": "sha512-IplZVu1OpyvGYlrzkV36+5xKdwyyfl8AOykcC+jWU1MtnbTrnVmqGGF94qv7YEYN4PcVKbhSuNnz6/vPQm27ZA==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/platform-browser": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.12.tgz",
-      "integrity": "sha512-w6R81GGgYS+l221yvibomkf0gQTaiontBLzafJXHyHWIXd1A3oVAaNfLzVpHy5kAfd1YruExRJOjDZ6T4iIfyA==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.1.0.tgz",
+      "integrity": "sha512-bYG02qt36lzCBIV6mbAuYPDKU18x9Xd3S3jwJddvoHjRupxwZtTPGWKQ/4qhv1QrLwZnvXbCavIZlrHe68XJbw==",
       "requires": {
         "tslib": "^2.0.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
-          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
-        }
       }
     },
     "@angular/platform-browser-dynamic": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.12.tgz",
-      "integrity": "sha512-izNbYVJiJOT90+Up58Y+E6WHP3CdrS94CZpFwkJFFgRfHu7uKvNrFnB3EkDr5+Lw+RZ8RN5O7QRzUPtG//AGEQ==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.1.0.tgz",
+      "integrity": "sha512-JzGYFiv6F6upbEv3KyoktZ8UaO/3kQRrqsXmUGbl+k12aG1Lg9WeTIfpWV8eqDCEAQb7BqyqoFbbZGZfnxp/TQ==",
       "requires": {
         "tslib": "^2.0.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
-          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
-        }
       }
     },
     "@angular/router": {
-      "version": "10.0.12",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.0.12.tgz",
-      "integrity": "sha512-utBfsIiVsFNydGtJexvEskYYgQXAd4+1KVxr5wVfND+AfV9EjC7YhMNdySq72ZRNrtQDpDpSlTHvoz5iVeEraw==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.1.0.tgz",
+      "integrity": "sha512-20xidByYytcg46pBxZtraNHFCLDg75mTYAB8cTZ5qEZghrECzECyDbSKCwaW2zsv51Tlrcpi03/0CAaw7EgZiw==",
       "requires": {
         "tslib": "^2.0.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
-          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
-        }
       }
     },
     "@babel/code-frame": {
@@ -824,9 +876,9 @@
       }
     },
     "@babel/compat-data": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.4.tgz",
-      "integrity": "sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz",
+      "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==",
       "dev": true,
       "requires": {
         "browserslist": "^4.12.0",
@@ -858,26 +910,6 @@
         "source-map": "^0.5.0"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        },
         "convert-source-map": {
           "version": "1.7.0",
           "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
@@ -971,17 +1003,6 @@
         "@babel/helper-annotate-as-pure": "^7.10.4",
         "@babel/helper-regex": "^7.10.4",
         "regexpu-core": "^4.7.0"
-      },
-      "dependencies": {
-        "@babel/helper-regex": {
-          "version": "7.10.5",
-          "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
-          "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.19"
-          }
-        }
       }
     },
     "@babel/helper-define-map": {
@@ -993,14 +1014,6 @@
         "@babel/helper-function-name": "^7.10.4",
         "@babel/types": "^7.10.5",
         "lodash": "^4.17.19"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "4.17.20",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-          "dev": true
-        }
       }
     },
     "@babel/helper-explode-assignable-expression": {
@@ -1069,101 +1082,113 @@
         "@babel/types": "^7.10.4"
       }
     },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
+      "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0"
+      }
+    },
     "@babel/helper-module-imports": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz",
-      "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+      "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.10.1"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz",
-      "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+      "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.10.1",
-        "@babel/helper-replace-supers": "^7.10.1",
-        "@babel/helper-simple-access": "^7.10.1",
-        "@babel/helper-split-export-declaration": "^7.10.1",
-        "@babel/template": "^7.10.1",
-        "@babel/types": "^7.10.1",
-        "lodash": "^4.17.13"
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-simple-access": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.11.0",
+        "lodash": "^4.17.19"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
-          "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.1"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
-          "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.1",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        },
         "@babel/template": {
-          "version": "7.10.1",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz",
-          "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==",
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.10.1",
-            "@babel/parser": "^7.10.1",
-            "@babel/types": "^7.10.1"
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
           }
         }
       }
     },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+      "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
     "@babel/helper-plugin-utils": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz",
-      "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
       "dev": true
     },
-    "@babel/helper-replace-supers": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
-      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
+    "@babel/helper-regex": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+      "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
       "dev": true,
       "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.10.4",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/traverse": "^7.10.4",
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.11.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz",
+      "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-wrap-function": "^7.10.4",
+        "@babel/template": "^7.10.4",
         "@babel/types": "^7.10.4"
       },
       "dependencies": {
-        "@babel/helper-member-expression-to-functions": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
-          "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.11.0"
-          }
-        },
-        "@babel/helper-optimise-call-expression": {
+        "@babel/template": {
           "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
-          "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
           "dev": true,
           "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
             "@babel/types": "^7.10.4"
           }
         }
       }
     },
+    "@babel/helper-replace-supers": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
     "@babel/helper-simple-access": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
@@ -1174,35 +1199,15 @@
         "@babel/types": "^7.10.4"
       },
       "dependencies": {
-        "@babel/code-frame": {
+        "@babel/template": {
           "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
           }
         }
       }
@@ -1217,12 +1222,12 @@
       }
     },
     "@babel/helper-split-export-declaration": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz",
-      "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.10.4"
+        "@babel/types": "^7.11.0"
       }
     },
     "@babel/helper-validator-identifier": {
@@ -1242,26 +1247,6 @@
         "@babel/types": "^7.10.4"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        },
         "@babel/template": {
           "version": "7.10.4",
           "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
@@ -1286,26 +1271,6 @@
         "@babel/types": "^7.10.4"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        },
         "@babel/template": {
           "version": "7.10.4",
           "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
@@ -1325,45 +1290,14 @@
       "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA=="
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz",
-      "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
+      "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-remap-async-to-generator": "^7.10.4",
         "@babel/plugin-syntax-async-generators": "^7.8.0"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        },
-        "@babel/helper-remap-async-to-generator": {
-          "version": "7.11.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz",
-          "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-annotate-as-pure": "^7.10.4",
-            "@babel/helper-wrap-function": "^7.10.4",
-            "@babel/template": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/plugin-proposal-dynamic-import": {
@@ -1374,14 +1308,6 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-dynamic-import": "^7.8.0"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-proposal-json-strings": {
@@ -1392,14 +1318,6 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-json-strings": "^7.8.0"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-proposal-nullish-coalescing-operator": {
@@ -1410,14 +1328,6 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-proposal-numeric-separator": {
@@ -1428,23 +1338,6 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        },
-        "@babel/plugin-syntax-numeric-separator": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-          "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-plugin-utils": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/plugin-proposal-object-rest-spread": {
@@ -1456,14 +1349,6 @@
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
         "@babel/plugin-transform-parameters": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-proposal-optional-catch-binding": {
@@ -1474,14 +1359,6 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-proposal-optional-chaining": {
@@ -1493,14 +1370,6 @@
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0",
         "@babel/plugin-syntax-optional-chaining": "^7.8.0"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-proposal-unicode-property-regex": {
@@ -1511,14 +1380,6 @@
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-syntax-async-generators": {
@@ -1558,18 +1419,18 @@
       }
     },
     "@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz",
-      "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.1"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-syntax-object-rest-spread": {
       "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
-      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.0"
@@ -1600,14 +1461,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-arrow-functions": {
@@ -1617,14 +1470,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-async-to-generator": {
@@ -1636,46 +1481,6 @@
         "@babel/helper-module-imports": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-remap-async-to-generator": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-module-imports": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
-          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.10.4"
-          }
-        },
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        },
-        "@babel/helper-remap-async-to-generator": {
-          "version": "7.11.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz",
-          "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-annotate-as-pure": "^7.10.4",
-            "@babel/helper-wrap-function": "^7.10.4",
-            "@babel/template": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/plugin-transform-block-scoped-functions": {
@@ -1685,14 +1490,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-block-scoping": {
@@ -1702,14 +1499,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-classes": {
@@ -1726,54 +1515,6 @@
         "@babel/helper-replace-supers": "^7.10.4",
         "@babel/helper-split-export-declaration": "^7.10.4",
         "globals": "^11.1.0"
-      },
-      "dependencies": {
-        "@babel/helper-function-name": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
-          "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-get-function-arity": "^7.10.4",
-            "@babel/template": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        },
-        "@babel/helper-optimise-call-expression": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
-          "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.10.4"
-          }
-        },
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.11.0"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/plugin-transform-computed-properties": {
@@ -1783,14 +1524,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-destructuring": {
@@ -1800,14 +1533,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-dotall-regex": {
@@ -1818,14 +1543,6 @@
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-duplicate-keys": {
@@ -1835,14 +1552,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-exponentiation-operator": {
@@ -1853,14 +1562,6 @@
       "requires": {
         "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-for-of": {
@@ -1870,14 +1571,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-function-name": {
@@ -1888,14 +1581,6 @@
       "requires": {
         "@babel/helper-function-name": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-literals": {
@@ -1904,159 +1589,39 @@
       "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/plugin-transform-member-expression-literals": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
-      "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/plugin-transform-modules-amd": {
-      "version": "7.10.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
-      "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-transforms": "^7.10.5",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      },
-      "dependencies": {
-        "@babel/helper-module-imports": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
-          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.10.4"
-          }
-        },
-        "@babel/helper-module-transforms": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
-          "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-module-imports": "^7.10.4",
-            "@babel/helper-replace-supers": "^7.10.4",
-            "@babel/helper-simple-access": "^7.10.4",
-            "@babel/helper-split-export-declaration": "^7.11.0",
-            "@babel/template": "^7.10.4",
-            "@babel/types": "^7.11.0",
-            "lodash": "^4.17.19"
-          }
-        },
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.11.0"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
-      }
-    },
-    "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
-      "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-transforms": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-simple-access": "^7.10.4",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      },
-      "dependencies": {
-        "@babel/helper-module-imports": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
-          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.10.4"
-          }
-        },
-        "@babel/helper-module-transforms": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
-          "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-module-imports": "^7.10.4",
-            "@babel/helper-replace-supers": "^7.10.4",
-            "@babel/helper-simple-access": "^7.10.4",
-            "@babel/helper-split-export-declaration": "^7.11.0",
-            "@babel/template": "^7.10.4",
-            "@babel/types": "^7.11.0",
-            "lodash": "^4.17.19"
-          }
-        },
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.11.0"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-member-expression-literals": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
+      "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
+      "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.10.5",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
+      "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-simple-access": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
       }
     },
     "@babel/plugin-transform-modules-systemjs": {
@@ -2069,58 +1634,6 @@
         "@babel/helper-module-transforms": "^7.10.5",
         "@babel/helper-plugin-utils": "^7.10.4",
         "babel-plugin-dynamic-import-node": "^2.3.3"
-      },
-      "dependencies": {
-        "@babel/helper-module-imports": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
-          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.10.4"
-          }
-        },
-        "@babel/helper-module-transforms": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
-          "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-module-imports": "^7.10.4",
-            "@babel/helper-replace-supers": "^7.10.4",
-            "@babel/helper-simple-access": "^7.10.4",
-            "@babel/helper-split-export-declaration": "^7.11.0",
-            "@babel/template": "^7.10.4",
-            "@babel/types": "^7.11.0",
-            "lodash": "^4.17.19"
-          }
-        },
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.11.0"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/plugin-transform-modules-umd": {
@@ -2131,58 +1644,6 @@
       "requires": {
         "@babel/helper-module-transforms": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-module-imports": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
-          "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.10.4"
-          }
-        },
-        "@babel/helper-module-transforms": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
-          "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-module-imports": "^7.10.4",
-            "@babel/helper-replace-supers": "^7.10.4",
-            "@babel/helper-simple-access": "^7.10.4",
-            "@babel/helper-split-export-declaration": "^7.11.0",
-            "@babel/template": "^7.10.4",
-            "@babel/types": "^7.11.0",
-            "lodash": "^4.17.19"
-          }
-        },
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.11.0",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.11.0"
-          }
-        },
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/plugin-transform-named-capturing-groups-regex": {
@@ -2201,14 +1662,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-object-super": {
@@ -2219,14 +1672,6 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-replace-supers": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-parameters": {
@@ -2237,14 +1682,6 @@
       "requires": {
         "@babel/helper-get-function-arity": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-property-literals": {
@@ -2254,14 +1691,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-regenerator": {
@@ -2280,14 +1709,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-runtime": {
@@ -2309,14 +1730,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-spread": {
@@ -2327,14 +1740,6 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-sticky-regex": {
@@ -2345,23 +1750,6 @@
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/helper-regex": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        },
-        "@babel/helper-regex": {
-          "version": "7.10.5",
-          "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
-          "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.19"
-          }
-        }
       }
     },
     "@babel/plugin-transform-template-literals": {
@@ -2372,14 +1760,6 @@
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-typeof-symbol": {
@@ -2389,14 +1769,6 @@
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-unicode-regex": {
@@ -2407,14 +1779,6 @@
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.10.4",
         "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/helper-plugin-utils": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
-          "dev": true
-        }
       }
     },
     "@babel/preset-env": {
@@ -2486,9 +1850,9 @@
       }
     },
     "@babel/preset-modules": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz",
-      "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==",
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+      "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -2524,28 +1888,6 @@
         "@babel/code-frame": "^7.8.3",
         "@babel/parser": "^7.8.6",
         "@babel/types": "^7.8.6"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          }
-        }
       }
     },
     "@babel/traverse": {
@@ -3132,12 +2474,12 @@
       }
     },
     "@ngtools/webpack": {
-      "version": "10.0.7",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.7.tgz",
-      "integrity": "sha512-yUjTDOgsuEJEtsyqb78jDm3Keo18x6j1AjmZUEeiCxShX2pBQTfErmxtBqxPUAkLa/gD7Wkf5cZM+3xcYyShRg==",
+      "version": "10.0.8",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.8.tgz",
+      "integrity": "sha512-Qv4v7O4VGeWuXjRThd/mdC2I4cJOgQ7kDrVN7vkDB2EW5xtRB+/4hghvFeO3bD11FLuFvCxBMb0HbwyKoVQgEQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.7",
+        "@angular-devkit/core": "10.0.8",
         "enhanced-resolve": "4.1.1",
         "rxjs": "6.5.5",
         "webpack-sources": "1.4.3"
@@ -3209,64 +2551,115 @@
       }
     },
     "@schematics/angular": {
-      "version": "10.0.7",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.0.7.tgz",
-      "integrity": "sha512-0SljGZjA68tOsn7OIps79lTy9Y96OZglLnBqO6pSLlmCkGMbjFY2ssKQXJzwR0jJ5+TWBjWjpn2U5mir4yzOuQ==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.1.0.tgz",
+      "integrity": "sha512-kQ925yMmOwiSITY+FhuTvrl3HuEIEUrdByBNB0NlvY+DyJwPlngEOo6Iu0cYWaJcoxM1JscOWL59ZR6W7YCFIg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.7",
-        "@angular-devkit/schematics": "10.0.7"
+        "@angular-devkit/core": "10.1.0",
+        "@angular-devkit/schematics": "10.1.0",
+        "jsonc-parser": "2.3.0"
+      },
+      "dependencies": {
+        "@angular-devkit/core": {
+          "version": "10.1.0",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.0.tgz",
+          "integrity": "sha512-oNRwAX+5uEwgheS3UUc1W+AerbimqGojCOTdWWcq5XtSviZnBCp1FeMZV+eB6XgUWfbmbWBu39S3sCYmXVHLwg==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+          "dev": true
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+          "dev": true
+        }
       }
     },
     "@schematics/update": {
-      "version": "0.1000.7",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1000.7.tgz",
-      "integrity": "sha512-KEOtKu95np+jVxxs/JCQ8UNQ0v21BSZKe0sb+D/Nk3XVPMHXDS3ZvcavDh5OXGC2GucbZHkD2UNvEPTEHpLxMg==",
+      "version": "0.1001.0",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1001.0.tgz",
+      "integrity": "sha512-LRGwo37akHe/BUl5FHj74mJ/xhM0Z7W8pWMWJ6zGihs+HNXjTgfYVgGA1TgN0amqQODa3AxxLL6aLj+hVYZi+g==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.7",
-        "@angular-devkit/schematics": "10.0.7",
+        "@angular-devkit/core": "10.1.0",
+        "@angular-devkit/schematics": "10.1.0",
         "@yarnpkg/lockfile": "1.1.0",
         "ini": "1.3.5",
         "npm-package-arg": "^8.0.0",
         "pacote": "9.5.12",
-        "rxjs": "6.5.5",
         "semver": "7.3.2",
         "semver-intersect": "1.4.0"
       },
       "dependencies": {
-        "hosted-git-info": {
-          "version": "3.0.5",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
-          "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==",
+        "@angular-devkit/core": {
+          "version": "10.1.0",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.0.tgz",
+          "integrity": "sha512-oNRwAX+5uEwgheS3UUc1W+AerbimqGojCOTdWWcq5XtSviZnBCp1FeMZV+eB6XgUWfbmbWBu39S3sCYmXVHLwg==",
           "dev": true,
           "requires": {
-            "lru-cache": "^6.0.0"
-          },
-          "dependencies": {
-            "lru-cache": {
-              "version": "6.0.0",
-              "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-              "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-              "dev": true,
-              "requires": {
-                "yallist": "^4.0.0"
-              }
-            },
-            "yallist": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-              "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-              "dev": true
-            }
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
           }
         },
-        "lru-cache": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+          "dev": true
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+          "dev": true
+        },
+        "hosted-git-info": {
+          "version": "3.0.5",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
+          "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==",
+          "dev": true,
           "requires": {
-            "yallist": "^3.0.2"
+            "lru-cache": "^6.0.0"
           }
         },
         "npm-package-arg": {
@@ -3280,31 +2673,11 @@
             "validate-npm-package-name": "^3.0.0"
           }
         },
-        "rxjs": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
-          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
-          "dev": true,
-          "requires": {
-            "tslib": "^1.9.0"
-          }
-        },
         "semver": {
           "version": "7.3.2",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
           "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
-        },
-        "tslib": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
-          "dev": true
-        },
-        "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
         }
       }
     },
@@ -3368,9 +2741,9 @@
       }
     },
     "@types/jasmine": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.13.tgz",
-      "integrity": "sha512-bVSrTEWdCNH2RHN+E0QlEr4pGPMRA6puKOmL/X13ZeZmUS0q12ZR1rkB9PVvJSX0zi/OXrMDNvUai+PC380+rQ==",
+      "version": "3.5.14",
+      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.14.tgz",
+      "integrity": "sha512-Fkgk536sHPqcOtd+Ow+WiUNuk0TSo/BntKkF8wSvcd6M2FvPjeXcUE6Oz/bwDZiUZEaXLslAgw00Q94Pnx6T4w==",
       "dev": true
     },
     "@types/jasminewd2": {
@@ -3383,9 +2756,9 @@
       }
     },
     "@types/json-schema": {
-      "version": "7.0.5",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
-      "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==",
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+      "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
       "dev": true
     },
     "@types/marked": {
@@ -3405,9 +2778,9 @@
       "integrity": "sha512-13gmo3M2qVvjQrWNseqM3+cR6S2Ss3grbR2NZltgMq94wOwqJYQdgn8qzwDshzgXqMlSUtyPZjysImmktu22ew=="
     },
     "@types/node": {
-      "version": "14.6.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz",
-      "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==",
+      "version": "14.6.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz",
+      "integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==",
       "dev": true
     },
     "@types/pako": {
@@ -4498,24 +3871,6 @@
         "schema-utils": "^2.6.5"
       },
       "dependencies": {
-        "ajv": {
-          "version": "6.12.3",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
-          "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-          "dev": true
-        },
         "find-cache-dir": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
@@ -4563,17 +3918,6 @@
           "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
           "dev": true
         },
-        "schema-utils": {
-          "version": "2.7.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
-          "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
-          "dev": true,
-          "requires": {
-            "@types/json-schema": "^7.0.4",
-            "ajv": "^6.12.2",
-            "ajv-keywords": "^3.4.1"
-          }
-        },
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -5631,9 +4975,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001117",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz",
-      "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==",
+      "version": "1.0.30001124",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001124.tgz",
+      "integrity": "sha512-zQW8V3CdND7GHRH6rxm6s59Ww4g/qGWTheoboW9nfeMg7sUoopIfKCcNZUjwYRCOrvereh3kwDpZj4VLQ7zGtA==",
       "dev": true
     },
     "canonical-path": {
@@ -5978,9 +5322,9 @@
       }
     },
     "cli-spinners": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz",
-      "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz",
+      "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==",
       "dev": true
     },
     "cli-width": {
@@ -6616,15 +5960,6 @@
           "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
           "dev": true
         },
-        "lru-cache": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
         "merge2": {
           "version": "1.4.1",
           "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -6685,12 +6020,6 @@
           "requires": {
             "is-number": "^7.0.0"
           }
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
         }
       }
     },
@@ -8875,9 +8204,9 @@
       }
     },
     "electron": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/electron/-/electron-10.0.0.tgz",
-      "integrity": "sha512-0XX/LqYAHHCSbfLjUk9VRDPOeYjDPEzA9i7F50AqpEpFIWR2bp++0S0beRANUpPdkvtBDp+0R6vHV3iXPvuKyA==",
+      "version": "10.1.1",
+      "resolved": "https://registry.npmjs.org/electron/-/electron-10.1.1.tgz",
+      "integrity": "sha512-ZJtZHMr17AvvBosuA6XUmpehwAlGM4/n46Mw9BcyD8tpgdI6IQd0X5OU9meE3X3M8Y6Ja2Kr2udTMgtjvot2hA==",
       "dev": true,
       "requires": {
         "@electron/get": "^1.0.1",
@@ -8886,9 +8215,9 @@
       },
       "dependencies": {
         "@types/node": {
-          "version": "12.12.54",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.54.tgz",
-          "integrity": "sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==",
+          "version": "12.12.55",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.55.tgz",
+          "integrity": "sha512-Vd6xQUVvPCTm7Nx1N7XHcpX6t047ltm7TgcsOr4gFHjeYgwZevo+V7I1lfzHnj5BT5frztZ42+RTG4MwYw63dw==",
           "dev": true
         }
       }
@@ -9064,9 +8393,9 @@
       }
     },
     "electron-to-chromium": {
-      "version": "1.3.545",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.545.tgz",
-      "integrity": "sha512-+0R/i17u5E1cwF3g0W8Niq3UUKTUMyyT4kLkutZUHG8mDNvFsAckK3HIanzGVtixe3b6rknD8k7gHiR6nKFkgg==",
+      "version": "1.3.562",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.562.tgz",
+      "integrity": "sha512-WhRe6liQ2q/w1MZc8mD8INkenHivuHdrr4r5EQHNomy3NJux+incP6M6lDMd0paShP3MD0WGe5R1TWmEClf+Bg==",
       "dev": true
     },
     "elementtree": {
@@ -9131,12 +8460,12 @@
       "dev": true
     },
     "encoding": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
-      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
       "dev": true,
       "requires": {
-        "iconv-lite": "~0.4.13"
+        "iconv-lite": "^0.6.2"
       },
       "dependencies": {
         "iconv-lite": {
@@ -9330,6 +8659,50 @@
         "is-arrayish": "^0.2.1"
       }
     },
+    "es-abstract": {
+      "version": "1.17.6",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+      "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1",
+        "is-callable": "^1.2.0",
+        "is-regex": "^1.1.0",
+        "object-inspect": "^1.7.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.0",
+        "string.prototype.trimend": "^1.0.1",
+        "string.prototype.trimstart": "^1.0.1"
+      },
+      "dependencies": {
+        "object-inspect": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+          "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+          "dev": true
+        },
+        "object-keys": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+          "dev": true
+        }
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
     "es5-ext": {
       "version": "0.10.53",
       "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
@@ -9490,12 +8863,20 @@
       "dev": true
     },
     "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "dev": true,
       "requires": {
-        "estraverse": "^4.1.0"
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+          "dev": true
+        }
       }
     },
     "estraverse": {
@@ -9513,7 +8894,8 @@
     "esutils": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "dev": true
     },
     "etag": {
       "version": "1.8.1",
@@ -10196,15 +9578,6 @@
             "p-locate": "^4.1.0"
           }
         },
-        "make-dir": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-          "dev": true,
-          "requires": {
-            "semver": "^6.0.0"
-          }
-        },
         "p-locate": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
@@ -10228,12 +9601,6 @@
           "requires": {
             "find-up": "^4.0.0"
           }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
         }
       }
     },
@@ -11479,9 +10846,9 @@
       "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
     "has-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
       "dev": true
     },
     "has-value": {
@@ -12211,6 +11578,12 @@
       "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
       "dev": true
     },
+    "is-callable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+      "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
+      "dev": true
+    },
     "is-ci": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
@@ -12255,9 +11628,9 @@
       }
     },
     "is-date-object": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
-      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
       "dev": true
     },
     "is-descriptor": {
@@ -12406,6 +11779,15 @@
       "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
       "dev": true
     },
+    "is-regex": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+      "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
     "is-relative": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
@@ -12437,12 +11819,12 @@
       }
     },
     "is-symbol": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
-      "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
       "dev": true,
       "requires": {
-        "has-symbols": "^1.0.0"
+        "has-symbols": "^1.0.1"
       }
     },
     "is-typedarray": {
@@ -12484,6 +11866,12 @@
       "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
       "dev": true
     },
+    "isbinaryfile": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz",
+      "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==",
+      "dev": true
+    },
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -12519,114 +11907,6 @@
         "semver": "^6.3.0"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-          "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-          "requires": {
-            "@babel/highlight": "^7.8.3"
-          }
-        },
-        "@babel/generator": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
-          "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
-          "requires": {
-            "@babel/types": "^7.8.7",
-            "jsesc": "^2.5.1",
-            "lodash": "^4.17.13"
-          }
-        },
-        "@babel/helper-function-name": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
-          "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
-          "requires": {
-            "@babel/helper-get-function-arity": "^7.8.3",
-            "@babel/template": "^7.8.3",
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-get-function-arity": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
-          "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/helper-split-export-declaration": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
-          "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
-          "requires": {
-            "@babel/types": "^7.8.3"
-          }
-        },
-        "@babel/highlight": {
-          "version": "7.8.3",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
-          "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
-          "requires": {
-            "chalk": "^2.0.0",
-            "esutils": "^2.0.2",
-            "js-tokens": "^4.0.0"
-          }
-        },
-        "@babel/parser": {
-          "version": "7.8.8",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
-          "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA=="
-        },
-        "@babel/template": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-          "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6"
-          }
-        },
-        "@babel/traverse": {
-          "version": "7.8.6",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
-          "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
-          "requires": {
-            "@babel/code-frame": "^7.8.3",
-            "@babel/generator": "^7.8.6",
-            "@babel/helper-function-name": "^7.8.3",
-            "@babel/helper-split-export-declaration": "^7.8.3",
-            "@babel/parser": "^7.8.6",
-            "@babel/types": "^7.8.6",
-            "debug": "^4.1.0",
-            "globals": "^11.1.0",
-            "lodash": "^4.17.13"
-          }
-        },
-        "@babel/types": {
-          "version": "7.8.7",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
-          "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -12833,9 +12113,9 @@
           "dev": true
         },
         "supports-color": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
@@ -12922,6 +12202,12 @@
         "minimist": "^1.2.5"
       }
     },
+    "jsonc-parser": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
+      "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
+      "dev": true
+    },
     "jsonfile": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
@@ -12962,24 +12248,23 @@
       }
     },
     "karma": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/karma/-/karma-5.1.1.tgz",
-      "integrity": "sha512-xAlOr5PMqUbiKXSv5PCniHWV3aiwj6wIZ0gUVcwpTCPVQm/qH2WAMFWxtnpM6KJqhkRWrIpovR4Rb0rn8GtJzQ==",
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.1.tgz",
+      "integrity": "sha512-+/AO2fWL7kC3aWTx/lHjtKXfOqh0O+KLtTy4BLQ/b/eciHR4VTHHdPhdrn9sDBQskgDieaBZ+sAKzlldc4GW/Q==",
       "dev": true,
       "requires": {
         "body-parser": "^1.19.0",
         "braces": "^3.0.2",
-        "chokidar": "^3.0.0",
+        "chokidar": "^3.4.2",
         "colors": "^1.4.0",
         "connect": "^3.7.0",
         "di": "^0.0.1",
         "dom-serialize": "^2.2.1",
-        "flatted": "^2.0.2",
         "glob": "^7.1.6",
         "graceful-fs": "^4.2.4",
         "http-proxy": "^1.18.1",
         "isbinaryfile": "^4.0.6",
-        "lodash": "^4.17.15",
+        "lodash": "^4.17.19",
         "log4js": "^6.2.1",
         "mime": "^2.4.5",
         "minimatch": "^3.0.4",
@@ -12987,12 +12272,28 @@
         "range-parser": "^1.2.1",
         "rimraf": "^3.0.2",
         "socket.io": "^2.3.0",
-        "source-map": "^0.6.1",
+        "source-map": "^0.7.3",
         "tmp": "0.2.1",
         "ua-parser-js": "0.7.21",
         "yargs": "^15.3.1"
       },
       "dependencies": {
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "dev": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "binary-extensions": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+          "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+          "dev": true
+        },
         "braces": {
           "version": "3.0.2",
           "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
@@ -13002,6 +12303,22 @@
             "fill-range": "^7.0.1"
           }
         },
+        "chokidar": {
+          "version": "3.4.2",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+          "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+          "dev": true,
+          "requires": {
+            "anymatch": "~3.1.1",
+            "braces": "~3.0.2",
+            "fsevents": "~2.1.2",
+            "glob-parent": "~5.1.0",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.4.0"
+          }
+        },
         "connect": {
           "version": "3.7.0",
           "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
@@ -13023,15 +12340,12 @@
             "to-regex-range": "^5.0.1"
           }
         },
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+        "fsevents": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+          "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
           "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
+          "optional": true
         },
         "glob": {
           "version": "7.1.6",
@@ -13047,47 +12361,56 @@
             "path-is-absolute": "^1.0.0"
           }
         },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
         "graceful-fs": {
           "version": "4.2.4",
           "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
           "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
           "dev": true
         },
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+          "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
         "is-number": {
           "version": "7.0.0",
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
           "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
           "dev": true
         },
-        "isbinaryfile": {
-          "version": "4.0.6",
-          "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz",
-          "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==",
-          "dev": true
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
         "mime": {
           "version": "2.4.6",
           "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
           "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
           "dev": true
         },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
+        "normalize-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+          "dev": true
         },
         "parseurl": {
           "version": "1.3.3",
@@ -13095,11 +12418,22 @@
           "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
           "dev": true
         },
-        "path-exists": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
+        "readdirp": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+          "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+          "dev": true,
+          "requires": {
+            "picomatch": "^2.2.1"
+          },
+          "dependencies": {
+            "picomatch": {
+              "version": "2.2.2",
+              "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+              "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+              "dev": true
+            }
+          }
         },
         "rimraf": {
           "version": "3.0.2",
@@ -13110,12 +12444,6 @@
             "glob": "^7.1.3"
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
         "tmp": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
@@ -13133,25 +12461,6 @@
           "requires": {
             "is-number": "^7.0.0"
           }
-        },
-        "yargs": {
-          "version": "15.3.1",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
-          "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
-          "dev": true,
-          "requires": {
-            "cliui": "^6.0.0",
-            "decamelize": "^1.2.0",
-            "find-up": "^4.1.0",
-            "get-caller-file": "^2.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^4.2.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^18.1.1"
-          }
         }
       }
     },
@@ -13607,12 +12916,58 @@
       "dev": true
     },
     "log-symbols": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
-      "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
       "dev": true,
       "requires": {
-        "chalk": "^2.4.2"
+        "chalk": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
       }
     },
     "log4js": {
@@ -13880,9 +13235,9 @@
       "integrity": "sha1-mnHEh0chjrylHlGmbaaCA4zct78="
     },
     "mathjax": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.0.5.tgz",
-      "integrity": "sha512-9M7VulhltkD8sIebWutK/VfAD+m+6BIFqfpjDh9Pz/etoKUtjO6UMnOhUcDmNl6iApE8C9xrUmaMyNZkZAlrMw=="
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.1.0.tgz",
+      "integrity": "sha512-W71QY6DBDAhKhsIRbqzB38VV6Mk1IVAx23IjNc00oAPa4jyoeDQOwMIBPnG5ATqOAYevrBrwaNbycERGoYBBhA=="
     },
     "md5-file": {
       "version": "5.0.0",
@@ -14172,14 +13527,6 @@
       "dev": true,
       "requires": {
         "yallist": "^4.0.0"
-      },
-      "dependencies": {
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
-        }
       }
     },
     "minipass-collect": {
@@ -14209,6 +13556,16 @@
         "minipass": "^3.0.0"
       }
     },
+    "minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      }
+    },
     "mississippi": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
@@ -14678,15 +14035,6 @@
             "lru-cache": "^6.0.0"
           }
         },
-        "lru-cache": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
         "npm-package-arg": {
           "version": "8.0.1",
           "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz",
@@ -14703,19 +14051,13 @@
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
           "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
         }
       }
     },
     "npm-registry-fetch": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz",
-      "integrity": "sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q==",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz",
+      "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==",
       "dev": true,
       "requires": {
         "JSONStream": "^1.3.4",
@@ -14870,157 +14212,27 @@
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.0-next.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.6",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
-          "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
-          "dev": true,
-          "requires": {
-            "es-to-primitive": "^1.2.1",
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1",
-            "is-callable": "^1.2.0",
-            "is-regex": "^1.1.0",
-            "object-inspect": "^1.7.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.0",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        },
-        "es-to-primitive": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-          "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-          "dev": true,
-          "requires": {
-            "is-callable": "^1.1.4",
-            "is-date-object": "^1.0.1",
-            "is-symbol": "^1.0.2"
-          }
-        },
-        "has-symbols": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-          "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
-          "dev": true
-        },
-        "is-callable": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
-          "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
-          "dev": true
-        },
-        "is-regex": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
-          "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
-          "dev": true,
-          "requires": {
-            "has-symbols": "^1.0.1"
-          }
-        },
-        "object-inspect": {
-          "version": "1.8.0",
-          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-          "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
-          "dev": true
-        },
-        "object-keys": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-          "dev": true
-        }
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
       }
     },
-    "object.values": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
-      "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0-next.1",
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.6",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
-          "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
-          "dev": true,
-          "requires": {
-            "es-to-primitive": "^1.2.1",
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1",
-            "is-callable": "^1.2.0",
-            "is-regex": "^1.1.0",
-            "object-inspect": "^1.7.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.0",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        },
-        "es-to-primitive": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-          "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-          "dev": true,
-          "requires": {
-            "is-callable": "^1.1.4",
-            "is-date-object": "^1.0.1",
-            "is-symbol": "^1.0.2"
-          }
-        },
-        "has-symbols": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-          "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
-          "dev": true
-        },
-        "is-callable": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
-          "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
-          "dev": true
-        },
-        "is-regex": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-          "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
-          "dev": true,
-          "requires": {
-            "has-symbols": "^1.0.1"
-          }
-        },
-        "object-inspect": {
-          "version": "1.8.0",
-          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-          "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
-          "dev": true
-        },
-        "object-keys": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-          "dev": true
-        }
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.values": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+      "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3"
       }
     },
     "objectorarray": {
@@ -15116,16 +14328,16 @@
       }
     },
     "ora": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz",
-      "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz",
+      "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==",
       "dev": true,
       "requires": {
-        "chalk": "^3.0.0",
+        "chalk": "^4.1.0",
         "cli-cursor": "^3.1.0",
-        "cli-spinners": "^2.2.0",
+        "cli-spinners": "^2.4.0",
         "is-interactive": "^1.0.0",
-        "log-symbols": "^3.0.0",
+        "log-symbols": "^4.0.0",
         "mute-stream": "0.0.8",
         "strip-ansi": "^6.0.0",
         "wcwidth": "^1.0.1"
@@ -15148,9 +14360,9 @@
           }
         },
         "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
@@ -15181,21 +14393,6 @@
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "mute-stream": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
-          "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
-          "dev": true
-        },
-        "onetime": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
-          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
-          "dev": true,
-          "requires": {
-            "mimic-fn": "^2.1.0"
-          }
-        },
         "restore-cursor": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -15216,9 +14413,9 @@
           }
         },
         "supports-color": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
@@ -15918,9 +15115,9 @@
       }
     },
     "postcss-calc": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz",
-      "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz",
+      "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==",
       "dev": true,
       "requires": {
         "postcss": "^7.0.27",
@@ -16112,21 +15309,6 @@
         "vendors": "^1.0.0"
       },
       "dependencies": {
-        "dot-prop": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
-          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
-          "dev": true,
-          "requires": {
-            "is-obj": "^2.0.0"
-          }
-        },
-        "is-obj": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
-          "dev": true
-        },
         "postcss-selector-parser": {
           "version": "3.1.2",
           "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
@@ -16212,21 +15394,6 @@
         "postcss-selector-parser": "^3.0.0"
       },
       "dependencies": {
-        "dot-prop": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
-          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
-          "dev": true,
-          "requires": {
-            "is-obj": "^2.0.0"
-          }
-        },
-        "is-obj": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
-          "dev": true
-        },
         "postcss-selector-parser": {
           "version": "3.1.2",
           "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
@@ -17130,6 +16297,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
       "requires": {
         "safe-buffer": "^5.1.0"
       }
@@ -17418,9 +16586,9 @@
       }
     },
     "regjsgen": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
-      "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
       "dev": true
     },
     "regjsparser": {
@@ -17827,7 +16995,8 @@
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
     },
     "safe-regex": {
       "version": "1.1.0",
@@ -17924,14 +17093,14 @@
       "dev": true
     },
     "schema-utils": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
-      "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
       "dev": true,
       "requires": {
-        "@types/json-schema": "^7.0.4",
-        "ajv": "^6.12.2",
-        "ajv-keywords": "^3.4.1"
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
       },
       "dependencies": {
         "ajv": {
@@ -17946,6 +17115,12 @@
             "uri-js": "^4.2.2"
           }
         },
+        "ajv-keywords": {
+          "version": "3.5.2",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+          "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+          "dev": true
+        },
         "fast-deep-equal": {
           "version": "3.1.3",
           "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -19151,71 +18326,6 @@
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.6",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
-          "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
-          "dev": true,
-          "requires": {
-            "es-to-primitive": "^1.2.1",
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1",
-            "is-callable": "^1.2.0",
-            "is-regex": "^1.1.0",
-            "object-inspect": "^1.7.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.0",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        },
-        "es-to-primitive": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-          "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-          "dev": true,
-          "requires": {
-            "is-callable": "^1.1.4",
-            "is-date-object": "^1.0.1",
-            "is-symbol": "^1.0.2"
-          }
-        },
-        "has-symbols": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-          "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
-          "dev": true
-        },
-        "is-callable": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
-          "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
-          "dev": true
-        },
-        "is-regex": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-          "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
-          "dev": true,
-          "requires": {
-            "has-symbols": "^1.0.1"
-          }
-        },
-        "object-inspect": {
-          "version": "1.8.0",
-          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-          "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
-          "dev": true
-        },
-        "object-keys": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-          "dev": true
-        }
       }
     },
     "string.prototype.trimstart": {
@@ -19226,71 +18336,6 @@
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.6",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
-          "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
-          "dev": true,
-          "requires": {
-            "es-to-primitive": "^1.2.1",
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1",
-            "is-callable": "^1.2.0",
-            "is-regex": "^1.1.0",
-            "object-inspect": "^1.7.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.0",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        },
-        "es-to-primitive": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-          "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-          "dev": true,
-          "requires": {
-            "is-callable": "^1.1.4",
-            "is-date-object": "^1.0.1",
-            "is-symbol": "^1.0.2"
-          }
-        },
-        "has-symbols": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-          "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
-          "dev": true
-        },
-        "is-callable": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
-          "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
-          "dev": true
-        },
-        "is-regex": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-          "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
-          "dev": true,
-          "requires": {
-            "has-symbols": "^1.0.1"
-          }
-        },
-        "object-inspect": {
-          "version": "1.8.0",
-          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-          "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
-          "dev": true
-        },
-        "object-keys": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-          "dev": true
-        }
       }
     },
     "string_decoder": {
@@ -19360,21 +18405,6 @@
         "postcss-selector-parser": "^3.0.0"
       },
       "dependencies": {
-        "dot-prop": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
-          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
-          "dev": true,
-          "requires": {
-            "is-obj": "^2.0.0"
-          }
-        },
-        "is-obj": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
-          "dev": true
-        },
         "postcss-selector-parser": {
           "version": "3.1.2",
           "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
@@ -19578,40 +18608,24 @@
       "dev": true
     },
     "tar": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz",
-      "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==",
+      "version": "6.0.5",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
+      "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
       "dev": true,
       "requires": {
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
         "minipass": "^3.0.0",
-        "minizlib": "^2.1.0",
+        "minizlib": "^2.1.1",
         "mkdirp": "^1.0.3",
         "yallist": "^4.0.0"
       },
       "dependencies": {
-        "minizlib": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-          "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-          "dev": true,
-          "requires": {
-            "minipass": "^3.0.0",
-            "yallist": "^4.0.0"
-          }
-        },
         "mkdirp": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
           "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
           "dev": true
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
         }
       }
     },
@@ -20334,20 +19348,20 @@
       }
     },
     "universal-analytics": {
-      "version": "0.4.20",
-      "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz",
-      "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==",
+      "version": "0.4.23",
+      "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz",
+      "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==",
       "dev": true,
       "requires": {
-        "debug": "^3.0.0",
-        "request": "^2.88.0",
+        "debug": "^4.1.1",
+        "request": "^2.88.2",
         "uuid": "^3.0.0"
       },
       "dependencies": {
         "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
             "ms": "^2.1.1"
@@ -20358,6 +19372,44 @@
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
           "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
           "dev": true
+        },
+        "request": {
+          "version": "2.88.2",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+          "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+          "dev": true,
+          "requires": {
+            "aws-sign2": "~0.7.0",
+            "aws4": "^1.8.0",
+            "caseless": "~0.12.0",
+            "combined-stream": "~1.0.6",
+            "extend": "~3.0.2",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.3.2",
+            "har-validator": "~5.1.3",
+            "http-signature": "~1.2.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.19",
+            "oauth-sign": "~0.9.0",
+            "performance-now": "^2.1.0",
+            "qs": "~6.5.2",
+            "safe-buffer": "^5.1.2",
+            "tough-cookie": "~2.5.0",
+            "tunnel-agent": "^0.6.0",
+            "uuid": "^3.3.2"
+          }
+        },
+        "tough-cookie": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+          "dev": true,
+          "requires": {
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
         }
       }
     },
@@ -20728,71 +19780,6 @@
         "es-abstract": "^1.17.2",
         "has-symbols": "^1.0.1",
         "object.getownpropertydescriptors": "^2.1.0"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.6",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
-          "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
-          "dev": true,
-          "requires": {
-            "es-to-primitive": "^1.2.1",
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1",
-            "is-callable": "^1.2.0",
-            "is-regex": "^1.1.0",
-            "object-inspect": "^1.7.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.0",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        },
-        "es-to-primitive": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-          "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-          "dev": true,
-          "requires": {
-            "is-callable": "^1.1.4",
-            "is-date-object": "^1.0.1",
-            "is-symbol": "^1.0.2"
-          }
-        },
-        "has-symbols": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-          "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
-          "dev": true
-        },
-        "is-callable": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
-          "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
-          "dev": true
-        },
-        "is-regex": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-          "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
-          "dev": true,
-          "requires": {
-            "has-symbols": "^1.0.1"
-          }
-        },
-        "object-inspect": {
-          "version": "1.8.0",
-          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-          "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
-          "dev": true
-        },
-        "object-keys": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-          "dev": true
-        }
       }
     },
     "utils-merge": {
@@ -21283,14 +20270,6 @@
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
-        "serialize-javascript": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
-          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
-          "requires": {
-            "randombytes": "^2.1.0"
-          }
-        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -21321,17 +20300,6 @@
             "terser": "^4.1.2",
             "webpack-sources": "^1.4.0",
             "worker-farm": "^1.7.0"
-          },
-          "dependencies": {
-            "serialize-javascript": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
-              "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
-              "dev": true,
-              "requires": {
-                "randombytes": "^2.1.0"
-              }
-            }
           }
         },
         "yallist": {
@@ -21647,14 +20615,6 @@
       "dev": true,
       "requires": {
         "lodash": "^4.17.15"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "4.17.20",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-          "dev": true
-        }
       }
     },
     "webpack-sources": {
@@ -21708,9 +20668,9 @@
       "dev": true
     },
     "whatwg-url": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.0.tgz",
-      "integrity": "sha512-Sl4svq71j4kzaFD13uxkVl2AIsbj/xwp8NTM1VMhFRyNT1ZMTWaV6+Pva0fQs7y8+cAEPrDGfCAFLvJejhT79g==",
+      "version": "8.2.1",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.1.tgz",
+      "integrity": "sha512-ZmVCr6nfBeaMxEHALLEGy0LszYjpJqf6PVNQUQ1qd9Et+q7Jpygd4rGGDXgHjD8e99yLFseD69msHDM4YwPZ4A==",
       "dev": true,
       "requires": {
         "lodash.sortby": "^4.7.0",
diff --git a/package.json b/package.json
index 8a9be8f40..7be479a7e 100644
--- a/package.json
+++ b/package.json
@@ -36,17 +36,17 @@
   },
   "private": true,
   "dependencies": {
-    "@angular/animations": "^10.0.12",
-    "@angular/cdk": "^10.1.3",
+    "@angular/animations": "^10.1.0",
+    "@angular/cdk": "^10.2.0",
     "@angular/common": "^10.0.12",
     "@angular/compiler": "^10.0.12",
-    "@angular/core": "^10.0.12",
+    "@angular/core": "^10.1.0",
     "@angular/flex-layout": "^10.0.0-beta.32",
-    "@angular/forms": "^10.0.12",
-    "@angular/material": "^10.1.3",
-    "@angular/platform-browser": "^10.0.12",
-    "@angular/platform-browser-dynamic": "^10.0.12",
-    "@angular/router": "^10.0.12",
+    "@angular/forms": "^10.1.0",
+    "@angular/material": "^10.2.0",
+    "@angular/platform-browser": "^10.1.0",
+    "@angular/platform-browser-dynamic": "^10.1.0",
+    "@angular/router": "^10.1.0",
     "@types/pako": "^1.0.1",
     "@types/sprintf-js": "^1.1.2",
     "angular2-chartjs": "^0.5.1",
@@ -66,7 +66,7 @@
     "he": "^1.2.0",
     "jalhyd": "file:../jalhyd",
     "material-design-icons": "^3.0.1",
-    "mathjax": "^3.0.5",
+    "mathjax": "^3.1.0",
     "mermaid": "^8.7.0",
     "ngx-konami": "^1.7.1",
     "ngx-markdown": "^10.1.1",
@@ -84,23 +84,23 @@
     "zone.js": "^0.11.1"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "^0.1000.7",
-    "@angular/cli": "^10.0.7",
+    "@angular-devkit/build-angular": "^0.1000.8",
+    "@angular/cli": "^10.1.0",
     "@angular/compiler-cli": "^10.0.12",
-    "@angular/language-service": "^10.0.12",
+    "@angular/language-service": "^10.1.0",
     "@compodoc/compodoc": "^1.1.11",
     "@types/file-saver": "^2.0.1",
-    "@types/jasmine": "^3.5.13",
+    "@types/jasmine": "^3.5.14",
     "@types/jasminewd2": "^2.0.8",
-    "@types/node": "^14.6.0",
+    "@types/node": "^14.6.4",
     "codelyzer": "^6.0.0",
     "cordova": "^10.0.0",
-    "electron": "^10.0.0",
+    "electron": "^10.1.1",
     "electron-builder": "^22.8.0",
     "fs-extra": "^9.0.1",
     "jasmine-core": "^3.6.0",
     "jasmine-spec-reporter": "~5.0.0",
-    "karma": "^5.1.1",
+    "karma": "^5.2.1",
     "karma-chrome-launcher": "~3.1.0",
     "karma-cli": "~2.0.0",
     "karma-coverage-istanbul-reporter": "^3.0.3",
-- 
GitLab


From 66beb2e92737476cc2ec7831cdd949f1378de26c Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 15 Sep 2020 15:43:51 +0200
Subject: [PATCH 75/92] Add translations for Prebarrage

---
 src/locale/messages.en.json | 5 ++++-
 src/locale/messages.fr.json | 3 +++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 2e3202b0d..f3b269f33 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -52,7 +52,9 @@
     "ERROR_PARAMDEF_VALUE_UNDEFINED": "value of '%symbol%' parameter is undefined",
     "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "invalid %minValue%/%maxValue% min/max boundaries for 'interval' parameter definition domain",
     "ERROR_PARAMDOMAIN_INVALID": "parameter '%symbol%: non supported '%domain%' definition domain",
-    "ERROR_PREBARRAGE_NON_CONVERGENCE": "Pre-sam: non-convergence of the calculation",
+    "ERROR_PREBARRAGE_NON_CONVERGENCE": "Pre-dam: non-convergence of the calculation",
+    "ERROR_PREBARRAGE_STRUCTURE_ZDV_INF_ZF": "Apron elevation of device #%ns% is lower than bottom elevation of upstream basin of wall #%nc%",
+    "ERROR_PREBARRAGE_Z2_SUP_Z1": "Downstream water elevation is greater than upstream water elevation",
     "ERROR_PROBLEM_LOADING_SESSION": "Session loaded, with errors",
     "ERROR_REMOUS_NO_WATER_LINE": "No water line can be calculated",
     "ERROR_STRUCTURE_AU_MOINS_UNE": "A structure needs at least one device",
@@ -541,6 +543,7 @@
     "INFO_QUICKNAV_CHARTS": "charts",
     "INFO_QUICKNAV_INPUT": "input",
     "INFO_QUICKNAV_RESULTS": "results",
+    "WARNING_PREBARRAGE_BASSIN_ZF_SUP_Z1": "Bottom elevation of basin #%n% is greater than upstream water elevation",
     "WARNING_PROBLEMS_ENCOUNTERED": "Problems occurred during calculation (info: %info%, warning: %warning%, error: %error%)",
     "INFO_REGIMEUNIFORME_DESCRIPTION": "open-channel flow normal depth",
     "INFO_REGIMEUNIFORME_TITRE_COURT": "Uniform flow",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index ac6778e51..5f9abffd1 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -53,6 +53,8 @@
     "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "Les bornes (%minValue%/%maxValue%) de l'intervalle sont incorrectes",
     "ERROR_PARAMDOMAIN_INVALID": "Paramètre '%symbol%'&nbsp;: le domaine de définition '%domain%' est incorrect",
     "ERROR_PREBARRAGE_NON_CONVERGENCE": "Pré-barrage&nbsp;: non convergence du calcul",
+    "ERROR_PREBARRAGE_STRUCTURE_ZDV_INF_ZF": "Cote de radier de l'ouvrage n°%ns% inférieure à la cote de fond du bassin amont de la cloison n°%nc%",
+    "ERROR_PREBARRAGE_Z2_SUP_Z1": "Cote de l'eau aval supérieure à la cote de l'eau amont",
     "ERROR_PROBLEM_LOADING_SESSION": "Session chargée, avec des erreurs",
     "ERROR_REMOUS_NO_WATER_LINE": "Aucune ligne d'eau ne peut être calculée",
     "ERROR_STRUCTURE_AU_MOINS_UNE": "Il faut au moins un ouvrage dans une structure",
@@ -542,6 +544,7 @@
     "INFO_QUICKNAV_CHARTS": "graphiques",
     "INFO_QUICKNAV_INPUT": "données",
     "INFO_QUICKNAV_RESULTS": "résultats",
+    "WARNING_PREBARRAGE_BASSIN_ZF_SUP_Z1": "Cote de fond du bassin n°%n% supérieure à la cote de l'eau amont",
     "WARNING_PROBLEMS_ENCOUNTERED": "Des problèmes sont survenus durant le calcul (info&nbsp;: %info%, avertissement&nbsp;: %warning%, erreur&nbsp;: %error%)",
     "INFO_REGIMEUNIFORME_DESCRIPTION": "hydraulique à surface libre hauteur normale",
     "INFO_REGIMEUNIFORME_TITRE_COURT": "R. uniforme",
-- 
GitLab


From 6b6a5ca6bd495db8256fa597effa284b45c6acbb Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 15 Sep 2020 16:20:47 +0200
Subject: [PATCH 76/92] Fix PbCloison editor (code lost after rebase)

---
 src/app/calculators/prebarrage/config.json    | 11 ++-
 .../dialog-new-pb-cloison.component.ts        |  2 +-
 .../formulaire/definition/form-pb-cloison.ts  | 42 +++---------
 .../elements/select-field-custom.ts           | 68 ++++++++++++++++++-
 4 files changed, 81 insertions(+), 42 deletions(-)

diff --git a/src/app/calculators/prebarrage/config.json b/src/app/calculators/prebarrage/config.json
index e68895e29..510ae56d1 100644
--- a/src/app/calculators/prebarrage/config.json
+++ b/src/app/calculators/prebarrage/config.json
@@ -161,14 +161,12 @@
                 "fields": [
                     {
                         "id": "select_upstream_basin",
-                        "type": "select_reference",
-                        "reference": "nub",
+                        "type": "select_custom",
                         "source": "upstream_basin"
                     },
                     {
                         "id": "select_downstream_basin",
-                        "type": "select_reference",
-                        "reference": "nub",
+                        "type": "select_custom",
                         "source": "downstream_basin"
                     }
                 ]
@@ -182,9 +180,8 @@
             },
             {
                 "type": "options",
-                "upstreamBasinSelectId": "select_upstream_basin",
-                "downstreamBasinSelectId": "select_downstream_basin",
-                "selectIds": [ "select_structure", "select_loidebit" ]
+                "selectIds": [ "select_structure", "select_loidebit" ],
+                "customSelectIds": [ "select_upstream_basin", "select_downstream_basin" ]
             }
         ]
     },
diff --git a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
index a249ca814..9f0962115 100644
--- a/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
+++ b/src/app/components/dialog-new-pb-cloison/dialog-new-pb-cloison.component.ts
@@ -18,7 +18,7 @@ export class DialogNewPbCloisonComponent implements OnInit {
     /** the selected downstream basin */
     public downstreamIndex: number;
 
-    /** list of connectable basins, plus reiver upstream / downstrem */
+    /** list of connectable basins, plus river upstream / downstream */
     protected availableBasins: PbBassin[];
 
     constructor(
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index e8b9a8835..b1599380c 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -9,34 +9,6 @@ import { SelectFieldCustom } from "../elements/select-field-custom";
 
 export class FormulairePbCloison extends FormulaireParallelStructure {
 
-    /** id of select configuring upstream basin Nub */
-    private _upstreamBasinSelectId: string;
-
-    /** id of select configuring downstream basin Nub */
-    private _downstreamBasinSelectId: string;
-
-    protected parseOptions(json: {}) {
-        super.parseOptions(json);
-        this._upstreamBasinSelectId = this.getOption(json, "upstreamBasinSelectId");
-        this._downstreamBasinSelectId = this.getOption(json, "downstreamBasinSelectId");
-    }
-
-    protected completeParse(firstNotif: boolean = true) {
-        super.completeParse(firstNotif);
-        if (this._upstreamBasinSelectId) {
-            const sel = this.getFormulaireNodeById(this._upstreamBasinSelectId);
-            if (sel) {
-                sel.addObserver(this);
-            }
-        }
-        if (this._downstreamBasinSelectId) {
-            const sel = this.getFormulaireNodeById(this._downstreamBasinSelectId);
-            if (sel) {
-                sel.addObserver(this);
-            }
-        }
-    }
-
     // interface Observer
 
     public update(sender: IObservable, data: any) {
@@ -72,23 +44,27 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
             const nub = this._currentNub as PbCloison;
             const pb = nub.parent;
             // empty "" data.value.value should return undefined, which is good for amont/aval
-            const newBasin = pb.findChild(data.value.value) as PbBassin;
-            if (sender.id === this._upstreamBasinSelectId) {
-                // remove and recreate wall (easier for pointers consistency)
+            const newBasin = pb.findChild(data.value?.value) as PbBassin;
+            if (sender.id === "select_upstream_basin") {
+                // remove and recreate wall (easier for pointers consistency) but preserve UID
+                const uid = nub.uid;
                 const oldDownstreamBasin = nub.bassinAval;
                 pb.deleteChild(pb.findChildPosition(nub.uid));
                 const newWall = new PbCloison(newBasin, oldDownstreamBasin);
+                newWall.setUid(uid);
                 // copy structures
                 for (const s of nub.structures) {
                     newWall.addChild(s);
                 }
                 pb.addChild(newWall);
                 this.currentNub = newWall;
-            } else if (sender.id === this._downstreamBasinSelectId) {
-                // remove and recreate wall (easier for pointers consistency)
+            } else if (sender.id === "select_downstream_basin") {
+                // remove and recreate wall (easier for pointers consistency) but preserve UID
+                const uid = nub.uid;
                 const oldUpstreamBasin = nub.bassinAmont;
                 pb.deleteChild(pb.findChildPosition(nub.uid));
                 const newWall = new PbCloison(oldUpstreamBasin, newBasin);
+                newWall.setUid(uid);
                 // copy structures
                 for (const s of nub.structures) {
                     newWall.addChild(s);
diff --git a/src/app/formulaire/elements/select-field-custom.ts b/src/app/formulaire/elements/select-field-custom.ts
index a9f28c9c6..1036e25ac 100644
--- a/src/app/formulaire/elements/select-field-custom.ts
+++ b/src/app/formulaire/elements/select-field-custom.ts
@@ -3,7 +3,7 @@ import { ServiceFactory } from "../../services/service-factory";
 import { SelectField } from "./select-field";
 import { decodeHtml, arraysAreEqual } from "../../util";
 
-import { FishSpecies, Session, Solveur, FishPass, CalculatorType, Verificateur, Nub } from "jalhyd";
+import { FishSpecies, Session, Solveur, FishPass, CalculatorType, Verificateur, Nub, PbCloison, PreBarrage } from "jalhyd";
 
 import { sprintf } from "sprintf-js";
 
@@ -50,6 +50,18 @@ export class SelectFieldCustom extends SelectField {
                     }));
                 }
                 break;
+
+            case "upstream_basin": // PbCloisons, bassin amont
+                const ub = (nub as PbCloison).bassinAmont;
+                // console.log("-- load UB", ub, this._entriesBaseId + ub?.uid);
+                this.setValueFromId(this._entriesBaseId + (ub ? ub.uid : "none"));
+                break;
+
+            case "downstream_basin": // PbCloisons, bassin aval
+                const db = (nub as PbCloison).bassinAval;
+                // console.log("-- load DB", db, this._entriesBaseId + db?.uid);
+                this.setValueFromId(this._entriesBaseId + (db ? db.uid : "none"));
+                break;
         }
     }
 
@@ -152,6 +164,60 @@ export class SelectFieldCustom extends SelectField {
                     );
                 }
                 break;
+
+            case "upstream_basin": // PbCloisons, bassin amont
+                const pbWallU = this.parentForm.currentNub as PbCloison;
+                const preBarrageU = pbWallU.parent as PreBarrage;
+                const posDb = pbWallU.bassinAval?.findPositionInParent();
+                // river upstream
+                this.addEntry(
+                    new SelectEntry(
+                        this._entriesBaseId + "none",
+                        undefined,
+                        ServiceFactory.i18nService.localizeText("INFO_LIB_AMONT")
+                    )
+                );
+                // all available basins, depending on current downstream basin
+                for (const b of preBarrageU.bassins) {
+                    const pos = b.findPositionInParent();
+                    if (posDb === undefined || pos < posDb) {
+                        this.addEntry(
+                            new SelectEntry(
+                                this._entriesBaseId + b.uid,
+                                b.uid,
+                                ServiceFactory.i18nService.localizeMessage(b.description)
+                            )
+                        );
+                    }
+                }
+                break;
+
+            case "downstream_basin": // PbCloisons, bassin aval
+                const pbWallD = this.parentForm.currentNub as PbCloison;
+                const preBarrageD = pbWallD.parent as PreBarrage;
+                const posUb = pbWallD.bassinAmont?.findPositionInParent();
+                // all available basins, depending on current upstream basin
+                for (const b of preBarrageD.bassins) {
+                    const pos = b.findPositionInParent();
+                    if (posUb === undefined || pos > posUb) {
+                        this.addEntry(
+                            new SelectEntry(
+                                this._entriesBaseId + b.uid,
+                                b.uid,
+                                ServiceFactory.i18nService.localizeMessage(b.description)
+                            )
+                        );
+                    }
+                }
+                // river downstream
+                this.addEntry(
+                    new SelectEntry(
+                        this._entriesBaseId + "none",
+                        undefined,
+                        ServiceFactory.i18nService.localizeText("INFO_LIB_AVAL")
+                    )
+                );
+                break;
         }
     }
 
-- 
GitLab


From b1951aa945f4b28c5a3b0dfe0c8652ad95f850c9 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 17 Jul 2020 14:18:33 +0200
Subject: [PATCH 77/92] Use TypeScript's "Optional Chaining" syntax

---
 src/app/components/log/log.component.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/app/components/log/log.component.ts b/src/app/components/log/log.component.ts
index 350e544fe..18da5657c 100644
--- a/src/app/components/log/log.component.ts
+++ b/src/app/components/log/log.component.ts
@@ -34,7 +34,7 @@ export class LogComponent {
     }
 
     public get hasEntries(): boolean {
-        return this._log?.messages?.length > 0;
+        return this._log?.messages?.length !== 0;
     }
 
     public get messages(): Message[] {
-- 
GitLab


From 1c99db48f2944b7ebd84b5da0056a61fd2b3132b Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 16 Jul 2020 16:10:47 +0200
Subject: [PATCH 78/92] Fix #418 - use proper Angular mechanisms in results
 components

---
 .../calculator-results.component.html         |  14 +-
 .../calculator-results.component.ts           | 142 ++------------
 .../fixed-results.component.ts                |   3 +-
 .../fixedvar-results.component.html           |   4 +-
 .../fixedvar-results.component.ts             | 105 +---------
 .../fixedvar-results/var-results.component.ts |   3 +-
 .../jet-results/jet-results.component.html    |   4 +-
 .../jet-results/jet-results.component.ts      |  43 +----
 .../jet-trajectory-chart.component.ts         |   5 +-
 src/app/components/log/log.component.html     |   2 +-
 src/app/components/log/log.component.ts       |  13 +-
 ...rorugo-compound-results-table.component.ts |  37 ++--
 .../macrorugo-compound-results.component.html |  11 +-
 .../macrorugo-compound-results.component.ts   | 114 +----------
 .../pab-profile-chart.component.ts            |   3 +-
 .../pab-results-table.component.ts            |  57 +++---
 .../pab-results/pab-results.component.html    |  14 +-
 .../pab-results/pab-results.component.ts      | 123 +-----------
 .../pb-cloison-results.component.ts           |   3 +-
 .../pb-results/pb-results-table.component.ts  |   3 +-
 .../pb-results/pb-results.component.html      |  10 +-
 .../pb-results/pb-results.component.ts        | 181 +-----------------
 .../remous-results.component.html             |   6 +-
 .../remous-results.component.ts               |  84 +++-----
 .../results-chart/results-chart.component.ts  |   8 +-
 .../section-results.component.ts              |  25 +--
 .../variable-results-selector.component.ts    |  55 +++---
 src/app/results/multidimension-results.ts     |   2 +-
 src/app/results/var-results.ts                |   6 +-
 29 files changed, 228 insertions(+), 852 deletions(-)

diff --git a/src/app/components/calculator-results/calculator-results.component.html b/src/app/components/calculator-results/calculator-results.component.html
index 4befd3308..7f8019197 100644
--- a/src/app/components/calculator-results/calculator-results.component.html
+++ b/src/app/components/calculator-results/calculator-results.component.html
@@ -1,10 +1,10 @@
 <div>
-    <section-results [hidden]="! isSP"></section-results>
-    <remous-results [hidden]="! isRemous"></remous-results>
-    <pab-results [hidden]="! isPAB"></pab-results>
-    <pb-results [hidden]="! isPB"></pb-results>
+    <section-results [hidden]="! isSP" [results]=formResultsArray></section-results>
+    <remous-results [hidden]="! isRemous" [results]=formResultsArray></remous-results>
+    <pab-results [hidden]="! isPAB" [results]=formResultsArray></pab-results>
+    <pb-results [hidden]="! isPB" [results]=formResultsArray></pb-results>
     <verificateur-results [hidden]="! isVerificateur"></verificateur-results>
-    <macrorugo-compound-results [hidden]="! isMRC"></macrorugo-compound-results>
-    <jet-results [hidden]="! isJet"></jet-results>
-    <fixedvar-results [hidden]="! showGenericResults"></fixedvar-results>
+    <macrorugo-compound-results [hidden]="! isMRC" [results]=formResultsArray></macrorugo-compound-results>
+    <jet-results *ngIf="isJet" [results]=formResultsArray></jet-results>
+    <fixedvar-results *ngIf="! isJet" [results]=formResultsArray></fixedvar-results>
 </div>
diff --git a/src/app/components/calculator-results/calculator-results.component.ts b/src/app/components/calculator-results/calculator-results.component.ts
index 8c36c651c..27fa0e724 100644
--- a/src/app/components/calculator-results/calculator-results.component.ts
+++ b/src/app/components/calculator-results/calculator-results.component.ts
@@ -1,17 +1,8 @@
-import { Component, ViewChild, Output, EventEmitter, AfterViewChecked, Inject, forwardRef } from "@angular/core";
+import { Component, Output, EventEmitter, AfterViewChecked, Inject, forwardRef } from "@angular/core";
 
-import { FixedVarResultsComponent } from "../../components/fixedvar-results/fixedvar-results.component";
-import { SectionResultsComponent } from "../../components/section-results/section-results.component";
-import { RemousResultsComponent } from "../../components/remous-results/remous-results.component";
-import { PabResultsComponent } from "../../components/pab-results/pab-results.component";
-import { MacrorugoCompoundResultsComponent } from "../macrorugo-compound-results/macrorugo-compound-results.component";
 import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
-import { JetResultsComponent } from "../jet-results/jet-results.component";
+import { CalculatorResults } from "../../results/calculator-results";
 import { GenericCalculatorComponent } from "../generic-calculator/calculator.component";
-import { VerificateurResultsComponent } from "../verificateur-results/verificateur-results.component";
-
-import { CalculatorType } from "jalhyd";
-import { PbResultsComponent } from "../pb-results/pb-results.component";
 
 @Component({
     selector: "calc-results",
@@ -21,57 +12,7 @@ export class CalculatorResultsComponent implements AfterViewChecked {
 
     private _formulaire: FormulaireDefinition;
 
-    /**
-     * composant d'affichage des résultats de paramètres fixés/variables
-     */
-    @ViewChild(FixedVarResultsComponent, { static: true })
-    private fixedVarResultsComponent: FixedVarResultsComponent;
-
-    /**
-     * composant d'affichage des résultats des sections paramétrées
-     */
-    @ViewChild(SectionResultsComponent, { static: true })
-    private sectionResultsComponent: SectionResultsComponent;
-
-    /**
-     * composant d'affichage des résultats des courbes de remous
-     */
-    @ViewChild(RemousResultsComponent, { static: true })
-    private remousResultsComponent: RemousResultsComponent;
-
-    /**
-     * composant d'affichage des résultats des passes à bassins
-     */
-    @ViewChild(PabResultsComponent, { static: true })
-    private pabResultsComponent: PabResultsComponent;
-
-    /**
-     * composant d'affichage des résultats des vérificateurs de critères de franchissement
-     */
-    @ViewChild(VerificateurResultsComponent, { static: true })
-    private verificateurResultsComponent: VerificateurResultsComponent;
-
-    /*
-     * composant d'affichage des résultats des prébarrages
-     */
-    @ViewChild(PbResultsComponent, { static: true })
-    private pbResultsComponent: PbResultsComponent;
-
-    /**
-     * composant d'affichage des résultats des passes à macrorugosités complexes
-     */
-    @ViewChild(MacrorugoCompoundResultsComponent, { static: true })
-    private mrcResultsComponent: MacrorugoCompoundResultsComponent;
-
-    /**
-     * composant d'affichage des résultats des impacts de jet
-     */
-    @ViewChild(JetResultsComponent, { static: true })
-    private jetResultsComponent: JetResultsComponent;
-
-    /**
-     * événement émis à la fin du dessin de la vue
-     */
+    /** notify CalculatorComponent that it may scroll down to results panel */
     @Output()
     private afterViewChecked = new EventEmitter();
 
@@ -82,83 +23,28 @@ export class CalculatorResultsComponent implements AfterViewChecked {
     // @TODO this system is sh*tty !
     public set formulaire(f: FormulaireDefinition) {
         this._formulaire = f;
-        if (this._formulaire === undefined) {
-            this.fixedVarResultsComponent.results = undefined;
-            this.sectionResultsComponent.results = undefined;
-            this.pbResultsComponent.results = undefined;
-            this.jetResultsComponent.results = undefined;
-            this.mrcResultsComponent.results = undefined;
-            this.pabResultsComponent.results = undefined;
-            this.remousResultsComponent.results = undefined;
-            this.verificateurResultsComponent.results = undefined;
-        } else {
-            this.sectionResultsComponent.results = f.results;
-            this.remousResultsComponent.results = f.results;
-            this.pabResultsComponent.results = f.results;
-            this.pbResultsComponent.results = f.results;
-            this.mrcResultsComponent.results = f.results;
-            // FixedVar and Jet are mutually incompatible (the 2nd extend the 1st)
-            if (this.isJet) {
-                this.jetResultsComponent.results = f.results;
-                this.fixedVarResultsComponent.results = undefined;
-            } else {
-                this.fixedVarResultsComponent.results = f.results;
-                this.jetResultsComponent.results = undefined;
-            }
+    }
+
+    public get formResultsArray(): CalculatorResults[] {
+        let r: CalculatorResults[] = [];
+        if (this._formulaire !== undefined) {
+            r = this._formulaire.results;
         }
+        return r;
     }
 
     public updateView() {
-        this.fixedVarResultsComponent.updateView();
-        this.sectionResultsComponent.updateView();
-        this.remousResultsComponent.updateView();
-        this.pabResultsComponent.updateView();
-        this.pbResultsComponent.updateView();
-        this.mrcResultsComponent.updateView();
-        this.jetResultsComponent.updateView();
+        console.log("UPDATE VIEW (disabled)");
     }
 
     public ngAfterViewChecked() {
         this.afterViewChecked.emit();
     }
 
-    /** Should we show the default FixedVarResultsComponent ? */
-    public get showGenericResults(): boolean {
-        return (
-            ! this.isJet
-            && ! this.isMRC
-            && ! this.isPAB
-            && ! this.isRemous
-            && ! this.isSP
-            && ! this.isVerificateur
-        );
-    }
-
-    public get isJet(): boolean {
+    // JetResultsComponent extends FixedVarResultsComponent, which makes
+    // them incompatible with each other
+    public get isJet() {
         return this.calculatorComponent.isJet;
     }
 
-    public get isMRC(): boolean {
-        return this.calculatorComponent.isMRC;
-    }
-
-    public get isPAB(): boolean {
-        return this.calculatorComponent.isPAB;
-    }
-
-    public get isPB(): boolean {
-        return this.calculatorComponent.is(CalculatorType.PreBarrage);
-    }
-
-    public get isRemous(): boolean {
-        return this.calculatorComponent.is(CalculatorType.CourbeRemous);
-    }
-
-    public get isSP(): boolean {
-        return this.calculatorComponent.is(CalculatorType.SectionParametree);
-    }
-
-    public get isVerificateur(): boolean {
-        return this.calculatorComponent.is(CalculatorType.Verificateur);
-    }
 }
diff --git a/src/app/components/fixedvar-results/fixed-results.component.ts b/src/app/components/fixedvar-results/fixed-results.component.ts
index 8477e6cef..090c1829d 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.ts
+++ b/src/app/components/fixedvar-results/fixed-results.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, ElementRef } from "@angular/core";
+import { Component, ViewChild, ElementRef, Input } from "@angular/core";
 
 import { FixedResults } from "../../results/fixed-results";
 import { I18nService } from "../../services/internationalisation.service";
@@ -35,6 +35,7 @@ export class FixedResultsComponent extends ResultsComponentDirective {
         super();
     }
 
+    @Input()
     public set results(r: FixedResults) {
         this._fixedResults = r;
     }
diff --git a/src/app/components/fixedvar-results/fixedvar-results.component.html b/src/app/components/fixedvar-results/fixedvar-results.component.html
index 7676b0268..6c2d779be 100644
--- a/src/app/components/fixedvar-results/fixedvar-results.component.html
+++ b/src/app/components/fixedvar-results/fixedvar-results.component.html
@@ -1,8 +1,8 @@
 <div class="container">
     <!-- journal -->
-    <log></log>
+    <log [log]=mergedGlobalLogs></log>
 
-    <results-chart [hidden]="! showVarResultsChart"></results-chart>
+    <results-chart [hidden]="! showVarResultsChart" [results]=varResults></results-chart>
 
     <div>
         <!-- table des résultats fixés -->
diff --git a/src/app/components/fixedvar-results/fixedvar-results.component.ts b/src/app/components/fixedvar-results/fixedvar-results.component.ts
index 04136deb5..b80300bad 100644
--- a/src/app/components/fixedvar-results/fixedvar-results.component.ts
+++ b/src/app/components/fixedvar-results/fixedvar-results.component.ts
@@ -1,14 +1,9 @@
-import { Component, ViewChild, DoCheck } from "@angular/core";
+import { Component, Input } from "@angular/core";
 
-import { LogComponent } from "../../components/log/log.component";
 import { FixedResults } from "../../results/fixed-results";
 import { VarResults } from "../../results/var-results";
-import { ResultsChartComponent } from "../results-chart/results-chart.component";
 import { CalculatorResults } from "../../results/calculator-results";
 import { Result, cLog } from "jalhyd";
-import { NgParameter } from "../../formulaire/elements/ngparam";
-import { FixedResultsComponent } from "./fixed-results.component";
-import { VarResultsComponent } from "./var-results.component";
 import { ResultsComponentDirective } from "./results.component";
 
 @Component({
@@ -18,36 +13,14 @@ import { ResultsComponentDirective } from "./results.component";
         "./fixedvar-results.component.scss"
     ]
 })
-export class FixedVarResultsComponent extends ResultsComponentDirective implements DoCheck {
+export class FixedVarResultsComponent extends ResultsComponentDirective {
     /**
      * résultats non mis en forme
      */
     protected _fixedResults: FixedResults;
     protected _varResults: VarResults;
 
-    /**
-     * true si les résultats doiventt être remis à jour
-     */
-    protected _doUpdate = false;
-
-    @ViewChild(FixedResultsComponent)
-    private fixedResultsComponent: FixedResultsComponent;
-
-    @ViewChild(VarResultsComponent)
-    private varResultsComponent: VarResultsComponent;
-
-    /**
-     * composant journal
-     */
-    @ViewChild(LogComponent)
-    private logComponent: LogComponent;
-
-    /**
-     * graphique dans le cas d'un paramètre à varier
-     */
-    @ViewChild(ResultsChartComponent)
-    private resultsChartComponent: ResultsChartComponent;
-
+    @Input()
     public set results(rs: CalculatorResults[]) {
         this._fixedResults = undefined;
         this._varResults = undefined;
@@ -60,40 +33,6 @@ export class FixedVarResultsComponent extends ResultsComponentDirective implemen
                 }
             }
         }
-        this.updateView();
-    }
-
-    public updateView() {
-        if (this.logComponent) {
-            this.logComponent.log = undefined;
-        }
-        if (this.fixedResultsComponent) {
-            this.fixedResultsComponent.results = undefined;
-        }
-        if (this.varResultsComponent) {
-            this.varResultsComponent.results = undefined;
-        }
-        if (this.resultsChartComponent) {
-            this.resultsChartComponent.results = undefined;
-        }
-
-        // set _doUpdate flag so that results are rebuilt on the next Angular display cycle
-        this._doUpdate = false;
-        if (this._fixedResults !== undefined) {
-            this._doUpdate = this._fixedResults.hasResults || this._fixedResults.hasLog;
-        }
-        if (this._varResults !== undefined) {
-            this._doUpdate = this._doUpdate || this._varResults.hasResults || this._varResults.hasLog;
-        }
-    }
-
-    public ngDoCheck() {
-        if (this._doUpdate) {
-            // clodo trick @see nghyd#308
-            setTimeout(() => {
-                this._doUpdate = !this.updateResults();
-            }, 10);
-        }
     }
 
     private mergeLog(result: Result, log: cLog) {
@@ -106,7 +45,7 @@ export class FixedVarResultsComponent extends ResultsComponentDirective implemen
         }
     }
 
-    private get mergedGlobalLogs(): cLog {
+    public get mergedGlobalLogs(): cLog {
         const res = new cLog();
         if (this._fixedResults) {
             this.mergeLog(this._fixedResults.result, res);
@@ -117,42 +56,6 @@ export class FixedVarResultsComponent extends ResultsComponentDirective implemen
         return res;
     }
 
-    /**
-     * met à jour l'affichage des résultats
-     * @returns true si les résultats ont pu être mis à jour
-     */
-    protected updateResults() {
-        const fixedUpdated = this._fixedResults !== undefined && this.fixedResultsComponent !== undefined;
-        if (fixedUpdated) {
-            this.fixedResultsComponent.results = this._fixedResults;
-        }
-
-        let graphUpdated: boolean;
-        let varUpdated: boolean;
-        if (this._varResults && this._varResults.hasResults) {
-            varUpdated = this.varResultsComponent !== undefined;
-            if (varUpdated) {
-                this.varResultsComponent.results = this._varResults;
-            }
-
-            graphUpdated = this.resultsChartComponent !== undefined;
-            if (graphUpdated) {
-                this.resultsChartComponent.results = this._varResults;
-                this.resultsChartComponent.updateView();
-            }
-        } else {
-            varUpdated = true;
-            graphUpdated = true;
-        }
-
-        const logUpdated = this.logComponent !== undefined;
-        if (logUpdated) {
-            this.logComponent.log = this.mergedGlobalLogs;
-        }
-
-        return fixedUpdated && varUpdated && logUpdated && graphUpdated;
-    }
-
     /**
      * affichage de la table des résultats fixés
      */
diff --git a/src/app/components/fixedvar-results/var-results.component.ts b/src/app/components/fixedvar-results/var-results.component.ts
index d1ba56c32..7493401d2 100644
--- a/src/app/components/fixedvar-results/var-results.component.ts
+++ b/src/app/components/fixedvar-results/var-results.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, ElementRef } from "@angular/core";
+import { Component, ViewChild, ElementRef, Input } from "@angular/core";
 
 import { MatDialog } from "@angular/material/dialog";
 
@@ -45,6 +45,7 @@ export class VarResultsComponent extends ResultsComponentDirective {
     }
 
     /** Refreshes results and builds the dataset */
+    @Input()
     public set results(r: VarResults) {
         this._varResults = r;
         this._results = [];
diff --git a/src/app/components/jet-results/jet-results.component.html b/src/app/components/jet-results/jet-results.component.html
index ee434e04f..1acaf47ff 100644
--- a/src/app/components/jet-results/jet-results.component.html
+++ b/src/app/components/jet-results/jet-results.component.html
@@ -2,9 +2,9 @@
     <!-- journal -->
     <log></log>
 
-    <results-chart *ngIf="showVarResults" [hidden]="! showVarResultsChart"></results-chart>
+    <results-chart *ngIf="showVarResults" [hidden]="! showVarResultsChart" [results]=varResults></results-chart>
 
-    <jet-trajectory-chart [hidden]="! hasValidResults"></jet-trajectory-chart>
+    <jet-trajectory-chart [hidden]="! hasValidResults" [results]=trajectoryResults></jet-trajectory-chart>
 
     <div>
         <!-- table des résultats fixés -->
diff --git a/src/app/components/jet-results/jet-results.component.ts b/src/app/components/jet-results/jet-results.component.ts
index 04e068fb0..57258cd1e 100644
--- a/src/app/components/jet-results/jet-results.component.ts
+++ b/src/app/components/jet-results/jet-results.component.ts
@@ -1,7 +1,8 @@
-import { Component, ViewChild } from "@angular/core";
+import { Component } from "@angular/core";
 
 import { FixedVarResultsComponent } from "../fixedvar-results/fixedvar-results.component";
-import { JetTrajectoryChartComponent } from "../jet-trajectory-chart/jet-trajectory-chart.component";
+import { FixedResults } from "../../results/fixed-results";
+import { VarResults } from "../../results/var-results";
 
 @Component({
     selector: "jet-results",
@@ -12,10 +13,6 @@ import { JetTrajectoryChartComponent } from "../jet-trajectory-chart/jet-traject
 })
 export class JetResultsComponent extends FixedVarResultsComponent {
 
-    /** graphique de trajectoire */
-    @ViewChild(JetTrajectoryChartComponent)
-    private jetTrajectoryChartComponent: JetTrajectoryChartComponent;
-
     public get hasResults(): boolean {
         return (
             (this._fixedResults?.hasResults)
@@ -32,33 +29,13 @@ export class JetResultsComponent extends FixedVarResultsComponent {
         );
     }
 
-    public updateView() {
-        if (this.jetTrajectoryChartComponent) {
-            this.jetTrajectoryChartComponent.results = undefined;
+    public get trajectoryResults(): FixedResults | VarResults {
+        // draw chart whether params are variating or not,
+        // hence different Results object for each case
+        if (this._varResults && this._varResults.hasResults) {
+            return this._varResults;
+        } else {
+            return this._fixedResults;
         }
-        super.updateView();
-    }
-
-    /**
-     * met à jour l'affichage des résultats
-     * @returns true si les résultats ont pu être mis à jour
-     */
-    protected updateResults() {
-        const superUpdated = super.updateResults();
-
-        const trajectoryChartUpdated = this.jetTrajectoryChartComponent !== undefined;
-
-        if (trajectoryChartUpdated) {
-            // draw chart whether params are variating or not,
-            // hence different Results object for each case
-            if (this._varResults && this._varResults.hasResults) {
-                this.jetTrajectoryChartComponent.results = this._varResults;
-            } else {
-                this.jetTrajectoryChartComponent.results = this._fixedResults;
-            }
-            this.jetTrajectoryChartComponent.updateView();
-        }
-
-        return superUpdated && trajectoryChartUpdated;
     }
 }
diff --git a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
index 960cda6bd..f4ee238a0 100644
--- a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
+++ b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, ChangeDetectorRef } from "@angular/core";
+import { Component, ViewChild, ChangeDetectorRef, Input } from "@angular/core";
 
 import { ChartComponent } from "angular2-chartjs";
 
@@ -132,7 +132,9 @@ export class JetTrajectoryChartComponent extends ResultsComponentDirective {
         }, 10);
     }
 
+    @Input()
     public set results(r: FixedResults | VarResults) {
+        console.log("miam miam les bons résultats !", r);
         this.forceRebuild(); // used for forcing redefinition of xAxes[0].ticks.min/max in generateScatterChart()
         this._results = r;
 
@@ -171,6 +173,7 @@ export class JetTrajectoryChartComponent extends ResultsComponentDirective {
     }
 
     public updateView() {
+        console.log("----> regenerate trajectory chart !!");
         this.generateScatterChart();
     }
 
diff --git a/src/app/components/log/log.component.html b/src/app/components/log/log.component.html
index 4d3d0424a..5920817ec 100644
--- a/src/app/components/log/log.component.html
+++ b/src/app/components/log/log.component.html
@@ -3,6 +3,6 @@
         <!-- titre -->
         <div class="titre">{{ uitextTitreJournal }}</div>
         <!-- entrées du journal -->
-        <log-entry *ngFor="let m of messages" [_message]="m"></log-entry>
+        <log-entry *ngFor="let m of _log?.messages" [_message]="m"></log-entry>
     </div>
 </div>
diff --git a/src/app/components/log/log.component.ts b/src/app/components/log/log.component.ts
index 18da5657c..5235954b2 100644
--- a/src/app/components/log/log.component.ts
+++ b/src/app/components/log/log.component.ts
@@ -34,13 +34,18 @@ export class LogComponent {
     }
 
     public get hasEntries(): boolean {
-        return this._log?.messages?.length !== 0;
+        return this._log?.messages?.length > 0;
     }
 
-    public get messages(): Message[] {
-        return this._log?.messages;
-    }
+    /* public get messages(): Message[] {
+        let m: Message[] = [];
+        if (this._log !== undefined) {
+            m = this._log.messages;
+        }
+        return m;
+    } */
 
+    @Input()
     public set log(log: cLog) {
         this._log = log;
     }
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.ts b/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.ts
index abe858dcc..bf70492bf 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.ts
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, ElementRef } from "@angular/core";
+import { Component, ViewChild, ElementRef, Input, OnChanges } from "@angular/core";
 
 import { MacroRugo } from "jalhyd";
 
@@ -15,10 +15,15 @@ import { AppComponent } from "../../app.component";
         "./macrorugo-compound-results-table.component.scss"
     ]
 })
-export class MacrorugoCompoundResultsTableComponent extends ResultsComponentDirective {
+export class MacrorugoCompoundResultsTableComponent extends ResultsComponentDirective implements OnChanges {
 
     /** résultats non mis en forme */
-    private _mrcResults: MacrorugoCompoundResults;
+    @Input()
+    public results: MacrorugoCompoundResults;
+
+    /** index de l'élément de résultat à afficher (modifié par le sélecteur de conditions limites) */
+    @Input()
+    public variableIndex = 0;
 
     /** entêtes des colonnes */
     private _headers: string[];
@@ -36,21 +41,19 @@ export class MacrorugoCompoundResultsTableComponent extends ResultsComponentDire
         super();
     }
 
-    public set results(r: MacrorugoCompoundResults) {
-        this._mrcResults = r;
-
+    public ngOnChanges() {
+        // rebuild dataset every time results or variableIndex change
         this._dataSet = [];
         if (
-            this._mrcResults
-            && this._mrcResults.childrenResults
-            && this._mrcResults.childrenResults.length > 0
-            && ! this._mrcResults.hasOnlyErrors()
+            this.results
+            && this.results.childrenResults
+            && this.results.childrenResults.length > 0
+            && ! this.results.hasOnlyErrors()
         ) {
-            const pr = this._mrcResults;
+            const pr = this.results;
             const nDigits = this.appSetupService.displayPrecision;
             // when a parameter is variating, index of the variating parameter
             // values to build the data from
-            const vi = pr.variableIndex;
 
             // refresh headers here if language changed
             this._headers = pr.headers;
@@ -58,13 +61,13 @@ export class MacrorugoCompoundResultsTableComponent extends ResultsComponentDire
             // lines 1 - n-1 (aprons)
             for (let i = 0; i < pr.childrenResults.length; i++) {
                 // protect loop contents with if(vCalc) ? Will hide erroneous apron results..
-                const res = pr.childrenResults[i].resultElements[vi].values;
+                const res = pr.childrenResults[i].resultElements[this.variableIndex].values;
                 const nub = (pr.childrenResults[i].sourceNub as MacroRugo);
                 // does ZF1 or B vary ?
                 let zf1: number;
                 try {
                     if (nub.prms.ZF1.hasMultipleValues) {
-                        zf1 = nub.prms.ZF1.getInferredValuesList()[vi];
+                        zf1 = nub.prms.ZF1.getInferredValuesList()[this.variableIndex];
                     } else {
                         zf1 = nub.prms.ZF1.singleValue;
                     }
@@ -74,7 +77,7 @@ export class MacrorugoCompoundResultsTableComponent extends ResultsComponentDire
                 let b: number;
                 try {
                     if (nub.prms.B.hasMultipleValues) {
-                        b = nub.prms.B.getInferredValuesList()[vi];
+                        b = nub.prms.B.getInferredValuesList()[this.variableIndex];
                     } else {
                         b = nub.prms.B.singleValue;
                     }
@@ -84,7 +87,7 @@ export class MacrorugoCompoundResultsTableComponent extends ResultsComponentDire
                 let Y: number;
                 try {
                     if (nub.prms.Y.hasMultipleValues) {
-                        Y = nub.prms.Y.getInferredValuesList()[vi];
+                        Y = nub.prms.Y.getInferredValuesList()[this.variableIndex];
                     } else {
                         Y = nub.prms.Y.singleValue;
                     }
@@ -111,7 +114,7 @@ export class MacrorugoCompoundResultsTableComponent extends ResultsComponentDire
             this._dataSet.push([
                 this.intlService.localizeText("INFO_LIB_TOTAL"),
                 "", "", "",
-                pr.result.resultElements[vi].vCalc.toFixed(nDigits),
+                pr.result.resultElements[this.variableIndex].vCalc.toFixed(nDigits),
                 "", "", "", "", "", ""
             ]);
         }
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
index 85b150db8..ed2f042bc 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
@@ -1,15 +1,16 @@
 <div class="container">
 
-    <log #generalLog [logTitle]="uitextGeneralLogTitle">log général</log>
+    <log #generalLog [logTitle]="uitextGeneralLogTitle" [log]=globalLog>log général</log>
 
-    <variable-results-selector [results]="mrcResults" (indexChange)="variableIndexChanged()">
+    <variable-results-selector [results]=mrcResults [variatedParameters]=mrcResults?.variatedParameters>
     </variable-results-selector>
 
-    <log #iterationLog></log>
+    <log #iterationLog [log]=iterationLog></log>
 
     <div>
         <!-- tableau de résultats -->
-        <macrorugo-compound-results-table *ngIf="hasDisplayableResults" [results]="mrcResults">
+        <macrorugo-compound-results-table *ngIf="hasDisplayableResults"
+          [results]=mrcResults [variableIndex]=mrcResults?.variableIndex>
         </macrorugo-compound-results-table>
     </div>
 
@@ -24,7 +25,7 @@
         fxLayoutAlign="space-around start">
         <!-- <pab-profile-chart *ngIf="hasDisplayableResults" fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </pab-profile-chart> -->
-        <results-chart *ngIf="hasDisplayableResults" fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        <results-chart *ngIf="hasDisplayableResults" [results]=plottableResults fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </results-chart>
     </div>
 
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
index d2d932838..cbe53d860 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
@@ -1,18 +1,14 @@
-import { Component, ViewChild, DoCheck } from "@angular/core";
+import { Component, Input, OnChanges } from "@angular/core";
 
 import { Result, cLog, Message, MessageCode, MessageSeverity, MRCInclination } from "jalhyd";
 
 import { fv } from "../../../app/util";
 
-import { LogComponent } from "../../components/log/log.component";
 import { CalculatorResults } from "../../results/calculator-results";
 import { NgParameter } from "../../formulaire/elements/ngparam";
 import { ApplicationSetupService } from "../../services/app-setup.service";
 import { PlottableData } from "../../results/plottable-data";
-import { ResultsChartComponent } from "../results-chart/results-chart.component";
 import { I18nService } from "../../services/internationalisation.service";
-import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
-import { MacrorugoCompoundResultsTableComponent } from "./macrorugo-compound-results-table.component";
 import { MacrorugoCompoundResults } from "../../results/macrorugo-compound-results";
 import { PlottableMacrorugoCompoundResults } from "../../results/plottable-macrorugo-compound-results";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
@@ -24,7 +20,7 @@ import { ResultsComponentDirective } from "../fixedvar-results/results.component
         "./macrorugo-compound-results.component.scss"
     ]
 })
-export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective implements DoCheck {
+export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective implements OnChanges {
 
     /** résultats non mis en forme */
     private _mrcResults: MacrorugoCompoundResults;
@@ -32,24 +28,6 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
     /** résultats mis en forme pour le graphique de données (classique) */
     private _plottableResults: PlottableMacrorugoCompoundResults;
 
-    /** true si les résultats doiventt être remis à jour */
-    private _doUpdate = false;
-
-    @ViewChild(MacrorugoCompoundResultsTableComponent)
-    private mrcResultsTableComponent: MacrorugoCompoundResultsTableComponent;
-
-    @ViewChild(VariableResultsSelectorComponent)
-    private variableResultsSelectorComponent: VariableResultsSelectorComponent;
-
-    @ViewChild("generalLog")
-    private generalLogComponent: LogComponent;
-
-    @ViewChild("iterationLog")
-    private iterationLogComponent: LogComponent;
-
-    @ViewChild(ResultsChartComponent)
-    private resultsChartComponent: ResultsChartComponent;
-
     constructor(
         private appSetupService: ApplicationSetupService,
         private i18nService: I18nService,
@@ -58,50 +36,16 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
         this._plottableResults = new PlottableMacrorugoCompoundResults();
     }
 
+    public ngOnChanges() {
+        console.log("--------> MRCR_C changes…");
+    }
+
+    @Input()
     public set results(rs: CalculatorResults[]) {
         this._mrcResults = undefined;
         if (rs.length > 0 && rs[0] instanceof MacrorugoCompoundResults) {
             this._mrcResults = rs[0] as MacrorugoCompoundResults;
         }
-        this.updateView();
-    }
-
-    /**
-     * update results table and chart when the variable index changed (event sent by
-     * VariableResultsSelectorComponent); variable index is already set in
-     * mrcResults at this time
-     */
-    public variableIndexChanged() {
-        this.updateView();
-    }
-
-    public updateView() {
-        if (this.iterationLogComponent) {
-            this.iterationLogComponent.log = undefined;
-        }
-        if (this.generalLogComponent) {
-            this.generalLogComponent.log = undefined;
-        }
-        if (this.mrcResultsTableComponent) {
-            this.mrcResultsTableComponent.results = undefined;
-        }
-        if (this.variableResultsSelectorComponent) {
-            this.variableResultsSelectorComponent.results = undefined;
-        }
-        if (this.resultsChartComponent) {
-            this.resultsChartComponent.results = undefined;
-        }
-        // set _doUpdate flag so that results are rebuilt on the next Angular display cycle
-        this._doUpdate = false;
-        if (this._mrcResults !== undefined) {
-            this._doUpdate = this._doUpdate || this._mrcResults.hasResults || this._mrcResults.hasLog;
-        }
-    }
-
-    public ngDoCheck() {
-        if (this._doUpdate) {
-            this._doUpdate = !this.updateResults();
-        }
     }
 
     private mergeGlobalLog(result: Result, log: cLog) {
@@ -177,7 +121,7 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
      * du sélecteur d'itération : messages globaux et / ou résumé des messages
      * spécifiques à chaque ResultElement
      */
-    private get globalLog(): cLog {
+    public get globalLog(): cLog {
         const l = new cLog();
         if (this._mrcResults && this.mrcResults.variatedParameters.length > 0) {
             this.mergeGlobalLog(this._mrcResults.result, l);
@@ -203,7 +147,7 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
      * du sélecteur d'itération : messages globaux et / ou résumé des messages
      * spécifiques à chaque ResultElement
      */
-    private get iterationLog(): cLog {
+    public get iterationLog(): cLog {
         const l = new cLog();
         if (this._mrcResults) {
             if (this.mrcResults.variatedParameters.length > 0) {
@@ -238,46 +182,6 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
         return l;
     }
 
-    /**
-     * met à jour l'affichage des résultats
-     * @returns true si les résultats ont pu être mis à jour
-     */
-    private updateResults() {
-        let mrcUpdated: boolean;
-        let resultsChartUpdated: boolean;
-        let selectorUpdated: boolean;
-
-        // results or not, there might be a log
-        const logUpdated = (this.iterationLogComponent !== undefined || this.generalLogComponent !== undefined); // gne ?
-        if (logUpdated) {
-            // order of logs is important !
-            this.iterationLogComponent.log = this.iterationLog;
-            this.generalLogComponent.log = this.globalLog;
-        }
-
-        if (this.hasResults) {
-            mrcUpdated = this.mrcResultsTableComponent !== undefined;
-            if (mrcUpdated) {
-                this.mrcResultsTableComponent.results = this._mrcResults;
-            }
-            selectorUpdated = this.variableResultsSelectorComponent !== undefined;
-            if (selectorUpdated) {
-                this.variableResultsSelectorComponent.results = this._mrcResults;
-            }
-            resultsChartUpdated = this.resultsChartComponent !== undefined;
-            if (resultsChartUpdated) {
-                this.resultsChartComponent.results = this.plottableResults;
-                this.resultsChartComponent.updateView();
-            }
-        } else {
-            mrcUpdated = true;
-            resultsChartUpdated = true;
-            selectorUpdated = true;
-        }
-
-        return mrcUpdated && logUpdated && resultsChartUpdated && selectorUpdated;
-    }
-
     public get mrcResults() {
         return this._mrcResults;
     }
diff --git a/src/app/components/pab-profile-chart/pab-profile-chart.component.ts b/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
index ce34f4dae..6f24b8ab1 100644
--- a/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
+++ b/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, ChangeDetectorRef } from "@angular/core";
+import { Component, ViewChild, ChangeDetectorRef, Input } from "@angular/core";
 
 import { ChartComponent } from "angular2-chartjs";
 
@@ -125,6 +125,7 @@ export class PabProfileChartComponent extends ResultsComponentDirective {
         };
     }
 
+    @Input()
     public set results(r: PabResults) {
         this._results = r;
 
diff --git a/src/app/components/pab-results/pab-results-table.component.ts b/src/app/components/pab-results/pab-results-table.component.ts
index 45418cf16..3591658a7 100644
--- a/src/app/components/pab-results/pab-results-table.component.ts
+++ b/src/app/components/pab-results/pab-results-table.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, ElementRef } from "@angular/core";
+import { Component, ViewChild, ElementRef, Input, OnChanges } from "@angular/core";
 
 import { CloisonAval, Result, capitalize } from "jalhyd";
 
@@ -15,10 +15,15 @@ import { fv } from "../../util";
         "./pab-results-table.component.scss"
     ]
 })
-export class PabResultsTableComponent extends ResultsComponentDirective {
+export class PabResultsTableComponent extends ResultsComponentDirective implements OnChanges {
 
     /** résultats non mis en forme */
-    private _pabResults: PabResults;
+    @Input()
+    public results: PabResults;
+
+    /** index de l'élément de résultat à afficher (modifié par le sélecteur de conditions limites) */
+    @Input()
+    public variableIndex = 0;
 
     /** entêtes des colonnes */
     private _headers: string[];
@@ -35,33 +40,15 @@ export class PabResultsTableComponent extends ResultsComponentDirective {
         super();
     }
 
-    private getJetTypes(re: Result, vi: number): string {
-        // jet type for each device
-        const devices = re.sourceNub.getChildren();
-        const jetTypes: string[] = devices.map((device) => {
-            const jt = device.result.resultElements[vi].getValue("ENUM_StructureJetType");
-            let jetType = capitalize(this.intlService.localizeText("INFO_ENUM_STRUCTUREJETTYPE_" + jt));
-            if (devices.length > 1) {
-                // evil HTML injection in table cell (simpler)
-                jetType = this.intlService.localizeText("INFO_LIB_FS_OUVRAGE") + " n°"
-                    + (device.findPositionInParent() + 1) + ": " + jetType;
-            }
-            return jetType;
-        });
-        return `<div class="inner-cell-line">` + jetTypes.join(`, </div><div class="inner-cell-line">`) + `</div>`;
-    }
-
-    public set results(r: PabResults) {
-        this._pabResults = r;
-
+    public ngOnChanges() {
         this._dataSet = [];
         if (
-            this._pabResults
-            && this._pabResults.cloisonsResults
-            && this._pabResults.cloisonsResults.length > 0
-            && ! this._pabResults.hasOnlyErrors()
+            this.results
+            && this.results.cloisonsResults
+            && this.results.cloisonsResults.length > 0
+            && ! this.results.hasOnlyErrors()
         ) {
-            const pr = this._pabResults;
+            const pr = this.results;
             // when a parameter is variating, index of the variating parameter
             // values to build the data from
             const vi = pr.variableIndex;
@@ -134,6 +121,22 @@ export class PabResultsTableComponent extends ResultsComponentDirective {
         }
     }
 
+    private getJetTypes(re: Result, vi: number): string {
+        // jet type for each device
+        const devices = re.sourceNub.getChildren();
+        const jetTypes: string[] = devices.map((device) => {
+            const jt = device.result.resultElements[vi].getValue("ENUM_StructureJetType");
+            let jetType = this.intlService.localizeText("INFO_ENUM_STRUCTUREJETTYPE_" + jt);
+            if (devices.length > 1) {
+                // evil HTML injection in table cell (simpler)
+                jetType = this.intlService.localizeText("INFO_LIB_FS_OUVRAGE") + " n°"
+                    + (device.findPositionInParent() + 1) + ": " + jetType;
+            }
+            return jetType;
+        });
+        return `<div class="inner-cell-line">` + jetTypes.join(`, </div><div class="inner-cell-line">`) + `</div>`;
+    }
+
     public get headers() {
         return this._headers;
     }
diff --git a/src/app/components/pab-results/pab-results.component.html b/src/app/components/pab-results/pab-results.component.html
index 9bb311053..8dc980039 100644
--- a/src/app/components/pab-results/pab-results.component.html
+++ b/src/app/components/pab-results/pab-results.component.html
@@ -1,24 +1,26 @@
 <div class="container">
 
-    <log #generalLog [logTitle]="uitextGeneralLogTitle">log général</log>
+    <log #generalLog [logTitle]="uitextGeneralLogTitle" [log]=globalLog>log général</log>
 
-    <variable-results-selector [results]="pabResults" (indexChange)="variableIndexChanged()">
+    <variable-results-selector [results]="pabResults" [variatedParameters]=pabResults?.variatedParameters>
     </variable-results-selector>
 
-    <log #iterationLog></log>
+    <log #iterationLog [log]=iterationLog></log>
 
     <div>
         <!-- tableau de résultats -->
-        <pab-results-table *ngIf="hasDisplayableResults" [results]="pabResults"></pab-results-table>
+        <pab-results-table *ngIf="hasDisplayableResults"
+          [results]=pabResults [variableIndex]=pabResults?.variableIndex>
+        </pab-results-table>
     </div>
 
     <quicknav *ngIf="hasDisplayableResults" [items]="[ 'input', 'results', 'charts' ]" [currentItem]="'charts'"
         [align]="'left'"></quicknav>
 
     <div id="pab-graphs-container" class="container" fxLayout="row wrap" fxLayoutAlign="space-around start">
-        <pab-profile-chart *ngIf="hasDisplayableResults" fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        <pab-profile-chart *ngIf="hasDisplayableResults" [results]=pabResults fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </pab-profile-chart>
-        <results-chart *ngIf="hasDisplayableResults" fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        <results-chart *ngIf="hasDisplayableResults" [results]=plottableResults fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </results-chart>
     </div>
 
diff --git a/src/app/components/pab-results/pab-results.component.ts b/src/app/components/pab-results/pab-results.component.ts
index 309a6647a..011ba0bd1 100644
--- a/src/app/components/pab-results/pab-results.component.ts
+++ b/src/app/components/pab-results/pab-results.component.ts
@@ -1,17 +1,12 @@
-import { Component, ViewChild, DoCheck } from "@angular/core";
+import { Component, Input } from "@angular/core";
 
 import { Result, cLog, Message, MessageCode, MessageSeverity } from "jalhyd";
 
-import { LogComponent } from "../../components/log/log.component";
 import { CalculatorResults } from "../../results/calculator-results";
-import { PabResultsTableComponent } from "./pab-results-table.component";
 import { PabResults } from "../../results/pab-results";
-import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
 import { PlottableData } from "../../results/plottable-data";
 import { PlottablePabResults } from "../../results/plottable-pab-results";
-import { ResultsChartComponent } from "../results-chart/results-chart.component";
 import { I18nService } from "../../services/internationalisation.service";
-import { PabProfileChartComponent } from "../pab-profile-chart/pab-profile-chart.component";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 
 @Component({
@@ -21,7 +16,7 @@ import { ResultsComponentDirective } from "../fixedvar-results/results.component
         "./pab-results.component.scss"
     ]
 })
-export class PabResultsComponent extends ResultsComponentDirective implements DoCheck {
+export class PabResultsComponent extends ResultsComponentDirective {
 
     /** résultats non mis en forme */
     private _pabResults: PabResults;
@@ -29,27 +24,6 @@ export class PabResultsComponent extends ResultsComponentDirective implements Do
     /** résultats mis en forme pour le graphique de données (classique) */
     private _plottableResults: PlottablePabResults;
 
-    /** true si les résultats doiventt être remis à jour */
-    private _doUpdate = false;
-
-    @ViewChild(PabResultsTableComponent)
-    private pabResultsTableComponent: PabResultsTableComponent;
-
-    @ViewChild(VariableResultsSelectorComponent)
-    private variableResultsSelectorComponent: VariableResultsSelectorComponent;
-
-    @ViewChild("generalLog")
-    private generalLogComponent: LogComponent;
-
-    @ViewChild("iterationLog")
-    private iterationLogComponent: LogComponent;
-
-    @ViewChild(ResultsChartComponent)
-    private resultsChartComponent: ResultsChartComponent;
-
-    @ViewChild(PabProfileChartComponent)
-    private profileChartComponent: PabProfileChartComponent;
-
     constructor(
         private i18nService: I18nService,
     ) {
@@ -57,53 +31,13 @@ export class PabResultsComponent extends ResultsComponentDirective implements Do
         this._plottableResults = new PlottablePabResults();
     }
 
+    @Input()
     public set results(rs: CalculatorResults[]) {
         this._pabResults = undefined;
         if (rs.length > 0 && rs[0] instanceof PabResults) {
             this._pabResults = rs[0] as PabResults;
         }
-        this.updateView();
-    }
-
-    /**
-     * update results table and chart when the variable index changed (event sent by
-     * VariableResultsSelectorComponent); variable index is already set in
-     * pabResults at this time
-     */
-    public variableIndexChanged() {
-        this.updateView();
-    }
-
-    public updateView() {
-        if (this.iterationLogComponent) {
-            this.iterationLogComponent.log = undefined;
-        }
-        if (this.generalLogComponent) {
-            this.generalLogComponent.log = undefined;
-        }
-        if (this.pabResultsTableComponent) {
-            this.pabResultsTableComponent.results = undefined;
-        }
-        if (this.variableResultsSelectorComponent) {
-            this.variableResultsSelectorComponent.results = undefined;
-        }
-        if (this.resultsChartComponent) {
-            this.resultsChartComponent.results = undefined;
-        }
-        if (this.profileChartComponent) {
-            this.profileChartComponent.results = undefined;
-        }
-        // set _doUpdate flag so that results are rebuilt on the next Angular display cycle
-        this._doUpdate = false;
-        if (this._pabResults !== undefined) {
-            this._doUpdate = this._doUpdate || this._pabResults.hasResults || this._pabResults.hasLog;
-        }
-    }
-
-    public ngDoCheck() {
-        if (this._doUpdate) {
-            this._doUpdate = !this.updateResults();
-        }
+        // this.updateView();
     }
 
     private mergeGlobalLog(result: Result, log: cLog) {
@@ -199,7 +133,7 @@ export class PabResultsComponent extends ResultsComponentDirective implements Do
      * du sélecteur d'itération : messages globaux et / ou résumé des messages
      * spécifiques à chaque ResultElement
      */
-    private get globalLog(): cLog {
+    public get globalLog(): cLog {
         const l = new cLog();
         if (this._pabResults && this.pabResults.variatedParameters.length > 0) {
             this.mergeGlobalLog(this._pabResults.result, l);
@@ -266,53 +200,6 @@ export class PabResultsComponent extends ResultsComponentDirective implements Do
         return l;
     }
 
-    /**
-     * met à jour l'affichage des résultats
-     * @returns true si les résultats ont pu être mis à jour
-     */
-    private updateResults() {
-        let pabUpdated: boolean;
-        let resultsChartUpdated: boolean;
-        let profileChartUpdated: boolean;
-        let selectorUpdated: boolean;
-
-        // results or not, there might be a log
-        const logUpdated = (this.iterationLogComponent !== undefined || this.generalLogComponent !== undefined); // gne ?
-        if (logUpdated) {
-            // order of logs is important !
-            this.iterationLogComponent.log = this.iterationLog;
-            this.generalLogComponent.log = this.globalLog;
-        }
-
-        if (this.hasResults) {
-            pabUpdated = this.pabResultsTableComponent !== undefined;
-            if (pabUpdated) {
-                this.pabResultsTableComponent.results = this._pabResults;
-            }
-            selectorUpdated = this.variableResultsSelectorComponent !== undefined;
-            if (selectorUpdated) {
-                this.variableResultsSelectorComponent.results = this._pabResults;
-            }
-            resultsChartUpdated = this.resultsChartComponent !== undefined;
-            if (resultsChartUpdated) {
-                this.resultsChartComponent.results = this.plottableResults;
-                this.resultsChartComponent.updateView();
-            }
-            profileChartUpdated = this.profileChartComponent !== undefined;
-            if (profileChartUpdated) {
-                this.profileChartComponent.results = this._pabResults;
-                this.profileChartComponent.updateView();
-            }
-        } else {
-            pabUpdated = true;
-            resultsChartUpdated = true;
-            profileChartUpdated = true;
-            selectorUpdated = true;
-        }
-
-        return pabUpdated && logUpdated && resultsChartUpdated && profileChartUpdated && selectorUpdated;
-    }
-
     public get pabResults() {
         return this._pabResults;
     }
diff --git a/src/app/components/pb-results/pb-cloison-results.component.ts b/src/app/components/pb-results/pb-cloison-results.component.ts
index 0d2fe30cc..0a59b6a8b 100644
--- a/src/app/components/pb-results/pb-cloison-results.component.ts
+++ b/src/app/components/pb-results/pb-cloison-results.component.ts
@@ -1,4 +1,4 @@
-import { Component } from "@angular/core";
+import { Component, Input } from "@angular/core";
 
 import { FixedResultsComponent } from "../fixedvar-results/fixed-results.component";
 import { NgParameter } from "../../formulaire/elements/ngparam";
@@ -16,6 +16,7 @@ import { Result, ResultElement } from "jalhyd";
 })
 export class PbCloisonResultsComponent extends FixedResultsComponent {
 
+    @Input()
     public set results(r: PbCloisonResults) {
         this._fixedResults = r;
     }
diff --git a/src/app/components/pb-results/pb-results-table.component.ts b/src/app/components/pb-results/pb-results-table.component.ts
index 925eab960..c5d8dff4d 100644
--- a/src/app/components/pb-results/pb-results-table.component.ts
+++ b/src/app/components/pb-results/pb-results-table.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, ElementRef } from "@angular/core";
+import { Component, ViewChild, ElementRef, Input } from "@angular/core";
 
 import { PreBarrage, PbBassin } from "jalhyd";
 
@@ -35,6 +35,7 @@ export class PbResultsTableComponent extends ResultsComponentDirective {
         super();
     }
 
+    @Input()
     public set results(r: PrebarrageResults) {
         this._pbResults = r;
 
diff --git a/src/app/components/pb-results/pb-results.component.html b/src/app/components/pb-results/pb-results.component.html
index 80a7d4501..cce785e43 100644
--- a/src/app/components/pb-results/pb-results.component.html
+++ b/src/app/components/pb-results/pb-results.component.html
@@ -1,16 +1,16 @@
 <div class="container">
-    <log #generalLog [logTitle]="uitextGeneralLogTitle">log général</log>
+    <log #generalLog [logTitle]="uitextGeneralLogTitle" [log]=globalLog>log général</log>
 
-    <variable-results-selector [results]="pbResults" (indexChange)="variableIndexChanged()">
+    <variable-results-selector [results]=pbResults>
     </variable-results-selector>
 
-    <log #iterationLog></log>
+    <log #iterationLog [log]=iterationLog></log>
 
     <!-- tableau de résultats des bassins -->
-    <pb-results-table *ngIf="hasBasinResults" [results]="pbResults"></pb-results-table>
+    <pb-results-table *ngIf="hasBasinResults" [results]=pbResults></pb-results-table>
 
     <!-- table des résultats fixés -->
-    <pb-cloison-results *ngIf="hasWallResults" [results]="pbResults.cloisonResults"></pb-cloison-results>
+    <pb-cloison-results *ngIf="hasWallResults" [results]=pbResults.cloisonResults></pb-cloison-results>
 
     <!-- <quicknav *ngIf="hasDisplayableResults" [items]="[ 'input', 'results', 'charts' ]"
         [currentItem]="'charts'" [align]="'left'"></quicknav> -->
diff --git a/src/app/components/pb-results/pb-results.component.ts b/src/app/components/pb-results/pb-results.component.ts
index 0362c6b8b..666257c7d 100644
--- a/src/app/components/pb-results/pb-results.component.ts
+++ b/src/app/components/pb-results/pb-results.component.ts
@@ -1,15 +1,10 @@
-import { Component, ViewChild, DoCheck } from "@angular/core";
+import { Component, Input } from "@angular/core";
 
-import { LogComponent } from "../log/log.component";
 import { CalculatorResults } from "../../results/calculator-results";
-import { PbResultsTableComponent } from "./pb-results-table.component";
 import { PrebarrageResults } from "../../results/prebarrage-results";
-import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
 import { I18nService } from "../../services/internationalisation.service";
-import { PbCloisonResultsComponent } from "./pb-cloison-results.component";
-import { FixedResults } from "../../results/fixed-results";
 
-import { Result } from "jalhyd";
+import { cLog } from "jalhyd";
 
 @Component({
     selector: "pb-results",
@@ -18,36 +13,16 @@ import { Result } from "jalhyd";
         "./pb-results.component.scss"
     ]
 })
-export class PbResultsComponent implements DoCheck {
+export class PbResultsComponent {
 
     /** résultats des bassins, non mis en forme */
     private _pbResults: PrebarrageResults;
 
-    /** true si les résultats doiventt être remis à jour */
-    private _doUpdate = false;
-
-    @ViewChild(PbResultsTableComponent)
-    private pbResultsTableComponent: PbResultsTableComponent;
-
-    @ViewChild(VariableResultsSelectorComponent)
-    private variableResultsSelectorComponent: VariableResultsSelectorComponent;
-
-    @ViewChild(PbCloisonResultsComponent)
-    private pbCloisonResultsComponent: PbCloisonResultsComponent;
-
-    @ViewChild("generalLog")
-    private generalLogComponent: LogComponent;
-
-    @ViewChild("iterationLog")
-    private iterationLogComponent: LogComponent;
-
-    /* @ViewChild(PabProfileChartComponent)
-    private profileChartComponent: PabProfileChartComponent; */
-
     constructor(
         private i18nService: I18nService,
     ) { }
 
+    @Input()
     public set results(rs: CalculatorResults[]) {
         this._pbResults = undefined;
         for (const r of rs) {
@@ -55,7 +30,7 @@ export class PbResultsComponent implements DoCheck {
                 this._pbResults = r as PrebarrageResults;
             }
         }
-        this.updateView();
+        // this.updateView();
     }
 
     public get pbResults() {
@@ -77,47 +52,6 @@ export class PbResultsComponent implements DoCheck {
         return this._pbResults && this._pbResults.hasWallResults;
     }
 
-    /**
-     * update results table and chart when the variable index changed (event sent by
-     * VariableResultsSelectorComponent); variable index is already set in
-     * pbResults at this time
-     */
-    public variableIndexChanged() {
-        this.updateView();
-    }
-
-    public updateView() {
-        if (this.iterationLogComponent) {
-            this.iterationLogComponent.log = undefined;
-        }
-        if (this.generalLogComponent) {
-            this.generalLogComponent.log = undefined;
-        }
-        if (this.pbResultsTableComponent) {
-            this.pbResultsTableComponent.results = undefined;
-        }
-        if (this.variableResultsSelectorComponent) {
-            this.variableResultsSelectorComponent.results = undefined;
-        }
-        if (this.pbCloisonResultsComponent) {
-            this.pbCloisonResultsComponent.results = undefined;
-        }
-        /* if (this.profileChartComponent) {
-            this.profileChartComponent.results = undefined;
-        } */
-        // set _doUpdate flag so that results are rebuilt on the next Angular display cycle
-        this._doUpdate = false;
-        if (this._pbResults !== undefined) {
-            this._doUpdate = this._doUpdate || this._pbResults.hasResults || this._pbResults.hasLog;
-        }
-    }
-
-    public ngDoCheck() {
-        if (this._doUpdate) {
-            this._doUpdate = !this.updateResults();
-        }
-    }
-
     /* private mergeGlobalLog(result: Result, log: cLog) {
         if (result) {
             if (result.hasGlobalLog()) {
@@ -211,9 +145,9 @@ export class PbResultsComponent implements DoCheck {
      * du sélecteur d'itération : messages globaux et / ou résumé des messages
      * spécifiques à chaque ResultElement
      */
-    /* private get globalLog(): cLog {
+    public get globalLog(): cLog {
         const l = new cLog();
-        if (this._pbResults && this.pbResults.variatedParameters.length > 0) {
+        /* if (this._pbResults && this.pbResults.variatedParameters.length > 0) {
             this.mergeGlobalLog(this._pbResults.result, l);
             // un problème avec la PAB en général / les cloisons, à une étape quelconque ?
             if (
@@ -228,107 +162,8 @@ export class PbResultsComponent implements DoCheck {
                 l.add(m);
                 // l.add(new Message(MessageCode.WARNING_PROBLEMS_ENCOUNTERED));
             }
-        } // sinon pas de log global (aucun paramètre ne varie)
-        return l;
-    } */
-
-    /**
-     * Retourne les logs à afficher dans le composant de log global, au dessus
-     * du sélecteur d'itération : messages globaux et / ou résumé des messages
-     * spécifiques à chaque ResultElement
-     */
-    /* private get iterationLog(): cLog {
-        const l = new cLog();
-        if (this._pbResults) {
-            if (this.pbResults.variatedParameters.length > 0) {
-                // A. si un paramètre varie
-                const vi = this._pbResults.variableIndex;
-                // log de la PAB pour l'itération en cours
-                if (
-                    this._pbResults.result
-                    && this._pbResults.result.hasResultElements()
-                    && this._pbResults.result.resultElements[vi]
-                    && this._pbResults.result.resultElements[vi].hasLog()
-                ) {
-                    l.addLog(this._pbResults.result.resultElements[vi].log);
-                }
-                // logs des enfants pour l'itération en cours
-                for (const cr of this._pbResults.cloisonsResults) {
-                    if (cr && cr.hasResultElements() && cr.resultElements[vi].hasLog()) {
-                        l.addLog(cr.resultElements[vi].log);
-                    }
-                }
-                if (this._pbResults.cloisonAvalResults && this._pbResults.cloisonAvalResults.resultElements[vi].hasLog()) {
-                    l.addLog(this._pbResults.cloisonAvalResults.resultElements[vi].log);
-                }
-            } else {
-                // B. si aucun paramètre ne varie
-                this.mergeGlobalLog(this._pbResults.result, l); // faut bien mettre le log global quelque part
-                // logs des enfants
-                for (const cr of this._pbResults.cloisonsResults) {
-                    if (cr && cr.hasResultElements() && cr.resultElement.hasLog()) {
-                        l.addLog(cr.resultElement.log);
-                    }
-                }
-                if (this._pbResults.cloisonAvalResults && this._pbResults.cloisonAvalResults.resultElement.hasLog()) {
-                    l.addLog(this._pbResults.cloisonAvalResults.resultElement.log);
-                }
-            }
-        }
+        } // sinon pas de log global (aucun paramètre ne varie) */
         return l;
-    } */
-
-    /**
-     * met à jour l'affichage des résultats
-     * @returns true si les résultats ont pu être mis à jour
-     */
-    private updateResults() {
-        let pbTableUpdated: boolean;
-        let profileChartUpdated: boolean;
-        let selectorUpdated: boolean;
-        let cloisonResultsUpdated: boolean;
-
-        // results or not, there might be a log
-        const logUpdated = (this.iterationLogComponent !== undefined || this.generalLogComponent !== undefined); // gne ?
-        if (logUpdated) {
-            // order of logs is important !
-            /* this.iterationLogComponent.log = this.iterationLog;
-            this.generalLogComponent.log = this.globalLog; */
-        }
-
-        // show selector as long as any result is present
-        if (this.hasResults) {
-            selectorUpdated = this.variableResultsSelectorComponent !== undefined;
-            if (selectorUpdated) {
-                this.variableResultsSelectorComponent.results = this._pbResults;
-            }
-        } else {
-            selectorUpdated = true;
-        }
-        if (this.hasBasinResults) {
-            pbTableUpdated = this.pbResultsTableComponent !== undefined;
-            if (pbTableUpdated) {
-                this.pbResultsTableComponent.results = this._pbResults;
-            }
-            /* profileChartUpdated = this.profileChartComponent !== undefined;
-            if (profileChartUpdated) {
-                this.profileChartComponent.results = this._pbResults;
-                this.profileChartComponent.updateView();
-            } */
-        } else {
-            pbTableUpdated = true;
-            profileChartUpdated = true;
-        }
-        if (this.hasWallResults) {
-            cloisonResultsUpdated = this.pbCloisonResultsComponent !== undefined;
-            if (cloisonResultsUpdated) {
-                this.pbCloisonResultsComponent.results = this._pbResults.cloisonResults;
-            }
-        } else {
-            cloisonResultsUpdated = true;
-        }
-
-        return pbTableUpdated && logUpdated && profileChartUpdated && selectorUpdated && cloisonResultsUpdated;
     }
 
     public get uitextGeneralLogTitle(): string {
diff --git a/src/app/components/remous-results/remous-results.component.html b/src/app/components/remous-results/remous-results.component.html
index ed96cbf12..da5ce69b5 100644
--- a/src/app/components/remous-results/remous-results.component.html
+++ b/src/app/components/remous-results/remous-results.component.html
@@ -42,10 +42,10 @@
 
 
 <!-- journal -->
-<log></log>
+<log [log]=log></log>
 
 <div [hidden]="! hasData">
     <!-- *ngIf breaks @ViewChild availability-->
     <!-- résultats numériques -->
-    <var-results></var-results>
-</div>
\ No newline at end of file
+    <var-results [results]=varResults></var-results>
+</div>
diff --git a/src/app/components/remous-results/remous-results.component.ts b/src/app/components/remous-results/remous-results.component.ts
index ecf98435a..4a18b7fb9 100644
--- a/src/app/components/remous-results/remous-results.component.ts
+++ b/src/app/components/remous-results/remous-results.component.ts
@@ -1,17 +1,16 @@
-import { Component, ViewChild, DoCheck } from "@angular/core";
+import { Component, Input } from "@angular/core";
 
-import { INumberIterator, CourbeRemousParams, CourbeRemous, ParamDefinition, ParamDomain, ParamDomainValue } from "jalhyd";
+import { INumberIterator, CourbeRemousParams, CourbeRemous, ParamDefinition, ParamDomainValue, cLog } from "jalhyd";
 
 import { I18nService } from "../../services/internationalisation.service";
-import { LogComponent } from "../../components/log/log.component";
 import { RemousResults } from "../../results/remous-results";
 import { CalculatorResults } from "../../results/calculator-results";
-import { VarResultsComponent } from "../fixedvar-results/var-results.component";
 import { FormulaireService } from "../../services/formulaire.service";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 import { AppComponent } from "../../app.component";
 import { LineData, ChartData } from "./line-and-chart-data";
 import { fv } from "../../util";
+import { VarResults } from "../../results/var-results";
 
 @Component({
     selector: "remous-results",
@@ -20,7 +19,7 @@ import { fv } from "../../util";
         "./remous-results.component.scss"
     ]
 })
-export class RemousResultsComponent extends ResultsComponentDirective implements DoCheck {
+export class RemousResultsComponent extends ResultsComponentDirective {
 
     private _remousResults: RemousResults;
 
@@ -43,23 +42,6 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
      */
     private _tableHeaders: string[];
 
-    /**
-     * true si les résultats doivent être mis à jour
-     */
-    private _doUpdate = false;
-
-    /**
-     * composant des résultats variables
-     */
-    @ViewChild(VarResultsComponent)
-    private varResultsComponent: VarResultsComponent;
-
-    /**
-     * composant journal
-     */
-    @ViewChild(LogComponent)
-    private logComponent: LogComponent;
-
     constructor(
         private intlService: I18nService,
         private formService: FormulaireService
@@ -67,7 +49,11 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
         super();
     }
 
-    private get uitextLigneFluviale() {
+    public get remousResults() {
+        return this._remousResults;
+    }
+
+    public get uitextLigneFluviale() {
         // calculator type for translation
         const sn = this._remousResults.result.sourceNub;
         let ct = sn.calcType;
@@ -77,7 +63,7 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
         return this.formService.expandVariableNameAndUnit(ct, "FLU");
     }
 
-    private get uitextLigneTorrentielle() {
+    public get uitextLigneTorrentielle() {
         // calculator type for translation
         const sn = this._remousResults.result.sourceNub;
         let ct = sn.calcType;
@@ -87,23 +73,23 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
         return this.formService.expandVariableNameAndUnit(ct, "TOR");
     }
 
-    private get uitextAbscisse() {
+    public get uitextAbscisse() {
         return this.intlService.localizeText("INFO_REMOUSRESULTS_ABSCISSE");
     }
 
-    private get uitextFond() {
+    public get uitextFond() {
         return this.intlService.localizeText("INFO_REMOUSRESULTS_FOND");
     }
 
-    private get uitextBerge() {
+    public get uitextBerge() {
         return this.intlService.localizeText("INFO_REMOUSRESULTS_BERGE");
     }
 
-    private get uitextTirantNormal() {
+    public get uitextTirantNormal() {
         return this.intlService.localizeText("INFO_REMOUSRESULTS_TIRANTNORMAL");
     }
 
-    private get uitextTirantCritique() {
+    public get uitextTirantCritique() {
         return this.intlService.localizeText("INFO_REMOUSRESULTS_TIRANTCRITIQUE");
     }
 
@@ -149,6 +135,7 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
         return this._remousResults && this._remousResults.result && this._remousResults.result.ok;
     }
 
+    @Input()
     public set results(rs: CalculatorResults[]) {
         this._remousResults = undefined;
         if (rs !== undefined) {
@@ -159,43 +146,19 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
                 }
             }
         }
-        this.updateView();
+        // this.updateView();
     }
 
-    public updateView() {
-        this.graph1_data = {};
-        this.graph1_options = {};
-        this.graph2_data = {};
-        this.graph2_options = {};
-        if (this.varResultsComponent !== undefined) {
-            this.varResultsComponent.results = undefined;
-        }
-        if (this.logComponent !== undefined) {
-            this.logComponent.log = undefined;
-        }
-        this._tableHeaders = [];
-
+    public get log(): cLog {
         if (this._remousResults !== undefined) {
-            this._doUpdate = this._remousResults.hasResults;
-        }
-    }
-
-    /**
-     * appelé pour gérer les changements non détectés par Angular
-     */
-    public ngDoCheck() {
-        if (this._doUpdate) {
-            this._doUpdate = !this.updateResults();
+            return this._remousResults.log;
         }
     }
 
-    private updateResults() {
-        if (this.logComponent !== undefined && this._remousResults !== undefined) {
-            this.logComponent.log = this._remousResults.log;
-            this.generateChart();
-            return true;
+    public get varResults(): VarResults {
+        if (this._remousResults !== undefined) {
+            return this._remousResults.varResults;
         }
-        return false;
     }
 
     /**
@@ -270,9 +233,6 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
         // le dernier dataset de la liste datasets est dessiné en 1er
 
         this._remousResults.update();
-        if (this.varResultsComponent) {
-            this.varResultsComponent.results = this._remousResults.varResults;
-        }
 
         const nub = this._remousResults.result.sourceNub as CourbeRemous;
         const params = nub.prms as CourbeRemousParams;
diff --git a/src/app/components/results-chart/results-chart.component.ts b/src/app/components/results-chart/results-chart.component.ts
index 05247e41c..cda71306f 100644
--- a/src/app/components/results-chart/results-chart.component.ts
+++ b/src/app/components/results-chart/results-chart.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, AfterContentInit, ChangeDetectorRef } from "@angular/core";
+import { Component, ViewChild, AfterContentInit, ChangeDetectorRef, Input, OnChanges, SimpleChanges } from "@angular/core";
 
 import { ChartComponent } from "angular2-chartjs";
 
@@ -90,6 +90,7 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
         };
     }
 
+    @Input()
     public set results(r: PlottableData) {
         this.forceRebuild();
         this._results = r;
@@ -98,13 +99,13 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
         }
     }
 
-    public get availableXAxis() {
+    public get availableXAxis(): string[] {
         if (this._results) {
             return this._results.getAvailableXAxis();
         }
     }
 
-    public get availableYAxis() {
+    public get availableYAxis(): string[] {
         if (this._results) {
             if (this._results.graphType !== ChartType.Scatter) {
                 // do not use real Y axis (that include families), if chart cannot display multiple series
@@ -170,6 +171,7 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
     }
 
     public updateView() {
+        console.log("----> regenerate chart !!");
         // (re)generate chart
         switch (this._graphTypeComponent.selectedValue) {
             case ChartType.Histogram:
diff --git a/src/app/components/section-results/section-results.component.ts b/src/app/components/section-results/section-results.component.ts
index 99df6bb4a..5d6acdeee 100644
--- a/src/app/components/section-results/section-results.component.ts
+++ b/src/app/components/section-results/section-results.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, DoCheck, ElementRef } from "@angular/core";
+import { Component, ViewChild, ElementRef, Input } from "@angular/core";
 
 import { ResultElement } from "jalhyd";
 
@@ -16,7 +16,7 @@ import { FixedVarResultsComponent } from "../fixedvar-results/fixedvar-results.c
         "./section-results.component.scss"
     ]
 })
-export class SectionResultsComponent extends FixedVarResultsComponent implements DoCheck {
+export class SectionResultsComponent extends ResultsComponentDirective {
 
     constructor(
         private intlService: I18nService,
@@ -25,6 +25,7 @@ export class SectionResultsComponent extends FixedVarResultsComponent implements
         super();
     }
 
+    @Input()
     public set results(rs: CalculatorResults[]) {
         super.results = rs;
         this._resultElement = undefined;
@@ -36,7 +37,8 @@ export class SectionResultsComponent extends FixedVarResultsComponent implements
                 }
             }
         }
-        this.updateView();
+        // this.updateView();
+        this.drawSectionCanvas();
     }
 
     /** détermine s'il y a des résultats de section "fixes" (pas de paramètre varié, graphique de la section) */
@@ -72,16 +74,6 @@ export class SectionResultsComponent extends FixedVarResultsComponent implements
     @ViewChild(SectionCanvasComponent)
     private _sectionCanvasComponent: SectionCanvasComponent;
 
-    public updateView() {
-        if (this._sectionCanvasComponent) {
-            this._sectionCanvasComponent.reset();
-        }
-        if (this._results) {
-            this._doUpdate = this._results.hasResults;
-        }
-        super.updateView();
-    }
-
     private isSectionLevel(s: string) {
         for (const k in SectionResultsComponent.labelColors) {
             if (k === s) {
@@ -91,10 +83,11 @@ export class SectionResultsComponent extends FixedVarResultsComponent implements
         return false;
     }
 
-    protected updateResults() {
-        const superUpdated = super.updateResults();
+    private drawSectionCanvas() {
+        if (this._results && this._sectionCanvas) {
+
+            this._sectionCanvas.reset();
 
-        if (this._results && this._sectionCanvasComponent !== undefined) {
             this._resultElement = new ResultElement();
 
             // compute canvas optimal size the first time
diff --git a/src/app/components/variable-results-selector/variable-results-selector.component.ts b/src/app/components/variable-results-selector/variable-results-selector.component.ts
index ff36f82b1..716d7fc9e 100644
--- a/src/app/components/variable-results-selector/variable-results-selector.component.ts
+++ b/src/app/components/variable-results-selector/variable-results-selector.component.ts
@@ -1,11 +1,11 @@
-import { Component, Output, EventEmitter } from "@angular/core";
+import { Component, Output, EventEmitter, Input, OnChanges } from "@angular/core";
 
 import { I18nService } from "../../services/internationalisation.service";
 import { fv, longestVarParam } from "../../util";
 import { MultiDimensionResults } from "../../results/multidimension-results";
 import { PrebarrageResults } from "../../results/prebarrage-results";
 
-import { CalculatorType, PbCloison, Structure } from "jalhyd";
+import { CalculatorType, PbCloison, Structure, VariatedDetails } from "jalhyd";
 
 @Component({
     selector: "variable-results-selector",
@@ -14,12 +14,18 @@ import { CalculatorType, PbCloison, Structure } from "jalhyd";
         "./variable-results-selector.component.scss"
     ]
 })
-export class VariableResultsSelectorComponent {
+export class VariableResultsSelectorComponent implements OnChanges {
 
     /** résultats non mis en forme */
-    private _results: MultiDimensionResults;
+    @Input()
+    private results: MultiDimensionResults;
 
-    private _selectedValue: number;
+    /** détails des paramètres qui varient dans le Nub associé au formulaire */
+    @Input()
+    private variatedParameters: VariatedDetails[];
+
+    /** valeur en cours */
+    private _selectedValue = 0;
 
     /** size of the longest variable value */
     private size = 0;
@@ -27,26 +33,23 @@ export class VariableResultsSelectorComponent {
     /** inferred extended values list for each variating parameter */
     private varValues = [];
 
-    @Output()
-    protected indexChange = new EventEmitter();
+    /* @Output()
+    protected indexChange = new EventEmitter(); */
 
     constructor(
         protected intlService: I18nService,
-    ) {
-        this._selectedValue = 0;
-    }
+    ) { }
 
-    public set results(r: MultiDimensionResults) {
-        this._results = r;
-
-        if (this._results) {
-            // pre-extract variable parameters values
+    public ngOnChanges() {
+        console.log("==//== changes !! ==//==", this.variatedParameters);
+        // rebuild variable parameters values everytime somthing changes
+        if (this.variatedParameters) {
             this.varValues = [];
             // find longest list
-            const lvp = longestVarParam(this._results.variatedParameters);
+            const lvp = longestVarParam(this.variatedParameters);
             this.size = lvp.size;
             // get extended values lists for each variable parameter
-            for (const v of this._results.variatedParameters) {
+            for (const v of this.variatedParameters) {
                 const vv = [];
                 const iter = v.param.getExtendedValuesIterator(this.size);
                 while (iter.hasNext) {
@@ -56,13 +59,17 @@ export class VariableResultsSelectorComponent {
                 this.varValues.push(vv);
             }
         }
+        // get current variatedIndex even if component was rebuilt
+        if (this.results) {
+            this._selectedValue = this.results.variableIndex;
+        }
     }
 
     public get hasVariableResults(): boolean {
         return (
-            this._results
-            && this._results.hasResults
-            && this._results.variatedParameters.length > 0
+            this.results
+            && this.results.hasResults
+            && this.results.variatedParameters.length > 0
         );
     }
 
@@ -78,7 +85,7 @@ export class VariableResultsSelectorComponent {
         const kv = [];
         for (let i = 0; i < this.varValues.length; i++) {
             const vv = this.varValues[i];
-            const vp = this._results.variatedParameters[i];
+            const vp = this.results.variatedParameters[i];
             let symbol = vp.param.symbol;
             // is vp a parameter of a child Nub ?
             if (
@@ -90,7 +97,7 @@ export class VariableResultsSelectorComponent {
                 switch (vp.param.originNub.calcType) {
                     case CalculatorType.PreBarrage:
                         const struct = vp.param.parentNub as Structure;
-                        const pbRes = this._results as PrebarrageResults;
+                        const pbRes = this.results as PrebarrageResults;
                         const wall = struct.parent as PbCloison;
                         const posS = struct.findPositionInParent() + 1;
                         childPrefix = this.intlService.localizeMessage(wall.description);
@@ -117,8 +124,8 @@ export class VariableResultsSelectorComponent {
     }
 
     public set selectedValue(v: number) {
-        this._results.variableIndex = v;
-        this.indexChange.emit();
+        this.results.variableIndex = v;
+        // this.indexChange.emit();
     }
 
     public get label() {
diff --git a/src/app/results/multidimension-results.ts b/src/app/results/multidimension-results.ts
index 44967427c..c7af4cc99 100644
--- a/src/app/results/multidimension-results.ts
+++ b/src/app/results/multidimension-results.ts
@@ -6,7 +6,7 @@ import { VariatedDetails } from "jalhyd";
 export class MultiDimensionResults extends CalculatedParamResults {
 
     /** paramètres variés */
-    public variatedParameters: VariatedDetails[];
+    public variatedParameters: VariatedDetails[] = [];
 
     /** index de la valeur du paramètre varié à afficher dans les résultats */
     protected _variableIndex = 0;
diff --git a/src/app/results/var-results.ts b/src/app/results/var-results.ts
index 918d70845..b982233ef 100644
--- a/src/app/results/var-results.ts
+++ b/src/app/results/var-results.ts
@@ -13,7 +13,7 @@ export class VarResults extends CalculatedParamResults implements PlottableData
     /**
      * paramètres variés
      */
-    private _variatedParams: VariatedDetails[];
+    private _variatedParams: VariatedDetails[] = [];
 
     /**
      * titre des colonnes des résultats variés
@@ -408,10 +408,10 @@ export class VarResults extends CalculatedParamResults implements PlottableData
      * When variable parameter or chart type changes, ensure the X / Y current values are still available
      */
     public resetDefaultAxisIfNeeded() {
-        if (! this.getAvailableXAxis().includes(this.chartX)) {
+        if (this.variatedParameters.length > 0 && ! this.getAvailableXAxis().includes(this.chartX)) {
             this.chartX = this.variatedParameters[0].param.symbol;
         }
-        if (! this.getAvailableYAxis().includes(this.chartY)) {
+        if (this.variatedParameters.length > 0 && ! this.getAvailableYAxis().includes(this.chartY)) {
             this.chartY = this.variatedParameters[0].param.symbol;
         }
     }
-- 
GitLab


From ff2886215724aafcae0d1ddcb5c2fd3da80b34a5 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Mon, 20 Jul 2020 10:00:53 +0200
Subject: [PATCH 79/92] Renamed graphType to chartType

---
 .../results-chart/results-chart.component.ts  | 40 +++++++++----------
 .../formulaire/definition/form-fixedvar.ts    |  4 +-
 src/app/results/plottable-data.ts             |  2 +-
 .../plottable-macrorugo-compound-results.ts   |  2 +-
 src/app/results/plottable-pab-results.ts      |  2 +-
 src/app/results/var-results.ts                |  4 +-
 6 files changed, 26 insertions(+), 28 deletions(-)

diff --git a/src/app/components/results-chart/results-chart.component.ts b/src/app/components/results-chart/results-chart.component.ts
index cda71306f..2995070a5 100644
--- a/src/app/components/results-chart/results-chart.component.ts
+++ b/src/app/components/results-chart/results-chart.component.ts
@@ -92,10 +92,9 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
 
     @Input()
     public set results(r: PlottableData) {
-        this.forceRebuild();
         this._results = r;
         if (this._results && this._graphTypeComponent) {
-            this._graphTypeComponent.selectedValue = r.graphType;
+            this._graphTypeComponent.selectedValue = r.chartType;
         }
     }
 
@@ -107,7 +106,7 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
 
     public get availableYAxis(): string[] {
         if (this._results) {
-            if (this._results.graphType !== ChartType.Scatter) {
+            if (this._results.chartType !== ChartType.Scatter) {
                 // do not use real Y axis (that include families), if chart cannot display multiple series
                 return this._results.getAvailableXAxis();
             } else {
@@ -172,24 +171,23 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
 
     public updateView() {
         console.log("----> regenerate chart !!");
-        // (re)generate chart
-        switch (this._graphTypeComponent.selectedValue) {
-            case ChartType.Histogram:
-                this.graph_type = "bar";
-                this.generateBarChart();
-                break;
-
-            case ChartType.Dots:
-                this.graph_type = "line";
-                this.generateLineChart();
-                break;
-
-            default:
-                this.graph_type = "scatter";
-                this.generateScatterChart();
-                break;
+            switch (this._graphTypeComponent.selectedValue) {
+                case ChartType.Histogram:
+                    this.graph_type = "bar";
+                    this.generateBarChart();
+                    break;
+
+                case ChartType.Dots:
+                    this.graph_type = "line";
+                    this.generateLineChart();
+                    break;
+
+                default:
+                    this.graph_type = "scatter";
+                    this.generateScatterChart();
+                    break;
+            }
         }
-    }
 
     public ngAfterContentInit() {
         this._graphTypeComponent.addObserver(this);
@@ -481,7 +479,7 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
     update(sender: any, data: any) {
         if (sender instanceof ChartTypeSelectComponent) {
             if (data.action === "graphTypeChanged") {
-                this._results.graphType = data.value;
+                this._results.chartType = data.value;
             }
         }
         this.updateView();
diff --git a/src/app/formulaire/definition/form-fixedvar.ts b/src/app/formulaire/definition/form-fixedvar.ts
index acd265fa2..7509e9bd5 100644
--- a/src/app/formulaire/definition/form-fixedvar.ts
+++ b/src/app/formulaire/definition/form-fixedvar.ts
@@ -50,8 +50,8 @@ export class FormulaireFixedVar extends FormulaireDefinition {
         }
     }
 
-    public set graphType(t: ChartType) {
-        this._varResults.graphType = t;
+    public set chartType(t: ChartType) {
+        this._varResults.chartType = t;
     }
 
     public get hasResults(): boolean {
diff --git a/src/app/results/plottable-data.ts b/src/app/results/plottable-data.ts
index bae4f7709..5df0f992f 100644
--- a/src/app/results/plottable-data.ts
+++ b/src/app/results/plottable-data.ts
@@ -7,7 +7,7 @@ import { ParamDefinition } from "jalhyd";
  */
 export interface PlottableData {
 
-    graphType: ChartType;
+    chartType: ChartType;
     chartX: string;
     chartY: string;
 
diff --git a/src/app/results/plottable-macrorugo-compound-results.ts b/src/app/results/plottable-macrorugo-compound-results.ts
index caf34a119..f98b337af 100644
--- a/src/app/results/plottable-macrorugo-compound-results.ts
+++ b/src/app/results/plottable-macrorugo-compound-results.ts
@@ -6,7 +6,7 @@ import { ParamDefinition } from "jalhyd";
 
 export class PlottableMacrorugoCompoundResults implements PlottableData {
 
-    public graphType: ChartType = ChartType.Scatter;
+    public chartType: ChartType = ChartType.Scatter;
     public chartX: string;
     public chartY: string;
 
diff --git a/src/app/results/plottable-pab-results.ts b/src/app/results/plottable-pab-results.ts
index 56ee01671..fc8235f32 100644
--- a/src/app/results/plottable-pab-results.ts
+++ b/src/app/results/plottable-pab-results.ts
@@ -7,7 +7,7 @@ import { ParamDefinition } from "jalhyd";
 
 export class PlottablePabResults implements PlottableData {
 
-    public graphType: ChartType = ChartType.Scatter;
+    public chartType: ChartType = ChartType.Scatter;
     public chartX: string;
     public chartY: string;
 
diff --git a/src/app/results/var-results.ts b/src/app/results/var-results.ts
index b982233ef..312a66f1c 100644
--- a/src/app/results/var-results.ts
+++ b/src/app/results/var-results.ts
@@ -97,11 +97,11 @@ export class VarResults extends CalculatedParamResults implements PlottableData
         return this._resultHeaders;
     }
 
-    public get graphType(): ChartType {
+    public get chartType(): ChartType {
         return this._graphType;
     }
 
-    public set graphType(gt: ChartType) {
+    public set chartType(gt: ChartType) {
         this._graphType = gt;
         this.resetDefaultAxisIfNeeded();
     }
-- 
GitLab


From 11ccee87c1e5c44aaf79e9461813914e938d16b8 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Mon, 20 Jul 2020 10:24:38 +0200
Subject: [PATCH 80/92] Simplified form results reset

---
 .../calculator-results.component.ts           |  6 +---
 .../calculator.component.ts                   | 35 +------------------
 .../pab-results/pab-results.component.ts      |  1 -
 .../pb-results/pb-results.component.ts        |  1 -
 .../remous-results.component.ts               |  1 -
 .../section-results.component.ts              |  1 -
 .../formulaire/definition/form-definition.ts  | 12 -------
 7 files changed, 2 insertions(+), 55 deletions(-)

diff --git a/src/app/components/calculator-results/calculator-results.component.ts b/src/app/components/calculator-results/calculator-results.component.ts
index 27fa0e724..8d6de93b5 100644
--- a/src/app/components/calculator-results/calculator-results.component.ts
+++ b/src/app/components/calculator-results/calculator-results.component.ts
@@ -20,7 +20,7 @@ export class CalculatorResultsComponent implements AfterViewChecked {
         @Inject(forwardRef(() => GenericCalculatorComponent)) private calculatorComponent: GenericCalculatorComponent
     ) { }
 
-    // @TODO this system is sh*tty !
+    // @TODO @Input() ?
     public set formulaire(f: FormulaireDefinition) {
         this._formulaire = f;
     }
@@ -33,10 +33,6 @@ export class CalculatorResultsComponent implements AfterViewChecked {
         return r;
     }
 
-    public updateView() {
-        console.log("UPDATE VIEW (disabled)");
-    }
-
     public ngAfterViewChecked() {
         this.afterViewChecked.emit();
     }
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 4951178b6..2be2d3286 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -388,10 +388,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         this.appComponent.showProgressBar = true;
         this._computeClicked = true;
         this.showPBInputData = false;
-        // send resetForm to clear log
-        this._formulaire.notifyObservers({
-            "action": "resetForm",
-        }, this._formulaire);
         // calculate module
         setTimeout(() => {
             this._formulaire.doCompute();
@@ -443,22 +439,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         }
     }
 
-    private setForm(f: FormulaireDefinition) {
-        if (this._formulaire !== undefined) {
-            this._formulaire.removeObserver(this);
-        }
-        this._formulaire = f;
-        if (this._formulaire !== undefined) {
-            this._formulaire.addObserver(this);
-        }
-    }
-
-    private updateFormulaireResults(uid: string) {
-        if (this._formulaire.uid === uid) {
-            this.resultsComponent.updateView();
-        }
-    }
-
     // interface Observer
 
     update(sender: any, data: any): void {
@@ -466,22 +446,13 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
             switch (data["action"]) {
                 case "currentFormChanged":
                     const uid: string = data["formId"];
-                    this.setForm(this.formulaireService.getFormulaireFromId(uid));
+                    this._formulaire = (this.formulaireService.getFormulaireFromId(uid));
                     this.resultsComponent.formulaire = this._formulaire;
                     this._calculatorNameComponent.model = this._formulaire;
                     // reload localisation in all cases (it does not eat bread)
                     this.formulaireService.updateFormulaireLocalisation(this._formulaire);
                     break;
             }
-        } else if (sender instanceof FormulaireDefinition) {
-            let f: FormulaireDefinition;
-            switch (data["action"]) {
-                case "resetForm": // réinitialisation du formulaire
-                case "resultsUpdated":
-                    f = sender as FormulaireDefinition;
-                    this.updateFormulaireResults(f.uid);
-                    break;
-            }
         }
     }
 
@@ -557,8 +528,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
      */
     public onInputChange(event: any) {
         this._formulaire.resetResults([], (event ? event.symbol : undefined));
-        // to refresh log components, that are fed manually (!)
-        this.resultsComponent.updateView();
     }
 
     /**
@@ -604,8 +573,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         // show proper form (actually subform elements) or proper results,
         // depending on what was clicked
         (this._formulaire as FormulairePrebarrage).nodeSelected(event.node);
-        // refresh results component
-        this.resultsComponent.updateView();
     }
 
     public openHelp() {
diff --git a/src/app/components/pab-results/pab-results.component.ts b/src/app/components/pab-results/pab-results.component.ts
index 011ba0bd1..513710980 100644
--- a/src/app/components/pab-results/pab-results.component.ts
+++ b/src/app/components/pab-results/pab-results.component.ts
@@ -37,7 +37,6 @@ export class PabResultsComponent extends ResultsComponentDirective {
         if (rs.length > 0 && rs[0] instanceof PabResults) {
             this._pabResults = rs[0] as PabResults;
         }
-        // this.updateView();
     }
 
     private mergeGlobalLog(result: Result, log: cLog) {
diff --git a/src/app/components/pb-results/pb-results.component.ts b/src/app/components/pb-results/pb-results.component.ts
index 666257c7d..034f24e0c 100644
--- a/src/app/components/pb-results/pb-results.component.ts
+++ b/src/app/components/pb-results/pb-results.component.ts
@@ -30,7 +30,6 @@ export class PbResultsComponent {
                 this._pbResults = r as PrebarrageResults;
             }
         }
-        // this.updateView();
     }
 
     public get pbResults() {
diff --git a/src/app/components/remous-results/remous-results.component.ts b/src/app/components/remous-results/remous-results.component.ts
index 4a18b7fb9..5762459e1 100644
--- a/src/app/components/remous-results/remous-results.component.ts
+++ b/src/app/components/remous-results/remous-results.component.ts
@@ -146,7 +146,6 @@ export class RemousResultsComponent extends ResultsComponentDirective {
                 }
             }
         }
-        // this.updateView();
     }
 
     public get log(): cLog {
diff --git a/src/app/components/section-results/section-results.component.ts b/src/app/components/section-results/section-results.component.ts
index 5d6acdeee..8590e0248 100644
--- a/src/app/components/section-results/section-results.component.ts
+++ b/src/app/components/section-results/section-results.component.ts
@@ -37,7 +37,6 @@ export class SectionResultsComponent extends ResultsComponentDirective {
                 }
             }
         }
-        // this.updateView();
         this.drawSectionCanvas();
     }
 
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index eb1dc8ad5..9ebc4348b 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -317,12 +317,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         }
     }
 
-    protected notifyReset() {
-        this.notifyObservers({
-            "action": "resetForm"
-        }, this);
-    }
-
     /**
      * Forwards Nub's progress updated notification.
      * Used by CalculatorComponent to update progress bar
@@ -337,8 +331,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
      */
     public reset() {
         this.resetResults([], undefined, true);
-        // prévenir les composants qu'il faut détecter les changements
-        this.notifyReset();
     }
 
     /**
@@ -499,10 +491,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
     public doCompute() {
         // calculate module
         this.compute();
-        // refresh results
-        this.notifyObservers({
-            "action": "resultsUpdated",
-        }, this);
     }
 
     public resetFormResults() {}
-- 
GitLab


From bf8654f75e896d9d56a50aa3aeada5458a22cdc7 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Mon, 20 Jul 2020 11:30:44 +0200
Subject: [PATCH 81/92] Simplified results charts components

---
 .../fixedvar-results.component.html           |  2 +-
 .../fixedvar-results.component.ts             |  2 +-
 .../jet-results/jet-results.component.html    |  4 +-
 .../jet-trajectory-chart.component.ts         | 30 +++++++-------
 .../macrorugo-compound-results.component.html |  8 ++--
 .../macrorugo-compound-results.component.ts   |  9 ++---
 .../pab-profile-chart.component.ts            | 12 +++---
 .../pab-results/pab-results.component.html    |  3 +-
 .../results-chart/results-chart.component.ts  | 40 ++++++++++---------
 .../formulaire/definition/form-pb-cloison.ts  |  2 -
 src/app/results/param-calc-results.ts         |  9 -----
 src/app/results/plottable-data.ts             |  5 +++
 .../plottable-macrorugo-compound-results.ts   |  4 ++
 src/app/results/plottable-pab-results.ts      |  4 ++
 src/app/results/var-results.ts                | 29 +++++++++-----
 15 files changed, 85 insertions(+), 78 deletions(-)

diff --git a/src/app/components/fixedvar-results/fixedvar-results.component.html b/src/app/components/fixedvar-results/fixedvar-results.component.html
index 6c2d779be..271a25508 100644
--- a/src/app/components/fixedvar-results/fixedvar-results.component.html
+++ b/src/app/components/fixedvar-results/fixedvar-results.component.html
@@ -2,7 +2,7 @@
     <!-- journal -->
     <log [log]=mergedGlobalLogs></log>
 
-    <results-chart [hidden]="! showVarResultsChart" [results]=varResults></results-chart>
+    <results-chart [hidden]="! showVarResultsChart" [results]=varResults [resultData]=varResults?.result></results-chart>
 
     <div>
         <!-- table des résultats fixés -->
diff --git a/src/app/components/fixedvar-results/fixedvar-results.component.ts b/src/app/components/fixedvar-results/fixedvar-results.component.ts
index b80300bad..d93bcc55c 100644
--- a/src/app/components/fixedvar-results/fixedvar-results.component.ts
+++ b/src/app/components/fixedvar-results/fixedvar-results.component.ts
@@ -74,7 +74,7 @@ export class FixedVarResultsComponent extends ResultsComponentDirective {
      * affichage du graphique des résultats variés
      */
     public get showVarResultsChart(): boolean {
-        return this._varResults && this._varResults.hasPlottableResults;
+        return this._varResults && this._varResults.hasPlottableResults();
     }
 
     public getFixedResultClass(i: number) {
diff --git a/src/app/components/jet-results/jet-results.component.html b/src/app/components/jet-results/jet-results.component.html
index 1acaf47ff..f3680821b 100644
--- a/src/app/components/jet-results/jet-results.component.html
+++ b/src/app/components/jet-results/jet-results.component.html
@@ -2,9 +2,9 @@
     <!-- journal -->
     <log></log>
 
-    <results-chart *ngIf="showVarResults" [hidden]="! showVarResultsChart" [results]=varResults></results-chart>
+    <results-chart *ngIf="showVarResults" [hidden]="! showVarResultsChart" [results]=varResults [resultData]=varResults?.result></results-chart>
 
-    <jet-trajectory-chart [hidden]="! hasValidResults" [results]=trajectoryResults></jet-trajectory-chart>
+    <jet-trajectory-chart [hidden]="! hasValidResults" [results]=trajectoryResults?.result></jet-trajectory-chart>
 
     <div>
         <!-- table des résultats fixés -->
diff --git a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
index f4ee238a0..2f92d72ac 100644
--- a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
+++ b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
@@ -1,16 +1,14 @@
-import { Component, ViewChild, ChangeDetectorRef, Input } from "@angular/core";
+import { Component, ViewChild, ChangeDetectorRef, Input, OnChanges } from "@angular/core";
 
 import { ChartComponent } from "angular2-chartjs";
 
 import { I18nService } from "../../services/internationalisation.service";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 import { IYSeries } from "../../results/y-series";
-import { FixedResults } from "../../results/fixed-results";
-import { VarResults } from "../../results/var-results";
 import { fv } from "../../util";
 import { AppComponent } from "../../app.component";
 
-import { Jet } from "jalhyd";
+import { Jet, Result } from "jalhyd";
 
 @Component({
     selector: "jet-trajectory-chart",
@@ -19,12 +17,12 @@ import { Jet } from "jalhyd";
         "./jet-trajectory-chart.component.scss"
     ]
 })
-export class JetTrajectoryChartComponent extends ResultsComponentDirective {
+export class JetTrajectoryChartComponent extends ResultsComponentDirective implements OnChanges {
 
     @ViewChild(ChartComponent)
     private chartComponent;
 
-    private _results: FixedResults | VarResults;
+    private _results: Result;
 
     private _zoomWasChanged = false;
 
@@ -133,13 +131,17 @@ export class JetTrajectoryChartComponent extends ResultsComponentDirective {
     }
 
     @Input()
-    public set results(r: FixedResults | VarResults) {
+    public set results(r: Result) {
         console.log("miam miam les bons résultats !", r);
         this.forceRebuild(); // used for forcing redefinition of xAxes[0].ticks.min/max in generateScatterChart()
         this._results = r;
+    }
 
-        if (this._results && this._results.result) {
-            const nub = this._results.result.sourceNub as Jet;
+    // redessine le graphique dès qu'une entrée change
+    public ngOnChanges() {
+        console.log("----> regenerate trajectory chart !!");
+        if (this._results) {
+            const nub = this._results.sourceNub as Jet;
             const length = nub.variatingLength();
             // extract variable values list for legend
             if (nub.resultHasMultipleValues()) {
@@ -160,6 +162,7 @@ export class JetTrajectoryChartComponent extends ResultsComponentDirective {
                     }
                 }
             }
+            this.generateScatterChart();
         }
     }
 
@@ -172,17 +175,12 @@ export class JetTrajectoryChartComponent extends ResultsComponentDirective {
         return this._zoomWasChanged;
     }
 
-    public updateView() {
-        console.log("----> regenerate trajectory chart !!");
-        this.generateScatterChart();
-    }
-
     /**
      * génère les données d'un graphique de type "scatter"
      */
     private generateScatterChart() {
         const ySeries = this.getYSeries();
-        const nub = (this._results.result.sourceNub as Jet);
+        const nub = (this._results.sourceNub as Jet);
 
         this.graph_data = {
             datasets: []
@@ -263,7 +261,7 @@ export class JetTrajectoryChartComponent extends ResultsComponentDirective {
     private getYSeries(): IYSeries[] {
         const ret: IYSeries[] = [];
         const palette = ResultsComponentDirective.distinctColors;
-        const nub = (this._results.result.sourceNub as Jet);
+        const nub = (this._results.sourceNub as Jet);
         const trajectories = nub.generateTrajectories();
 
         for (let i = 0; i < trajectories.length; i++) {
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
index ed2f042bc..9ce5cecca 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
@@ -21,11 +21,9 @@
     <quicknav *ngIf="hasDisplayableResults" [items]="[ 'input', 'results', 'charts' ]" [currentItem]="'charts'"
         [align]="'left'"></quicknav>
 
-    <div id="macrorugo-compound-graphs-container" class="container" fxLayout="row wrap"
-        fxLayoutAlign="space-around start">
-        <!-- <pab-profile-chart *ngIf="hasDisplayableResults" fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
-        </pab-profile-chart> -->
-        <results-chart *ngIf="hasDisplayableResults" [results]=plottableResults fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+    <div id="macrorugo-compound-graphs-container" class="container" fxLayout="row wrap" fxLayoutAlign="space-around start">
+        <results-chart *ngIf="hasDisplayableResults" [results]=plottableResults [resultData]=plottableResults?.result
+          fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </results-chart>
     </div>
 
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
index cbe53d860..d59d27a3f 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
@@ -25,15 +25,11 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
     /** résultats non mis en forme */
     private _mrcResults: MacrorugoCompoundResults;
 
-    /** résultats mis en forme pour le graphique de données (classique) */
-    private _plottableResults: PlottableMacrorugoCompoundResults;
-
     constructor(
         private appSetupService: ApplicationSetupService,
         private i18nService: I18nService,
     ) {
         super();
-        this._plottableResults = new PlottableMacrorugoCompoundResults();
     }
 
     public ngOnChanges() {
@@ -234,8 +230,9 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
 
     /** builds a set of PlottableData from MacrorugoCompoundResults, to feed the chart */
     protected get plottableResults(): PlottableData {
-        this._plottableResults.setMrcResults(this.mrcResults);
-        return this._plottableResults;
+        const plottableResults = new PlottableMacrorugoCompoundResults();
+        plottableResults.setMrcResults(this.mrcResults);
+        return plottableResults;
     }
 
 }
diff --git a/src/app/components/pab-profile-chart/pab-profile-chart.component.ts b/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
index 6f24b8ab1..9e4e3ba5e 100644
--- a/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
+++ b/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, ChangeDetectorRef, Input } from "@angular/core";
+import { Component, ViewChild, ChangeDetectorRef, Input, OnChanges } from "@angular/core";
 
 import { ChartComponent } from "angular2-chartjs";
 
@@ -20,7 +20,7 @@ import { sprintf } from "sprintf-js";
         "./pab-profile-chart.component.scss"
     ]
 })
-export class PabProfileChartComponent extends ResultsComponentDirective {
+export class PabProfileChartComponent extends ResultsComponentDirective implements OnChanges {
 
     @ViewChild(ChartComponent)
     private chartComponent;
@@ -128,7 +128,10 @@ export class PabProfileChartComponent extends ResultsComponentDirective {
     @Input()
     public set results(r: PabResults) {
         this._results = r;
+    }
 
+    // redessine le graphique dès qu'une entrée change
+    public ngOnChanges() {
         // pre-extract variable parameters values
         if (this._results) {
             this.varValues = [];
@@ -146,6 +149,7 @@ export class PabProfileChartComponent extends ResultsComponentDirective {
                 this.varValues.push(vv);
             }
         }
+        this.generateScatterChart();
     }
 
     public zoomComplete() {
@@ -157,10 +161,6 @@ export class PabProfileChartComponent extends ResultsComponentDirective {
         return this._zoomWasChanged;
     }
 
-    public updateView() {
-        this.generateScatterChart();
-    }
-
     /**
      * génère les données d'un graphique de type "scatter"
      */
diff --git a/src/app/components/pab-results/pab-results.component.html b/src/app/components/pab-results/pab-results.component.html
index 8dc980039..225c00f9e 100644
--- a/src/app/components/pab-results/pab-results.component.html
+++ b/src/app/components/pab-results/pab-results.component.html
@@ -20,7 +20,8 @@
     <div id="pab-graphs-container" class="container" fxLayout="row wrap" fxLayoutAlign="space-around start">
         <pab-profile-chart *ngIf="hasDisplayableResults" [results]=pabResults fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </pab-profile-chart>
-        <results-chart *ngIf="hasDisplayableResults" [results]=plottableResults fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        <results-chart *ngIf="hasDisplayableResults" [results]=plottableResults [resultData]=plottableResults?.result
+          fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </results-chart>
     </div>
 
diff --git a/src/app/components/results-chart/results-chart.component.ts b/src/app/components/results-chart/results-chart.component.ts
index 2995070a5..2dd547434 100644
--- a/src/app/components/results-chart/results-chart.component.ts
+++ b/src/app/components/results-chart/results-chart.component.ts
@@ -1,8 +1,8 @@
-import { Component, ViewChild, AfterContentInit, ChangeDetectorRef, Input, OnChanges, SimpleChanges } from "@angular/core";
+import { Component, ViewChild, AfterContentInit, ChangeDetectorRef, Input, OnChanges } from "@angular/core";
 
 import { ChartComponent } from "angular2-chartjs";
 
-import { Observer, ParamFamily } from "jalhyd";
+import { Observer, ParamFamily, Result } from "jalhyd";
 
 import { ChartTypeSelectComponent } from "./chart-type.component";
 import { I18nService } from "../../services/internationalisation.service";
@@ -21,7 +21,7 @@ import { AppComponent } from "../../app.component";
         "./results-chart.component.scss"
     ]
 })
-export class ResultsChartComponent extends ResultsComponentDirective implements AfterContentInit, Observer {
+export class ResultsChartComponent extends ResultsComponentDirective implements AfterContentInit, Observer, OnChanges {
 
     @ViewChild(ChartComponent)
     private chartComponent;
@@ -98,6 +98,11 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
         }
     }
 
+    @Input()
+    public set resultData(r: Result) {
+        // trick to trigger onChanges when results data changes
+    }
+
     public get availableXAxis(): string[] {
         if (this._results) {
             return this._results.getAvailableXAxis();
@@ -124,9 +129,8 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
     public set chartX(X) {
         if (X !== this.chartX) {
             this._results.chartX = X;
-            this.forceRebuild();
             // refresh chart
-            this.updateView();
+            this.drawChart();
         }
     }
 
@@ -139,9 +143,8 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
     public set chartY(Y) {
         if (Y !== this.chartY) {
             this._results.chartY = Y;
-            this.forceRebuild();
             // refresh chart
-            this.updateView();
+            this.drawChart();
         }
     }
 
@@ -169,8 +172,15 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
         return this._zoomWasChanged;
     }
 
-    public updateView() {
-        console.log("----> regenerate chart !!");
+    public ngOnChanges() {
+        console.log("==> ResChart onChanges");
+        // redessiner le graphique chaque fois qu'une entrée change
+        this.drawChart();
+    }
+
+    public drawChart() {
+        console.log("----> regenerate chart !!", this._results);
+        if (this._results && this._results.hasPlottableResults()) {
             switch (this._graphTypeComponent.selectedValue) {
                 case ChartType.Histogram:
                     this.graph_type = "bar";
@@ -188,6 +198,7 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
                     break;
             }
         }
+    }
 
     public ngAfterContentInit() {
         this._graphTypeComponent.addObserver(this);
@@ -212,15 +223,6 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
         return l;
     }
 
-    /** forces Angular to rebuild the chart @see bug #137 */
-    private forceRebuild() {
-        this.displayChart = false;
-        const that = this;
-        setTimeout(() => { // trick
-            that.displayChart = true;
-        }, 10);
-    }
-
     /**
      * génère les données d'un graphique de type "bar"
      */
@@ -482,6 +484,6 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
                 this._results.chartType = data.value;
             }
         }
-        this.updateView();
+        this.drawChart();
     }
 }
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index b1599380c..311f8f918 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -122,8 +122,6 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
     public reset() {
         // also reset parent results (that will reset all its children results)
         (this.parent as FormulairePrebarrage).reset();
-        // prévenir les composants qu'il faut détecter les changements
-        this.notifyReset();
     }
 
     // ensure all PBresults are reset
diff --git a/src/app/results/param-calc-results.ts b/src/app/results/param-calc-results.ts
index 6a2418848..eaca087d3 100644
--- a/src/app/results/param-calc-results.ts
+++ b/src/app/results/param-calc-results.ts
@@ -40,15 +40,6 @@ export abstract class CalculatedParamResults extends CalculatorResults {
             return false;
         }
         return true;
-        // return ! this.result.hasOnlyErrors;
-    }
-
-    /** return true if there is something to display on the variable results chart */
-    public get hasPlottableResults(): boolean {
-        if (this.result === undefined) {
-            return false;
-        }
-        return ! this.result.hasOnlyErrors;
     }
 
     public get hasLog(): boolean {
diff --git a/src/app/results/plottable-data.ts b/src/app/results/plottable-data.ts
index 5df0f992f..a2bd574d2 100644
--- a/src/app/results/plottable-data.ts
+++ b/src/app/results/plottable-data.ts
@@ -47,4 +47,9 @@ export interface PlottableData {
      * (used by tooltip functions)
      */
     getVariatingParametersSymbols(): string[];
+
+    /**
+     * Returns true if results contain data
+     */
+    hasPlottableResults(): boolean;
 }
diff --git a/src/app/results/plottable-macrorugo-compound-results.ts b/src/app/results/plottable-macrorugo-compound-results.ts
index f98b337af..ace4357c6 100644
--- a/src/app/results/plottable-macrorugo-compound-results.ts
+++ b/src/app/results/plottable-macrorugo-compound-results.ts
@@ -21,6 +21,10 @@ export class PlottableMacrorugoCompoundResults implements PlottableData {
         this.chartY = this.chartY || "Q";
     }
 
+    public hasPlottableResults(): boolean {
+        return this.mrcResults && this.mrcResults.hasResults;
+    }
+
     /** reaffect mrcResults, for ex. when objet was contructed with empty mrcResults */
     public setMrcResults(mrcResults: MacrorugoCompoundResults) {
         this.mrcResults = mrcResults;
diff --git a/src/app/results/plottable-pab-results.ts b/src/app/results/plottable-pab-results.ts
index fc8235f32..ad75a959e 100644
--- a/src/app/results/plottable-pab-results.ts
+++ b/src/app/results/plottable-pab-results.ts
@@ -22,6 +22,10 @@ export class PlottablePabResults implements PlottableData {
         this.chartY = this.chartY || "YMOY";
     }
 
+    public hasPlottableResults(): boolean {
+        return this.pabResults && this.pabResults.hasResults;
+    }
+
     /** reaffect pabResults, for ex. when objet was contructed with empty pabResults */
     public setPabResults(pabResults: PabResults) {
         this.pabResults = pabResults;
diff --git a/src/app/results/var-results.ts b/src/app/results/var-results.ts
index 312a66f1c..7b85bfb0d 100644
--- a/src/app/results/var-results.ts
+++ b/src/app/results/var-results.ts
@@ -106,19 +106,28 @@ export class VarResults extends CalculatedParamResults implements PlottableData
         this.resetDefaultAxisIfNeeded();
     }
 
-    public getChartAxisLabel(symbol: string): string {
-        // 1. calculated param ?
-        if (this.calculatedParameter && this.calculatedParameter.symbol === symbol) {
-            return this.calculatedParameterHeader;
+    public hasPlottableResults(): boolean {
+        if (this.result === undefined) {
+            return false;
         }
-        // 2. variated param ?
-        for (let i = 0; i < this.variatedParameters.length; i++) {
-            if (this._variatedParams[i].param.symbol === symbol) {
-                return this.variableParamHeaders[i];
+        return ! this.result.hasOnlyErrors;
+    }
+
+    public getChartAxisLabel(symbol: string): string {
+        if (this.result) {
+            // 1. calculated param ?
+            if (this.calculatedParameter && this.calculatedParameter.symbol === symbol) {
+                return this.calculatedParameterHeader;
+            }
+            // 2. variated param ?
+            for (let i = 0; i < this.variatedParameters.length; i++) {
+                if (this._variatedParams[i].param.symbol === symbol) {
+                    return this.variableParamHeaders[i];
+                }
             }
+            // 3. Result element / child result
+            return this.expandLabelFromSymbol(new ParamDefinition(undefined, symbol, ParamDomainValue.ANY));
         }
-        // 3. Result element / child result
-        return this.expandLabelFromSymbol(new ParamDefinition(undefined, symbol, ParamDomainValue.ANY));
     }
 
     /**
-- 
GitLab


From d1bf33e2e1d4b411f5744adda5be415be7d17f49 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Mon, 20 Jul 2020 15:51:39 +0200
Subject: [PATCH 82/92] Simplified section canvas component

---
 src/app/app.module.ts                         |   2 -
 src/app/components/canvas/canvas.component.ts | 109 -------
 .../jet-trajectory-chart.component.ts         |   1 -
 .../macrorugo-compound-results.component.ts   |   2 +-
 .../pab-profile-chart.component.ts            |   2 +-
 .../remous-results.component.html             |   3 +-
 .../remous-results.component.ts               |  13 +-
 .../section-canvas.component.html             |   2 +
 .../section-canvas.component.scss             |   3 +
 .../section-canvas.component.ts               | 284 +++++++++++++-----
 .../section-results.component.html            |   2 +-
 .../section-results.component.ts              | 136 +++------
 12 files changed, 263 insertions(+), 296 deletions(-)
 delete mode 100644 src/app/components/canvas/canvas.component.ts
 create mode 100644 src/app/components/section-canvas/section-canvas.component.html
 create mode 100644 src/app/components/section-canvas/section-canvas.component.scss

diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 59f49747f..f1d0c0215 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -66,7 +66,6 @@ import { FixedVarResultsComponent } from "./components/fixedvar-results/fixedvar
 import { SectionResultsComponent } from "./components/section-results/section-results.component";
 import { GenericCalculatorComponent } from "./components/generic-calculator/calculator.component";
 import { CalculatorNameComponent } from "./components/generic-calculator/calc-name.component";
-import { CalcCanvasComponent } from "./components/canvas/canvas.component";
 import { SectionCanvasComponent } from "./components/section-canvas/section-canvas.component";
 import { RemousResultsComponent } from "./components/remous-results/remous-results.component";
 import { ResultsChartComponent } from "./components/results-chart/results-chart.component";
@@ -186,7 +185,6 @@ const appRoutes: Routes = [
         AppComponent,
         ApplicationSetupComponent,
         BaseParamInputComponent,
-        CalcCanvasComponent,
         CalculatorListComponent,
         CalculatorNameComponent,
         CalculatorResultsComponent,
diff --git a/src/app/components/canvas/canvas.component.ts b/src/app/components/canvas/canvas.component.ts
deleted file mode 100644
index 2035e886e..000000000
--- a/src/app/components/canvas/canvas.component.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import { Component, Input, ViewChild, ElementRef, AfterViewInit } from "@angular/core";
-
-@Component({
-    selector: "calc-canvas",
-    template: `<canvas #canvas
-    [attr.width]="width"
-    [attr.height]="height">
-    </canvas>
-    `
-})
-export class CalcCanvasComponent implements AfterViewInit {
-
-    public get width(): number {
-        return this._calcCanvas.nativeElement.width;
-    }
-
-    @Input()
-    public set width(w: number) {
-        this._calcCanvas.nativeElement.width = w;
-    }
-
-    public get height(): number {
-        return this._calcCanvas.nativeElement.height;
-    }
-
-    @Input()
-    public set height(h: number) {
-        this._calcCanvas.nativeElement.height = h;
-    }
-
-    private _context2d: CanvasRenderingContext2D;
-
-    @ViewChild("canvas", { static: true })
-    private _calcCanvas: ElementRef;
-
-    ngAfterViewInit() { // wait for the view to init before using the element
-        this._context2d = this._calcCanvas.nativeElement.getContext("2d");
-    }
-
-    public clear() {
-        if (this._context2d) {
-            this._context2d.clearRect(0, 0, this.width, this.height);
-        }
-    }
-
-    public setStrokeColor(r: number, g: number, b: number) {
-        const col: string = "rgb(" + r + "," + g + "," + b + ")";
-        this._context2d.strokeStyle = col;
-    }
-
-    public setFillColor(r: number, g: number, b: number) {
-        const col: string = "rgb(" + r + "," + g + "," + b + ")";
-        this._context2d.fillStyle = col;
-    }
-
-    public setFont(f: string) {
-        this._context2d.font = f;
-    }
-
-    public fillText(s: string, x: number, y: number, align?: any) {
-        if (align) {
-            this._context2d.textAlign = align;
-        }
-        this._context2d.fillText(s, x, y);
-    }
-
-    public setLineWidth(w: number) {
-        this._context2d.lineWidth = w;
-    }
-
-    public setLineDash(d: number[]) {
-        this._context2d.setLineDash(d);
-    }
-
-    public resetLineDash() {
-        this._context2d.setLineDash([]);
-    }
-
-    public drawRect(x1: number, y1: number, w: number, h: number) {
-        this._context2d.strokeRect(x1, y1, w, h);
-    }
-
-    public drawLine(x1: number, y1: number, x2: number, y2: number) {
-        this._context2d.beginPath();
-        this._context2d.moveTo(x1, y1);
-        this._context2d.lineTo(x2, y2);
-        this._context2d.stroke();
-    }
-
-    /**
-     *
-     * @param x The x axis of the coordinate for the ellipse's center.
-     * @param y The y axis of the coordinate for the ellipse's center.
-     * @param radiusX The ellipse's major-axis radius.
-     * @param radiusY The ellipse's minor-axis radius.
-     * @param rotation The rotation for this ellipse, expressed in radians
-     * @param startAngle The starting point, measured from the x axis, from which it will be drawn, expressed in radians
-     * @param endAngle The end ellipse's angle to which it will be drawn, expressed in radians
-     */
-    public drawEllipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number) {
-        this._context2d.beginPath();
-        this._context2d.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle);
-        this._context2d.stroke();
-    }
-
-    public get context2d(): CanvasRenderingContext2D {
-        return this._context2d;
-    }
-}
diff --git a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
index 2f92d72ac..3e4d1e9db 100644
--- a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
+++ b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
@@ -132,7 +132,6 @@ export class JetTrajectoryChartComponent extends ResultsComponentDirective imple
 
     @Input()
     public set results(r: Result) {
-        console.log("miam miam les bons résultats !", r);
         this.forceRebuild(); // used for forcing redefinition of xAxes[0].ticks.min/max in generateScatterChart()
         this._results = r;
     }
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
index d59d27a3f..6c17591e8 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
@@ -33,7 +33,7 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
     }
 
     public ngOnChanges() {
-        console.log("--------> MRCR_C changes…");
+        // console.log("--------> MRCR_C changes…");
     }
 
     @Input()
diff --git a/src/app/components/pab-profile-chart/pab-profile-chart.component.ts b/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
index 9e4e3ba5e..5d9220b27 100644
--- a/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
+++ b/src/app/components/pab-profile-chart/pab-profile-chart.component.ts
@@ -148,8 +148,8 @@ export class PabProfileChartComponent extends ResultsComponentDirective implemen
                 }
                 this.varValues.push(vv);
             }
+            this.generateScatterChart();
         }
-        this.generateScatterChart();
     }
 
     public zoomComplete() {
diff --git a/src/app/components/remous-results/remous-results.component.html b/src/app/components/remous-results/remous-results.component.html
index da5ce69b5..7f9efd5fd 100644
--- a/src/app/components/remous-results/remous-results.component.html
+++ b/src/app/components/remous-results/remous-results.component.html
@@ -44,8 +44,7 @@
 <!-- journal -->
 <log [log]=log></log>
 
-<div [hidden]="! hasData">
-    <!-- *ngIf breaks @ViewChild availability-->
+<div *ngIf="hasData">
     <!-- résultats numériques -->
     <var-results [results]=varResults></var-results>
 </div>
diff --git a/src/app/components/remous-results/remous-results.component.ts b/src/app/components/remous-results/remous-results.component.ts
index 5762459e1..532556c37 100644
--- a/src/app/components/remous-results/remous-results.component.ts
+++ b/src/app/components/remous-results/remous-results.component.ts
@@ -1,4 +1,4 @@
-import { Component, Input } from "@angular/core";
+import { Component, Input, OnChanges, SimpleChanges } from "@angular/core";
 
 import { INumberIterator, CourbeRemousParams, CourbeRemous, ParamDefinition, ParamDomainValue, cLog } from "jalhyd";
 
@@ -19,7 +19,7 @@ import { VarResults } from "../../results/var-results";
         "./remous-results.component.scss"
     ]
 })
-export class RemousResultsComponent extends ResultsComponentDirective {
+export class RemousResultsComponent extends ResultsComponentDirective implements OnChanges {
 
     private _remousResults: RemousResults;
 
@@ -148,6 +148,13 @@ export class RemousResultsComponent extends ResultsComponentDirective {
         }
     }
 
+    public ngOnChanges(s: SimpleChanges) {
+        // console.log("_________> RRC onChanges", s);
+        if (this._remousResults && this._remousResults.result) {
+            this.generateChart();
+        }
+    }
+
     public get log(): cLog {
         if (this._remousResults !== undefined) {
             return this._remousResults.log;
@@ -230,7 +237,7 @@ export class RemousResultsComponent extends ResultsComponentDirective {
     private generateChart() {
         // http://www.chartjs.org/docs/latest/charts/line.html
         // le dernier dataset de la liste datasets est dessiné en 1er
-
+        console.log("ooOOO Oui !");
         this._remousResults.update();
 
         const nub = this._remousResults.result.sourceNub as CourbeRemous;
diff --git a/src/app/components/section-canvas/section-canvas.component.html b/src/app/components/section-canvas/section-canvas.component.html
new file mode 100644
index 000000000..da242b966
--- /dev/null
+++ b/src/app/components/section-canvas/section-canvas.component.html
@@ -0,0 +1,2 @@
+<canvas #canvas [attr.width]="width" [attr.height]="height">
+</canvas>
diff --git a/src/app/components/section-canvas/section-canvas.component.scss b/src/app/components/section-canvas/section-canvas.component.scss
new file mode 100644
index 000000000..7f26ddcb5
--- /dev/null
+++ b/src/app/components/section-canvas/section-canvas.component.scss
@@ -0,0 +1,3 @@
+:host {
+    display: block;
+}
diff --git a/src/app/components/section-canvas/section-canvas.component.ts b/src/app/components/section-canvas/section-canvas.component.ts
index 3475f8842..81b4c45dd 100644
--- a/src/app/components/section-canvas/section-canvas.component.ts
+++ b/src/app/components/section-canvas/section-canvas.component.ts
@@ -1,27 +1,30 @@
-import { Component, ViewChild } from "@angular/core";
+import { Component, ViewChild, Input, OnChanges, AfterViewInit, ElementRef } from "@angular/core";
 
 import {
     acSection, cSnTrapez, ParamsSectionTrapez, cSnRectang, ParamsSectionRectang, cSnCirc,
     ParamsSectionCirc, cSnPuiss, ParamsSectionPuiss, Result
 } from "jalhyd";
 
-import { CalcCanvasComponent } from "../canvas/canvas.component";
+import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 
 @Component({
     selector: "section-canvas",
-    template: `<calc-canvas #calcCanvas
-    [width]="size"
-    [height]="size">
-    </calc-canvas>
-    `
+    templateUrl: "./section-canvas.component.html",
+    styleUrls: [
+        "./section-canvas.component.scss"
+    ]
 })
-export class SectionCanvasComponent {
-
-    /** default square size, supposed to match device size (computed at contruct time) */
-    public originalSize: number;
-
-    /** taille (pixels) du canvas (c'est un carré) */
-    public size = 400;
+export class SectionCanvasComponent extends ResultsComponentDirective implements AfterViewInit, OnChanges {
+
+    private static labelColors: { [key: string]: any; } = {
+        "Hs": { r: 255, g: 0, b: 0 },
+        "Hsc": { r: 0, g: 0, b: 255 },
+        "Yn": { r: 16, g: 128, b: 16 },
+        "Ycor": { r: 128, g: 128, b: 128 },
+        "Yc": { r: 255, g: 128, b: 0 },
+        "Ycon": { r: 255, g: 0, b: 255 },
+        "Y": { r: 50, g: 50, b: 50 }
+    };
 
     /** marges gauche/droite pour le texte (pixels) */
     private _textMargin = 90;
@@ -35,42 +38,59 @@ export class SectionCanvasComponent {
 
     private _section: acSection;
 
+    private _result: Result;
+
+    private _size: number;
+
     // tirants
     private _levels: Object[] = [];
 
-    @ViewChild("calcCanvas")
-    private _calcCanvas: CalcCanvasComponent;
+    public get width(): number {
+        // return this._calcCanvas.nativeElement.width;
+        return this._size;
+    }
 
+    public get height(): number {
+        // return this._calcCanvas.nativeElement.height;
+        return this._size;
+    }
+
+    private _context2d: CanvasRenderingContext2D;
+
+    @ViewChild("canvas", { static: true })
+    private _calcCanvas: ElementRef;
+
+    @Input()
     public set section(s: acSection) {
         this._section = s;
-        if (this._section) {
-            this.draw();
-        }
     }
 
-    public reset() {
-        this._section = undefined;
-        this._levels = [];
-        this._calcCanvas.clear();
+    @Input()
+    public set result(r: Result) {
+        this._result = r;
     }
 
-    private computeScale(maxWidth: number, maxHeight: number) {
-        this._scaleX = (this.size - 2 * this._textMargin) / maxWidth;
-        this._scaleY = (this.size - this._bottomMargin) / maxHeight;
+    @Input()
+    public set size(s: number) {
+        this._size = s;
+        console.log("(i) size set to", this._size);
     }
 
-    /**
-     * convertit une abscisse en m en pixels
-     */
-    private Xm2pix(x: number) {
-        return this._textMargin + x * this._scaleX;
+    // redessine le canvas chaque fois qu'une entrée change
+    public ngOnChanges() {
+        console.log("XXX section canvas on changes");
+        this.draw();
     }
 
-    /**
-     * convertit une ordonnée en m en pixels
-     */
-    private Ym2pix(y: number) {
-        return this.size - this._bottomMargin - y * this._scaleY;
+    public ngAfterViewInit() { // wait for the view to init before using the element
+        this._context2d = this._calcCanvas.nativeElement.getContext("2d");
+        console.log("<<<< after view init >>>");
+        this.draw();
+    }
+
+    public reset() {
+        this._levels = [];
+        this.clear();
     }
 
     public addLevel(val: number, label: string, rgb: {}) {
@@ -83,6 +103,45 @@ export class SectionCanvasComponent {
         return Math.max(this._section.prms.YB.v, this._levels[this._levels.length - 1]["val"]);
     }
 
+    private isSectionLevel(s: string) {
+        for (const k in SectionCanvasComponent.labelColors) {
+            if (k === s) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public draw() {
+        console.log(">> redrawing at size", this._size);
+        if (this._context2d && this._section) {
+            this.reset();
+
+            // traduction des symboles des variables calculées
+            const re = this._result.resultElement;
+            for (const k in re.values) {
+                if (k !== re.vCalcSymbol) {
+                    const lbl = k.toUpperCase();
+                    const er = re.getValue(k);
+                    // this._resultElement.addExtraResult(lbl, er);
+
+                    if (this.isSectionLevel(k)) {
+                        this.addLevel(er, k + " = " + this.formattedValue(er), SectionCanvasComponent.labelColors[k]);
+                    }
+                }
+            }
+
+            // ajout du tirant d'eau saisi
+            const valY = this._result.sourceNub.getParameter("Y").singleValue;
+            this.addLevel(valY, "Y = " + this.formattedValue(valY), SectionCanvasComponent.labelColors["Y"]);
+
+            this.sortLevels();
+            this.drawFrame();
+            const maxWidth = this.drawSection();
+            this.drawLevels(maxWidth);
+        }
+    }
+
     /**
      * dessin des pointillés au dessus de la berge
      * xmin,xmax : position gauche/droite
@@ -90,9 +149,9 @@ export class SectionCanvasComponent {
      * maxHeight : valeur maxi des cotes
      */
     private drawTopDashLines(xmin: number, xmax: number, yb: number, maxHeight: number) {
-        this._calcCanvas.setLineWidth(2);
-        this._calcCanvas.setLineDash([5]);
-        this._calcCanvas.setStrokeColor(128, 128, 128);
+        this.setLineWidth(2);
+        this.setLineDash([5]);
+        this.setStrokeColor(128, 128, 128);
         this.drawSectionLine(xmin, yb, xmin, maxHeight);
         this.drawSectionLine(xmax, yb, xmax, maxHeight);
     }
@@ -118,8 +177,8 @@ export class SectionCanvasComponent {
 
         // dessin de la section
 
-        this._calcCanvas.setStrokeColor(0, 0, 0);
-        this._calcCanvas.setLineWidth(5);
+        this.setStrokeColor(0, 0, 0);
+        this.setLineWidth(5);
         this.drawSectionLine(0, yb, lp, 0);
         this.drawSectionLine(lp, 0, lp + prms.LargeurFond.v, 0);
         this.drawSectionLine(lp + prms.LargeurFond.v, 0, maxWidth, yb);
@@ -149,8 +208,8 @@ export class SectionCanvasComponent {
 
         // dessin de la section
 
-        this._calcCanvas.setStrokeColor(0, 0, 0);
-        this._calcCanvas.setLineWidth(5);
+        this.setStrokeColor(0, 0, 0);
+        this.setLineWidth(5);
         this.drawSectionLine(0, yb, 0, 0);
         this.drawSectionLine(0, 0, prms.LargeurBerge.v, 0);
         this.drawSectionLine(prms.LargeurBerge.v, 0, maxWidth, yb);
@@ -191,8 +250,8 @@ export class SectionCanvasComponent {
 
             // dessin de la section
 
-            this._calcCanvas.setStrokeColor(0, 0, 0);
-            this._calcCanvas.setLineWidth(5);
+            this.setStrokeColor(0, 0, 0);
+            this.setLineWidth(5);
 
             const wx: number = maxWidth / 2;
             const alpha: Result = sect.CalcSection("Alpha", yb);
@@ -237,19 +296,19 @@ export class SectionCanvasComponent {
 
         // contour de la section
 
-        this._calcCanvas.setStrokeColor(0, 0, 0);
-        this._calcCanvas.setLineWidth(5);
+        this.setStrokeColor(0, 0, 0);
+        this.setLineWidth(5);
         const k: number = prms.k.v;
         const lambda: number = B / Math.pow(yb, k);
         const inv_k: number = 1 / k;
 
         const n = 20;
-        this.beginPath();
+        this._context2d.beginPath();
         for (let x: number = -B / 2; x <= B / 2; x += B / n) {
             const y: number = Math.pow(Math.abs(x) * 2 / lambda, inv_k);
-            this.lineTo(x + B / 2, y);
+            this._context2d.lineTo(this.Xm2pix(x + B / 2), this.Ym2pix(y));
         }
-        this.closePath();
+        this._context2d.stroke();
 
         // pointillés du haut
         this.drawTopDashLines(0, maxWidth, yb, maxHeight);
@@ -257,28 +316,16 @@ export class SectionCanvasComponent {
         return maxWidth;
     }
 
-    private beginPath() {
-        this._calcCanvas.context2d.beginPath();
-    }
-
-    private lineTo(x: number, y: number) {
-        this._calcCanvas.context2d.lineTo(this.Xm2pix(x), this.Ym2pix(y));
-    }
-
-    private closePath() {
-        this._calcCanvas.context2d.stroke();
-    }
-
     private drawSectionEllipse(x: number, y: number, rX: number, rY: number, rot: number, start: number, end: number) {
-        this._calcCanvas.drawEllipse(this.Xm2pix(x), this.Ym2pix(y), rX * this._scaleX, rY * this._scaleY, rot, start, end);
+        this.drawEllipse(this.Xm2pix(x), this.Ym2pix(y), rX * this._scaleX, rY * this._scaleY, rot, start, end);
     }
 
     private drawText(s: string, x: number, y: number, align?: string) {
-        this._calcCanvas.fillText(s, this.Xm2pix(x), this.Ym2pix(y), align);
+        this.fillText(s, this.Xm2pix(x), this.Ym2pix(y), align);
     }
 
     private drawSectionLine(x1: number, y1: number, x2: number, y2: number) {
-        this._calcCanvas.drawLine(this.Xm2pix(x1), this.Ym2pix(y1), this.Xm2pix(x2), this.Ym2pix(y2));
+        this.drawLine(this.Xm2pix(x1), this.Ym2pix(y1), this.Xm2pix(x2), this.Ym2pix(y2));
     }
 
     /**
@@ -301,6 +348,25 @@ export class SectionCanvasComponent {
         throw new Error("SectionCanvasComponent.drawSection() : type de section non pris en charge");
     }
 
+    private computeScale(maxWidth: number, maxHeight: number) {
+        this._scaleX = (this._size - 2 * this._textMargin) / maxWidth;
+        this._scaleY = (this._size - this._bottomMargin) / maxHeight;
+    }
+
+    /**
+     * convertit une abscisse en m en pixels
+     */
+    private Xm2pix(x: number) {
+        return this._textMargin + x * this._scaleX;
+    }
+
+    /**
+     * convertit une ordonnée en m en pixels
+     */
+    private Ym2pix(y: number) {
+        return this._size - this._bottomMargin - y * this._scaleY;
+    }
+
     private sortLevels() {
         this._levels.sort((a, b) => {
             if (a["val"] < b["val"]) {
@@ -316,16 +382,16 @@ export class SectionCanvasComponent {
     private drawLevels(maxWidth: number) {
         let left = true;
 
-        this._calcCanvas.resetLineDash();
-        this._calcCanvas.setLineWidth(1);
-        this._calcCanvas.setFont("12px sans- serif");
+        this.resetLineDash();
+        this.setLineWidth(1);
+        this.setFont("12px sans- serif");
         for (const l of this._levels) {
             const y = l["val"];
             const col = l["rgb"];
-            this._calcCanvas.setStrokeColor(col["r"], col["g"], col["b"]);
+            this.setStrokeColor(col["r"], col["g"], col["b"]);
             this.drawSectionLine(0, y, maxWidth, y);
 
-            this._calcCanvas.setFillColor(col["r"], col["g"], col["b"]);
+            this.setFillColor(col["r"], col["g"], col["b"]);
             if (left) {
                 this.drawText(l["label"], -0.1, y, "right");
             } else {
@@ -337,17 +403,75 @@ export class SectionCanvasComponent {
 
     // contour du canvas
     private drawFrame() {
-        this._calcCanvas.clear();
-        this._calcCanvas.resetLineDash();
-        this._calcCanvas.setStrokeColor(128, 128, 128);
-        this._calcCanvas.drawRect(0, 0, this._calcCanvas.width, this._calcCanvas.height);
+        this.clear();
+        this.resetLineDash();
+        this.setStrokeColor(128, 128, 128);
+        this.drawRect(0, 0, this.width, this.height);
     }
 
-    public draw() {
-        // console.log(">> redrawing at size", this.size);
-        this.sortLevels();
-        this.drawFrame();
-        const maxWidth = this.drawSection();
-        this.drawLevels(maxWidth);
+    public clear() {
+        if (this._context2d) {
+            this._context2d.clearRect(0, 0, this.width, this.height);
+        }
+    }
+
+    public setStrokeColor(r: number, g: number, b: number) {
+        const col: string = "rgb(" + r + "," + g + "," + b + ")";
+        this._context2d.strokeStyle = col;
+    }
+
+    public setFillColor(r: number, g: number, b: number) {
+        const col: string = "rgb(" + r + "," + g + "," + b + ")";
+        this._context2d.fillStyle = col;
+    }
+
+    public setFont(f: string) {
+        this._context2d.font = f;
+    }
+
+    public fillText(s: string, x: number, y: number, align?: any) {
+        if (align) {
+            this._context2d.textAlign = align;
+        }
+        this._context2d.fillText(s, x, y);
+    }
+
+    public setLineWidth(w: number) {
+        this._context2d.lineWidth = w;
+    }
+
+    public setLineDash(d: number[]) {
+        this._context2d.setLineDash(d);
+    }
+
+    public resetLineDash() {
+        this._context2d.setLineDash([]);
+    }
+
+    public drawRect(x1: number, y1: number, w: number, h: number) {
+        this._context2d.strokeRect(x1, y1, w, h);
+    }
+
+    public drawLine(x1: number, y1: number, x2: number, y2: number) {
+        this._context2d.beginPath();
+        this._context2d.moveTo(x1, y1);
+        this._context2d.lineTo(x2, y2);
+        this._context2d.stroke();
+    }
+
+    /**
+     *
+     * @param x The x axis of the coordinate for the ellipse's center.
+     * @param y The y axis of the coordinate for the ellipse's center.
+     * @param radiusX The ellipse's major-axis radius.
+     * @param radiusY The ellipse's minor-axis radius.
+     * @param rotation The rotation for this ellipse, expressed in radians
+     * @param startAngle The starting point, measured from the x axis, from which it will be drawn, expressed in radians
+     * @param endAngle The end ellipse's angle to which it will be drawn, expressed in radians
+     */
+    public drawEllipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number) {
+        this._context2d.beginPath();
+        this._context2d.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle);
+        this._context2d.stroke();
     }
 }
diff --git a/src/app/components/section-results/section-results.component.html b/src/app/components/section-results/section-results.component.html
index ff26a315c..9f855a34e 100644
--- a/src/app/components/section-results/section-results.component.html
+++ b/src/app/components/section-results/section-results.component.html
@@ -17,7 +17,7 @@
 
         <!-- graphique -->
         <div class="canvas-container">
-            <section-canvas></section-canvas>
+            <section-canvas [result]=result [section]=section [size]=size></section-canvas>
         </div>
     </div>
 </div>
diff --git a/src/app/components/section-results/section-results.component.ts b/src/app/components/section-results/section-results.component.ts
index 8590e0248..359845b85 100644
--- a/src/app/components/section-results/section-results.component.ts
+++ b/src/app/components/section-results/section-results.component.ts
@@ -1,8 +1,5 @@
-import { Component, ViewChild, ElementRef, Input } from "@angular/core";
+import { Component, ElementRef, Input, AfterContentChecked } from "@angular/core";
 
-import { ResultElement } from "jalhyd";
-
-import { SectionCanvasComponent } from "../section-canvas/section-canvas.component";
 import { SectionResults } from "../../results/section-results";
 import { CalculatorResults } from "../../results/calculator-results";
 import { I18nService } from "../../services/internationalisation.service";
@@ -18,17 +15,30 @@ import { FixedVarResultsComponent } from "../fixedvar-results/fixedvar-results.c
 })
 export class SectionResultsComponent extends ResultsComponentDirective {
 
+    /** taille (pixels) du canvas (c'est un carré) */
+    public _size: number;
+
+    /** hardcoded bullet-proof default canvas size **/
+    private previousContainerSize: number;
+
+    private defaultSize = 400;
+
+    private minimalSize = 300;
+
+    /**  résultats non mis en forme */
+    private _results: SectionResults;
+
     constructor(
         private intlService: I18nService,
         private element: ElementRef,
     ) {
         super();
+        this.previousContainerSize = this.defaultSize;
+        this._size = this.previousContainerSize;
     }
 
     @Input()
     public set results(rs: CalculatorResults[]) {
-        super.results = rs;
-        this._resultElement = undefined;
         this._results = undefined;
         if (rs) {
             for (const r of rs) {
@@ -37,96 +47,22 @@ export class SectionResultsComponent extends ResultsComponentDirective {
                 }
             }
         }
-        this.drawSectionCanvas();
     }
 
-    /** détermine s'il y a des résultats de section "fixes" (pas de paramètre varié, graphique de la section) */
     public get hasResults(): boolean {
         return this._results && this._results.hasResults;
     }
 
-    public get resultElement() {
-        return this._resultElement;
+    public get section() {
+        return this._results.section;
     }
 
-    private static labelColors: { [key: string]: any; } = {
-        "Hs": { r: 255, g: 0, b: 0 },
-        "Hsc": { r: 0, g: 0, b: 255 },
-        "Yn": { r: 16, g: 128, b: 16 },
-        "Ycor": { r: 128, g: 128, b: 128 },
-        "Yc": { r: 255, g: 128, b: 0 },
-        "Ycon": { r: 255, g: 0, b: 255 },
-        "Y": { r: 50, g: 50, b: 50 }
-    };
-
-    /** hardcoded bullet-proof default canvas size **/
-    private previousContainerSize = 400;
-
-    /**  résultats non mis en forme */
-    private _results: SectionResults;
-
-    /**
-     * ResultElement mis en forme (symboles des variables traduits)
-     */
-    private _resultElement: ResultElement;
-
-    @ViewChild(SectionCanvasComponent)
-    private _sectionCanvasComponent: SectionCanvasComponent;
-
-    private isSectionLevel(s: string) {
-        for (const k in SectionResultsComponent.labelColors) {
-            if (k === s) {
-                return true;
-            }
-        }
-        return false;
+    public get result() {
+        return this._results.result;
     }
 
-    private drawSectionCanvas() {
-        if (this._results && this._sectionCanvas) {
-
-            this._sectionCanvas.reset();
-
-            this._resultElement = new ResultElement();
-
-            // compute canvas optimal size the first time
-            if (this._sectionCanvasComponent.originalSize === undefined) {
-                const container = this.element.nativeElement.querySelector(".section-results-container");
-                const size = Math.min(container.offsetWidth, container.offsetHeight);
-                this._sectionCanvasComponent.originalSize = size - 17; // 417 - 17 = 400
-                this._sectionCanvasComponent.size = this._sectionCanvasComponent.originalSize;
-            }
-
-            // traduction des symboles des variables calculées
-            const re = this._results.result.resultElement;
-            for (const k in re.values) {
-                if (k !== re.vCalcSymbol) {
-                    const lbl = k.toUpperCase();
-                    const er = re.getValue(k);
-                    this._resultElement.addExtraResult(lbl, er);
-
-                    if (this.isSectionLevel(k)) {
-                        this._sectionCanvasComponent.addLevel(
-                            er, k + " = " + this.formattedValue(er), SectionResultsComponent.labelColors[k]
-                        );
-                    }
-                }
-            }
-
-            // ajout du tirant d'eau saisi
-            const valY = this._results.result.sourceNub.getParameter("Y").singleValue;
-            this._sectionCanvasComponent.addLevel(valY, "Y = " + this.formattedValue(valY), SectionResultsComponent.labelColors["Y"]);
-
-            // wait just a little to draw, in case this._sectionCanvas.size was changed above (1st run)
-            setTimeout(() => {
-                if (this._results && this._results.section) {
-                    this._sectionCanvasComponent.section = this._results.section;
-                }
-            }, 100);
-        }
-
-        const canvasUpdated = (! this.hasResults || this._sectionCanvasComponent !== undefined);
-        return superUpdated && canvasUpdated;
+    public get size() {
+        return this._size;
     }
 
     public exportAsImage(element: HTMLDivElement) {
@@ -135,26 +71,34 @@ export class SectionResultsComponent extends ResultsComponentDirective {
 
     /** redraw canvas on fullscreen state change (scale drawing) */
     public fullscreenChange(isFullscreen: boolean) {
-        this._sectionCanvasComponent.size = this.getContainerSize(! isFullscreen);
-        this.previousContainerSize = this._sectionCanvasComponent.size;
-        setTimeout(() => {
-            this._sectionCanvasComponent.draw();
-        }, 100);
+        this._size = this.getContainerSize(! isFullscreen, isFullscreen);
+        this.previousContainerSize = this._size;
     }
 
-    private getContainerSize(useOriginalSize: boolean = false): number {
+    private getContainerSize(useDefaultSize: boolean = false, useMinOfWidthAndHeight: boolean = false): number {
         const container = this.element.nativeElement.querySelector(".section-results-container");
+        console.log("[container size in getContainerSize]", container.offsetWidth, container.offsetHeight);
         let size: number;
         if (container) {
-            size = Math.min(container.offsetWidth, container.offsetHeight);
+            if (useMinOfWidthAndHeight) {
+                // when going to fullscreen mode, ensure the drawing
+                // is not larger or higher than the screen
+                size = Math.min(container.offsetWidth, container.offsetHeight);
+            } else {
+                size = container.offsetWidth;
+            }
         } else {
             size = this.previousContainerSize;
         }
         // when going back from fullscreen mode, container size tends to be
-        // too high for whatever reason; use originalSize on this purpose
-        if (useOriginalSize) {
-            size = Math.min(size, this._sectionCanvasComponent.originalSize);
+        // too high for whatever reason; use defaultSize on this purpose
+        if (useDefaultSize) {
+            console.log("~~ use default ~~", size, this.defaultSize);
+            size = this.defaultSize;
         }
+        // lower boundary
+        size = Math.max(size, this.minimalSize);
+
         return size;
     }
 
-- 
GitLab


From 5ebaf8eafc939c254e0672a8ad354cc8db63e6f5 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 21 Jul 2020 11:39:28 +0200
Subject: [PATCH 83/92] Simplified plottable results charts in PAB and MRC

---
 .../macrorugo-compound-results.component.html |   8 +-
 .../macrorugo-compound-results.component.ts   |  17 +-
 .../pab-results/pab-results.component.html    |   8 +-
 .../pab-results/pab-results.component.ts      |  12 --
 .../pb-results/pb-results.component.html      |   4 +-
 .../results-chart/results-chart.component.ts  |   5 +
 src/app/results/macrorugo-compound-results.ts | 108 ++++++++++++-
 src/app/results/pab-results.ts                | 130 +++++++++++++++-
 .../plottable-macrorugo-compound-results.ts   | 124 ---------------
 src/app/results/plottable-pab-results.ts      | 147 ------------------
 10 files changed, 251 insertions(+), 312 deletions(-)
 delete mode 100644 src/app/results/plottable-macrorugo-compound-results.ts
 delete mode 100644 src/app/results/plottable-pab-results.ts

diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
index 9ce5cecca..593252b2c 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
@@ -1,11 +1,11 @@
 <div class="container">
 
-    <log #generalLog [logTitle]="uitextGeneralLogTitle" [log]=globalLog>log général</log>
+    <log [logTitle]="uitextGeneralLogTitle" [log]=globalLog>log général</log>
 
     <variable-results-selector [results]=mrcResults [variatedParameters]=mrcResults?.variatedParameters>
     </variable-results-selector>
 
-    <log #iterationLog [log]=iterationLog></log>
+    <log [log]=iterationLog></log>
 
     <div>
         <!-- tableau de résultats -->
@@ -22,8 +22,8 @@
         [align]="'left'"></quicknav>
 
     <div id="macrorugo-compound-graphs-container" class="container" fxLayout="row wrap" fxLayoutAlign="space-around start">
-        <results-chart *ngIf="hasDisplayableResults" [results]=plottableResults [resultData]=plottableResults?.result
-          fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        <results-chart *ngIf="hasDisplayableResults" [results]=mrcResults [resultData]=mrcResults?.result
+          [variableIndex]=mrcResults?.variableIndex fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </results-chart>
     </div>
 
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
index 6c17591e8..4e4f108bb 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
@@ -1,4 +1,4 @@
-import { Component, Input, OnChanges } from "@angular/core";
+import { Component, Input } from "@angular/core";
 
 import { Result, cLog, Message, MessageCode, MessageSeverity, MRCInclination } from "jalhyd";
 
@@ -7,10 +7,8 @@ import { fv } from "../../../app/util";
 import { CalculatorResults } from "../../results/calculator-results";
 import { NgParameter } from "../../formulaire/elements/ngparam";
 import { ApplicationSetupService } from "../../services/app-setup.service";
-import { PlottableData } from "../../results/plottable-data";
 import { I18nService } from "../../services/internationalisation.service";
 import { MacrorugoCompoundResults } from "../../results/macrorugo-compound-results";
-import { PlottableMacrorugoCompoundResults } from "../../results/plottable-macrorugo-compound-results";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 
 @Component({
@@ -20,7 +18,7 @@ import { ResultsComponentDirective } from "../fixedvar-results/results.component
         "./macrorugo-compound-results.component.scss"
     ]
 })
-export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective implements OnChanges {
+export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective {
 
     /** résultats non mis en forme */
     private _mrcResults: MacrorugoCompoundResults;
@@ -32,10 +30,6 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
         super();
     }
 
-    public ngOnChanges() {
-        // console.log("--------> MRCR_C changes…");
-    }
-
     @Input()
     public set results(rs: CalculatorResults[]) {
         this._mrcResults = undefined;
@@ -228,11 +222,4 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
         return fv(lincl);
     }
 
-    /** builds a set of PlottableData from MacrorugoCompoundResults, to feed the chart */
-    protected get plottableResults(): PlottableData {
-        const plottableResults = new PlottableMacrorugoCompoundResults();
-        plottableResults.setMrcResults(this.mrcResults);
-        return plottableResults;
-    }
-
 }
diff --git a/src/app/components/pab-results/pab-results.component.html b/src/app/components/pab-results/pab-results.component.html
index 225c00f9e..a85d72bd6 100644
--- a/src/app/components/pab-results/pab-results.component.html
+++ b/src/app/components/pab-results/pab-results.component.html
@@ -1,11 +1,11 @@
 <div class="container">
 
-    <log #generalLog [logTitle]="uitextGeneralLogTitle" [log]=globalLog>log général</log>
+    <log [logTitle]="uitextGeneralLogTitle" [log]=globalLog>log général</log>
 
     <variable-results-selector [results]="pabResults" [variatedParameters]=pabResults?.variatedParameters>
     </variable-results-selector>
 
-    <log #iterationLog [log]=iterationLog></log>
+    <log [log]=iterationLog></log>
 
     <div>
         <!-- tableau de résultats -->
@@ -20,8 +20,8 @@
     <div id="pab-graphs-container" class="container" fxLayout="row wrap" fxLayoutAlign="space-around start">
         <pab-profile-chart *ngIf="hasDisplayableResults" [results]=pabResults fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </pab-profile-chart>
-        <results-chart *ngIf="hasDisplayableResults" [results]=plottableResults [resultData]=plottableResults?.result
-          fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        <results-chart *ngIf="hasDisplayableResults" [results]=pabResults [resultData]=pabResults?.result
+          [variableIndex]=pabResults?.variableIndex fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
         </results-chart>
     </div>
 
diff --git a/src/app/components/pab-results/pab-results.component.ts b/src/app/components/pab-results/pab-results.component.ts
index 513710980..edcbdbb30 100644
--- a/src/app/components/pab-results/pab-results.component.ts
+++ b/src/app/components/pab-results/pab-results.component.ts
@@ -4,8 +4,6 @@ import { Result, cLog, Message, MessageCode, MessageSeverity } from "jalhyd";
 
 import { CalculatorResults } from "../../results/calculator-results";
 import { PabResults } from "../../results/pab-results";
-import { PlottableData } from "../../results/plottable-data";
-import { PlottablePabResults } from "../../results/plottable-pab-results";
 import { I18nService } from "../../services/internationalisation.service";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 
@@ -21,14 +19,10 @@ export class PabResultsComponent extends ResultsComponentDirective {
     /** résultats non mis en forme */
     private _pabResults: PabResults;
 
-    /** résultats mis en forme pour le graphique de données (classique) */
-    private _plottableResults: PlottablePabResults;
-
     constructor(
         private i18nService: I18nService,
     ) {
         super();
-        this._plottableResults = new PlottablePabResults();
     }
 
     @Input()
@@ -226,10 +220,4 @@ export class PabResultsComponent extends ResultsComponentDirective {
         return this.i18nService.localizeText("INFO_TITREJOURNAL_GLOBAL");
     }
 
-    /** builds a set of PlottableData from PabResults, to feed the chart */
-    protected get plottableResults(): PlottableData {
-        this._plottableResults.setPabResults(this.pabResults);
-        return this._plottableResults;
-    }
-
 }
diff --git a/src/app/components/pb-results/pb-results.component.html b/src/app/components/pb-results/pb-results.component.html
index cce785e43..ae3009105 100644
--- a/src/app/components/pb-results/pb-results.component.html
+++ b/src/app/components/pb-results/pb-results.component.html
@@ -1,10 +1,10 @@
 <div class="container">
-    <log #generalLog [logTitle]="uitextGeneralLogTitle" [log]=globalLog>log général</log>
+    <log [logTitle]="uitextGeneralLogTitle" [log]=globalLog>log général</log>
 
     <variable-results-selector [results]=pbResults>
     </variable-results-selector>
 
-    <log #iterationLog [log]=iterationLog></log>
+    <log [log]=iterationLog></log>
 
     <!-- tableau de résultats des bassins -->
     <pb-results-table *ngIf="hasBasinResults" [results]=pbResults></pb-results-table>
diff --git a/src/app/components/results-chart/results-chart.component.ts b/src/app/components/results-chart/results-chart.component.ts
index 2dd547434..d8fd854ae 100644
--- a/src/app/components/results-chart/results-chart.component.ts
+++ b/src/app/components/results-chart/results-chart.component.ts
@@ -103,6 +103,11 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
         // trick to trigger onChanges when results data changes
     }
 
+    @Input()
+    public set variableIndex(v: number) {
+        // trick to trigger onChanges when variable index changes
+    }
+
     public get availableXAxis(): string[] {
         if (this._results) {
             return this._results.getAvailableXAxis();
diff --git a/src/app/results/macrorugo-compound-results.ts b/src/app/results/macrorugo-compound-results.ts
index 8aba75366..74e776f72 100644
--- a/src/app/results/macrorugo-compound-results.ts
+++ b/src/app/results/macrorugo-compound-results.ts
@@ -1,9 +1,11 @@
-import { Result } from "jalhyd";
+import { Result, ParamDefinition } from "jalhyd";
 
 import { ServiceFactory } from "../services/service-factory";
 import { MultiDimensionResults } from "./multidimension-results";
+import { PlottableData } from "./plottable-data";
+import { ChartType } from "./chart-type";
 
-export class MacrorugoCompoundResults extends MultiDimensionResults {
+export class MacrorugoCompoundResults extends MultiDimensionResults implements PlottableData {
 
     /** résultats des modules MacroRugo enfants */
     public childrenResults: Result[];
@@ -11,6 +13,10 @@ export class MacrorugoCompoundResults extends MultiDimensionResults {
     /** symboles des colonnes de résultat */
     protected _columns: string[];
 
+    public chartType: ChartType = ChartType.Scatter;
+    public chartX: string;
+    public chartY: string;
+
     public constructor() {
         super();
         this.reset();
@@ -28,6 +34,9 @@ export class MacrorugoCompoundResults extends MultiDimensionResults {
             "ENUM_MacroRugoFlowType",
             "xCenter"
         ];
+        // axes par défaut
+        this.chartX = this.chartX || "xCenter";
+        this.chartY = this.chartY || "Q";
     }
 
     /** headers symbols */
@@ -119,4 +128,99 @@ export class MacrorugoCompoundResults extends MultiDimensionResults {
 
         return err;
     }
+    public hasPlottableResults(): boolean {
+        return this.hasResults;
+    }
+
+    /**
+     * Returns the label to display, for an element of getAvailableChartAxis()
+     * @param symbol parameter / result symbol (ex: "Q")
+     */
+    public getChartAxisLabel(symbol: string): string {
+        return this.headers[this.columns.indexOf(symbol)];
+    }
+
+    public expandLabelFromSymbol(p: ParamDefinition): string {
+        return p.symbol;
+    }
+
+    /**
+     * Returns a list of plottable parameters / result elements, that can be defined
+     * as X or Y chart axis
+     */
+    public getAvailableChartAxis(): string[] {
+        const axis = [];
+        for (const c of this.columns) {
+            if (c.indexOf("ENUM_") === -1) { // ENUM variables are not plottable
+                axis.push(c);
+            }
+        }
+        return axis;
+    }
+
+    public getAvailableXAxis(): string[] {
+        return this.getAvailableChartAxis();
+    }
+
+    public getAvailableYAxis(): string[] {
+        return this.getAvailableChartAxis();
+    }
+
+    // just to implement interface
+    public getVariatingParametersSymbols(): string[] {
+        return [];
+    }
+
+    /**
+     * Returns the series of values for the required symbol
+     * @param symbol parameter / result symbol (ex: "Q")
+     */
+    public getValuesSeries(symbol: string): number[] {
+        const data: number[] = [];
+        const l = this.childrenResults.length;
+        // when a parameter is variating, index of the variating parameter
+        // values to build the data from
+        const vi = this.variableIndex;
+
+        if (this.iterationHasError(vi)) {
+            return [];
+        }
+
+        for (let i = 0; i < l; i++) {
+            switch (symbol) {
+                case "RADIER_N":
+                    data.push(i + 1);
+                    break;
+
+                case "ZF1":
+                case "Y":
+                case "B":
+                    let v: number;
+                    const nub = this.childrenResults[i].sourceNub;
+                    const param = nub.getParameter(symbol);
+                    try {
+                        if (param.hasMultipleValues) {
+                            v = param.getInferredValuesList()[vi];
+                        } else {
+                            v = param.singleValue;
+                        }
+                    } catch (e) {
+                        // silent fail
+                    }
+                    data.push(v);
+                    break;
+
+                case "Q":
+                case "Vdeb":
+                case "Fr":
+                case "Vmax":
+                case "PV":
+                case "xCenter":
+                    data.push(this.childrenResults[i].resultElements[vi].getValue(symbol));
+                    break;
+            }
+        }
+
+        return data;
+    }
 }
diff --git a/src/app/results/pab-results.ts b/src/app/results/pab-results.ts
index d08b381f1..f77a2f9b4 100644
--- a/src/app/results/pab-results.ts
+++ b/src/app/results/pab-results.ts
@@ -1,9 +1,11 @@
-import { Result } from "jalhyd";
+import { Result, ParamDefinition } from "jalhyd";
 
 import { ServiceFactory } from "../services/service-factory";
 import { MultiDimensionResults } from "./multidimension-results";
+import { PlottableData } from "./plottable-data";
+import { ChartType } from "./chart-type";
 
-export class PabResults extends MultiDimensionResults {
+export class PabResults extends MultiDimensionResults implements PlottableData {
 
     /** résultats des modules Cloisons avant chaque bassin */
     public cloisonsResults: Result[];
@@ -20,6 +22,10 @@ export class PabResults extends MultiDimensionResults {
     /** symboles des colonnes de résultat */
     protected _columns: string[];
 
+    public chartType: ChartType = ChartType.Scatter;
+    public chartX: string;
+    public chartY: string;
+
     public constructor() {
         super();
         this.reset();
@@ -36,6 +42,9 @@ export class PabResults extends MultiDimensionResults {
             "QA",
             "ENUM_StructureJetType"
         ];
+        // axes par défaut
+        this.chartX = this.chartX || "CLOISON";
+        this.chartY = this.chartY || "YMOY";
     }
 
     /** headers symbols */
@@ -130,4 +139,121 @@ export class PabResults extends MultiDimensionResults {
 
         return err;
     }
+
+    public hasPlottableResults(): boolean {
+        return this.hasResults;
+    }
+
+    /**
+     * Returns the label to display, for an element of getAvailableChartAxis()
+     * @param symbol parameter / result symbol (ex: "Q")
+     */
+    public getChartAxisLabel(symbol: string): string {
+        if (symbol === "x") { // specific case for wall abscissa
+            return ServiceFactory.instance.i18nService.localizeText("INFO_LIB_ABSCISSE_CLOISON");
+        } else {
+            return this.headers[this.columns.indexOf(symbol)];
+        }
+    }
+
+    public expandLabelFromSymbol(p: ParamDefinition): string {
+        return p.symbol;
+    }
+
+    /**
+     * Returns a list of plottable parameters / result elements, that can be defined
+     * as X or Y chart axis
+     */
+    public getAvailableChartAxis(): string[] {
+        const axis = [];
+        axis.push("x"); // wall abscissa
+        for (const c of this.columns) {
+            if (c.indexOf("ENUM_") === -1) { // ENUM variables are not plottable
+                axis.push(c);
+            }
+        }
+        return axis;
+    }
+
+    public getAvailableXAxis(): string[] {
+        return this.getAvailableChartAxis();
+    }
+
+    public getAvailableYAxis(): string[] {
+        return this.getAvailableChartAxis();
+    }
+
+    // just to implement interface
+    public getVariatingParametersSymbols(): string[] {
+        return [];
+    }
+
+    /**
+     * Returns the series of values for the required symbol
+     * @param symbol parameter / result symbol (ex: "Q")
+     */
+    public getValuesSeries(symbol: string): number[] {
+        const data: number[] = [];
+        const l = this.cloisonsResults.length;
+        // when a parameter is variating, index of the variating parameter
+        // values to build the data from
+        const vi = this.variableIndex;
+
+        if (this.iterationHasError(vi)) {
+            return [];
+        }
+
+        switch (symbol) {
+            case "CLOISON":
+                data.push(undefined);
+                for (let i = 0; i <= l; i++) { // <= for one extra step (downwall)
+                    data.push(i + 1);
+                }
+                break;
+
+            case "DH":
+            case "ZRAM":
+            case "Q":
+                data.push(undefined);
+                for (let i = 0; i < l; i++) {
+                    const er = this.cloisonsResults[i].resultElements[vi].getValue(symbol);
+                    data.push(er);
+                }
+                const zrAval = this.cloisonAvalResults.resultElements[vi].getValue(symbol);
+                data.push(zrAval);
+                break;
+
+            case "Z":
+                for (let i = 0; i < l; i++) {
+                    data.push(this.cloisonsResults[i].resultElements[vi].vCalc);
+                }
+                data.push(this.cloisonAvalResults.resultElements[vi].vCalc);
+                data.push(this.Z2[vi]);
+                break;
+
+            case "PV":
+            case "YMOY":
+            case "ZRMB":
+            case "QA":
+                data.push(undefined);
+                for (let i = 0; i < l; i++) {
+                    const er = this.cloisonsResults[i].resultElements[vi].getValue(symbol);
+                    data.push(er);
+                }
+                data.push(undefined);
+                break;
+
+            case "x": // wall abscissa
+                data.push(undefined);
+                for (let i = 0; i < l; i++) {
+                    const er = this.cloisonsResults[i].resultElements[vi].getValue(symbol);
+                    data.push(er);
+                }
+                const erXdw = this.cloisonAvalResults.resultElements[vi].getValue(symbol);
+                data.push(erXdw);
+                break;
+        }
+
+        return data;
+    }
 }
diff --git a/src/app/results/plottable-macrorugo-compound-results.ts b/src/app/results/plottable-macrorugo-compound-results.ts
deleted file mode 100644
index ace4357c6..000000000
--- a/src/app/results/plottable-macrorugo-compound-results.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-import { PlottableData } from "./plottable-data";
-import { ChartType } from "./chart-type";
-import { MacrorugoCompoundResults } from "./macrorugo-compound-results";
-
-import { ParamDefinition } from "jalhyd";
-
-export class PlottableMacrorugoCompoundResults implements PlottableData {
-
-    public chartType: ChartType = ChartType.Scatter;
-    public chartX: string;
-    public chartY: string;
-
-    protected mrcResults: MacrorugoCompoundResults;
-
-    public constructor(mrcResults?: MacrorugoCompoundResults) {
-        if (mrcResults) {
-            this.setMrcResults(mrcResults);
-        }
-        // axes par défaut
-        this.chartX = this.chartX || "xCenter";
-        this.chartY = this.chartY || "Q";
-    }
-
-    public hasPlottableResults(): boolean {
-        return this.mrcResults && this.mrcResults.hasResults;
-    }
-
-    /** reaffect mrcResults, for ex. when objet was contructed with empty mrcResults */
-    public setMrcResults(mrcResults: MacrorugoCompoundResults) {
-        this.mrcResults = mrcResults;
-    }
-
-    /**
-     * Returns the label to display, for an element of getAvailableChartAxis()
-     * @param symbol parameter / result symbol (ex: "Q")
-     */
-    public getChartAxisLabel(symbol: string): string {
-        return this.mrcResults.headers[this.mrcResults.columns.indexOf(symbol)];
-    }
-
-    public expandLabelFromSymbol(p: ParamDefinition): string {
-        return p.symbol;
-    }
-
-    /**
-     * Returns a list of plottable parameters / result elements, that can be defined
-     * as X or Y chart axis
-     */
-    public getAvailableChartAxis(): string[] {
-        const axis = [];
-        for (const c of this.mrcResults.columns) {
-            if (c.indexOf("ENUM_") === -1) { // ENUM variables are not plottable
-                axis.push(c);
-            }
-        }
-        return axis;
-    }
-
-    public getAvailableXAxis(): string[] {
-        return this.getAvailableChartAxis();
-    }
-
-    public getAvailableYAxis(): string[] {
-        return this.getAvailableChartAxis();
-    }
-
-    // just to implement interface
-    public getVariatingParametersSymbols(): string[] {
-        return [];
-    }
-
-    /**
-     * Returns the series of values for the required symbol
-     * @param symbol parameter / result symbol (ex: "Q")
-     */
-    public getValuesSeries(symbol: string): number[] {
-        const data: number[] = [];
-        const l = this.mrcResults.childrenResults.length;
-        // when a parameter is variating, index of the variating parameter
-        // values to build the data from
-        const vi = this.mrcResults.variableIndex;
-
-        if (this.mrcResults.iterationHasError(vi)) {
-            return [];
-        }
-
-        for (let i = 0; i < l; i++) {
-            switch (symbol) {
-                case "RADIER_N":
-                    data.push(i + 1);
-                    break;
-
-                case "ZF1":
-                case "Y":
-                case "B":
-                    let v: number;
-                    const nub = this.mrcResults.childrenResults[i].sourceNub;
-                    const param = nub.getParameter(symbol);
-                    try {
-                        if (param.hasMultipleValues) {
-                            v = param.getInferredValuesList()[vi];
-                        } else {
-                            v = param.singleValue;
-                        }
-                    } catch (e) {
-                        // silent fail
-                    }
-                    data.push(v);
-                    break;
-
-                case "Q":
-                case "Vdeb":
-                case "Fr":
-                case "Vmax":
-                case "PV":
-                case "xCenter":
-                    data.push(this.mrcResults.childrenResults[i].resultElements[vi].getValue(symbol));
-                    break;
-            }
-        }
-
-        return data;
-    }
-}
diff --git a/src/app/results/plottable-pab-results.ts b/src/app/results/plottable-pab-results.ts
deleted file mode 100644
index ad75a959e..000000000
--- a/src/app/results/plottable-pab-results.ts
+++ /dev/null
@@ -1,147 +0,0 @@
-import { PlottableData } from "./plottable-data";
-import { PabResults } from "./pab-results";
-import { ChartType } from "./chart-type";
-import { ServiceFactory } from "../services/service-factory";
-
-import { ParamDefinition } from "jalhyd";
-
-export class PlottablePabResults implements PlottableData {
-
-    public chartType: ChartType = ChartType.Scatter;
-    public chartX: string;
-    public chartY: string;
-
-    protected pabResults: PabResults;
-
-    public constructor(pabResults?: PabResults) {
-        if (pabResults) {
-            this.setPabResults(pabResults);
-        }
-        // axes par défaut
-        this.chartX = this.chartX || "CLOISON";
-        this.chartY = this.chartY || "YMOY";
-    }
-
-    public hasPlottableResults(): boolean {
-        return this.pabResults && this.pabResults.hasResults;
-    }
-
-    /** reaffect pabResults, for ex. when objet was contructed with empty pabResults */
-    public setPabResults(pabResults: PabResults) {
-        this.pabResults = pabResults;
-    }
-
-    /**
-     * Returns the label to display, for an element of getAvailableChartAxis()
-     * @param symbol parameter / result symbol (ex: "Q")
-     */
-    public getChartAxisLabel(symbol: string): string {
-        if (symbol === "x") { // specific case for wall abscissa
-            return ServiceFactory.i18nService.localizeText("INFO_LIB_ABSCISSE_CLOISON");
-        } else {
-            return this.pabResults.headers[this.pabResults.columns.indexOf(symbol)];
-        }
-    }
-
-    public expandLabelFromSymbol(p: ParamDefinition): string {
-        return p.symbol;
-    }
-
-    /**
-     * Returns a list of plottable parameters / result elements, that can be defined
-     * as X or Y chart axis
-     */
-    public getAvailableChartAxis(): string[] {
-        const axis = [];
-        axis.push("x"); // wall abscissa
-        for (const c of this.pabResults.columns) {
-            if (c.indexOf("ENUM_") === -1) { // ENUM variables are not plottable
-                axis.push(c);
-            }
-        }
-        return axis;
-    }
-
-    public getAvailableXAxis(): string[] {
-        return this.getAvailableChartAxis();
-    }
-
-    public getAvailableYAxis(): string[] {
-        return this.getAvailableChartAxis();
-    }
-
-    // just to implement interface
-    public getVariatingParametersSymbols(): string[] {
-        return [];
-    }
-
-    /**
-     * Returns the series of values for the required symbol
-     * @param symbol parameter / result symbol (ex: "Q")
-     */
-    public getValuesSeries(symbol: string): number[] {
-        const data: number[] = [];
-        const pr = this.pabResults;
-        const l = this.pabResults.cloisonsResults.length;
-        // when a parameter is variating, index of the variating parameter
-        // values to build the data from
-        const vi = this.pabResults.variableIndex;
-
-        if (this.pabResults.iterationHasError(vi)) {
-            return [];
-        }
-
-        switch (symbol) {
-            case "CLOISON":
-                data.push(undefined);
-                for (let i = 0; i <= l; i++) { // <= for one extra step (downwall)
-                    data.push(i + 1);
-                }
-                break;
-
-            case "DH":
-            case "ZRAM":
-            case "Q":
-                data.push(undefined);
-                for (let i = 0; i < l; i++) {
-                    const er = pr.cloisonsResults[i].resultElements[vi].getValue(symbol);
-                    data.push(er);
-                }
-                const zrAval = pr.cloisonAvalResults.resultElements[vi].getValue(symbol);
-                data.push(zrAval);
-                break;
-
-            case "Z":
-                for (let i = 0; i < l; i++) {
-                    data.push(pr.cloisonsResults[i].resultElements[vi].vCalc);
-                }
-                data.push(pr.cloisonAvalResults.resultElements[vi].vCalc);
-                data.push(pr.Z2[vi]);
-                break;
-
-            case "PV":
-            case "YMOY":
-            case "ZRMB":
-            case "QA":
-                data.push(undefined);
-                for (let i = 0; i < l; i++) {
-                    const er = pr.cloisonsResults[i].resultElements[vi].getValue(symbol);
-                    data.push(er);
-                }
-                data.push(undefined);
-                break;
-
-            case "x": // wall abscissa
-                data.push(undefined);
-                for (let i = 0; i < l; i++) {
-                    const er = pr.cloisonsResults[i].resultElements[vi].getValue(symbol);
-                    data.push(er);
-                }
-                const erXdw = pr.cloisonAvalResults.resultElements[vi].getValue(symbol);
-                data.push(erXdw);
-                break;
-        }
-
-        return data;
-    }
-}
-- 
GitLab


From 6af9d3088433cd4a9835a7f566d848f80c7ab6c6 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Tue, 21 Jul 2020 12:03:51 +0200
Subject: [PATCH 84/92] Added conditions on sub calc-results components

---
 .../calculator-results.component.html         | 10 ++--
 .../calculator-results.component.ts           | 22 ++++++++-
 .../calculator.component.ts                   | 10 ++++
 .../macrorugo-compound-results.component.ts   |  6 +--
 .../pab-results/pab-results.component.ts      |  8 ++--
 .../pb-results/pb-results.component.ts        | 46 +++++++++++++++++++
 .../remous-results.component.ts               |  1 -
 .../results-chart/results-chart.component.ts  |  2 -
 .../variable-results-selector.component.ts    |  1 -
 9 files changed, 88 insertions(+), 18 deletions(-)

diff --git a/src/app/components/calculator-results/calculator-results.component.html b/src/app/components/calculator-results/calculator-results.component.html
index 7f8019197..f057d40a4 100644
--- a/src/app/components/calculator-results/calculator-results.component.html
+++ b/src/app/components/calculator-results/calculator-results.component.html
@@ -1,10 +1,10 @@
 <div>
-    <section-results [hidden]="! isSP" [results]=formResultsArray></section-results>
-    <remous-results [hidden]="! isRemous" [results]=formResultsArray></remous-results>
-    <pab-results [hidden]="! isPAB" [results]=formResultsArray></pab-results>
-    <pb-results [hidden]="! isPB" [results]=formResultsArray></pb-results>
+    <section-results *ngIf="isSP" [results]=formResultsArray></section-results>
+    <remous-results *ngIf="isRemous" [results]=formResultsArray></remous-results>
+    <pab-results *ngIf="isPAB" [results]=formResultsArray></pab-results>
+    <pb-results *ngIf="isPB" [results]=formResultsArray></pb-results>
     <verificateur-results [hidden]="! isVerificateur"></verificateur-results>
-    <macrorugo-compound-results [hidden]="! isMRC" [results]=formResultsArray></macrorugo-compound-results>
+    <macrorugo-compound-results *ngIf="isMRC" [results]=formResultsArray></macrorugo-compound-results>
     <jet-results *ngIf="isJet" [results]=formResultsArray></jet-results>
     <fixedvar-results *ngIf="! isJet" [results]=formResultsArray></fixedvar-results>
 </div>
diff --git a/src/app/components/calculator-results/calculator-results.component.ts b/src/app/components/calculator-results/calculator-results.component.ts
index 8d6de93b5..41a6e20d1 100644
--- a/src/app/components/calculator-results/calculator-results.component.ts
+++ b/src/app/components/calculator-results/calculator-results.component.ts
@@ -37,8 +37,26 @@ export class CalculatorResultsComponent implements AfterViewChecked {
         this.afterViewChecked.emit();
     }
 
-    // JetResultsComponent extends FixedVarResultsComponent, which makes
-    // them incompatible with each other
+    public get isSP() {
+        return this.calculatorComponent.isSP;
+    }
+
+    public get isRemous() {
+        return this.calculatorComponent.isRemous;
+    }
+
+    public get isPAB() {
+        return this.calculatorComponent.isPAB;
+    }
+
+    public get isPB() {
+        return this.calculatorComponent.isPB;
+    }
+
+    public get isMRC() {
+        return this.calculatorComponent.isMRC;
+    }
+
     public get isJet() {
         return this.calculatorComponent.isJet;
     }
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 2be2d3286..4426cff87 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -650,6 +650,16 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         return this.is(CalculatorType.Espece);
     }
 
+    // true if current Nub is PAR
+    public get isSP() {
+        return this.is(CalculatorType.SectionParametree);
+    }
+
+    // true if current Nub is PAR
+    public get isRemous() {
+        return this.is(CalculatorType.CourbeRemous);
+    }
+
     /**
      * Returns true if no parameter is varying; ignores parameters having
      * one of the given {except} symbols, if any
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
index 4e4f108bb..232f0c436 100644
--- a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
@@ -133,9 +133,9 @@ export class MacrorugoCompoundResultsComponent extends ResultsComponentDirective
     }
 
     /**
-     * Retourne les logs à afficher dans le composant de log global, au dessus
-     * du sélecteur d'itération : messages globaux et / ou résumé des messages
-     * spécifiques à chaque ResultElement
+     * Retourne les logs à afficher dans le composant de log local, en dessous
+     * du sélecteur d'itération : messages concernant l'itération (le ResultElement)
+     * en cours
      */
     public get iterationLog(): cLog {
         const l = new cLog();
diff --git a/src/app/components/pab-results/pab-results.component.ts b/src/app/components/pab-results/pab-results.component.ts
index edcbdbb30..bb190be6a 100644
--- a/src/app/components/pab-results/pab-results.component.ts
+++ b/src/app/components/pab-results/pab-results.component.ts
@@ -148,11 +148,11 @@ export class PabResultsComponent extends ResultsComponentDirective {
     }
 
     /**
-     * Retourne les logs à afficher dans le composant de log global, au dessus
-     * du sélecteur d'itération : messages globaux et / ou résumé des messages
-     * spécifiques à chaque ResultElement
+     * Retourne les logs à afficher dans le composant de log local, en dessous
+     * du sélecteur d'itération : messages concernant l'itération (le ResultElement)
+     * en cours
      */
-    private get iterationLog(): cLog {
+    public get iterationLog(): cLog {
         const l = new cLog();
         if (this._pabResults) {
             if (this.pabResults.variatedParameters.length > 0) {
diff --git a/src/app/components/pb-results/pb-results.component.ts b/src/app/components/pb-results/pb-results.component.ts
index 034f24e0c..b502c4e40 100644
--- a/src/app/components/pb-results/pb-results.component.ts
+++ b/src/app/components/pb-results/pb-results.component.ts
@@ -165,6 +165,52 @@ export class PbResultsComponent {
         return l;
     }
 
+    /**
+     * Retourne les logs à afficher dans le composant de log local, en dessous
+     * du sélecteur d'itération : messages concernant l'itération (le ResultElement)
+     * en cours
+     */
+    public get iterationLog(): cLog {
+        const l = new cLog();
+        /* if (this._pabResults) {
+            if (this.pabResults.variatedParameters.length > 0) {
+                // A. si un paramètre varie
+                const vi = this._pabResults.variableIndex;
+                // log de la PAB pour l'itération en cours
+                if (
+                    this._pabResults.result
+                    && this._pabResults.result.hasResultElements()
+                    && this._pabResults.result.resultElements[vi]
+                    && this._pabResults.result.resultElements[vi].hasLog()
+                ) {
+                    l.addLog(this._pabResults.result.resultElements[vi].log);
+                }
+                // logs des enfants pour l'itération en cours
+                for (const cr of this._pabResults.cloisonsResults) {
+                    if (cr && cr.hasResultElements() && cr.resultElements[vi].hasLog()) {
+                        l.addLog(cr.resultElements[vi].log);
+                    }
+                }
+                if (this._pabResults.cloisonAvalResults && this._pabResults.cloisonAvalResults.resultElements[vi].hasLog()) {
+                    l.addLog(this._pabResults.cloisonAvalResults.resultElements[vi].log);
+                }
+            } else {
+                // B. si aucun paramètre ne varie
+                this.mergeGlobalLog(this._pabResults.result, l); // faut bien mettre le log global quelque part
+                // logs des enfants
+                for (const cr of this._pabResults.cloisonsResults) {
+                    if (cr && cr.hasResultElements() && cr.resultElement.hasLog()) {
+                        l.addLog(cr.resultElement.log);
+                    }
+                }
+                if (this._pabResults.cloisonAvalResults && this._pabResults.cloisonAvalResults.resultElement.hasLog()) {
+                    l.addLog(this._pabResults.cloisonAvalResults.resultElement.log);
+                }
+            }
+        } */
+        return l;
+    }
+
     public get uitextGeneralLogTitle(): string {
         return this.i18nService.localizeText("INFO_TITREJOURNAL_GLOBAL");
     }
diff --git a/src/app/components/remous-results/remous-results.component.ts b/src/app/components/remous-results/remous-results.component.ts
index 532556c37..b39505299 100644
--- a/src/app/components/remous-results/remous-results.component.ts
+++ b/src/app/components/remous-results/remous-results.component.ts
@@ -237,7 +237,6 @@ export class RemousResultsComponent extends ResultsComponentDirective implements
     private generateChart() {
         // http://www.chartjs.org/docs/latest/charts/line.html
         // le dernier dataset de la liste datasets est dessiné en 1er
-        console.log("ooOOO Oui !");
         this._remousResults.update();
 
         const nub = this._remousResults.result.sourceNub as CourbeRemous;
diff --git a/src/app/components/results-chart/results-chart.component.ts b/src/app/components/results-chart/results-chart.component.ts
index d8fd854ae..d41858fe7 100644
--- a/src/app/components/results-chart/results-chart.component.ts
+++ b/src/app/components/results-chart/results-chart.component.ts
@@ -178,13 +178,11 @@ export class ResultsChartComponent extends ResultsComponentDirective implements
     }
 
     public ngOnChanges() {
-        console.log("==> ResChart onChanges");
         // redessiner le graphique chaque fois qu'une entrée change
         this.drawChart();
     }
 
     public drawChart() {
-        console.log("----> regenerate chart !!", this._results);
         if (this._results && this._results.hasPlottableResults()) {
             switch (this._graphTypeComponent.selectedValue) {
                 case ChartType.Histogram:
diff --git a/src/app/components/variable-results-selector/variable-results-selector.component.ts b/src/app/components/variable-results-selector/variable-results-selector.component.ts
index 716d7fc9e..68491335a 100644
--- a/src/app/components/variable-results-selector/variable-results-selector.component.ts
+++ b/src/app/components/variable-results-selector/variable-results-selector.component.ts
@@ -41,7 +41,6 @@ export class VariableResultsSelectorComponent implements OnChanges {
     ) { }
 
     public ngOnChanges() {
-        console.log("==//== changes !! ==//==", this.variatedParameters);
         // rebuild variable parameters values everytime somthing changes
         if (this.variatedParameters) {
             this.varValues = [];
-- 
GitLab


From 3c9d56e4a51836de3e44d5528d97557fa148f1bc Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Wed, 16 Sep 2020 10:38:32 +0200
Subject: [PATCH 85/92] Update after merge

---
 .../calculator-results.component.ts           |  4 ++
 .../calculator.component.ts                   |  6 +-
 .../section-results.component.html            | 19 ------
 .../section-results.component.ts              |  4 +-
 .../verificateur-results.component.html       |  2 +-
 .../verificateur-results.component.ts         | 64 +------------------
 src/app/results/pab-results.ts                |  2 +-
 7 files changed, 15 insertions(+), 86 deletions(-)

diff --git a/src/app/components/calculator-results/calculator-results.component.ts b/src/app/components/calculator-results/calculator-results.component.ts
index 41a6e20d1..e26bc762f 100644
--- a/src/app/components/calculator-results/calculator-results.component.ts
+++ b/src/app/components/calculator-results/calculator-results.component.ts
@@ -61,4 +61,8 @@ export class CalculatorResultsComponent implements AfterViewChecked {
         return this.calculatorComponent.isJet;
     }
 
+    public get isVerificateur() {
+        return this.calculatorComponent.isVerificateur;
+    }
+
 }
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 4426cff87..2cd8d2d6f 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -645,6 +645,11 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         return this.is(CalculatorType.Par);
     }
 
+    // true if current Nub is Verificateur
+    public get isVerificateur() {
+        return this.is(CalculatorType.Verificateur);
+    }
+
     // true if current Nub is Espece
     public get isEspece() {
         return this.is(CalculatorType.Espece);
@@ -1037,7 +1042,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
                 const form = this._formulaire as FormulaireFixedVar;
                 const nub = (form.currentNub as Espece);
                 nub.loadPredefinedSpecies(result.selected);
-                console.log("================ espèce chargée, refresh tout");
                 form.refreshFieldsets();
             }
         });
diff --git a/src/app/components/section-results/section-results.component.html b/src/app/components/section-results/section-results.component.html
index 9f855a34e..ac4e78fa0 100644
--- a/src/app/components/section-results/section-results.component.html
+++ b/src/app/components/section-results/section-results.component.html
@@ -1,6 +1,5 @@
 <div class="section-results-container" #sectionResults *ngIf="hasResults" fxLayout="row wrap"
     fxLayoutAlign="center center">
-
     <div fxFlex="1 1 100%">
         <div class="section-results-buttons">
             <button mat-icon-button (click)="exportAsImage(sectionResults)" [title]="uitextExportImageTitle">
@@ -21,21 +20,3 @@
         </div>
     </div>
 </div>
-
-<div class="container">
-    <!-- journal -->
-    <log></log>
-
-    <results-chart *ngIf="showVarResults"></results-chart>
-    <!--<results-chart [hidden]="! showVarResultsChart"></results-chart>-->
-
-    <div>
-        <!-- table des résultats fixés -->
-        <fixed-results [results]=fixedResults></fixed-results>
-
-        <!-- table des résultats variés -->
-        <div *ngIf="showVarResults">
-            <var-results [results]=varResults></var-results>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/src/app/components/section-results/section-results.component.ts b/src/app/components/section-results/section-results.component.ts
index 359845b85..0893a387f 100644
--- a/src/app/components/section-results/section-results.component.ts
+++ b/src/app/components/section-results/section-results.component.ts
@@ -1,10 +1,10 @@
-import { Component, ElementRef, Input, AfterContentChecked } from "@angular/core";
+import { Component, ElementRef, Input } from "@angular/core";
 
 import { SectionResults } from "../../results/section-results";
 import { CalculatorResults } from "../../results/calculator-results";
 import { I18nService } from "../../services/internationalisation.service";
 import { AppComponent } from "../../app.component";
-import { FixedVarResultsComponent } from "../fixedvar-results/fixedvar-results.component";
+import { ResultsComponentDirective } from "../fixedvar-results/results.component";
 
 @Component({
     selector: "section-results",
diff --git a/src/app/components/verificateur-results/verificateur-results.component.html b/src/app/components/verificateur-results/verificateur-results.component.html
index 1d0f78479..f84e65938 100644
--- a/src/app/components/verificateur-results/verificateur-results.component.html
+++ b/src/app/components/verificateur-results/verificateur-results.component.html
@@ -1,7 +1,7 @@
 <div class="container">
     <log #generalLog [logTitle]="uitextGeneralLogTitle">log général</log>
 
-    <variable-results-selector [results]="verificateurResults" (indexChange)="variableIndexChanged()">
+    <variable-results-selector [results]="verificateurResults" [variatedParameters]=verificateurResults?.variatedParameters>
     </variable-results-selector>
 
     <log-drawer #iterationLog></log-drawer>
diff --git a/src/app/components/verificateur-results/verificateur-results.component.ts b/src/app/components/verificateur-results/verificateur-results.component.ts
index 1d76c0420..d0e06ee55 100644
--- a/src/app/components/verificateur-results/verificateur-results.component.ts
+++ b/src/app/components/verificateur-results/verificateur-results.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, DoCheck } from "@angular/core";
+import { Component, ViewChild } from "@angular/core";
 
 import { cLog, Message } from "jalhyd";
 
@@ -17,7 +17,7 @@ import { LogDrawerComponent } from "../log-drawer/log-drawer.component";
         "./verificateur-results.component.scss"
     ]
 })
-export class VerificateurResultsComponent extends ResultsComponentDirective implements DoCheck {
+export class VerificateurResultsComponent extends ResultsComponentDirective {
 
     /** résultats non mis en forme */
     private _verificateurResults: VerificateurResults;
@@ -45,39 +45,6 @@ export class VerificateurResultsComponent extends ResultsComponentDirective impl
         if (rs.length > 0 && rs[0] instanceof VerificateurResults) {
             this._verificateurResults = rs[0] as VerificateurResults;
         }
-        this.updateView();
-    }
-
-    /**
-     * update iteration log when the variable index changed (event sent by
-     * VariableResultsSelectorComponent); variable index is already set in
-     * verificateurResults at this time
-     */
-    public variableIndexChanged() {
-        this.updateView();
-    }
-
-    public updateView() {
-        if (this.iterationLogComponent) {
-            this.iterationLogComponent.log = undefined;
-        }
-        if (this.generalLogComponent) {
-            this.generalLogComponent.log = undefined;
-        }
-        if (this.variableResultsSelectorComponent) {
-            this.variableResultsSelectorComponent.results = undefined;
-        }
-        // set _doUpdate flag so that results are rebuilt on the next Angular display cycle
-        this._doUpdate = false;
-        if (this._verificateurResults !== undefined) {
-            this._doUpdate = this._doUpdate || this._verificateurResults.hasResults || this._verificateurResults.hasLog;
-        }
-    }
-
-    public ngDoCheck() {
-        if (this._doUpdate) {
-            this._doUpdate = !this.updateResults();
-        }
     }
 
     /*
@@ -136,33 +103,6 @@ export class VerificateurResultsComponent extends ResultsComponentDirective impl
         return l;
     }
 
-    /**
-     * met à jour l'affichage des résultats
-     * @returns true si les résultats ont pu être mis à jour
-     */
-    private updateResults() {
-        let selectorUpdated: boolean;
-
-        // results or not, there might be a log
-        const logUpdated = (this.iterationLogComponent !== undefined || this.generalLogComponent !== undefined); // gne ?
-        if (logUpdated) {
-            // order of logs is important !
-            this.iterationLogComponent.log = this.iterationLog;
-            this.generalLogComponent.log = this.globalLog;
-        }
-
-        if (this.hasResults) {
-            selectorUpdated = this.variableResultsSelectorComponent !== undefined;
-            if (selectorUpdated) {
-                this.variableResultsSelectorComponent.results = this._verificateurResults;
-            }
-        } else {
-            selectorUpdated = true;
-        }
-
-        return logUpdated && selectorUpdated;
-    }
-
     public get verificateurResults() {
         return this._verificateurResults;
     }
diff --git a/src/app/results/pab-results.ts b/src/app/results/pab-results.ts
index f77a2f9b4..d282524ef 100644
--- a/src/app/results/pab-results.ts
+++ b/src/app/results/pab-results.ts
@@ -150,7 +150,7 @@ export class PabResults extends MultiDimensionResults implements PlottableData {
      */
     public getChartAxisLabel(symbol: string): string {
         if (symbol === "x") { // specific case for wall abscissa
-            return ServiceFactory.instance.i18nService.localizeText("INFO_LIB_ABSCISSE_CLOISON");
+            return ServiceFactory.i18nService.localizeText("INFO_LIB_ABSCISSE_CLOISON");
         } else {
             return this.headers[this.columns.indexOf(symbol)];
         }
-- 
GitLab


From 6957d1049e2735bc0c0dd9e54e8218782e735c9d Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Wed, 16 Sep 2020 14:24:07 +0200
Subject: [PATCH 86/92] Fix VerificateurResults

---
 .../calculator-results.component.html         |  2 +-
 .../log-drawer/log-drawer.component.html      | 12 +++----
 .../log-drawer/log-drawer.component.ts        | 33 +++++++++++++++++--
 src/app/components/log/log.component.ts       |  8 -----
 .../verificateur-results.component.html       |  4 +--
 .../verificateur-results.component.ts         | 22 +++----------
 6 files changed, 43 insertions(+), 38 deletions(-)

diff --git a/src/app/components/calculator-results/calculator-results.component.html b/src/app/components/calculator-results/calculator-results.component.html
index f057d40a4..61ddf062b 100644
--- a/src/app/components/calculator-results/calculator-results.component.html
+++ b/src/app/components/calculator-results/calculator-results.component.html
@@ -3,7 +3,7 @@
     <remous-results *ngIf="isRemous" [results]=formResultsArray></remous-results>
     <pab-results *ngIf="isPAB" [results]=formResultsArray></pab-results>
     <pb-results *ngIf="isPB" [results]=formResultsArray></pb-results>
-    <verificateur-results [hidden]="! isVerificateur"></verificateur-results>
+    <verificateur-results *ngIf="isVerificateur" [results]=formResultsArray></verificateur-results>
     <macrorugo-compound-results *ngIf="isMRC" [results]=formResultsArray></macrorugo-compound-results>
     <jet-results *ngIf="isJet" [results]=formResultsArray></jet-results>
     <fixedvar-results *ngIf="! isJet" [results]=formResultsArray></fixedvar-results>
diff --git a/src/app/components/log-drawer/log-drawer.component.html b/src/app/components/log-drawer/log-drawer.component.html
index f2139f7c2..24c2ed3a8 100644
--- a/src/app/components/log-drawer/log-drawer.component.html
+++ b/src/app/components/log-drawer/log-drawer.component.html
@@ -3,18 +3,18 @@
         <!-- titre -->
         <div class="titre">{{ uitextTitreJournal }}</div>
         <!-- entrées du journal -->
-        <div class="log-entry" *ngFor="let entry of log">
+        <div class="log-entry" *ngFor="let entry of log; let i = index; trackBy: tbIndex">
             <log-entry [_message]="entry.message"></log-entry>
             <div *ngIf="entry.subLog.messages.length" class="drawer">
                 <div class="open-drawer">
-                    <span *ngIf="! entry.isOpen">
-                        <a (click)="entry.isOpen = true;">{{ uitextShowDetails }}</a>
+                    <span *ngIf="! entryIsOpen(i)">
+                        <a (click)="setEntryOpen(i, true);">{{ uitextShowDetails }}</a>
                     </span>
-                    <span *ngIf="entry.isOpen">
-                        <a (click)="entry.isOpen = false">{{ uitextHideDetails }}</a>
+                    <span *ngIf="entryIsOpen(i)">
+                        <a (click)="setEntryOpen(i, false);">{{ uitextHideDetails }}</a>
                     </span>
                 </div>
-                <div class="drawer-contents" [hidden]="! entry.isOpen">
+                <div class="drawer-contents" [hidden]="! entryIsOpen(i)">
                     <log-entry *ngFor="let m of entry.subLog.messages" [_message]="m"></log-entry>
                 </div>
             </div>
diff --git a/src/app/components/log-drawer/log-drawer.component.ts b/src/app/components/log-drawer/log-drawer.component.ts
index 2394e46b8..bb4fcf4f3 100644
--- a/src/app/components/log-drawer/log-drawer.component.ts
+++ b/src/app/components/log-drawer/log-drawer.component.ts
@@ -15,7 +15,9 @@ import { I18nService } from "../../services/internationalisation.service";
 export class LogDrawerComponent {
 
     /** A list of log messages accompanied by a sub-log (multiple messages) */
-    public log: Array<{ message: Message, subLog: cLog }>;
+    private _log: Array<{ message: Message, subLog: cLog }>;
+
+    private entriesStates: boolean[] = [];
 
     // title to display above the log
     @Input()
@@ -24,7 +26,16 @@ export class LogDrawerComponent {
     constructor(
         private intlService: I18nService,
     ) {
-        this.log = [];
+        this._log = [];
+    }
+
+    @Input()
+    public set log(log: Array<{ message: Message, subLog: cLog }>) {
+        this._log = log;
+    }
+
+    public get log(): Array<{ message: Message, subLog: cLog }> {
+        return this._log;
     }
 
     public get uitextTitreJournal(): string {
@@ -36,7 +47,7 @@ export class LogDrawerComponent {
     }
 
     public get hasEntries(): boolean {
-        return this.log !== undefined && this.log.length !== 0;
+        return this._log !== undefined && this._log.length !== 0;
     }
 
     public get uitextShowDetails(): string {
@@ -46,4 +57,20 @@ export class LogDrawerComponent {
     public get uitextHideDetails(): string {
         return this.intlService.localizeText("INFO_LOG_HIDE_DETAILS");
     }
+
+    public entryIsOpen(i: number): boolean {
+        if (this.entriesStates[i] !== undefined) {
+            return this.entriesStates[i];
+        }
+        return false;
+    }
+
+    public setEntryOpen(i: number, open: boolean) {
+        this.entriesStates[i] = open;
+    }
+
+    /** trackBy:index simulator @see nghyd#364 */
+    public tbIndex(index: number, item: any) {
+        return index;
+    }
 }
diff --git a/src/app/components/log/log.component.ts b/src/app/components/log/log.component.ts
index 5235954b2..b3d9c2f71 100644
--- a/src/app/components/log/log.component.ts
+++ b/src/app/components/log/log.component.ts
@@ -37,14 +37,6 @@ export class LogComponent {
         return this._log?.messages?.length > 0;
     }
 
-    /* public get messages(): Message[] {
-        let m: Message[] = [];
-        if (this._log !== undefined) {
-            m = this._log.messages;
-        }
-        return m;
-    } */
-
     @Input()
     public set log(log: cLog) {
         this._log = log;
diff --git a/src/app/components/verificateur-results/verificateur-results.component.html b/src/app/components/verificateur-results/verificateur-results.component.html
index f84e65938..b343b924e 100644
--- a/src/app/components/verificateur-results/verificateur-results.component.html
+++ b/src/app/components/verificateur-results/verificateur-results.component.html
@@ -1,8 +1,8 @@
 <div class="container">
-    <log #generalLog [logTitle]="uitextGeneralLogTitle">log général</log>
+    <log [log]="globalLog" [logTitle]="uitextGeneralLogTitle">log général</log>
 
     <variable-results-selector [results]="verificateurResults" [variatedParameters]=verificateurResults?.variatedParameters>
     </variable-results-selector>
 
-    <log-drawer #iterationLog></log-drawer>
+    <log-drawer [log]="iterationLog"></log-drawer>
 </div>
diff --git a/src/app/components/verificateur-results/verificateur-results.component.ts b/src/app/components/verificateur-results/verificateur-results.component.ts
index d0e06ee55..6770b31ac 100644
--- a/src/app/components/verificateur-results/verificateur-results.component.ts
+++ b/src/app/components/verificateur-results/verificateur-results.component.ts
@@ -1,14 +1,11 @@
-import { Component, ViewChild } from "@angular/core";
+import { Component, Input } from "@angular/core";
 
 import { cLog, Message } from "jalhyd";
 
-import { LogComponent } from "../log/log.component";
 import { CalculatorResults } from "../../results/calculator-results";
-import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
 import { I18nService } from "../../services/internationalisation.service";
 import { VerificateurResults } from "../../results/verificateur-results";
 import { ResultsComponentDirective } from "../fixedvar-results/results.component";
-import { LogDrawerComponent } from "../log-drawer/log-drawer.component";
 
 @Component({
     selector: "verificateur-results",
@@ -22,24 +19,13 @@ export class VerificateurResultsComponent extends ResultsComponentDirective {
     /** résultats non mis en forme */
     private _verificateurResults: VerificateurResults;
 
-    /** true si les résultats doiventt être remis à jour */
-    private _doUpdate = false;
-
-    @ViewChild(VariableResultsSelectorComponent)
-    private variableResultsSelectorComponent: VariableResultsSelectorComponent;
-
-    @ViewChild("generalLog")
-    private generalLogComponent: LogComponent;
-
-    @ViewChild("iterationLog")
-    private iterationLogComponent: LogDrawerComponent;
-
     constructor(
         private i18nService: I18nService,
     ) {
         super();
     }
 
+    @Input()
     public set results(rs: CalculatorResults[]) {
         this._verificateurResults = undefined;
         if (rs.length > 0 && rs[0] instanceof VerificateurResults) {
@@ -51,7 +37,7 @@ export class VerificateurResultsComponent extends ResultsComponentDirective {
      * Retourne les messages à afficher dans le composant de log global, au dessus
      * du sélecteur d'itération : messages globaux du Verificateur
      */
-    private get globalLog(): cLog {
+    public get globalLog(): cLog {
         const l = new cLog();
         if (this._verificateurResults && this._verificateurResults.result && this._verificateurResults.result.hasGlobalLog()) {
             l.addLog(this._verificateurResults.result.globalLog);
@@ -63,7 +49,7 @@ export class VerificateurResultsComponent extends ResultsComponentDirective {
      * Retourne les messages à afficher dans le composant de log "du bas" : logs de l'itération
      * en cours (messages non-globaux du Vérificateur et eds Espèce), que le résultat varie ou non
      */
-    private get iterationLog(): Array<{ message: Message, subLog: cLog }> {
+    public get iterationLog(): Array<{ message: Message, subLog: cLog }> {
         const l: Array<{ message: Message, subLog: cLog }> = [];
         if (this._verificateurResults) {
             // = 0 lorsque rien ne varie
-- 
GitLab


From 8a097804466e72bb6515fbceb42175f908ee881d Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Wed, 16 Sep 2020 14:53:08 +0200
Subject: [PATCH 87/92] Simplify calculator template data injection

---
 .../calculator-results.component.ts           |  4 ++--
 .../generic-calculator/calc-name.component.ts |  7 ++++++-
 .../calculator.component.html                 |  4 ++--
 .../calculator.component.ts                   | 21 ++++---------------
 4 files changed, 14 insertions(+), 22 deletions(-)

diff --git a/src/app/components/calculator-results/calculator-results.component.ts b/src/app/components/calculator-results/calculator-results.component.ts
index e26bc762f..796d0e481 100644
--- a/src/app/components/calculator-results/calculator-results.component.ts
+++ b/src/app/components/calculator-results/calculator-results.component.ts
@@ -1,4 +1,4 @@
-import { Component, Output, EventEmitter, AfterViewChecked, Inject, forwardRef } from "@angular/core";
+import { Component, Output, EventEmitter, AfterViewChecked, Inject, forwardRef, Input } from "@angular/core";
 
 import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
 import { CalculatorResults } from "../../results/calculator-results";
@@ -20,7 +20,7 @@ export class CalculatorResultsComponent implements AfterViewChecked {
         @Inject(forwardRef(() => GenericCalculatorComponent)) private calculatorComponent: GenericCalculatorComponent
     ) { }
 
-    // @TODO @Input() ?
+    @Input()
     public set formulaire(f: FormulaireDefinition) {
         this._formulaire = f;
     }
diff --git a/src/app/components/generic-calculator/calc-name.component.ts b/src/app/components/generic-calculator/calc-name.component.ts
index a07f51b0c..c1cc4bb7e 100644
--- a/src/app/components/generic-calculator/calc-name.component.ts
+++ b/src/app/components/generic-calculator/calc-name.component.ts
@@ -1,4 +1,4 @@
-import { Component } from "@angular/core";
+import { Component, Input } from "@angular/core";
 import { GenericInputComponentDirective } from "../generic-input/generic-input.component";
 import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
 import { I18nService } from "../../services/internationalisation.service";
@@ -20,6 +20,11 @@ export class CalculatorNameComponent extends GenericInputComponentDirective {
         super(null, intlService, appSetupService);
     }
 
+    @Input()
+    public set model(v: any) {
+        super.model = v;
+    }
+
     /**
      * formulaire géré
      */
diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index 906fc6a98..7b085815a 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -57,7 +57,7 @@
         <mat-card-content>
 
             <!-- nom du module de calcul -->
-            <calc-name id="calculator-name" [title]="uitextCalculatorName"></calc-name>
+            <calc-name id="calculator-name" [model]="formulaire" [title]="uitextCalculatorName"></calc-name>
 
             <button mat-raised-button type="button" color="accent" id="load-predefined-espece" *ngIf="isEspece"
                 (click)="loadPredefinedEspece()" [title]="uitextLoadPredefinedEspece">
@@ -192,7 +192,7 @@
                     </button>
 
                     <mat-card-content>
-                        <calc-results id="resultsComp" (afterViewChecked)="onCalcResultsViewChecked()"></calc-results>
+                        <calc-results id="resultsComp" [formulaire]="formulaire" (afterViewChecked)="onCalcResultsViewChecked()"></calc-results>
                     </mat-card-content>
                 </mat-card>
 
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 2cd8d2d6f..33efee506 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -31,10 +31,8 @@ import { ApplicationSetupService } from "../../services/app-setup.service";
 import { I18nService } from "../../services/internationalisation.service";
 import { FieldSet } from "../../formulaire/elements/fieldset";
 import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
-import { CalculatorResultsComponent } from "../../components/calculator-results/calculator-results.component";
 import { Subscription } from "rxjs";
 import { FieldSetComponent } from "../field-set/field-set.component";
-import { CalculatorNameComponent } from "./calc-name.component";
 import { FormulaireElement } from "../../formulaire/elements/formulaire-element";
 import { FieldsetContainer } from "../../formulaire/elements/fieldset-container";
 import { FieldsetContainerComponent } from "../fieldset-container/fieldset-container.component";
@@ -46,7 +44,6 @@ import { DialogGeneratePARSimulationComponent } from "../dialog-generate-par-sim
 import { DialogLoadPredefinedEspeceComponent } from "../dialog-load-predefined-espece/dialog-load-predefined-espece.component";
 import { PabTable } from "../../formulaire/elements/pab-table";
 import { MultiDimensionResults } from "../../results/multidimension-results";
-import { NgParameter } from "../../formulaire/elements/ngparam";
 import { FormulaireFixedVar } from "../../formulaire/definition/form-fixedvar";
 import { PbSchema } from "../../formulaire/elements/pb-schema";
 import { PbSchemaComponent } from "../pb-schema/pb-schema.component";
@@ -86,18 +83,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     @ViewChild(PbSchemaComponent)
     private _pbSchemaComponent: PbSchemaComponent;
 
-    /**
-     * composant d'affichage des résultats
-     */
-    @ViewChild(CalculatorResultsComponent, { static: true })
-    private resultsComponent: CalculatorResultsComponent;
-
-    /**
-     * composant "nom du module de calcul"
-     */
-    @ViewChild(CalculatorNameComponent, { static: true })
-    private _calculatorNameComponent: CalculatorNameComponent;
-
     /**
      * formulaire affiché
      */
@@ -179,6 +164,10 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         }, this)));
     }
 
+    public get formulaire(): FormulaireDefinition {
+        return this._formulaire;
+    }
+
     public get formElements(): FormulaireElement[] {
         if (this._formulaire === undefined) {
             return [];
@@ -447,8 +436,6 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
                 case "currentFormChanged":
                     const uid: string = data["formId"];
                     this._formulaire = (this.formulaireService.getFormulaireFromId(uid));
-                    this.resultsComponent.formulaire = this._formulaire;
-                    this._calculatorNameComponent.model = this._formulaire;
                     // reload localisation in all cases (it does not eat bread)
                     this.formulaireService.updateFormulaireLocalisation(this._formulaire);
                     break;
-- 
GitLab


From a552413c50c0fcf95ac5fc68ae871bfdb3b67e94 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 17 Sep 2020 10:55:10 +0200
Subject: [PATCH 88/92] Cosmetics

---
 .../jet-trajectory-chart/jet-trajectory-chart.component.html    | 2 +-
 .../jet-trajectory-chart/jet-trajectory-chart.component.ts      | 1 -
 .../pab-profile-chart/pab-profile-chart.component.html          | 2 +-
 src/app/components/results-chart/results-chart.component.html   | 2 +-
 4 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.html b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.html
index 1087a424a..cedbcf293 100644
--- a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.html
+++ b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.html
@@ -17,7 +17,7 @@
         </div>
 
         <div *ngIf="! displayChart" class="fake-chart"></div><!-- trick to avoid blinking effect due to forceRebuild -->
-        <chart *ngIf="displayChart" type="scatter" [data]="graph_data" [options]="graph_options" #graphChart>
+        <chart *ngIf="displayChart" type="scatter" [data]="graph_data" [options]="graph_options">
         </chart>
     </div>
 </div>
\ No newline at end of file
diff --git a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
index 3e4d1e9db..2d726e9f9 100644
--- a/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
+++ b/src/app/components/jet-trajectory-chart/jet-trajectory-chart.component.ts
@@ -138,7 +138,6 @@ export class JetTrajectoryChartComponent extends ResultsComponentDirective imple
 
     // redessine le graphique dès qu'une entrée change
     public ngOnChanges() {
-        console.log("----> regenerate trajectory chart !!");
         if (this._results) {
             const nub = this._results.sourceNub as Jet;
             const length = nub.variatingLength();
diff --git a/src/app/components/pab-profile-chart/pab-profile-chart.component.html b/src/app/components/pab-profile-chart/pab-profile-chart.component.html
index 35c9c9aec..f7c4d9079 100644
--- a/src/app/components/pab-profile-chart/pab-profile-chart.component.html
+++ b/src/app/components/pab-profile-chart/pab-profile-chart.component.html
@@ -16,7 +16,7 @@
             </button>
         </div>
 
-        <chart type="scatter" [data]="graph_data" [options]="graph_options" #graphChart>
+        <chart type="scatter" [data]="graph_data" [options]="graph_options">
         </chart>
     </div>
 </div>
\ No newline at end of file
diff --git a/src/app/components/results-chart/results-chart.component.html b/src/app/components/results-chart/results-chart.component.html
index 1cf1336d5..be55ade02 100644
--- a/src/app/components/results-chart/results-chart.component.html
+++ b/src/app/components/results-chart/results-chart.component.html
@@ -17,7 +17,7 @@
         </div>
 
         <div *ngIf="! displayChart" class="fake-chart"></div><!-- trick to avoid blinking effect due to forceRebuild -->
-        <chart *ngIf="displayChart" [type]="graph_type" [data]="graph_data" [options]="graph_options" #graphChart>
+        <chart *ngIf="displayChart" [type]="graph_type" [data]="graph_data" [options]="graph_options">
         </chart>
     </div>
 </div>
-- 
GitLab


From cf7bfec91bd21e400fac67e2fdd58c2d0c2f7f41 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 17 Sep 2020 16:07:05 +0200
Subject: [PATCH 89/92] Fix many problems in PreBarrage schema

do not replace walls when basins selectors value was not changed
when showing results, go back to input data after removing a wall or basin
---
 .../pb-schema/pb-schema.component.ts          |  1 +
 .../formulaire/definition/form-pb-cloison.ts  | 52 +++++++++++--------
 2 files changed, 31 insertions(+), 22 deletions(-)

diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 7a9ed20fe..7ca98ce67 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -337,6 +337,7 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
         this.unselect();
         this.refresh();
         this.clearResults();
+        this.calculatorComponent.showPBInputData = true;
     }
 
     public get uitextRemove() {
diff --git a/src/app/formulaire/definition/form-pb-cloison.ts b/src/app/formulaire/definition/form-pb-cloison.ts
index 311f8f918..f7680be3a 100644
--- a/src/app/formulaire/definition/form-pb-cloison.ts
+++ b/src/app/formulaire/definition/form-pb-cloison.ts
@@ -46,31 +46,39 @@ export class FormulairePbCloison extends FormulaireParallelStructure {
             // empty "" data.value.value should return undefined, which is good for amont/aval
             const newBasin = pb.findChild(data.value?.value) as PbBassin;
             if (sender.id === "select_upstream_basin") {
-                // remove and recreate wall (easier for pointers consistency) but preserve UID
-                const uid = nub.uid;
-                const oldDownstreamBasin = nub.bassinAval;
-                pb.deleteChild(pb.findChildPosition(nub.uid));
-                const newWall = new PbCloison(newBasin, oldDownstreamBasin);
-                newWall.setUid(uid);
-                // copy structures
-                for (const s of nub.structures) {
-                    newWall.addChild(s);
+                // update only if upstream basin changed (prevents updating on unwanted events)
+                if (newBasin?.uid !== nub.bassinAmont?.uid) {
+                    // remove and recreate wall (easier for pointers consistency) but preserve UID
+                    const uid = nub.uid;
+                    const oldDownstreamBasin = nub.bassinAval;
+                    pb.deleteChild(pb.findChildPosition(nub.uid));
+                    const newWall = new PbCloison(newBasin, oldDownstreamBasin);
+                    newWall.setUid(uid);
+                    // copy structures
+                    for (const s of nub.structures) {
+                        newWall.addChild(s);
+                    }
+                    pb.addChild(newWall);
+                    this.currentNub = newWall;
+                    this.reset();
                 }
-                pb.addChild(newWall);
-                this.currentNub = newWall;
             } else if (sender.id === "select_downstream_basin") {
-                // remove and recreate wall (easier for pointers consistency) but preserve UID
-                const uid = nub.uid;
-                const oldUpstreamBasin = nub.bassinAmont;
-                pb.deleteChild(pb.findChildPosition(nub.uid));
-                const newWall = new PbCloison(oldUpstreamBasin, newBasin);
-                newWall.setUid(uid);
-                // copy structures
-                for (const s of nub.structures) {
-                    newWall.addChild(s);
+                // update only if downstream basin changed (prevents updating on unwanted events)
+                if (newBasin?.uid !== nub.bassinAval?.uid) {
+                    // remove and recreate wall (easier for pointers consistency) but preserve UID
+                    const uid = nub.uid;
+                    const oldUpstreamBasin = nub.bassinAmont;
+                    pb.deleteChild(pb.findChildPosition(nub.uid));
+                    const newWall = new PbCloison(oldUpstreamBasin, newBasin);
+                    newWall.setUid(uid);
+                    // copy structures
+                    for (const s of nub.structures) {
+                        newWall.addChild(s);
+                    }
+                    pb.addChild(newWall);
+                    this.currentNub = newWall;
+                    this.reset();
                 }
-                pb.addChild(newWall);
-                this.currentNub = newWall;
             }
             this.notifyObservers({
                 action: "updateBasin",
-- 
GitLab


From dbb8a8a4031a5177b2aaa8ee65119f56734d1212 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 17 Sep 2020 16:32:52 +0200
Subject: [PATCH 90/92] Update Mermaid, set max width for PreBarrage chart

---
 package-lock.json                                   | 6 +++---
 package.json                                        | 2 +-
 src/app/components/pb-schema/pb-schema.component.ts | 3 ++-
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index a6ac34cc9..54b2d0507 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13313,9 +13313,9 @@
       "dev": true
     },
     "mermaid": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.7.0.tgz",
-      "integrity": "sha512-SkinxAY3sIdML+o5U4U7rQEIa628OEywEw+pfhc3wSVDFqLk2XNdX2j3YmkyCw3Kcbp9BXar533ei+/saYBs5g==",
+      "version": "8.8.0",
+      "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.8.0.tgz",
+      "integrity": "sha512-SbMzt5T6+XMkHRUECHUneq26H8bvjF752YZCKCJ4G8UU7qI2OmmxYdj4ZJnda7JIx3EuNeN4xSLuLCBJ5ByzSQ==",
       "requires": {
         "@braintree/sanitize-url": "^3.1.0",
         "babel-eslint": "^10.1.0",
diff --git a/package.json b/package.json
index 7be479a7e..54e2edbed 100644
--- a/package.json
+++ b/package.json
@@ -67,7 +67,7 @@
     "jalhyd": "file:../jalhyd",
     "material-design-icons": "^3.0.1",
     "mathjax": "^3.1.0",
-    "mermaid": "^8.7.0",
+    "mermaid": "^8.8.0",
     "ngx-konami": "^1.7.1",
     "ngx-markdown": "^10.1.1",
     "ngx-material-file-input": "^2.1.1",
diff --git a/src/app/components/pb-schema/pb-schema.component.ts b/src/app/components/pb-schema/pb-schema.component.ts
index 7ca98ce67..bf924160d 100644
--- a/src/app/components/pb-schema/pb-schema.component.ts
+++ b/src/app/components/pb-schema/pb-schema.component.ts
@@ -76,7 +76,8 @@ export class PbSchemaComponent implements AfterViewInit, AfterContentInit, OnIni
     public ngAfterContentInit(): void {
         mermaid.initialize({
             flowchart: {
-                curve: "basis"
+                curve: "basis",
+                useMaxWidth: true
             }
         });
         this.nativeElement = this.schema.nativeElement;
-- 
GitLab


From 9cb0ddc9c26f1c283ee9ad2067df6b05c8db2cc1 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 17 Sep 2020 16:36:32 +0200
Subject: [PATCH 91/92] Update dependencies

---
 package-lock.json | 220 +++++++++++++++++++++++++++++-----------------
 package.json      |  30 +++----
 2 files changed, 155 insertions(+), 95 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 54b2d0507..8d855d26f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -317,20 +317,20 @@
       }
     },
     "@angular-devkit/schematics": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.1.0.tgz",
-      "integrity": "sha512-5Vl32bHpcB/oj0oNR8nPLXF7DwPVuzrJjosch8G+sPG2gAG6OpwjUhQjY1U6E4xJGDR6j7fX8jw+TwC2cMgUbQ==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.1.2.tgz",
+      "integrity": "sha512-gS5yP8ntw3/v9zBK9kBsp5r4gYlp8cLvJ3oWLZmSvdzzbm/QznPnRKqNm72AptKrlxRFX0xyrJ7vjtLWcssqxA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.1.0",
+        "@angular-devkit/core": "10.1.2",
         "ora": "5.0.0",
         "rxjs": "6.6.2"
       },
       "dependencies": {
         "@angular-devkit/core": {
-          "version": "10.1.0",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.0.tgz",
-          "integrity": "sha512-oNRwAX+5uEwgheS3UUc1W+AerbimqGojCOTdWWcq5XtSviZnBCp1FeMZV+eB6XgUWfbmbWBu39S3sCYmXVHLwg==",
+          "version": "10.1.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.2.tgz",
+          "integrity": "sha512-LMxesiCuXRe3UzPdRouXsC1W73/q6rVtACVoD5GdzmmnZ7cRh7oiwonqT0lEXIKQikMsZUasUOXHD2HoKV6BoA==",
           "dev": true,
           "requires": {
             "ajv": "6.12.4",
@@ -363,21 +363,36 @@
           "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
           "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
           "dev": true
+        },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
         }
       }
     },
     "@angular/animations": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.1.0.tgz",
-      "integrity": "sha512-0S2UKHDwIw/ZEISDrzhDhn4eVTNwjJW+msOYSaIm6ASRArtSVrwBz1ckD92HhurnnkHVwgTQsnU7yDYKfheaow==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.1.2.tgz",
+      "integrity": "sha512-39KSRY61pLaggbuikx4bltJQQ/l54RjPDffZrUJsuCXIpBKHd+ew8CJ3rud+zjhDfA3pETb7WE1jeCNKo6Zo1A==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/cdk": {
-      "version": "10.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-10.2.0.tgz",
-      "integrity": "sha512-KYEBOuGimnWtYS8KvLz/dPWC2pzDzKh1ETkvyJCSm5yXZgNPdj1XatbGQrnQgy9vJwxjbZQ1s8P9tzWx1Dj7dg==",
+      "version": "10.2.1",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-10.2.1.tgz",
+      "integrity": "sha512-67nPfteerlGPlwBeKt+EEOgEo2zm3+U6FzwhXVqwEeBxCZ7PWelMDiartHC7zZnzIKkcNEO0Uptq7Bzl2gdU0w==",
       "requires": {
         "parse5": "^5.0.0",
         "tslib": "^2.0.0"
@@ -392,16 +407,16 @@
       }
     },
     "@angular/cli": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.1.0.tgz",
-      "integrity": "sha512-sWGEVeQQ5PXKuu517fRFEQQ5qopzoWeW+8qBUTrmJt8FztiL2ASyu412iJse56wyGxZvqwUmtzpti5kWHR9XIw==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.1.2.tgz",
+      "integrity": "sha512-dBcqFTuT71CCkH4BoV2cN5RP5k8ggzOBijNNtwkQv7N4gNcdcczhoPtEa2v4Oo8mPcTwxf/C3RXZ+NicdROJOw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.1001.0",
-        "@angular-devkit/core": "10.1.0",
-        "@angular-devkit/schematics": "10.1.0",
-        "@schematics/angular": "10.1.0",
-        "@schematics/update": "0.1001.0",
+        "@angular-devkit/architect": "0.1001.2",
+        "@angular-devkit/core": "10.1.2",
+        "@angular-devkit/schematics": "10.1.2",
+        "@schematics/angular": "10.1.2",
+        "@schematics/update": "0.1001.2",
         "@yarnpkg/lockfile": "1.1.0",
         "ansi-colors": "4.1.1",
         "debug": "4.1.1",
@@ -420,19 +435,19 @@
       },
       "dependencies": {
         "@angular-devkit/architect": {
-          "version": "0.1001.0",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1001.0.tgz",
-          "integrity": "sha512-mJYy9tqy7ZfqAJYlQPgcHVUiaAxWnxEEpiTAftsKz/yqdO45YFkzehYXJfCqbAXYr4r7hYY3KqKMgj41ixkS8Q==",
+          "version": "0.1001.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1001.2.tgz",
+          "integrity": "sha512-05o12amjZ8NNIFehKm/lFYf12xvCclC7V5tGl/9+V7g/3pQqakwAjCysgb9T+ETffhmKhMnE8XdAJZqF7YrDcw==",
           "dev": true,
           "requires": {
-            "@angular-devkit/core": "10.1.0",
+            "@angular-devkit/core": "10.1.2",
             "rxjs": "6.6.2"
           }
         },
         "@angular-devkit/core": {
-          "version": "10.1.0",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.0.tgz",
-          "integrity": "sha512-oNRwAX+5uEwgheS3UUc1W+AerbimqGojCOTdWWcq5XtSviZnBCp1FeMZV+eB6XgUWfbmbWBu39S3sCYmXVHLwg==",
+          "version": "10.1.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.2.tgz",
+          "integrity": "sha512-LMxesiCuXRe3UzPdRouXsC1W73/q6rVtACVoD5GdzmmnZ7cRh7oiwonqT0lEXIKQikMsZUasUOXHD2HoKV6BoA==",
           "dev": true,
           "requires": {
             "ajv": "6.12.4",
@@ -646,6 +661,15 @@
           "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
           "dev": true
         },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "semver": {
           "version": "7.3.2",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
@@ -670,6 +694,12 @@
             "has-flag": "^4.0.0"
           }
         },
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        },
         "uuid": {
           "version": "8.3.0",
           "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
@@ -679,25 +709,25 @@
       }
     },
     "@angular/common": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.1.0.tgz",
-      "integrity": "sha512-LdDa6adSv9b+uCSyYuH8I7LS40CdJCVMOv8Y44p/JBr9b54Datslf8nygG1RhU+HkIMzdtw6qjcHbwF+27cLZw==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.1.2.tgz",
+      "integrity": "sha512-zsWZN30sUJVXcakKK+B7ANzDZNK5fqZRwawCp5IteUNveqxfl70CqSTft0twOnva0NGsiTgix9WH5XqnUJqYzg==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/compiler": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.1.0.tgz",
-      "integrity": "sha512-PBHH59B2yTT/h2HxrlGGm8W5taHkcEk39FXiycSBrbt3T5QiExUXMJoUERviPQCUeHCWWsi1Fpu9wK2fgnP/Qw==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.1.2.tgz",
+      "integrity": "sha512-P7AMt15HwCXVBZcTqh9HqQcSTRzSy1cUjOjy+POz4C5VRAzpOXMUkh5mlbv9FtnrfmCIili7hBrf06a/q8orPQ==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/compiler-cli": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.1.0.tgz",
-      "integrity": "sha512-4AvjGNNvGcBakI4djt6W8GhmuKGf3eySthVQCh0GRYErYLvXYSW+69Yi0FzbjieHZht2P3LFVbunWFksBwp+rw==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.1.2.tgz",
+      "integrity": "sha512-oZ6uSmiJ5JnNpLYhpEpKOXIU90mAidjMY0u/aJcCQnARWa/t72c/txlEkiB0CO41Hi6k3Hqb4XAERmIzQ6H59A==",
       "dev": true,
       "requires": {
         "canonical-path": "1.0.0",
@@ -794,9 +824,9 @@
       }
     },
     "@angular/core": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.1.0.tgz",
-      "integrity": "sha512-lENt8Wk1vVsIiHeZVzXCZoHY13BxkqmulEw/AdUOh4VQxoU5K3z1o7fC1cvPHBvBEUnhbD2pDC1UHcY1G9yLRw==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.1.2.tgz",
+      "integrity": "sha512-iBVkCgXMp3TofrbZVwpuSbLAiLHF/fbx9xHnFcjBQUXBUIoxiEB4NcrPHibmBVNX0J45hO6iLsG+ZtFZbMifNg==",
       "requires": {
         "tslib": "^2.0.0"
       }
@@ -810,47 +840,47 @@
       }
     },
     "@angular/forms": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.1.0.tgz",
-      "integrity": "sha512-1onL5To+QAaI1v642WcjfchwwJrUqIPrJ40a4l5yvcd/iZydOBHS/bbw1nYjQDiKeGL2+gzpP04qrh4nHeG7OA==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.1.2.tgz",
+      "integrity": "sha512-BzzhKabLdI7JZAGz6oa+7ITEpVGhR+Tu0nhRsgyjZijz02vWAMexr1xXILLgCNMiMG509WDFvIbTwsd6lIFsXA==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/language-service": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.1.0.tgz",
-      "integrity": "sha512-+36OfWzn+JgHeKDxWPS4+rEUQnmwqvm7U9ciqZiaa0V49j9+MJOtM5Ax5WXQhYHFBxuG9zQIowAsm7UYxvWiDg==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.1.2.tgz",
+      "integrity": "sha512-NYAvbiqzj2cxIAFiqZQSEVqbKaRaJKEn/qRlzMbfELbJV3Vwzw6oDwV550LnX4ZXOdsfMvEV4zJLBjUMDbpevg==",
       "dev": true
     },
     "@angular/material": {
-      "version": "10.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/material/-/material-10.2.0.tgz",
-      "integrity": "sha512-IplZVu1OpyvGYlrzkV36+5xKdwyyfl8AOykcC+jWU1MtnbTrnVmqGGF94qv7YEYN4PcVKbhSuNnz6/vPQm27ZA==",
+      "version": "10.2.1",
+      "resolved": "https://registry.npmjs.org/@angular/material/-/material-10.2.1.tgz",
+      "integrity": "sha512-TSfjW4w3orzDtTstNcNR2zsfNcO/R7NNmDMQ11LO6+EfnbNF2yktsMS3FZl811GX6dXEE+R/GCdDgCnlvqv9Mw==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/platform-browser": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.1.0.tgz",
-      "integrity": "sha512-bYG02qt36lzCBIV6mbAuYPDKU18x9Xd3S3jwJddvoHjRupxwZtTPGWKQ/4qhv1QrLwZnvXbCavIZlrHe68XJbw==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.1.2.tgz",
+      "integrity": "sha512-zI6YUy2juR8y8jDfdGGYHxZ9kv3wDZzFj49CObx9GU6+ijQ9FsFCWnsB44LmlzC17xCoQ9wn+zYIHtpdf80zvA==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/platform-browser-dynamic": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.1.0.tgz",
-      "integrity": "sha512-JzGYFiv6F6upbEv3KyoktZ8UaO/3kQRrqsXmUGbl+k12aG1Lg9WeTIfpWV8eqDCEAQb7BqyqoFbbZGZfnxp/TQ==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.1.2.tgz",
+      "integrity": "sha512-ePxQdVSh3pJLq4Zxc+27VW+ekyU5MGrGDT/gpLhzXWu1EEUe786Q9fM4T6yA7mDP/1XF7HngF3hlMqla2ayqeA==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@angular/router": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.1.0.tgz",
-      "integrity": "sha512-20xidByYytcg46pBxZtraNHFCLDg75mTYAB8cTZ5qEZghrECzECyDbSKCwaW2zsv51Tlrcpi03/0CAaw7EgZiw==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.1.2.tgz",
+      "integrity": "sha512-JufAdFyTsB9I9aMD/WNBaI4Fi81SuN6cJm9idSwsUHbEOfB96aQL4dfNEOarzfD9KtDi1vADzkrmVRc2tz2qNw==",
       "requires": {
         "tslib": "^2.0.0"
       }
@@ -2551,20 +2581,20 @@
       }
     },
     "@schematics/angular": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.1.0.tgz",
-      "integrity": "sha512-kQ925yMmOwiSITY+FhuTvrl3HuEIEUrdByBNB0NlvY+DyJwPlngEOo6Iu0cYWaJcoxM1JscOWL59ZR6W7YCFIg==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.1.2.tgz",
+      "integrity": "sha512-7BHgSdP4yC0IuoiPGWBGQrwE5ilBhIOGozjKSHx41Utac45YKyXpmjr1Jw+SvFilgsnPEjZwc7VKqgINmeLkqA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.1.0",
-        "@angular-devkit/schematics": "10.1.0",
+        "@angular-devkit/core": "10.1.2",
+        "@angular-devkit/schematics": "10.1.2",
         "jsonc-parser": "2.3.0"
       },
       "dependencies": {
         "@angular-devkit/core": {
-          "version": "10.1.0",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.0.tgz",
-          "integrity": "sha512-oNRwAX+5uEwgheS3UUc1W+AerbimqGojCOTdWWcq5XtSviZnBCp1FeMZV+eB6XgUWfbmbWBu39S3sCYmXVHLwg==",
+          "version": "10.1.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.2.tgz",
+          "integrity": "sha512-LMxesiCuXRe3UzPdRouXsC1W73/q6rVtACVoD5GdzmmnZ7cRh7oiwonqT0lEXIKQikMsZUasUOXHD2HoKV6BoA==",
           "dev": true,
           "requires": {
             "ajv": "6.12.4",
@@ -2597,17 +2627,32 @@
           "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
           "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
           "dev": true
+        },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
         }
       }
     },
     "@schematics/update": {
-      "version": "0.1001.0",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1001.0.tgz",
-      "integrity": "sha512-LRGwo37akHe/BUl5FHj74mJ/xhM0Z7W8pWMWJ6zGihs+HNXjTgfYVgGA1TgN0amqQODa3AxxLL6aLj+hVYZi+g==",
+      "version": "0.1001.2",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1001.2.tgz",
+      "integrity": "sha512-Z/P08k4FlbKNmxV5pe34yfKPLI2327CjBg26isO5qpR4nB1FVZkC39YXwFwJod3nU7DE6UMkKcA749k30k2KSg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.1.0",
-        "@angular-devkit/schematics": "10.1.0",
+        "@angular-devkit/core": "10.1.2",
+        "@angular-devkit/schematics": "10.1.2",
         "@yarnpkg/lockfile": "1.1.0",
         "ini": "1.3.5",
         "npm-package-arg": "^8.0.0",
@@ -2617,9 +2662,9 @@
       },
       "dependencies": {
         "@angular-devkit/core": {
-          "version": "10.1.0",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.0.tgz",
-          "integrity": "sha512-oNRwAX+5uEwgheS3UUc1W+AerbimqGojCOTdWWcq5XtSviZnBCp1FeMZV+eB6XgUWfbmbWBu39S3sCYmXVHLwg==",
+          "version": "10.1.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.2.tgz",
+          "integrity": "sha512-LMxesiCuXRe3UzPdRouXsC1W73/q6rVtACVoD5GdzmmnZ7cRh7oiwonqT0lEXIKQikMsZUasUOXHD2HoKV6BoA==",
           "dev": true,
           "requires": {
             "ajv": "6.12.4",
@@ -2673,11 +2718,26 @@
             "validate-npm-package-name": "^3.0.0"
           }
         },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "semver": {
           "version": "7.3.2",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
           "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
+        },
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
         }
       }
     },
@@ -2778,9 +2838,9 @@
       "integrity": "sha512-13gmo3M2qVvjQrWNseqM3+cR6S2Ss3grbR2NZltgMq94wOwqJYQdgn8qzwDshzgXqMlSUtyPZjysImmktu22ew=="
     },
     "@types/node": {
-      "version": "14.6.4",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz",
-      "integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==",
+      "version": "14.10.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.3.tgz",
+      "integrity": "sha512-zdN0hor7TLkjAdKTnYW+Y22oIhUUpil5ZD1V1OFq0CR0CLKw+NdR6dkziTfkWRLo6sKzisayoj/GNpNbe4LY9Q==",
       "dev": true
     },
     "@types/pako": {
@@ -16978,9 +17038,9 @@
       "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
     },
     "rxjs": {
-      "version": "6.6.2",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
-      "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+      "version": "6.6.3",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
+      "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
       "requires": {
         "tslib": "^1.9.0"
       },
diff --git a/package.json b/package.json
index 54e2edbed..a99d92bd6 100644
--- a/package.json
+++ b/package.json
@@ -36,17 +36,17 @@
   },
   "private": true,
   "dependencies": {
-    "@angular/animations": "^10.1.0",
-    "@angular/cdk": "^10.2.0",
-    "@angular/common": "^10.0.12",
-    "@angular/compiler": "^10.0.12",
-    "@angular/core": "^10.1.0",
+    "@angular/animations": "^10.1.2",
+    "@angular/cdk": "^10.2.1",
+    "@angular/common": "^10.1.2",
+    "@angular/compiler": "^10.1.2",
+    "@angular/core": "^10.1.2",
     "@angular/flex-layout": "^10.0.0-beta.32",
-    "@angular/forms": "^10.1.0",
-    "@angular/material": "^10.2.0",
-    "@angular/platform-browser": "^10.1.0",
-    "@angular/platform-browser-dynamic": "^10.1.0",
-    "@angular/router": "^10.1.0",
+    "@angular/forms": "^10.1.2",
+    "@angular/material": "^10.2.1",
+    "@angular/platform-browser": "^10.1.2",
+    "@angular/platform-browser-dynamic": "^10.1.2",
+    "@angular/router": "^10.1.2",
     "@types/pako": "^1.0.1",
     "@types/sprintf-js": "^1.1.2",
     "angular2-chartjs": "^0.5.1",
@@ -76,7 +76,7 @@
     "pako": "^1.0.11",
     "primeng": "^9.1.3",
     "roboto-fontface": "^0.10.0",
-    "rxjs": "^6.6.2",
+    "rxjs": "^6.6.3",
     "screenfull": "^5.0.2",
     "svg-pan-zoom": "^3.6.1",
     "tslib": "^2.0.0",
@@ -85,14 +85,14 @@
   },
   "devDependencies": {
     "@angular-devkit/build-angular": "^0.1000.8",
-    "@angular/cli": "^10.1.0",
-    "@angular/compiler-cli": "^10.0.12",
-    "@angular/language-service": "^10.1.0",
+    "@angular/cli": "^10.1.2",
+    "@angular/compiler-cli": "^10.1.2",
+    "@angular/language-service": "^10.1.2",
     "@compodoc/compodoc": "^1.1.11",
     "@types/file-saver": "^2.0.1",
     "@types/jasmine": "^3.5.14",
     "@types/jasminewd2": "^2.0.8",
-    "@types/node": "^14.6.4",
+    "@types/node": "^14.10.3",
     "codelyzer": "^6.0.0",
     "cordova": "^10.0.0",
     "electron": "^10.1.1",
-- 
GitLab


From 6fa122e12ad713dd5b1a9eb83d83992b0fbe332d Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 17 Sep 2020 16:46:12 +0200
Subject: [PATCH 92/92] Update dependencies

---
 package-lock.json | 1364 +++++++++++++++++++--------------------------
 package.json      |   14 +-
 2 files changed, 566 insertions(+), 812 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 8d855d26f..b010761ab 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,19 +11,19 @@
       "dev": true
     },
     "@angular-devkit/architect": {
-      "version": "0.1000.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.8.tgz",
-      "integrity": "sha512-2AqPbiEugtPxNz4MGhLh+imUVelhW9h1cdJs2AbxZosIxftPb5DNDQUSAwVmRGp4CtcXVrlvcDwc0f4Fw1aiIA==",
+      "version": "0.1001.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1001.2.tgz",
+      "integrity": "sha512-05o12amjZ8NNIFehKm/lFYf12xvCclC7V5tGl/9+V7g/3pQqakwAjCysgb9T+ETffhmKhMnE8XdAJZqF7YrDcw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.8",
-        "rxjs": "6.5.5"
+        "@angular-devkit/core": "10.1.2",
+        "rxjs": "6.6.2"
       },
       "dependencies": {
         "rxjs": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
-          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -38,111 +38,93 @@
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "0.1000.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1000.8.tgz",
-      "integrity": "sha512-wwDN2oadQvYPL7lDmvGsoWQjW++0ZnxWk1QVlABGhBSIs8Uxs26Hjd5YNUSsvJavBkqb1UZIOilqzb4dig5MIA==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/architect": "0.1000.8",
-        "@angular-devkit/build-optimizer": "0.1000.8",
-        "@angular-devkit/build-webpack": "0.1000.8",
-        "@angular-devkit/core": "10.0.8",
-        "@babel/core": "7.9.6",
-        "@babel/generator": "7.9.6",
-        "@babel/plugin-transform-runtime": "7.9.6",
-        "@babel/preset-env": "7.9.6",
-        "@babel/runtime": "7.9.6",
-        "@babel/template": "7.8.6",
-        "@jsdevtools/coverage-istanbul-loader": "3.0.3",
-        "@ngtools/webpack": "10.0.8",
-        "ajv": "6.12.3",
-        "autoprefixer": "9.8.0",
+      "version": "0.1001.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1001.2.tgz",
+      "integrity": "sha512-G03ORkh5j0+1rFXcMlwiIbIkrx9LpUeubqCQM+9uHmfTOtS2mLpgiY/ChECyGz6NKhy8GhUmQ9BuVkO8Mh+NAQ==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/architect": "0.1001.2",
+        "@angular-devkit/build-optimizer": "0.1001.2",
+        "@angular-devkit/build-webpack": "0.1001.2",
+        "@angular-devkit/core": "10.1.2",
+        "@babel/core": "7.11.1",
+        "@babel/generator": "7.11.0",
+        "@babel/plugin-transform-runtime": "7.11.0",
+        "@babel/preset-env": "7.11.0",
+        "@babel/runtime": "7.11.2",
+        "@babel/template": "7.10.4",
+        "@jsdevtools/coverage-istanbul-loader": "3.0.5",
+        "@ngtools/webpack": "10.1.2",
+        "autoprefixer": "9.8.6",
         "babel-loader": "8.1.0",
         "browserslist": "^4.9.1",
-        "cacache": "15.0.3",
+        "cacache": "15.0.5",
         "caniuse-lite": "^1.0.30001032",
         "circular-dependency-plugin": "5.2.0",
         "copy-webpack-plugin": "6.0.3",
         "core-js": "3.6.4",
-        "css-loader": "3.5.3",
+        "css-loader": "4.2.2",
         "cssnano": "4.1.10",
         "file-loader": "6.0.0",
         "find-cache-dir": "3.3.1",
         "glob": "7.1.6",
-        "jest-worker": "26.0.0",
+        "jest-worker": "26.3.0",
         "karma-source-map-support": "1.4.0",
-        "less-loader": "6.1.0",
-        "license-webpack-plugin": "2.2.0",
+        "less-loader": "6.2.0",
+        "license-webpack-plugin": "2.3.0",
         "loader-utils": "2.0.0",
-        "mini-css-extract-plugin": "0.9.0",
+        "mini-css-extract-plugin": "0.10.0",
         "minimatch": "3.0.4",
-        "open": "7.0.4",
-        "parse5": "4.0.0",
+        "open": "7.2.0",
+        "parse5": "6.0.1",
+        "parse5-htmlparser2-tree-adapter": "6.0.1",
         "pnp-webpack-plugin": "1.6.4",
-        "postcss": "7.0.31",
+        "postcss": "7.0.32",
         "postcss-import": "12.0.1",
         "postcss-loader": "3.0.0",
         "raw-loader": "4.0.1",
-        "regenerator-runtime": "0.13.5",
+        "regenerator-runtime": "0.13.7",
         "resolve-url-loader": "3.1.1",
         "rimraf": "3.0.2",
-        "rollup": "2.10.9",
-        "rxjs": "6.5.5",
-        "sass": "1.26.5",
-        "sass-loader": "8.0.2",
+        "rollup": "2.26.5",
+        "rxjs": "6.6.2",
+        "sass": "1.26.10",
+        "sass-loader": "10.0.1",
         "semver": "7.3.2",
         "source-map": "0.7.3",
-        "source-map-loader": "1.0.0",
+        "source-map-loader": "1.0.2",
         "source-map-support": "0.5.19",
         "speed-measure-webpack-plugin": "1.3.3",
         "style-loader": "1.2.1",
-        "stylus": "0.54.7",
+        "stylus": "0.54.8",
         "stylus-loader": "3.0.2",
-        "terser": "4.7.0",
-        "terser-webpack-plugin": "3.0.1",
+        "terser": "5.3.0",
+        "terser-webpack-plugin": "4.1.0",
         "tree-kill": "1.2.2",
-        "webpack": "4.43.0",
+        "webpack": "4.44.1",
         "webpack-dev-middleware": "3.7.2",
         "webpack-dev-server": "3.11.0",
         "webpack-merge": "4.2.2",
         "webpack-sources": "1.4.3",
         "webpack-subresource-integrity": "1.4.1",
-        "worker-plugin": "4.0.3"
+        "worker-plugin": "5.0.0"
       },
       "dependencies": {
         "@babel/runtime": {
-          "version": "7.9.6",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz",
-          "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==",
+          "version": "7.11.2",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
+          "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
           "dev": true,
           "requires": {
             "regenerator-runtime": "^0.13.4"
           }
         },
-        "ajv": {
-          "version": "6.12.3",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
-          "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
         "core-js": {
           "version": "3.6.4",
           "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
           "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==",
           "dev": true
         },
-        "fast-deep-equal": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-          "dev": true
-        },
         "glob": {
           "version": "7.1.6",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
@@ -157,10 +139,29 @@
             "path-is-absolute": "^1.0.0"
           }
         },
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        },
+        "open": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz",
+          "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0",
+            "is-wsl": "^2.1.1"
+          }
+        },
         "regenerator-runtime": {
-          "version": "0.13.5",
-          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
-          "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
+          "version": "0.13.7",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+          "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
           "dev": true
         },
         "rimraf": {
@@ -173,9 +174,9 @@
           }
         },
         "rxjs": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
-          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -188,9 +189,9 @@
           "dev": true
         },
         "terser": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz",
-          "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==",
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.0.tgz",
+          "integrity": "sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg==",
           "dev": true,
           "requires": {
             "commander": "^2.20.0",
@@ -215,40 +216,41 @@
       }
     },
     "@angular-devkit/build-optimizer": {
-      "version": "0.1000.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.8.tgz",
-      "integrity": "sha512-esODHuTGEEMx1SmLUq03VAMly8gZUd1vRuvZeKS5HqKwDg8ZzcI7/25BuuUSlyST+6BEdjo2gnmagQnG0VBdQw==",
+      "version": "0.1001.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1001.2.tgz",
+      "integrity": "sha512-aykCI0cP6wEW/6GsV0Rs59doN0n5ztsM2+qFrZMSHyggaNzllVafYbQwVvA7t503QpOsmT5E+kve/S/4dMgmFg==",
       "dev": true,
       "requires": {
         "loader-utils": "2.0.0",
         "source-map": "0.7.3",
-        "tslib": "2.0.0",
+        "tslib": "2.0.1",
+        "typescript": "4.0.2",
         "webpack-sources": "1.4.3"
       },
       "dependencies": {
-        "tslib": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz",
-          "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==",
+        "typescript": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz",
+          "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==",
           "dev": true
         }
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.1000.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1000.8.tgz",
-      "integrity": "sha512-y/U+dV5N8W7KECncGSKQWoUH/DFNZCseczyl6LAd8bc0fMr8Z0TAIe8OXj+5CSRRdejWfRIxGtNWM+L2kTCU8A==",
+      "version": "0.1001.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1001.2.tgz",
+      "integrity": "sha512-+rdxyZOnTou8yAVU8nU49D0PVuIXGQY+V08KukeZsoszJGlwvqfGq1CMJLFlsq3goszTIDCetgmMYvtbaYVrxw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.1000.8",
-        "@angular-devkit/core": "10.0.8",
-        "rxjs": "6.5.5"
+        "@angular-devkit/architect": "0.1001.2",
+        "@angular-devkit/core": "10.1.2",
+        "rxjs": "6.6.2"
       },
       "dependencies": {
         "rxjs": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
-          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -263,22 +265,22 @@
       }
     },
     "@angular-devkit/core": {
-      "version": "10.0.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz",
-      "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.2.tgz",
+      "integrity": "sha512-LMxesiCuXRe3UzPdRouXsC1W73/q6rVtACVoD5GdzmmnZ7cRh7oiwonqT0lEXIKQikMsZUasUOXHD2HoKV6BoA==",
       "dev": true,
       "requires": {
-        "ajv": "6.12.3",
+        "ajv": "6.12.4",
         "fast-json-stable-stringify": "2.1.0",
         "magic-string": "0.25.7",
-        "rxjs": "6.5.5",
+        "rxjs": "6.6.2",
         "source-map": "0.7.3"
       },
       "dependencies": {
         "ajv": {
-          "version": "6.12.3",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
-          "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
           "dev": true,
           "requires": {
             "fast-deep-equal": "^3.1.1",
@@ -300,9 +302,9 @@
           "dev": true
         },
         "rxjs": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
-          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -917,29 +919,35 @@
       }
     },
     "@babel/core": {
-      "version": "7.9.6",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz",
-      "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.8.3",
-        "@babel/generator": "^7.9.6",
-        "@babel/helper-module-transforms": "^7.9.0",
-        "@babel/helpers": "^7.9.6",
-        "@babel/parser": "^7.9.6",
-        "@babel/template": "^7.8.6",
-        "@babel/traverse": "^7.9.6",
-        "@babel/types": "^7.9.6",
+      "version": "7.11.1",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz",
+      "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.11.0",
+        "@babel/helper-module-transforms": "^7.11.0",
+        "@babel/helpers": "^7.10.4",
+        "@babel/parser": "^7.11.1",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.11.0",
+        "@babel/types": "^7.11.0",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.1",
         "json5": "^2.1.2",
-        "lodash": "^4.17.13",
+        "lodash": "^4.17.19",
         "resolve": "^1.3.2",
         "semver": "^5.4.1",
         "source-map": "^0.5.0"
       },
       "dependencies": {
+        "@babel/parser": {
+          "version": "7.11.5",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz",
+          "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==",
+          "dev": true
+        },
         "convert-source-map": {
           "version": "1.7.0",
           "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
@@ -973,14 +981,13 @@
       }
     },
     "@babel/generator": {
-      "version": "7.9.6",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz",
-      "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz",
+      "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.9.6",
+        "@babel/types": "^7.11.0",
         "jsesc": "^2.5.1",
-        "lodash": "^4.17.13",
         "source-map": "^0.5.0"
       },
       "dependencies": {
@@ -1024,6 +1031,20 @@
         "semver": "^5.5.0"
       }
     },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz",
+      "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-member-expression-to-functions": "^7.10.5",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.10.4"
+      }
+    },
     "@babel/helper-create-regexp-features-plugin": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz",
@@ -1143,19 +1164,6 @@
         "@babel/template": "^7.10.4",
         "@babel/types": "^7.11.0",
         "lodash": "^4.17.19"
-      },
-      "dependencies": {
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/helper-optimise-call-expression": {
@@ -1192,19 +1200,6 @@
         "@babel/helper-wrap-function": "^7.10.4",
         "@babel/template": "^7.10.4",
         "@babel/types": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/helper-replace-supers": {
@@ -1227,19 +1222,6 @@
       "requires": {
         "@babel/template": "^7.10.4",
         "@babel/types": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/helper-skip-transparent-expression-wrappers": {
@@ -1275,19 +1257,6 @@
         "@babel/template": "^7.10.4",
         "@babel/traverse": "^7.10.4",
         "@babel/types": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/helpers": {
@@ -1299,19 +1268,6 @@
         "@babel/template": "^7.10.4",
         "@babel/traverse": "^7.10.4",
         "@babel/types": "^7.10.4"
-      },
-      "dependencies": {
-        "@babel/template": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.10.4",
-            "@babel/parser": "^7.10.4",
-            "@babel/types": "^7.10.4"
-          }
-        }
       }
     },
     "@babel/parser": {
@@ -1330,6 +1286,16 @@
         "@babel/plugin-syntax-async-generators": "^7.8.0"
       }
     },
+    "@babel/plugin-proposal-class-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz",
+      "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
     "@babel/plugin-proposal-dynamic-import": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
@@ -1340,6 +1306,16 @@
         "@babel/plugin-syntax-dynamic-import": "^7.8.0"
       }
     },
+    "@babel/plugin-proposal-export-namespace-from": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz",
+      "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      }
+    },
     "@babel/plugin-proposal-json-strings": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
@@ -1350,6 +1326,16 @@
         "@babel/plugin-syntax-json-strings": "^7.8.0"
       }
     },
+    "@babel/plugin-proposal-logical-assignment-operators": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz",
+      "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      }
+    },
     "@babel/plugin-proposal-nullish-coalescing-operator": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
@@ -1402,6 +1388,16 @@
         "@babel/plugin-syntax-optional-chaining": "^7.8.0"
       }
     },
+    "@babel/plugin-proposal-private-methods": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz",
+      "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
     "@babel/plugin-proposal-unicode-property-regex": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz",
@@ -1421,6 +1417,15 @@
         "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
+    "@babel/plugin-syntax-class-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz",
+      "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
     "@babel/plugin-syntax-dynamic-import": {
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
@@ -1430,6 +1435,15 @@
         "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
+    "@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      }
+    },
     "@babel/plugin-syntax-json-strings": {
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
@@ -1439,6 +1453,15 @@
         "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
+    "@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
     "@babel/plugin-syntax-nullish-coalescing-operator": {
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
@@ -1742,13 +1765,13 @@
       }
     },
     "@babel/plugin-transform-runtime": {
-      "version": "7.9.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz",
-      "integrity": "sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz",
+      "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
         "resolve": "^1.8.1",
         "semver": "^5.5.1"
       }
@@ -1801,6 +1824,15 @@
         "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
+    "@babel/plugin-transform-unicode-escapes": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz",
+      "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
     "@babel/plugin-transform-unicode-regex": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz",
@@ -1812,67 +1844,75 @@
       }
     },
     "@babel/preset-env": {
-      "version": "7.9.6",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz",
-      "integrity": "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==",
-      "dev": true,
-      "requires": {
-        "@babel/compat-data": "^7.9.6",
-        "@babel/helper-compilation-targets": "^7.9.6",
-        "@babel/helper-module-imports": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/plugin-proposal-async-generator-functions": "^7.8.3",
-        "@babel/plugin-proposal-dynamic-import": "^7.8.3",
-        "@babel/plugin-proposal-json-strings": "^7.8.3",
-        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-proposal-numeric-separator": "^7.8.3",
-        "@babel/plugin-proposal-object-rest-spread": "^7.9.6",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-proposal-optional-chaining": "^7.9.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.8.3",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz",
+      "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.11.0",
+        "@babel/helper-compilation-targets": "^7.10.4",
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-proposal-async-generator-functions": "^7.10.4",
+        "@babel/plugin-proposal-class-properties": "^7.10.4",
+        "@babel/plugin-proposal-dynamic-import": "^7.10.4",
+        "@babel/plugin-proposal-export-namespace-from": "^7.10.4",
+        "@babel/plugin-proposal-json-strings": "^7.10.4",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
+        "@babel/plugin-proposal-numeric-separator": "^7.10.4",
+        "@babel/plugin-proposal-object-rest-spread": "^7.11.0",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.10.4",
+        "@babel/plugin-proposal-optional-chaining": "^7.11.0",
+        "@babel/plugin-proposal-private-methods": "^7.10.4",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.10.4",
         "@babel/plugin-syntax-async-generators": "^7.8.0",
+        "@babel/plugin-syntax-class-properties": "^7.10.4",
         "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
         "@babel/plugin-syntax-json-strings": "^7.8.0",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
-        "@babel/plugin-syntax-numeric-separator": "^7.8.0",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
         "@babel/plugin-syntax-optional-chaining": "^7.8.0",
-        "@babel/plugin-syntax-top-level-await": "^7.8.3",
-        "@babel/plugin-transform-arrow-functions": "^7.8.3",
-        "@babel/plugin-transform-async-to-generator": "^7.8.3",
-        "@babel/plugin-transform-block-scoped-functions": "^7.8.3",
-        "@babel/plugin-transform-block-scoping": "^7.8.3",
-        "@babel/plugin-transform-classes": "^7.9.5",
-        "@babel/plugin-transform-computed-properties": "^7.8.3",
-        "@babel/plugin-transform-destructuring": "^7.9.5",
-        "@babel/plugin-transform-dotall-regex": "^7.8.3",
-        "@babel/plugin-transform-duplicate-keys": "^7.8.3",
-        "@babel/plugin-transform-exponentiation-operator": "^7.8.3",
-        "@babel/plugin-transform-for-of": "^7.9.0",
-        "@babel/plugin-transform-function-name": "^7.8.3",
-        "@babel/plugin-transform-literals": "^7.8.3",
-        "@babel/plugin-transform-member-expression-literals": "^7.8.3",
-        "@babel/plugin-transform-modules-amd": "^7.9.6",
-        "@babel/plugin-transform-modules-commonjs": "^7.9.6",
-        "@babel/plugin-transform-modules-systemjs": "^7.9.6",
-        "@babel/plugin-transform-modules-umd": "^7.9.0",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3",
-        "@babel/plugin-transform-new-target": "^7.8.3",
-        "@babel/plugin-transform-object-super": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.9.5",
-        "@babel/plugin-transform-property-literals": "^7.8.3",
-        "@babel/plugin-transform-regenerator": "^7.8.7",
-        "@babel/plugin-transform-reserved-words": "^7.8.3",
-        "@babel/plugin-transform-shorthand-properties": "^7.8.3",
-        "@babel/plugin-transform-spread": "^7.8.3",
-        "@babel/plugin-transform-sticky-regex": "^7.8.3",
-        "@babel/plugin-transform-template-literals": "^7.8.3",
-        "@babel/plugin-transform-typeof-symbol": "^7.8.4",
-        "@babel/plugin-transform-unicode-regex": "^7.8.3",
+        "@babel/plugin-syntax-top-level-await": "^7.10.4",
+        "@babel/plugin-transform-arrow-functions": "^7.10.4",
+        "@babel/plugin-transform-async-to-generator": "^7.10.4",
+        "@babel/plugin-transform-block-scoped-functions": "^7.10.4",
+        "@babel/plugin-transform-block-scoping": "^7.10.4",
+        "@babel/plugin-transform-classes": "^7.10.4",
+        "@babel/plugin-transform-computed-properties": "^7.10.4",
+        "@babel/plugin-transform-destructuring": "^7.10.4",
+        "@babel/plugin-transform-dotall-regex": "^7.10.4",
+        "@babel/plugin-transform-duplicate-keys": "^7.10.4",
+        "@babel/plugin-transform-exponentiation-operator": "^7.10.4",
+        "@babel/plugin-transform-for-of": "^7.10.4",
+        "@babel/plugin-transform-function-name": "^7.10.4",
+        "@babel/plugin-transform-literals": "^7.10.4",
+        "@babel/plugin-transform-member-expression-literals": "^7.10.4",
+        "@babel/plugin-transform-modules-amd": "^7.10.4",
+        "@babel/plugin-transform-modules-commonjs": "^7.10.4",
+        "@babel/plugin-transform-modules-systemjs": "^7.10.4",
+        "@babel/plugin-transform-modules-umd": "^7.10.4",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4",
+        "@babel/plugin-transform-new-target": "^7.10.4",
+        "@babel/plugin-transform-object-super": "^7.10.4",
+        "@babel/plugin-transform-parameters": "^7.10.4",
+        "@babel/plugin-transform-property-literals": "^7.10.4",
+        "@babel/plugin-transform-regenerator": "^7.10.4",
+        "@babel/plugin-transform-reserved-words": "^7.10.4",
+        "@babel/plugin-transform-shorthand-properties": "^7.10.4",
+        "@babel/plugin-transform-spread": "^7.11.0",
+        "@babel/plugin-transform-sticky-regex": "^7.10.4",
+        "@babel/plugin-transform-template-literals": "^7.10.4",
+        "@babel/plugin-transform-typeof-symbol": "^7.10.4",
+        "@babel/plugin-transform-unicode-escapes": "^7.10.4",
+        "@babel/plugin-transform-unicode-regex": "^7.10.4",
         "@babel/preset-modules": "^0.1.3",
-        "@babel/types": "^7.9.6",
-        "browserslist": "^4.11.1",
+        "@babel/types": "^7.11.0",
+        "browserslist": "^4.12.0",
         "core-js-compat": "^3.6.2",
         "invariant": "^2.2.2",
         "levenary": "^1.1.1",
@@ -1910,14 +1950,14 @@
       }
     },
     "@babel/template": {
-      "version": "7.8.6",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
-      "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+      "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.8.3",
-        "@babel/parser": "^7.8.6",
-        "@babel/types": "^7.8.6"
+        "@babel/code-frame": "^7.10.4",
+        "@babel/parser": "^7.10.4",
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/traverse": {
@@ -2325,9 +2365,9 @@
       },
       "dependencies": {
         "ajv": {
-          "version": "6.12.4",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
-          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "version": "6.12.5",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz",
+          "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==",
           "dev": true,
           "requires": {
             "fast-deep-equal": "^3.1.1",
@@ -2418,16 +2458,16 @@
       "dev": true
     },
     "@jsdevtools/coverage-istanbul-loader": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz",
-      "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz",
+      "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==",
       "dev": true,
       "requires": {
         "convert-source-map": "^1.7.0",
-        "istanbul-lib-instrument": "^4.0.1",
-        "loader-utils": "^1.4.0",
+        "istanbul-lib-instrument": "^4.0.3",
+        "loader-utils": "^2.0.0",
         "merge-source-map": "^1.1.0",
-        "schema-utils": "^2.6.4"
+        "schema-utils": "^2.7.0"
       },
       "dependencies": {
         "convert-source-map": {
@@ -2439,26 +2479,6 @@
             "safe-buffer": "~5.1.1"
           }
         },
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
-          }
-        },
         "merge-source-map": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
@@ -2504,32 +2524,14 @@
       }
     },
     "@ngtools/webpack": {
-      "version": "10.0.8",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.8.tgz",
-      "integrity": "sha512-Qv4v7O4VGeWuXjRThd/mdC2I4cJOgQ7kDrVN7vkDB2EW5xtRB+/4hghvFeO3bD11FLuFvCxBMb0HbwyKoVQgEQ==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.1.2.tgz",
+      "integrity": "sha512-YBzMSzVHQsDGmdsKnmvAklrwQ5bjedQu40REvYczMNpdBthw2aiOI+YKSvRVfSKxMmnLWVL0aYYrqE5IhaMnRg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.8",
-        "enhanced-resolve": "4.1.1",
-        "rxjs": "6.5.5",
+        "@angular-devkit/core": "10.1.2",
+        "enhanced-resolve": "4.3.0",
         "webpack-sources": "1.4.3"
-      },
-      "dependencies": {
-        "rxjs": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
-          "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
-          "dev": true,
-          "requires": {
-            "tslib": "^1.9.0"
-          }
-        },
-        "tslib": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
-          "dev": true
-        }
       }
     },
     "@nodelib/fs.scandir": {
@@ -3109,9 +3111,9 @@
       }
     },
     "abab": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz",
-      "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
+      "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
       "dev": true
     },
     "abbrev": {
@@ -3454,27 +3456,27 @@
       "dev": true
     },
     "app-builder-bin": {
-      "version": "3.5.9",
-      "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.9.tgz",
-      "integrity": "sha512-NSjtqZ3x2kYiDp3Qezsgukx/AUzKPr3Xgf9by4cYt05ILWGAptepeeu0Uv+7MO+41o6ujhLixTou8979JGg2Kg==",
+      "version": "3.5.10",
+      "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.10.tgz",
+      "integrity": "sha512-Jd+GW68lR0NeetgZDo47PdWBEPdnD+p0jEa7XaxjRC8u6Oo/wgJsfKUkORRgr2NpkD19IFKN50P6JYy04XHFLQ==",
       "dev": true
     },
     "app-builder-lib": {
-      "version": "22.8.0",
-      "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.8.0.tgz",
-      "integrity": "sha512-RGaIRjCUrqkmh6QOGsyekQPEOaVynHfmeh8JZuyUymFYUOFdzBbPamkA2nhBVBTkkgfjRHsxK7LhedFKPzvWEQ==",
+      "version": "22.8.1",
+      "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.8.1.tgz",
+      "integrity": "sha512-D/ac1+vuGIAAwEeTtXl8b+qWl7Gz/IQatFyzYl2ocag/7N8LqUjKzZFJJISQPWt6PFDPDH0oCj8/GMh63aV0yw==",
       "dev": true,
       "requires": {
         "7zip-bin": "~5.0.3",
         "@develar/schema-utils": "~2.6.5",
         "async-exit-hook": "^2.0.1",
         "bluebird-lst": "^1.0.9",
-        "builder-util": "22.8.0",
+        "builder-util": "22.8.1",
         "builder-util-runtime": "8.7.2",
         "chromium-pickle-js": "^0.2.0",
-        "debug": "^4.1.1",
+        "debug": "^4.2.0",
         "ejs": "^3.1.3",
-        "electron-publish": "22.8.0",
+        "electron-publish": "22.8.1",
         "fs-extra": "^9.0.1",
         "hosted-git-info": "^3.0.5",
         "is-ci": "^2.0.0",
@@ -3504,24 +3506,6 @@
           "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
           "dev": true
         },
-        "fs-extra": {
-          "version": "9.0.1",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
-          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^1.0.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.4",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
-          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
-          "dev": true
-        },
         "hosted-git-info": {
           "version": "3.0.5",
           "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
@@ -3531,12 +3515,6 @@
             "lru-cache": "^6.0.0"
           }
         },
-        "isbinaryfile": {
-          "version": "4.0.6",
-          "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz",
-          "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==",
-          "dev": true
-        },
         "js-yaml": {
           "version": "3.14.0",
           "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
@@ -3547,16 +3525,6 @@
             "esprima": "^4.0.0"
           }
         },
-        "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
-          }
-        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -3568,12 +3536,6 @@
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
           "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
-        },
-        "universalify": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
-          "dev": true
         }
       }
     },
@@ -3860,17 +3822,17 @@
       "dev": true
     },
     "autoprefixer": {
-      "version": "9.8.0",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz",
-      "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==",
+      "version": "9.8.6",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+      "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
       "dev": true,
       "requires": {
         "browserslist": "^4.12.0",
-        "caniuse-lite": "^1.0.30001061",
-        "chalk": "^2.4.2",
+        "caniuse-lite": "^1.0.30001109",
+        "colorette": "^1.2.1",
         "normalize-range": "^0.1.2",
         "num2fraction": "^1.2.2",
-        "postcss": "^7.0.30",
+        "postcss": "^7.0.32",
         "postcss-value-parser": "^4.1.0"
       }
     },
@@ -4595,15 +4557,15 @@
       }
     },
     "browserslist": {
-      "version": "4.14.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz",
-      "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==",
+      "version": "4.14.2",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz",
+      "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==",
       "dev": true,
       "requires": {
-        "caniuse-lite": "^1.0.30001111",
-        "electron-to-chromium": "^1.3.523",
+        "caniuse-lite": "^1.0.30001125",
+        "electron-to-chromium": "^1.3.564",
         "escalade": "^3.0.2",
-        "node-releases": "^1.1.60"
+        "node-releases": "^1.1.61"
       }
     },
     "browserstack": {
@@ -4656,19 +4618,19 @@
       "dev": true
     },
     "builder-util": {
-      "version": "22.8.0",
-      "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.8.0.tgz",
-      "integrity": "sha512-H80P1JzVy3TGpi63x81epQDK24XalL034+jAZlrPb5IhLtYmnNNdxCCAVJvg3VjSISd73Y71O+uhqCxWpqbPHw==",
+      "version": "22.8.1",
+      "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.8.1.tgz",
+      "integrity": "sha512-LZG+E1xszMdut5hL5h7RkJQ7yOsQqdhJYgn1wvOP7MmF3MoUPRNDiRodLpYiWlaqZmgYhcfaipR/Mb8F/RqK8w==",
       "dev": true,
       "requires": {
         "7zip-bin": "~5.0.3",
         "@types/debug": "^4.1.5",
         "@types/fs-extra": "^9.0.1",
-        "app-builder-bin": "3.5.9",
+        "app-builder-bin": "3.5.10",
         "bluebird-lst": "^1.0.9",
         "builder-util-runtime": "8.7.2",
         "chalk": "^4.1.0",
-        "debug": "^4.1.1",
+        "debug": "^4.2.0",
         "fs-extra": "^9.0.1",
         "is-ci": "^2.0.0",
         "js-yaml": "^3.14.0",
@@ -4721,24 +4683,6 @@
           "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
           "dev": true
         },
-        "fs-extra": {
-          "version": "9.0.1",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
-          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^1.0.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.4",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
-          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -4755,16 +4699,6 @@
             "esprima": "^4.0.0"
           }
         },
-        "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
-          }
-        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -4772,19 +4706,13 @@
           "dev": true
         },
         "supports-color": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
           }
-        },
-        "universalify": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
-          "dev": true
         }
       }
     },
@@ -4799,12 +4727,12 @@
       },
       "dependencies": {
         "debug": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
-          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
-            "ms": "2.1.2"
+            "ms": "^2.1.1"
           }
         },
         "ms": {
@@ -4840,22 +4768,22 @@
       "dev": true
     },
     "cacache": {
-      "version": "15.0.3",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz",
-      "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==",
+      "version": "15.0.5",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
+      "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
       "dev": true,
       "requires": {
+        "@npmcli/move-file": "^1.0.1",
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
         "glob": "^7.1.4",
         "infer-owner": "^1.0.4",
-        "lru-cache": "^5.1.1",
+        "lru-cache": "^6.0.0",
         "minipass": "^3.1.1",
         "minipass-collect": "^1.0.2",
         "minipass-flush": "^1.0.5",
         "minipass-pipeline": "^1.2.2",
         "mkdirp": "^1.0.3",
-        "move-file": "^2.0.0",
         "p-map": "^4.0.0",
         "promise-inflight": "^1.0.1",
         "rimraf": "^3.0.2",
@@ -4878,15 +4806,6 @@
             "path-is-absolute": "^1.0.0"
           }
         },
-        "lru-cache": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-          "dev": true,
-          "requires": {
-            "yallist": "^3.0.2"
-          }
-        },
         "mkdirp": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -4901,12 +4820,6 @@
           "requires": {
             "glob": "^7.1.3"
           }
-        },
-        "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-          "dev": true
         }
       }
     },
@@ -5035,9 +4948,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001124",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001124.tgz",
-      "integrity": "sha512-zQW8V3CdND7GHRH6rxm6s59Ww4g/qGWTheoboW9nfeMg7sUoopIfKCcNZUjwYRCOrvereh3kwDpZj4VLQ7zGtA==",
+      "version": "1.0.30001131",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001131.tgz",
+      "integrity": "sha512-4QYi6Mal4MMfQMSqGIRPGbKIbZygeN83QsWq1ixpUwvtfgAZot5BrCKzGygvZaV+CnELdTwD0S4cqUNozq7/Cw==",
       "dev": true
     },
     "canonical-path": {
@@ -5438,17 +5351,6 @@
       "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
       "dev": true
     },
-    "clone-deep": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
-      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
-      "dev": true,
-      "requires": {
-        "is-plain-object": "^2.0.4",
-        "kind-of": "^6.0.2",
-        "shallow-clone": "^3.0.0"
-      }
-    },
     "clone-response": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
@@ -5614,6 +5516,12 @@
       "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
       "dev": true
     },
+    "colorette": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+      "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+      "dev": true
+    },
     "colors": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
@@ -5934,31 +5842,6 @@
             "fill-range": "^7.0.1"
           }
         },
-        "cacache": {
-          "version": "15.0.5",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
-          "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
-          "dev": true,
-          "requires": {
-            "@npmcli/move-file": "^1.0.1",
-            "chownr": "^2.0.0",
-            "fs-minipass": "^2.0.0",
-            "glob": "^7.1.4",
-            "infer-owner": "^1.0.4",
-            "lru-cache": "^6.0.0",
-            "minipass": "^3.1.1",
-            "minipass-collect": "^1.0.2",
-            "minipass-flush": "^1.0.5",
-            "minipass-pipeline": "^1.2.2",
-            "mkdirp": "^1.0.3",
-            "p-map": "^4.0.0",
-            "promise-inflight": "^1.0.1",
-            "rimraf": "^3.0.2",
-            "ssri": "^8.0.0",
-            "tar": "^6.0.2",
-            "unique-filename": "^1.1.1"
-          }
-        },
         "fast-glob": {
           "version": "3.2.4",
           "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
@@ -5982,20 +5865,6 @@
             "to-regex-range": "^5.0.1"
           }
         },
-        "glob": {
-          "version": "7.1.6",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
         "glob-parent": {
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
@@ -6036,12 +5905,6 @@
             "picomatch": "^2.0.5"
           }
         },
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        },
         "normalize-path": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -6063,15 +5926,6 @@
           "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
           "dev": true
         },
-        "rimraf": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
         "to-regex-range": {
           "version": "5.0.1",
           "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -6820,9 +6674,9 @@
       "integrity": "sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA=="
     },
     "cordova-plugin-file-opener2": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/cordova-plugin-file-opener2/-/cordova-plugin-file-opener2-3.0.4.tgz",
-      "integrity": "sha512-bd1aCx62X2RwpC+KUiuB7quoxL/8RnPMEJU7x38Tvs+cUGLWBvsmR9+/LqGBsSns2CIqgnJ34TW0Vazoqu7Ieg=="
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/cordova-plugin-file-opener2/-/cordova-plugin-file-opener2-3.0.5.tgz",
+      "integrity": "sha512-tjLHDamH5+y0bJZYVe2967L1S4R8tL4Y0rJUzJGoxsyiw3FUlrJNS199POOpzZZ6Xhlntn9a2o7+84r1dMN21A=="
     },
     "cordova-plugin-local-notification": {
       "version": "0.9.0-beta.2",
@@ -7105,56 +6959,35 @@
       }
     },
     "css-loader": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.3.tgz",
-      "integrity": "sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==",
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.2.2.tgz",
+      "integrity": "sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg==",
       "dev": true,
       "requires": {
-        "camelcase": "^5.3.1",
+        "camelcase": "^6.0.0",
         "cssesc": "^3.0.0",
         "icss-utils": "^4.1.1",
-        "loader-utils": "^1.2.3",
-        "normalize-path": "^3.0.0",
-        "postcss": "^7.0.27",
+        "loader-utils": "^2.0.0",
+        "postcss": "^7.0.32",
         "postcss-modules-extract-imports": "^2.0.0",
-        "postcss-modules-local-by-default": "^3.0.2",
+        "postcss-modules-local-by-default": "^3.0.3",
         "postcss-modules-scope": "^2.2.0",
         "postcss-modules-values": "^3.0.0",
-        "postcss-value-parser": "^4.0.3",
-        "schema-utils": "^2.6.6",
-        "semver": "^6.3.0"
+        "postcss-value-parser": "^4.1.0",
+        "schema-utils": "^2.7.0",
+        "semver": "^7.3.2"
       },
       "dependencies": {
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
-          }
-        },
-        "normalize-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+        "camelcase": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz",
+          "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==",
           "dev": true
         },
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
         }
       }
@@ -8040,13 +7873,13 @@
       }
     },
     "dmg-builder": {
-      "version": "22.8.0",
-      "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.8.0.tgz",
-      "integrity": "sha512-orePWjcrl97SYLA8F/6UUtbXJSoZCYu5KOP1lVqD4LOomr8bjGDyEVYZmZYcg5WqKmXucdmO6OpqgzH/aRMMuA==",
+      "version": "22.8.1",
+      "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.8.1.tgz",
+      "integrity": "sha512-WeGom1moM00gBII6swljl4DQGrlJuEivoUhOmh8U9p1ALgeJL+EiTHbZFERlj8Ejy62xUUjURV+liOxUKmJFWg==",
       "dev": true,
       "requires": {
-        "app-builder-lib": "22.8.0",
-        "builder-util": "22.8.0",
+        "app-builder-lib": "22.8.1",
+        "builder-util": "22.8.1",
         "fs-extra": "^9.0.1",
         "iconv-lite": "^0.6.2",
         "js-yaml": "^3.14.0",
@@ -8077,20 +7910,6 @@
             "argparse": "^1.0.7",
             "esprima": "^4.0.0"
           }
-        },
-        "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
-          }
-        },
-        "universalify": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug=="
         }
       }
     },
@@ -8264,9 +8083,9 @@
       }
     },
     "electron": {
-      "version": "10.1.1",
-      "resolved": "https://registry.npmjs.org/electron/-/electron-10.1.1.tgz",
-      "integrity": "sha512-ZJtZHMr17AvvBosuA6XUmpehwAlGM4/n46Mw9BcyD8tpgdI6IQd0X5OU9meE3X3M8Y6Ja2Kr2udTMgtjvot2hA==",
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/electron/-/electron-10.1.2.tgz",
+      "integrity": "sha512-SvN8DcKCmPZ0UcQSNAJBfaUu+LGACqtRhUn1rW0UBLHgdbbDM76L0GU5/XGQEllH5pu5bwlCZwax3srzIl+Aeg==",
       "dev": true,
       "requires": {
         "@electron/get": "^1.0.1",
@@ -8275,33 +8094,33 @@
       },
       "dependencies": {
         "@types/node": {
-          "version": "12.12.55",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.55.tgz",
-          "integrity": "sha512-Vd6xQUVvPCTm7Nx1N7XHcpX6t047ltm7TgcsOr4gFHjeYgwZevo+V7I1lfzHnj5BT5frztZ42+RTG4MwYw63dw==",
+          "version": "12.12.61",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.61.tgz",
+          "integrity": "sha512-+/KPk6uV9qGfVX0y2uUj3y8O0Z6KZWUy3XTS0uQGYYF+iXGtepm9GPETdcRq+hGmErkLOr5QJDX8vuymkwu4sA==",
           "dev": true
         }
       }
     },
     "electron-builder": {
-      "version": "22.8.0",
-      "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.8.0.tgz",
-      "integrity": "sha512-dUv4F3srJouqxhWivtKqSoQP4Df6vYgjooGdzms+iYMTFi9f0b4LlEbr7kgsPvte8zAglee7VOGOODkCRJDkUQ==",
+      "version": "22.8.1",
+      "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.8.1.tgz",
+      "integrity": "sha512-Hs7KTMq1rGSvT0fwGKXrjbLiJkK6sAKDQooUSwklOkktUgWi4ATjlP0fVE3l8SmS7zcLoww2yDZonSDqxEFhaQ==",
       "dev": true,
       "requires": {
         "@types/yargs": "^15.0.5",
-        "app-builder-lib": "22.8.0",
+        "app-builder-lib": "22.8.1",
         "bluebird-lst": "^1.0.9",
-        "builder-util": "22.8.0",
+        "builder-util": "22.8.1",
         "builder-util-runtime": "8.7.2",
         "chalk": "^4.1.0",
-        "dmg-builder": "22.8.0",
+        "dmg-builder": "22.8.1",
         "fs-extra": "^9.0.1",
         "is-ci": "^2.0.0",
         "lazy-val": "^1.0.4",
         "read-config-file": "6.0.0",
         "sanitize-filename": "^1.6.3",
         "update-notifier": "^4.1.0",
-        "yargs": "^15.3.1"
+        "yargs": "^15.4.1"
       },
       "dependencies": {
         "ansi-styles": {
@@ -8340,9 +8159,9 @@
           "dev": true
         },
         "supports-color": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
@@ -8351,14 +8170,14 @@
       }
     },
     "electron-publish": {
-      "version": "22.8.0",
-      "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.8.0.tgz",
-      "integrity": "sha512-uM0Zdi9hUqqGOrPj478v7toTvV1Kgto1w11rIiI168batiXAJvNLD8VZRfehOrZT0ibUyZlw8FtxoGCrjyHUOw==",
+      "version": "22.8.1",
+      "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.8.1.tgz",
+      "integrity": "sha512-zqI66vl7j1CJZJ60J+1ez1tQNQeuqVspW44JvYDa5kZbM5wSFDAJFMK9RWHOqRF1Ezd4LDeiBa4aeTOwOt9syA==",
       "dev": true,
       "requires": {
         "@types/fs-extra": "^9.0.1",
         "bluebird-lst": "^1.0.9",
-        "builder-util": "22.8.0",
+        "builder-util": "22.8.1",
         "builder-util-runtime": "8.7.2",
         "chalk": "^4.1.0",
         "fs-extra": "^9.0.1",
@@ -8395,40 +8214,12 @@
             "color-name": "~1.1.4"
           }
         },
-        "fs-extra": {
-          "version": "9.0.1",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
-          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^1.0.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.4",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
-          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
-          }
-        },
         "mime": {
           "version": "2.4.6",
           "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
@@ -8436,26 +8227,20 @@
           "dev": true
         },
         "supports-color": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
           }
-        },
-        "universalify": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
-          "dev": true
         }
       }
     },
     "electron-to-chromium": {
-      "version": "1.3.562",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.562.tgz",
-      "integrity": "sha512-WhRe6liQ2q/w1MZc8mD8INkenHivuHdrr4r5EQHNomy3NJux+incP6M6lDMd0paShP3MD0WGe5R1TWmEClf+Bg==",
+      "version": "1.3.570",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz",
+      "integrity": "sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg==",
       "dev": true
     },
     "elementtree": {
@@ -8659,9 +8444,9 @@
       }
     },
     "enhanced-resolve": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
-      "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
+      "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
       "dev": true,
       "requires": {
         "graceful-fs": "^4.1.2",
@@ -8857,9 +8642,9 @@
       }
     },
     "escalade": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz",
-      "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz",
+      "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==",
       "dev": true
     },
     "escape-goat": {
@@ -10795,7 +10580,8 @@
     "graceful-fs": {
       "version": "4.1.15",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
-      "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
+      "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+      "dev": true
     },
     "graphlib": {
       "version": "2.1.8",
@@ -12157,11 +11943,12 @@
       "dev": true
     },
     "jest-worker": {
-      "version": "26.0.0",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz",
-      "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==",
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz",
+      "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==",
       "dev": true,
       "requires": {
+        "@types/node": "*",
         "merge-stream": "^2.0.0",
         "supports-color": "^7.0.0"
       },
@@ -12308,9 +12095,9 @@
       }
     },
     "karma": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.1.tgz",
-      "integrity": "sha512-+/AO2fWL7kC3aWTx/lHjtKXfOqh0O+KLtTy4BLQ/b/eciHR4VTHHdPhdrn9sDBQskgDieaBZ+sAKzlldc4GW/Q==",
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.2.tgz",
+      "integrity": "sha512-rB3Ua5yDxmIupTj67r3Q8itz7TxJzRE6DmVcOfV20D509Uu9AoBKlVwbZhND4kcm6BqLfbHtv4DZC9QJfrUY+w==",
       "dev": true,
       "requires": {
         "body-parser": "^1.19.0",
@@ -12332,7 +12119,7 @@
         "range-parser": "^1.2.1",
         "rimraf": "^3.0.2",
         "socket.io": "^2.3.0",
-        "source-map": "^0.7.3",
+        "source-map": "^0.6.1",
         "tmp": "0.2.1",
         "ua-parser-js": "0.7.21",
         "yargs": "^15.3.1"
@@ -12504,6 +12291,12 @@
             "glob": "^7.1.3"
           }
         },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
         "tmp": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
@@ -12624,6 +12417,12 @@
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true
     },
+    "klona": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
+      "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
+      "dev": true
+    },
     "latest-version": {
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
@@ -12696,15 +12495,15 @@
       }
     },
     "less-loader": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.1.0.tgz",
-      "integrity": "sha512-/jLzOwLyqJ7Kt3xg5sHHkXtOyShWwFj410K9Si9WO+/h8rmYxxkSR0A3/hFEntWudE20zZnWMtpMYnLzqTVdUA==",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.2.0.tgz",
+      "integrity": "sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg==",
       "dev": true,
       "requires": {
         "clone": "^2.1.2",
-        "less": "^3.11.1",
+        "less": "^3.11.3",
         "loader-utils": "^2.0.0",
-        "schema-utils": "^2.6.6"
+        "schema-utils": "^2.7.0"
       }
     },
     "leven": {
@@ -12733,9 +12532,9 @@
       }
     },
     "license-webpack-plugin": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.2.0.tgz",
-      "integrity": "sha512-XPsdL/0brSHf+7dXIlRqotnCQ58RX2au6otkOg4U3dm8uH+Ka/fW4iukEs95uXm+qKe/SBs+s1Ll/aQddKG+tg==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.0.tgz",
+      "integrity": "sha512-JK/DXrtN6UeYQSgkg5q1+pgJ8aiKPL9tnz9Wzw+Ikkf+8mJxG56x6t8O+OH/tAeF/5NREnelTEMyFtbJNkjH4w==",
       "dev": true,
       "requires": {
         "@types/webpack-sources": "^0.1.5",
@@ -13295,9 +13094,9 @@
       "integrity": "sha1-mnHEh0chjrylHlGmbaaCA4zct78="
     },
     "mathjax": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.1.0.tgz",
-      "integrity": "sha512-W71QY6DBDAhKhsIRbqzB38VV6Mk1IVAx23IjNc00oAPa4jyoeDQOwMIBPnG5ATqOAYevrBrwaNbycERGoYBBhA=="
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.1.2.tgz",
+      "integrity": "sha512-BojKspBv4nNWzO1wC6VEI+g9gHDOhkaGHGgLxXkasdU4pwjdO5AXD5M/wcLPkXYPjZ/N+6sU8rjQTlyvN2cWiQ=="
     },
     "md5-file": {
       "version": "5.0.0",
@@ -13469,9 +13268,9 @@
       "dev": true
     },
     "mini-css-extract-plugin": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz",
-      "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==",
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz",
+      "integrity": "sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A==",
       "dev": true,
       "requires": {
         "loader-utils": "^1.1.0",
@@ -13724,23 +13523,6 @@
         "run-queue": "^1.0.3"
       }
     },
-    "move-file": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz",
-      "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==",
-      "dev": true,
-      "requires": {
-        "path-exists": "^4.0.0"
-      },
-      "dependencies": {
-        "path-exists": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
-        }
-      }
-    },
     "ms": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -13962,9 +13744,9 @@
       }
     },
     "node-releases": {
-      "version": "1.1.60",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz",
-      "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==",
+      "version": "1.1.61",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz",
+      "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==",
       "dev": true
     },
     "nopt": {
@@ -14847,11 +14629,20 @@
       "dev": true
     },
     "parse5": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
-      "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
       "dev": true
     },
+    "parse5-htmlparser2-tree-adapter": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+      "dev": true,
+      "requires": {
+        "parse5": "^6.0.1"
+      }
+    },
     "parseqs": {
       "version": "0.0.5",
       "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
@@ -15156,9 +14947,9 @@
       "dev": true
     },
     "postcss": {
-      "version": "7.0.31",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.31.tgz",
-      "integrity": "sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==",
+      "version": "7.0.32",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+      "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.2",
@@ -15486,25 +15277,6 @@
         "postcss": "^7.0.32",
         "postcss-selector-parser": "^6.0.2",
         "postcss-value-parser": "^4.1.0"
-      },
-      "dependencies": {
-        "postcss": {
-          "version": "7.0.32",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
-          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
-          "dev": true,
-          "requires": {
-            "chalk": "^2.4.2",
-            "source-map": "^0.6.1",
-            "supports-color": "^6.1.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
       }
     },
     "postcss-modules-scope": {
@@ -16963,13 +16735,13 @@
       }
     },
     "roarr": {
-      "version": "2.15.3",
-      "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz",
-      "integrity": "sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA==",
+      "version": "2.15.4",
+      "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
+      "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
       "dev": true,
       "optional": true,
       "requires": {
-        "boolean": "^3.0.0",
+        "boolean": "^3.0.1",
         "detect-node": "^2.0.4",
         "globalthis": "^1.0.1",
         "json-stringify-safe": "^5.0.1",
@@ -16992,9 +16764,9 @@
       "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g=="
     },
     "rollup": {
-      "version": "2.10.9",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.10.9.tgz",
-      "integrity": "sha512-dY/EbjiWC17ZCUSyk14hkxATAMAShkMsD43XmZGWjLrgFj15M3Dw2kEkA9ns64BiLFm9PKN6vTQw8neHwK74eg==",
+      "version": "2.26.5",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.5.tgz",
+      "integrity": "sha512-rCyFG3ZtQdnn9YwfuAVH0l/Om34BdO5lwCA0W6Hq+bNB21dVEBbCRxhaHOmu1G7OBFDWytbzAC104u7rxHwGjA==",
       "dev": true,
       "requires": {
         "fsevents": "~2.1.2"
@@ -17082,47 +16854,27 @@
       }
     },
     "sass": {
-      "version": "1.26.5",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz",
-      "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==",
+      "version": "1.26.10",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz",
+      "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==",
       "dev": true,
       "requires": {
         "chokidar": ">=2.0.0 <4.0.0"
       }
     },
     "sass-loader": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
-      "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.1.tgz",
+      "integrity": "sha512-b2PSldKVTS3JcFPHSrEXh3BeAfR7XknGiGCAO5aHruR3Pf3kqLP3Gb2ypXLglRrAzgZkloNxLZ7GXEGDX0hBUQ==",
       "dev": true,
       "requires": {
-        "clone-deep": "^4.0.1",
-        "loader-utils": "^1.2.3",
-        "neo-async": "^2.6.1",
-        "schema-utils": "^2.6.1",
-        "semver": "^6.3.0"
+        "klona": "^2.0.3",
+        "loader-utils": "^2.0.0",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^2.7.0",
+        "semver": "^7.3.2"
       },
       "dependencies": {
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
-          }
-        },
         "neo-async": {
           "version": "2.6.2",
           "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
@@ -17130,9 +16882,9 @@
           "dev": true
         },
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
         }
       }
@@ -17164,9 +16916,9 @@
       },
       "dependencies": {
         "ajv": {
-          "version": "6.12.4",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
-          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "version": "6.12.5",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz",
+          "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==",
           "dev": true,
           "requires": {
             "fast-deep-equal": "^3.1.1",
@@ -17468,15 +17220,6 @@
         "safe-buffer": "^5.0.1"
       }
     },
-    "shallow-clone": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
-      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      }
-    },
     "shallow-copy": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
@@ -17882,25 +17625,25 @@
       "dev": true
     },
     "source-map-loader": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.0.tgz",
-      "integrity": "sha512-ZayyQCSCrQazN50aCvuS84lJT4xc1ZAcykH5blHaBdVveSwjiFK8UGMPvao0ho54DTb0Jf7m57uRRG/YYUZ2Fg==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.2.tgz",
+      "integrity": "sha512-oX8d6ndRjN+tVyjj6PlXSyFPhDdVAPsZA30nD3/II8g4uOv8fCz0DMn5sy8KtVbDfKQxOpGwGJnK3xIW3tauDw==",
       "dev": true,
       "requires": {
         "data-urls": "^2.0.0",
-        "iconv-lite": "^0.5.1",
+        "iconv-lite": "^0.6.2",
         "loader-utils": "^2.0.0",
-        "schema-utils": "^2.6.6",
-        "source-map": "^0.6.0"
+        "schema-utils": "^2.7.0",
+        "source-map": "^0.6.1"
       },
       "dependencies": {
         "iconv-lite": {
-          "version": "0.5.2",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz",
-          "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==",
+          "version": "0.6.2",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
+          "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
           "dev": true,
           "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
           }
         },
         "source-map": {
@@ -18484,18 +18227,18 @@
       "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q=="
     },
     "stylus": {
-      "version": "0.54.7",
-      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz",
-      "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==",
+      "version": "0.54.8",
+      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz",
+      "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==",
       "dev": true,
       "requires": {
         "css-parse": "~2.0.0",
         "debug": "~3.1.0",
-        "glob": "^7.1.3",
-        "mkdirp": "~0.5.x",
+        "glob": "^7.1.6",
+        "mkdirp": "~1.0.4",
         "safer-buffer": "^2.1.2",
         "sax": "~1.2.4",
-        "semver": "^6.0.0",
+        "semver": "^6.3.0",
         "source-map": "^0.7.3"
       },
       "dependencies": {
@@ -18508,6 +18251,26 @@
             "ms": "2.0.0"
           }
         },
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -18745,40 +18508,31 @@
       }
     },
     "terser-webpack-plugin": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz",
-      "integrity": "sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.1.0.tgz",
+      "integrity": "sha512-0ZWDPIP8BtEDZdChbufcXUigOYk6dOX/P/X0hWxqDDcVAQLb8Yy/0FAaemSfax3PAA67+DJR778oz8qVbmy4hA==",
       "dev": true,
       "requires": {
-        "cacache": "^15.0.3",
+        "cacache": "^15.0.5",
         "find-cache-dir": "^3.3.1",
-        "jest-worker": "^26.0.0",
-        "p-limit": "^2.3.0",
+        "jest-worker": "^26.3.0",
+        "p-limit": "^3.0.2",
         "schema-utils": "^2.6.6",
-        "serialize-javascript": "^3.0.0",
+        "serialize-javascript": "^4.0.0",
         "source-map": "^0.6.1",
-        "terser": "^4.6.13",
+        "terser": "^5.0.0",
         "webpack-sources": "^1.4.3"
       },
       "dependencies": {
         "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+          "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
           "dev": true,
           "requires": {
             "p-try": "^2.0.0"
           }
         },
-        "serialize-javascript": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
-          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
-          "dev": true,
-          "requires": {
-            "randombytes": "^2.1.0"
-          }
-        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -18786,9 +18540,9 @@
           "dev": true
         },
         "terser": {
-          "version": "4.8.0",
-          "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
-          "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.1.tgz",
+          "integrity": "sha512-yD80f4hdwCWTH5mojzxe1q8bN1oJbsK/vfJGLcPZM/fl+/jItIVNKhFIHqqR71OipFWMLgj3Kc+GIp6CeIqfnA==",
           "dev": true,
           "requires": {
             "commander": "^2.20.0",
@@ -20150,9 +19904,9 @@
       "dev": true
     },
     "webpack": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz",
-      "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==",
+      "version": "4.44.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz",
+      "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==",
       "dev": true,
       "requires": {
         "@webassemblyjs/ast": "1.9.0",
@@ -20163,7 +19917,7 @@
         "ajv": "^6.10.2",
         "ajv-keywords": "^3.4.1",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^4.1.0",
+        "enhanced-resolve": "^4.3.0",
         "eslint-scope": "^4.0.3",
         "json-parse-better-errors": "^1.0.2",
         "loader-runner": "^2.4.0",
@@ -20176,14 +19930,14 @@
         "schema-utils": "^1.0.0",
         "tapable": "^1.1.3",
         "terser-webpack-plugin": "^1.4.3",
-        "watchpack": "^1.6.1",
+        "watchpack": "^1.7.4",
         "webpack-sources": "^1.4.1"
       },
       "dependencies": {
         "ajv": {
-          "version": "6.12.4",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
-          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "version": "6.12.5",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz",
+          "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==",
           "dev": true,
           "requires": {
             "fast-deep-equal": "^3.1.1",
@@ -20728,9 +20482,9 @@
       "dev": true
     },
     "whatwg-url": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.1.tgz",
-      "integrity": "sha512-ZmVCr6nfBeaMxEHALLEGy0LszYjpJqf6PVNQUQ1qd9Et+q7Jpygd4rGGDXgHjD8e99yLFseD69msHDM4YwPZ4A==",
+      "version": "8.2.2",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.2.tgz",
+      "integrity": "sha512-PcVnO6NiewhkmzV0qn7A+UZ9Xx4maNTI+O+TShmfE4pqjoCMwUMjkvoNhNHPTvgR7QH9Xt3R13iHuWy2sToFxQ==",
       "dev": true,
       "requires": {
         "lodash.sortby": "^4.7.0",
@@ -20866,9 +20620,9 @@
       }
     },
     "worker-plugin": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.3.tgz",
-      "integrity": "sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz",
+      "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==",
       "dev": true,
       "requires": {
         "loader-utils": "^1.1.0"
@@ -20981,9 +20735,9 @@
       "dev": true
     },
     "xlsx": {
-      "version": "0.16.6",
-      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.6.tgz",
-      "integrity": "sha512-iAPNt15C2umCx7Q6h9owZvNHRYVOImLp7Mc00uA4UhJvzjfM1OV3V7TgBXIHuawGF1G6GLXZr/r75e5jsiBefg==",
+      "version": "0.16.7",
+      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.7.tgz",
+      "integrity": "sha512-Xc4NRjci2Grbh9NDk/XoaWycJurxEug1wwn0aJCmB0NvIMyQuHYq2muWLWGidYNZPf94aUbqm6K8Fbjd7gKTZg==",
       "requires": {
         "adler-32": "~1.2.0",
         "cfb": "^1.1.4",
diff --git a/package.json b/package.json
index a99d92bd6..1463b3630 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "cordova-plugin-badge": "^0.8.8",
     "cordova-plugin-device": "^2.0.3",
     "cordova-plugin-file": "^6.0.2",
-    "cordova-plugin-file-opener2": "^3.0.4",
+    "cordova-plugin-file-opener2": "^3.0.5",
     "cordova-plugin-local-notification": "^0.9.0-beta.2",
     "cordova-plugin-whitelist": "^1.3.4",
     "core-js": "^3.6.5",
@@ -66,7 +66,7 @@
     "he": "^1.2.0",
     "jalhyd": "file:../jalhyd",
     "material-design-icons": "^3.0.1",
-    "mathjax": "^3.1.0",
+    "mathjax": "^3.1.2",
     "mermaid": "^8.8.0",
     "ngx-konami": "^1.7.1",
     "ngx-markdown": "^10.1.1",
@@ -80,11 +80,11 @@
     "screenfull": "^5.0.2",
     "svg-pan-zoom": "^3.6.1",
     "tslib": "^2.0.0",
-    "xlsx": "^0.16.6",
+    "xlsx": "^0.16.7",
     "zone.js": "^0.11.1"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "^0.1000.8",
+    "@angular-devkit/build-angular": "^0.1001.2",
     "@angular/cli": "^10.1.2",
     "@angular/compiler-cli": "^10.1.2",
     "@angular/language-service": "^10.1.2",
@@ -95,12 +95,12 @@
     "@types/node": "^14.10.3",
     "codelyzer": "^6.0.0",
     "cordova": "^10.0.0",
-    "electron": "^10.1.1",
-    "electron-builder": "^22.8.0",
+    "electron": "^10.1.2",
+    "electron-builder": "^22.8.1",
     "fs-extra": "^9.0.1",
     "jasmine-core": "^3.6.0",
     "jasmine-spec-reporter": "~5.0.0",
-    "karma": "^5.2.1",
+    "karma": "^5.2.2",
     "karma-chrome-launcher": "~3.1.0",
     "karma-cli": "~2.0.0",
     "karma-coverage-istanbul-reporter": "^3.0.3",
-- 
GitLab