From a79069c17d0579bdf4ebacc5bcba50ea26943666 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:06:24 -0300
Subject: [PATCH 001/147] added model folder and user.js file

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/models/user.js | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/models/user.js

diff --git a/src/models/user.js b/src/models/user.js
new file mode 100644
index 0000000..e69de29

From da94259bbca7e416238ff7850d6658901f9e5405 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:07:16 -0300
Subject: [PATCH 002/147] add user model

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/models/user.js | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/src/models/user.js b/src/models/user.js
index e69de29..f6b07e4 100644
--- a/src/models/user.js
+++ b/src/models/user.js
@@ -0,0 +1,22 @@
+const mongoose = require('mongoose');
+
+const UserSchema = new mongoose.Schema({
+    name:{
+        type: String,
+        require: true,
+    },
+    email:{
+        type: String,
+        unique: true,
+        required: true,
+        lowercase: true,
+    },
+    password:{
+        type: String,
+        required: true,
+        select: false,
+    },
+
+});
+
+const User = mongoose.model('User', UserSchema);
\ No newline at end of file

From d405e282d12a63a33a6f0e98704e6d15d2854914 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:09:54 -0300
Subject: [PATCH 003/147] added controllers folder and loginController.js file

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/controllers/loginController.js

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
new file mode 100644
index 0000000..e69de29

From 6fe31c12ff343e51c1240b1e36abbf4a4a2351c8 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:11:55 -0300
Subject: [PATCH 004/147] add login controller

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index e69de29..04a558b 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -0,0 +1,27 @@
+const express = require('express');
+
+const User = require('../models/User');
+
+const router = express.Router();
+
+router.post('/login', async(req, res) => {
+    const {email, password} = req.body;
+
+    const user = await User.findOne({ email }).select('+password');
+
+    if(!user){
+        
+        return res.status(400).send({Error: 'User not found'});
+
+    }
+
+    if(!await password == user.password){
+        
+        return res.status(400).send({ Error: 'Incorrect password'});
+
+    }
+
+    user.password = undefined;
+
+    res.send({ user });
+});
\ No newline at end of file

From 3be36b82cd79e5697b87258427a8a92538ed57f3 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:13:03 -0300
Subject: [PATCH 005/147] added '/' route to router

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 04a558b..4dce3a0 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -24,4 +24,6 @@ router.post('/login', async(req, res) => {
     user.password = undefined;
 
     res.send({ user });
-});
\ No newline at end of file
+});
+
+module.exports = app => app.use('/', router);
\ No newline at end of file

From 3b5a87a15088247837391db1646475f4dfd64d66 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:14:36 -0300
Subject: [PATCH 006/147] login controller added to index

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/index.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/index.js b/src/index.js
index 9a870d2..5fbb366 100644
--- a/src/index.js
+++ b/src/index.js
@@ -14,6 +14,9 @@ app.use(express.json());
 // routes
 app.use(require('./routes/index.js'));
 
+//controllers
+require('./controllers/loginController')(app);
+
 // starting the server
 app.listen(app.get('port'), () => {
     console.log(`Server on port ${app.get('port')}`);

From 23b96ac1abf009010dccb01fea157e3f4310dcee Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:19:51 -0300
Subject: [PATCH 007/147] added jasonwebtoken dependency

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 package-lock.json | 94 ++++++++++++++++++++++++++++++++++++++++++++++-
 package.json      |  1 +
 2 files changed, 93 insertions(+), 2 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index dbb2a56..5584fff 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -207,6 +207,11 @@
         "fill-range": "^7.0.1"
       }
     },
+    "buffer-equal-constant-time": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+      "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+    },
     "bytes": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
@@ -390,6 +395,14 @@
       "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
       "dev": true
     },
+    "ecdsa-sig-formatter": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
     "ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -723,6 +736,49 @@
       "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
       "dev": true
     },
+    "jsonwebtoken": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+      "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+      "requires": {
+        "jws": "^3.2.2",
+        "lodash.includes": "^4.3.0",
+        "lodash.isboolean": "^3.0.3",
+        "lodash.isinteger": "^4.0.4",
+        "lodash.isnumber": "^3.0.3",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.isstring": "^4.0.1",
+        "lodash.once": "^4.0.0",
+        "ms": "^2.1.1",
+        "semver": "^5.6.0"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "jwa": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+      "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+      "requires": {
+        "buffer-equal-constant-time": "1.0.1",
+        "ecdsa-sig-formatter": "1.0.11",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "jws": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+      "requires": {
+        "jwa": "^1.4.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
     "keyv": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
@@ -741,6 +797,41 @@
         "package-json": "^6.3.0"
       }
     },
+    "lodash.includes": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+    },
+    "lodash.isboolean": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+    },
+    "lodash.isinteger": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+      "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+    },
+    "lodash.isnumber": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+      "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+    },
+    "lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+    },
+    "lodash.isstring": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+    },
+    "lodash.once": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+    },
     "lowercase-keys": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
@@ -1089,8 +1180,7 @@
     "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=="
     },
     "semver-diff": {
       "version": "3.1.1",
diff --git a/package.json b/package.json
index 1dc773e..de41151 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,7 @@
   "homepage": "https://github.com/fga-eps-mds/2020.1-Grupo2-backend#readme",
   "dependencies": {
     "express": "^4.17.1",
+    "jsonwebtoken": "^8.5.1",
     "morgan": "^1.10.0"
   },
   "devDependencies": {

From ba0c561e521e3d0c501ce9eca3a60585338aecd5 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:26:11 -0300
Subject: [PATCH 008/147] added token to login controller

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 4dce3a0..0cf4b36 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -1,5 +1,7 @@
 const express = require('express');
 
+const jasonwebtoken = require('jasonwebtoker');
+
 const User = require('../models/User');
 
 const router = express.Router();
@@ -23,6 +25,8 @@ router.post('/login', async(req, res) => {
 
     user.password = undefined;
 
+    const token = jasonwebtoken.sign({id: user.id}) 
+
     res.send({ user });
 });
 

From f0c43b50e79659b4172914e3b4d83b53dda5f44f Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:27:28 -0300
Subject: [PATCH 009/147] added config folder and auth.json file

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/config/auth,json | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/config/auth,json

diff --git a/src/config/auth,json b/src/config/auth,json
new file mode 100644
index 0000000..e69de29

From 4318bf7d94f7ca9e546468ac92cb5722248c609d Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:29:52 -0300
Subject: [PATCH 010/147] added secret (hash md5) to auth.json

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/config/auth,json | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/config/auth,json b/src/config/auth,json
index e69de29..5df31c6 100644
--- a/src/config/auth,json
+++ b/src/config/auth,json
@@ -0,0 +1,3 @@
+{
+    "secret": "d41d8cd98f00b204e9800998ecf8427e" 
+}
\ No newline at end of file

From 1523dbc63fa60360355da7a58058488ab4b1efb8 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:34:00 -0300
Subject: [PATCH 011/147] auth.json imported to login controller and expiration
 time added to token

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 0cf4b36..3154bbc 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -6,6 +6,8 @@ const User = require('../models/User');
 
 const router = express.Router();
 
+const authConfig = require('../config/auth');
+
 router.post('/login', async(req, res) => {
     const {email, password} = req.body;
 
@@ -25,7 +27,9 @@ router.post('/login', async(req, res) => {
 
     user.password = undefined;
 
-    const token = jasonwebtoken.sign({id: user.id}) 
+    const token = jasonwebtoken.sign({id: user.id}, authConfig.secret,{
+        expiresIn: 86400,
+    }); 
 
     res.send({ user });
 });

From 0a210d18173e5a56914a15d66cfcbc9d61b13bd2 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:35:14 -0300
Subject: [PATCH 012/147] token added to res

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 3154bbc..3492cb7 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -31,7 +31,7 @@ router.post('/login', async(req, res) => {
         expiresIn: 86400,
     }); 
 
-    res.send({ user });
+    res.send({ user, token });
 });
 
 module.exports = app => app.use('/', router);
\ No newline at end of file

From cc071172113e71502c3d2cf7923034c28b247c39 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Wed, 16 Sep 2020 20:22:34 -0300
Subject: [PATCH 013/147] corrected jasonwebtoken to jsonwebtoken

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 3492cb7..d358c81 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -1,6 +1,6 @@
 const express = require('express');
 
-const jasonwebtoken = require('jasonwebtoker');
+const jsonwebtoken = require('jsonwebtoker');
 
 const User = require('../models/User');
 
@@ -27,7 +27,7 @@ router.post('/login', async(req, res) => {
 
     user.password = undefined;
 
-    const token = jasonwebtoken.sign({id: user.id}, authConfig.secret,{
+    const token = jsonwebtoken.sign({id: user.id}, authConfig.secret,{
         expiresIn: 86400,
     }); 
 

From 0ebf63b42e76db0af970a9be8ef0e3684eaa5a2d Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Wed, 16 Sep 2020 20:25:55 -0300
Subject: [PATCH 014/147] corrected jsonwebtoker to jsonwebtoken

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index d358c81..7eda761 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -1,6 +1,6 @@
 const express = require('express');
 
-const jsonwebtoken = require('jsonwebtoker');
+const jsonwebtoken = require('jsonwebtoken');
 
 const User = require('../models/User');
 

From 71c912dfe3f38694e16bf44a83ff3e9d5517163c Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:06:24 -0300
Subject: [PATCH 015/147] added model folder and user.js file

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/models/user.js | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/models/user.js

diff --git a/src/models/user.js b/src/models/user.js
new file mode 100644
index 0000000..e69de29

From 2717190f3f90dd3c09cf6e7c63ea20435edaa315 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:07:16 -0300
Subject: [PATCH 016/147] add user model

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/models/user.js | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/src/models/user.js b/src/models/user.js
index e69de29..f6b07e4 100644
--- a/src/models/user.js
+++ b/src/models/user.js
@@ -0,0 +1,22 @@
+const mongoose = require('mongoose');
+
+const UserSchema = new mongoose.Schema({
+    name:{
+        type: String,
+        require: true,
+    },
+    email:{
+        type: String,
+        unique: true,
+        required: true,
+        lowercase: true,
+    },
+    password:{
+        type: String,
+        required: true,
+        select: false,
+    },
+
+});
+
+const User = mongoose.model('User', UserSchema);
\ No newline at end of file

From bf7c99fd845944790fcbbeb01fa46994ce8030d9 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:09:54 -0300
Subject: [PATCH 017/147] added controllers folder and loginController.js file

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/controllers/loginController.js

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
new file mode 100644
index 0000000..e69de29

From 86e156ea80cf5a2ac0d19555a1dd3eebae258601 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:11:55 -0300
Subject: [PATCH 018/147] add login controller

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index e69de29..04a558b 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -0,0 +1,27 @@
+const express = require('express');
+
+const User = require('../models/User');
+
+const router = express.Router();
+
+router.post('/login', async(req, res) => {
+    const {email, password} = req.body;
+
+    const user = await User.findOne({ email }).select('+password');
+
+    if(!user){
+        
+        return res.status(400).send({Error: 'User not found'});
+
+    }
+
+    if(!await password == user.password){
+        
+        return res.status(400).send({ Error: 'Incorrect password'});
+
+    }
+
+    user.password = undefined;
+
+    res.send({ user });
+});
\ No newline at end of file

From daeca39998ceadc6f1cee7b42af311c1b547e209 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:13:03 -0300
Subject: [PATCH 019/147] added '/' route to router

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 04a558b..4dce3a0 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -24,4 +24,6 @@ router.post('/login', async(req, res) => {
     user.password = undefined;
 
     res.send({ user });
-});
\ No newline at end of file
+});
+
+module.exports = app => app.use('/', router);
\ No newline at end of file

From 1e318e8416c6a16fb5d7ed97a3d33f55f69bfe17 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:14:36 -0300
Subject: [PATCH 020/147] login controller added to index

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/index.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/index.js b/src/index.js
index 62a985b..010dd47 100644
--- a/src/index.js
+++ b/src/index.js
@@ -26,6 +26,9 @@ app.use(express.json());
 // routes
 app.use('/item',itemRoutes);
 
+//controllers
+require('./controllers/loginController')(app);
+
 // starting the server
 app.listen(app.get('port'), () => {
     console.log(`Server on port ${app.get('port')}`);

From d52413db6eb09bf26988f0d439868ef181a8e671 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:19:51 -0300
Subject: [PATCH 021/147] added jasonwebtoken dependency

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 package-lock.json | 91 +++++++++++++++++++++++++++++++++++++++++++++++
 package.json      |  1 +
 2 files changed, 92 insertions(+)

diff --git a/package-lock.json b/package-lock.json
index 39ed5c9..3cddde7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -257,6 +257,11 @@
       "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
       "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
     },
+    "buffer-equal-constant-time": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+      "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+    },
     "bytes": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
@@ -450,6 +455,14 @@
       "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
       "dev": true
     },
+    "ecdsa-sig-formatter": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
     "ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -805,6 +818,49 @@
       "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz",
       "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
     },
+    "jsonwebtoken": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+      "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+      "requires": {
+        "jws": "^3.2.2",
+        "lodash.includes": "^4.3.0",
+        "lodash.isboolean": "^3.0.3",
+        "lodash.isinteger": "^4.0.4",
+        "lodash.isnumber": "^3.0.3",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.isstring": "^4.0.1",
+        "lodash.once": "^4.0.0",
+        "ms": "^2.1.1",
+        "semver": "^5.6.0"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "jwa": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+      "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+      "requires": {
+        "buffer-equal-constant-time": "1.0.1",
+        "ecdsa-sig-formatter": "1.0.11",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "jws": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+      "requires": {
+        "jwa": "^1.4.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
     "keyv": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
@@ -823,6 +879,41 @@
         "package-json": "^6.3.0"
       }
     },
+    "lodash.includes": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+    },
+    "lodash.isboolean": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+    },
+    "lodash.isinteger": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+      "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+    },
+    "lodash.isnumber": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+      "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+    },
+    "lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+    },
+    "lodash.isstring": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+    },
+    "lodash.once": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+    },
     "lowercase-keys": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
diff --git a/package.json b/package.json
index f952ad0..a24ddad 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
     "express": "^4.17.1",
     "joi": "^17.2.1",
     "mongoose": "^5.10.5",
+    "jsonwebtoken": "^8.5.1",
     "morgan": "^1.10.0"
   },
   "devDependencies": {

From 0f70b3ba1c874bb6ce8cfd3c0e28ad07b07e9058 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:26:11 -0300
Subject: [PATCH 022/147] added token to login controller

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 4dce3a0..0cf4b36 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -1,5 +1,7 @@
 const express = require('express');
 
+const jasonwebtoken = require('jasonwebtoker');
+
 const User = require('../models/User');
 
 const router = express.Router();
@@ -23,6 +25,8 @@ router.post('/login', async(req, res) => {
 
     user.password = undefined;
 
+    const token = jasonwebtoken.sign({id: user.id}) 
+
     res.send({ user });
 });
 

From 6b2238015ee0ad75e68bccf8ea130f8581d1f29e Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:27:28 -0300
Subject: [PATCH 023/147] added config folder and auth.json file

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/config/auth,json | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/config/auth,json

diff --git a/src/config/auth,json b/src/config/auth,json
new file mode 100644
index 0000000..e69de29

From cc654714b02b9c9f61eef5b8ec1ef620c1127b64 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:29:52 -0300
Subject: [PATCH 024/147] added secret (hash md5) to auth.json

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/config/auth,json | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/config/auth,json b/src/config/auth,json
index e69de29..5df31c6 100644
--- a/src/config/auth,json
+++ b/src/config/auth,json
@@ -0,0 +1,3 @@
+{
+    "secret": "d41d8cd98f00b204e9800998ecf8427e" 
+}
\ No newline at end of file

From a0bce3560148713caaf71625355c1272995fc09b Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:34:00 -0300
Subject: [PATCH 025/147] auth.json imported to login controller and expiration
 time added to token

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 0cf4b36..3154bbc 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -6,6 +6,8 @@ const User = require('../models/User');
 
 const router = express.Router();
 
+const authConfig = require('../config/auth');
+
 router.post('/login', async(req, res) => {
     const {email, password} = req.body;
 
@@ -25,7 +27,9 @@ router.post('/login', async(req, res) => {
 
     user.password = undefined;
 
-    const token = jasonwebtoken.sign({id: user.id}) 
+    const token = jasonwebtoken.sign({id: user.id}, authConfig.secret,{
+        expiresIn: 86400,
+    }); 
 
     res.send({ user });
 });

From 1cdf360ff3c59f20ce8a7911835aeefb04dff957 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 15 Sep 2020 10:35:14 -0300
Subject: [PATCH 026/147] token added to res

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 3154bbc..3492cb7 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -31,7 +31,7 @@ router.post('/login', async(req, res) => {
         expiresIn: 86400,
     }); 
 
-    res.send({ user });
+    res.send({ user, token });
 });
 
 module.exports = app => app.use('/', router);
\ No newline at end of file

From 337fd353281c7c50501b470d0e004e65e46b01d6 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Wed, 16 Sep 2020 20:22:34 -0300
Subject: [PATCH 027/147] corrected jasonwebtoken to jsonwebtoken

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 3492cb7..d358c81 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -1,6 +1,6 @@
 const express = require('express');
 
-const jasonwebtoken = require('jasonwebtoker');
+const jsonwebtoken = require('jsonwebtoker');
 
 const User = require('../models/User');
 
@@ -27,7 +27,7 @@ router.post('/login', async(req, res) => {
 
     user.password = undefined;
 
-    const token = jasonwebtoken.sign({id: user.id}, authConfig.secret,{
+    const token = jsonwebtoken.sign({id: user.id}, authConfig.secret,{
         expiresIn: 86400,
     }); 
 

From 260da0fc17a5486e9d621de1ef9a1c7746421d8c Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Wed, 16 Sep 2020 20:25:55 -0300
Subject: [PATCH 028/147] corrected jsonwebtoker to jsonwebtoken

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index d358c81..7eda761 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -1,6 +1,6 @@
 const express = require('express');
 
-const jsonwebtoken = require('jsonwebtoker');
+const jsonwebtoken = require('jsonwebtoken');
 
 const User = require('../models/User');
 

From e02a9a94a8e81e8ef48126438afb1527536b6386 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Wed, 16 Sep 2020 21:25:10 -0300
Subject: [PATCH 029/147] solving errors

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 7 +++++--
 src/models/user.js                 | 2 +-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index 7eda761..be1de18 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -2,11 +2,14 @@ const express = require('express');
 
 const jsonwebtoken = require('jsonwebtoken');
 
-const User = require('../models/User');
+const User = require('../models/user');
 
 const router = express.Router();
 
-const authConfig = require('../config/auth');
+//const authConfig = require('../config/auth');
+const authConfig = {
+    "secret": "d41d8cd98f00b204e9800998ecf8427e" 
+};
 
 router.post('/login', async(req, res) => {
     const {email, password} = req.body;
diff --git a/src/models/user.js b/src/models/user.js
index f6b07e4..715450e 100644
--- a/src/models/user.js
+++ b/src/models/user.js
@@ -19,4 +19,4 @@ const UserSchema = new mongoose.Schema({
 
 });
 
-const User = mongoose.model('User', UserSchema);
\ No newline at end of file
+module.exports = User = mongoose.model('User', UserSchema);
\ No newline at end of file

From 174497b35e7ba900d51931749270e71226a3763a Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Wed, 16 Sep 2020 22:55:29 -0300
Subject: [PATCH 030/147] test case comment

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/loginController.js | 8 ++++++--
 src/index.js                       | 3 ---
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index be1de18..5ff8670 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -11,10 +11,14 @@ const authConfig = {
     "secret": "d41d8cd98f00b204e9800998ecf8427e" 
 };
 
-router.post('/login', async(req, res) => {
+router.post('/login', async(req, res) => {    
     const {email, password} = req.body;
 
     const user = await User.findOne({ email }).select('+password');
+    /*const user = {
+        "email": "asda@asd.com",
+        "password": "asdz"
+    };*/
 
     if(!user){
         
@@ -34,7 +38,7 @@ router.post('/login', async(req, res) => {
         expiresIn: 86400,
     }); 
 
-    res.send({ user, token });
+    res.send({user, token });
 });
 
 module.exports = app => app.use('/', router);
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
index 7eaac77..010dd47 100644
--- a/src/index.js
+++ b/src/index.js
@@ -29,9 +29,6 @@ app.use('/item',itemRoutes);
 //controllers
 require('./controllers/loginController')(app);
 
-//controllers
-require('./controllers/loginController')(app);
-
 // starting the server
 app.listen(app.get('port'), () => {
     console.log(`Server on port ${app.get('port')}`);

From 6f56db58b48a79fbc3cf846659621a2846263c3b Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Wed, 16 Sep 2020 22:59:24 -0300
Subject: [PATCH 031/147] create logout controller

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/controllers/logoutController.js | 44 +++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)
 create mode 100644 src/controllers/logoutController.js

diff --git a/src/controllers/logoutController.js b/src/controllers/logoutController.js
new file mode 100644
index 0000000..4e4b61c
--- /dev/null
+++ b/src/controllers/logoutController.js
@@ -0,0 +1,44 @@
+const express = require('express');
+
+const jsonwebtoken = require('jsonwebtoken');
+
+const router = express.Router();
+
+const authConfig = {
+    "secret": "d41d8cd98f00b204e9800998ecf8427e" 
+};
+
+router.get('/logout', async(req, res) => { 
+    const sessiontoken = req.headers.sessiontoken;
+
+    if(!sessiontoken){
+        return res.status(401).send({Error: 'Token not provided'});
+    }
+
+    const parts = sessiontoken.split(' ');
+
+    if (!parts.length === 2){
+        return res.status(401).send({Error: 'Token error'});
+    }
+    
+    const [scheme, token] = parts;
+
+    if(!/^Bearer$/i.test(scheme)){
+        return res.status(401).send({Error: 'Token malformated'});
+    }
+
+    jsonwebtoken.verify(token, authConfig.secret, (err, decoded) => {
+        if(err){
+            return res.status(401).send({Error: 'Token invalid'});
+        }
+
+        const token = jsonwebtoken.sign({id: decoded.id}, authConfig.secret,{
+            expiresIn: 1,
+        });
+
+    });
+
+    res.redirect('/login');
+});
+
+module.exports = app => app.use('/', router);
\ No newline at end of file

From de37faf187085e416e559fe98cd04576b46b81f4 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Wed, 16 Sep 2020 23:00:48 -0300
Subject: [PATCH 032/147] add logout controller to index.js

Co-authored-by: Vinicius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/index.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/index.js b/src/index.js
index 010dd47..7e7faf0 100644
--- a/src/index.js
+++ b/src/index.js
@@ -28,6 +28,7 @@ app.use('/item',itemRoutes);
 
 //controllers
 require('./controllers/loginController')(app);
+require('./controllers/logoutController')(app);
 
 // starting the server
 app.listen(app.get('port'), () => {

From 043fb92281c677559bb1ec5381ba0b0ce1217da0 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Thu, 24 Sep 2020 00:58:30 -0300
Subject: [PATCH 033/147] changes requested applied

Co-authored-by: Victor Hugo Siqueira Costa <vitao.hugo@hotmail.com>
---
 src/config/auth,json                          |  3 --
 src/controllers/loginController.js            | 44 ------------------
 src/index.js                                  |  6 +--
 .../authRoutes.js}                            | 45 ++++++++++++++++++-
 4 files changed, 45 insertions(+), 53 deletions(-)
 delete mode 100644 src/config/auth,json
 delete mode 100644 src/controllers/loginController.js
 rename src/{controllers/logoutController.js => routes/authRoutes.js} (53%)

diff --git a/src/config/auth,json b/src/config/auth,json
deleted file mode 100644
index 5df31c6..0000000
--- a/src/config/auth,json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "secret": "d41d8cd98f00b204e9800998ecf8427e" 
-}
\ No newline at end of file
diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
deleted file mode 100644
index 5ff8670..0000000
--- a/src/controllers/loginController.js
+++ /dev/null
@@ -1,44 +0,0 @@
-const express = require('express');
-
-const jsonwebtoken = require('jsonwebtoken');
-
-const User = require('../models/user');
-
-const router = express.Router();
-
-//const authConfig = require('../config/auth');
-const authConfig = {
-    "secret": "d41d8cd98f00b204e9800998ecf8427e" 
-};
-
-router.post('/login', async(req, res) => {    
-    const {email, password} = req.body;
-
-    const user = await User.findOne({ email }).select('+password');
-    /*const user = {
-        "email": "asda@asd.com",
-        "password": "asdz"
-    };*/
-
-    if(!user){
-        
-        return res.status(400).send({Error: 'User not found'});
-
-    }
-
-    if(!await password == user.password){
-        
-        return res.status(400).send({ Error: 'Incorrect password'});
-
-    }
-
-    user.password = undefined;
-
-    const token = jsonwebtoken.sign({id: user.id}, authConfig.secret,{
-        expiresIn: 86400,
-    }); 
-
-    res.send({user, token });
-});
-
-module.exports = app => app.use('/', router);
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
index 7e7faf0..7bc111d 100644
--- a/src/index.js
+++ b/src/index.js
@@ -4,6 +4,7 @@ const morgan = require('morgan');
 const mongoose = require('mongoose');
 
 const itemRoutes = require('./routes/itemRoutes');
+const authRoutes = require('./routes/authRoutes');
 
 // MongoDB connection
 mongoose
@@ -25,10 +26,7 @@ app.use(express.json());
 
 // routes
 app.use('/item',itemRoutes);
-
-//controllers
-require('./controllers/loginController')(app);
-require('./controllers/logoutController')(app);
+app.use('/auth',authRoutes);
 
 // starting the server
 app.listen(app.get('port'), () => {
diff --git a/src/controllers/logoutController.js b/src/routes/authRoutes.js
similarity index 53%
rename from src/controllers/logoutController.js
rename to src/routes/authRoutes.js
index 4e4b61c..2a2d877 100644
--- a/src/controllers/logoutController.js
+++ b/src/routes/authRoutes.js
@@ -1,13 +1,54 @@
 const express = require('express');
 
+const router = express.Router();
+
 const jsonwebtoken = require('jsonwebtoken');
 
-const router = express.Router();
+const User = require('../models/user');
+
+router.get('/', (req, res) => {
+    res.json({
+        message: 'Authentication!'
+    });
+});
 
 const authConfig = {
     "secret": "d41d8cd98f00b204e9800998ecf8427e" 
 };
 
+router.post('/login', async(req, res) => {    
+    const {email, password} = req.body;
+
+    //const user = await User.findOne({ email }).select('+password');
+    const user = {
+        "email": "asda@asd.com",
+        "password": "asdz"
+    };
+
+    if(!user){
+        
+        return res.status(400).send({Error: 'User not found'});
+
+    }
+
+    if(!await password == user.password){
+        
+        return res.status(400).send({ Error: 'Incorrect password'});
+
+    }
+
+    user.password = undefined;
+
+    const token = jsonwebtoken.sign({id: user.id}, authConfig.secret,{
+        expiresIn: 86400,
+    }); 
+
+    const aToken = "Bearer "+token;
+
+    res.header("authToken", aToken);
+    res.redirect('/main');
+});
+
 router.get('/logout', async(req, res) => { 
     const sessiontoken = req.headers.sessiontoken;
 
@@ -41,4 +82,4 @@ router.get('/logout', async(req, res) => {
     res.redirect('/login');
 });
 
-module.exports = app => app.use('/', router);
\ No newline at end of file
+module.exports = router;

From 9cb8250dcafb3b36f7b69e75200382074f1f3d7a Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Thu, 24 Sep 2020 01:14:23 -0300
Subject: [PATCH 034/147] solving conflicts

Co-authored-by: Victor Hugo Siqueira Costa <vitao.hugo@hotmail.com>
---
 src/models/user.js       | 26 ++++++-------
 src/routes/authRoutes.js | 81 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 93 insertions(+), 14 deletions(-)

diff --git a/src/models/user.js b/src/models/user.js
index 715450e..5b87ad6 100644
--- a/src/models/user.js
+++ b/src/models/user.js
@@ -1,22 +1,22 @@
 const mongoose = require('mongoose');
 
-const UserSchema = new mongoose.Schema({
-    name:{
+const Schema = mongoose.Schema;
+
+const userSchema = new Schema({
+    username: {
         type: String,
-        require: true,
+        required: true
     },
-    email:{
+    password: {
         type: String,
-        unique: true,
-        required: true,
-        lowercase: true,
+        required: true
     },
-    password:{
+    email: {
         type: String,
-        required: true,
-        select: false,
-    },
-
+        required: true
+    }
 });
 
-module.exports = User = mongoose.model('User', UserSchema);
\ No newline at end of file
+const User = mongoose.model('User', userSchema);
+
+module.exports = User;
\ No newline at end of file
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 2a2d877..35b3f12 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -6,6 +6,8 @@ const jsonwebtoken = require('jsonwebtoken');
 
 const User = require('../models/user');
 
+const userSchema = require('../schemas/userSchema');
+
 router.get('/', (req, res) => {
     res.json({
         message: 'Authentication!'
@@ -82,4 +84,81 @@ router.get('/logout', async(req, res) => {
     res.redirect('/login');
 });
 
-module.exports = router;
+router.post('/signup', async(req, res, next) => {
+
+    try {
+
+        const newUserData = req.body;
+        const result = userSchema.validate(req.body);
+
+        if( await User.findOne({ username: newUserData.username}) ) {
+            const error = new Error('Username already being used.');
+            return next(error);
+        }
+
+        if( result.error ) {
+            return next(result.error);
+        }
+
+        const user = new User(newUserData);
+
+        user.save()
+            .then( result => {
+                return res.send(result);
+            })
+            .catch( err => next(err));
+
+    } catch(err) {
+        return next(err);
+    }
+
+});
+
+router.put('/update-user/:id', async(req, res, next) => {
+
+    try {
+
+        const user = await User.findById(req.params.id);
+        const newData = req.body;
+
+        if ( !newData.username ) {
+            newData.username = user.username;
+        }
+        if ( !newData.password ) {
+            newData.password = user.password;
+        }
+        if ( !newData.email ) {
+            newData.email = user.email;
+        }
+
+        const result = userSchema.validate(newData);
+
+        if(result.error) {
+            return next(result.error);
+        }
+        
+        await User.findOneAndUpdate({_id: req.params.id}, req.body, { useFindAndModify: false})
+                    .then( () => {
+                        res.send({ message: 'User updated successfully.'});
+                    });
+
+    } catch(err) {
+        return next(err);
+    }
+
+});
+
+router.delete('/delete-user/:id', async(req, res, next) => {
+    
+    try {
+        
+        await User.findByIdAndDelete(req.params.id);
+        return res.send({ message: 'User successfully deleted.' });
+
+    } catch(err) {
+        return next(err);
+    }
+
+});
+
+module.exports = router;
\ No newline at end of file

From 91976f208f77937a06a38b12695e8710e9e93583 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Thu, 24 Sep 2020 01:27:40 -0300
Subject: [PATCH 035/147] error solving

Co-authored-by: Victor Hugo Siqueira Costa <vitao.hugo@hotmail.com>
---
 src/routes/authRoutes.js | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 35b3f12..5cce565 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -21,11 +21,11 @@ const authConfig = {
 router.post('/login', async(req, res) => {    
     const {email, password} = req.body;
 
-    //const user = await User.findOne({ email }).select('+password');
-    const user = {
+    const user = await User.findOne({ email, password });
+    /*const user = {
         "email": "asda@asd.com",
         "password": "asdz"
-    };
+    };*/
 
     if(!user){
         
@@ -47,8 +47,11 @@ router.post('/login', async(req, res) => {
 
     const aToken = "Bearer "+token;
 
-    res.header("authToken", aToken);
-    res.redirect('/main');
+    res.header('authToken', aToken);
+    res.json({
+        message: 'Auth token generated'
+    }).redirect('/main');
+    
 });
 
 router.get('/logout', async(req, res) => { 

From 70629cdb4c740aade76d3332bd46660d0dc5500a Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Thu, 24 Sep 2020 01:43:03 -0300
Subject: [PATCH 036/147] change header field to lower case

Co-authored-by: Victor Hugo Siqueira Costa <vitao.hugo@hotmail.com>
---
 src/routes/authRoutes.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 5cce565..2bd2c05 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -47,7 +47,7 @@ router.post('/login', async(req, res) => {
 
     const aToken = "Bearer "+token;
 
-    res.header('authToken', aToken);
+    res.header('authtoken', aToken);
     res.json({
         message: 'Auth token generated'
     }).redirect('/main');
@@ -55,7 +55,7 @@ router.post('/login', async(req, res) => {
 });
 
 router.get('/logout', async(req, res) => { 
-    const sessiontoken = req.headers.sessiontoken;
+    const sessiontoken = req.headers.authtoken;
 
     if(!sessiontoken){
         return res.status(401).send({Error: 'Token not provided'});

From e8206a4a84dffaf20969ee7fb9de3e91a5f2a5cf Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Mon, 28 Sep 2020 22:46:20 -0300
Subject: [PATCH 037/147] Added UserSchema

Co-authored-by: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
---
 src/schemas/userSchema.js | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 src/schemas/userSchema.js

diff --git a/src/schemas/userSchema.js b/src/schemas/userSchema.js
new file mode 100644
index 0000000..b3300ab
--- /dev/null
+++ b/src/schemas/userSchema.js
@@ -0,0 +1,11 @@
+
+const Joi = require('joi');
+
+const userSchema = Joi.object({
+    username: Joi.string().alphanum().min(4).max(30).required(),
+    password: Joi.string().min(8).required(),
+    passwordConfirmation: Joi.string().min(8).required().valid(Joi.ref('password')).error(new Error('Password confirmation does not match.')),
+    email: Joi.string().email().required()
+});
+
+module.exports = userSchema;
\ No newline at end of file

From efeff82b5be1424d9a8f1b04d18afd28a3a1f803 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 12:46:51 -0300
Subject: [PATCH 038/147] A#dd topic creation and error handlers

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/index.js              |  1 +
 src/models/topic.js       | 31 ++++++++++++++
 src/models/user.js        |  7 +++-
 src/routes/topicRoutes.js | 86 +++++++++++++--------------------------
 4 files changed, 66 insertions(+), 59 deletions(-)
 create mode 100644 src/models/topic.js

diff --git a/src/index.js b/src/index.js
index 49c4596..1647880 100644
--- a/src/index.js
+++ b/src/index.js
@@ -10,6 +10,7 @@ const plantRoutes = require('./routes/plantRoutes');
 const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
 const authRoutes = require('./routes/authRoutes');
+const topicRoutes = require('./routes/topicRoutes');
 
 // MongoDB connection
 
diff --git a/src/models/topic.js b/src/models/topic.js
new file mode 100644
index 0000000..21eed56
--- /dev/null
+++ b/src/models/topic.js
@@ -0,0 +1,31 @@
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+
+const topicSchema = new Schema({
+    title: {
+        type: String,
+        require: true,
+    },
+    description: {
+        type: String,
+        require: true,
+    },
+    user: {
+        type: Schema.Types.ObjectId,
+        ref: 'User',
+        require: true,
+    },
+    createdAt: {
+        type: Date,
+        default: Date.now,
+    },
+    completed: {
+        type: Boolean,
+        require: true,
+        default: false,
+    },
+});
+
+const Topic = mongoose.model('Topic', topicSchema);
+
+module.exports = Topic;
diff --git a/src/models/user.js b/src/models/user.js
index 32ff1ec..eb95e35 100644
--- a/src/models/user.js
+++ b/src/models/user.js
@@ -13,7 +13,12 @@ const userSchema = new Schema({
     email: {
         type: String,
         required: true
-    }
+    },
+    topics: [{
+        type: mongoose.Schema.Types.ObjectId,
+        ref: 'Topics',
+        require: true,
+    }]
 });
 
 const User = mongoose.model('User', userSchema);
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index e2db253..655683a 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -1,63 +1,33 @@
 const express = require('express');
-const Plant = require('../models/Plant');
-const Topico = require('../models/Topico');
-
 const router = express.Router();
-//Criar um novo topico pelo id da planta
-router.put('/:plantId', async (req , res) => {
-    try{
-        const {topicos} = req.body;
-        const plant = await Plant.findByIdAndUpdate(req.params.plantId,
-            {},{ new: true}).populate('topicos');
-        await Promise.all(topicos.map(async topico =>{
-            const plantTopic = new Topico({...topico,plant : plant._id});
-
-            await plantTopic.save();
-
-            plant.topicos.push(plantTopic);
-        }));
-        await plant.save();
-        return res.send({ plant });
-    }catch (err){
-        return res.status(400).send({ error: 'Registration failed'});
-    }
-});
-//Listando todos os topics
-router.get('/', async (req , res) => {
-    try{
-        const topics = await Topico.find();
-        return res.send({ topics });
-    }catch (err){
-        return res.status(400).send({ error: 'Loading plants failed'});
-    }
-});
-//Procurando topic por id
-router.get('/:topicId', async (req , res) => {
-    try{
-        const topico = await Topico.findById(req.params.topicId);
-        return res.send({ topico });
-    }catch (err){
-        return res.status(400).send({ error: 'error when searching for this topic '});
-    }
-});
-//Deletando topic por id
-router.delete('/:topicId', async (req , res) => {
-    try{
-        await Topico.findByIdAndRemove(req.params.topicId);
-        return res.send();
-    }catch (err){
-        return res.status(400).send({ error: 'Error when Delete this topic'});
-    }
-});
-//Dando upgrade topic por id
-router.put('/:topicId', async (req , res) => {
-    try{
-        await Topico.findByIdAndUpdate(req.params.topicId,{description: 'marcos felipe'},{new : true});
-        return res.send();
-    }catch (err){
-        console.log(err);
-        return res.status(400).send({ error: 'Error when Delete this plant'});
+
+const Topic = require('../models/topic');
+const User = require('../models/user');
+
+router.post('/create/:userId', async (req, res, next) => {
+    
+    try {
+
+        const topic = await Topic.create({...req.body, user: req.params.userId});
+        await topic.save();
+
+        const user = await User.findById(req.params.userId);
+
+        if (!user) {
+            const error = new Error('User not found.');
+            return next(error);
+        }
+
+        user.topics.push(topic);
+
+        await user.save();
+    
+        return res.send({ topic });
+
+    } catch (err) {
+        return next(err);
     }
+
 });
 
-module.exports = router;
\ No newline at end of file
+module.exports = router;

From da39988abc775f321e31e1744861fe8027698e8a Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 13:31:57 -0300
Subject: [PATCH 039/147] Add update, delete and list topics functions

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/topicRoutes.js | 62 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 58 insertions(+), 4 deletions(-)

diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 655683a..8c139f1 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -9,8 +9,6 @@ router.post('/create/:userId', async (req, res, next) => {
     try {
 
         const topic = await Topic.create({...req.body, user: req.params.userId});
-        await topic.save();
-
         const user = await User.findById(req.params.userId);
 
         if (!user) {
@@ -18,16 +16,72 @@ router.post('/create/:userId', async (req, res, next) => {
             return next(error);
         }
 
-        user.topics.push(topic);
+        await topic.save();
 
+        user.topics.push(topic);
         await user.save();
     
         return res.send({ topic });
 
     } catch (err) {
-        return next(err);
+        console.log(err);
+        return next({ error: 'Error creating topic.' });
+    }
+
+});
+
+router.put('/update/:topicId', async (req, res) => {
+
+    try {
+
+        const topic = await Topic.findById(req.params.topicId);
+
+        if (!topic) {
+            const error = new Error('Topic not found.');
+            return next(error);
+        }
+
+        const newData = req.body;
+
+        if (!newData.title) newData.title = topic.title;
+        if (!newData.description) newData.description = topic.description;
+        if (!newData.completed) newData.completed = topic.completed;
+
+    
+        await Topic.findOneAndUpdate({_id: req.params.topicId}, req.body, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: 'Topic updated successfully.'});
+        });
+
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error updating topic.' });
     }
 
 });
 
+router.delete('/delete/:topicId', async (req, res) => {
+    try {
+        await Topic.findByIdAndRemove(req.params.topicId).populate('user');
+
+        return res.send({
+            message: 'Topic successfully removed.'
+        });
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error deleting topic.' });
+    }
+});
+
+router.get('/list_topics', async (req, res) => {
+    try {
+        const topic = await Topic.find().populate(['user']);
+
+        return res.send({ topic });
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error loading topics.' });
+    }
+});
+
 module.exports = router;

From 31d2a3b362b99f1224563bf988bf0bff7ce2b069 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 16:33:04 -0300
Subject: [PATCH 040/147] Add comment model and its creation route

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/models/comment.js     | 23 +++++++++++++++++++++++
 src/models/topic.js       |  4 ++++
 src/routes/topicRoutes.js | 30 +++++++++++++++++++++++++++---
 3 files changed, 54 insertions(+), 3 deletions(-)
 create mode 100644 src/models/comment.js

diff --git a/src/models/comment.js b/src/models/comment.js
new file mode 100644
index 0000000..9e5973c
--- /dev/null
+++ b/src/models/comment.js
@@ -0,0 +1,23 @@
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+
+const commentSchema = new Schema({
+    text: {
+        type: String,
+        require: true
+    },
+    author: {
+        type: Schema.Types.ObjectId,
+        ref: 'User',
+        require: true
+    },
+    topic: {
+        type: Schema.Types.ObjectId,
+        ref: 'Topics',
+        require: true
+    }
+});
+
+const Comment = mongoose.model('Comment', commentSchema);
+
+module.exports = Comment;
diff --git a/src/models/topic.js b/src/models/topic.js
index 21eed56..aee0ff1 100644
--- a/src/models/topic.js
+++ b/src/models/topic.js
@@ -15,6 +15,10 @@ const topicSchema = new Schema({
         ref: 'User',
         require: true,
     },
+    comments: [{
+        type: Schema.Types.ObjectId,
+        ref: 'Comment'
+    }],
     createdAt: {
         type: Date,
         default: Date.now,
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 8c139f1..7dbde2a 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -3,6 +3,7 @@ const router = express.Router();
 
 const Topic = require('../models/topic');
 const User = require('../models/user');
+const Comment = require('../models/comment');
 
 router.post('/create/:userId', async (req, res, next) => {
     
@@ -30,7 +31,7 @@ router.post('/create/:userId', async (req, res, next) => {
 
 });
 
-router.put('/update/:topicId', async (req, res) => {
+router.put('/update/:topicId', async (req, res, next) => {
 
     try {
 
@@ -60,7 +61,7 @@ router.put('/update/:topicId', async (req, res) => {
 
 });
 
-router.delete('/delete/:topicId', async (req, res) => {
+router.delete('/delete/:topicId', async (req, res, next) => {
     try {
         await Topic.findByIdAndRemove(req.params.topicId).populate('user');
 
@@ -73,7 +74,7 @@ router.delete('/delete/:topicId', async (req, res) => {
     }
 });
 
-router.get('/list_topics', async (req, res) => {
+router.get('/list_topics', async (req, res, next) => {
     try {
         const topic = await Topic.find().populate(['user']);
 
@@ -84,4 +85,27 @@ router.get('/list_topics', async (req, res) => {
     }
 });
 
+router.post('/comment/:topicId/:userId', async (req, res, next) => {
+    try {
+
+        const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
+        const user = await User.findById(req.params.userId);
+        const topic = await Topic.findById(req.params.topicId);
+
+        if (!user) return next(new Error('User not found.'));
+        if (!topic) return next(new Error('Topic not found.'));
+
+        await comment.save();
+
+        topic.comments.push(comment);
+        await topic.save();
+    
+        return res.send({ message: 'Comment successfully registered.' });
+
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error, it was not possible to comment.'});
+    }
+})
+
 module.exports = router;

From 910e5a1558e00fc79b3f21c332578a54225048c4 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 17:13:24 -0300
Subject: [PATCH 041/147] Create update comment function

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/topicRoutes.js | 36 +++++++++++++++++++++++++++---------
 1 file changed, 27 insertions(+), 9 deletions(-)

diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 7dbde2a..e66ce5f 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -12,10 +12,7 @@ router.post('/create/:userId', async (req, res, next) => {
         const topic = await Topic.create({...req.body, user: req.params.userId});
         const user = await User.findById(req.params.userId);
 
-        if (!user) {
-            const error = new Error('User not found.');
-            return next(error);
-        }
+        if (!user) return next( new Error('User not found.'));
 
         await topic.save();
 
@@ -37,10 +34,7 @@ router.put('/update/:topicId', async (req, res, next) => {
 
         const topic = await Topic.findById(req.params.topicId);
 
-        if (!topic) {
-            const error = new Error('Topic not found.');
-            return next(error);
-        }
+        if (!topic) return next(new Error('Topic not found.'));
 
         const newData = req.body;
 
@@ -106,6 +100,30 @@ router.post('/comment/:topicId/:userId', async (req, res, next) => {
         console.log(err);
         return res.next({ error: 'Error, it was not possible to comment.'});
     }
-})
+});
+
+router.put('/update_comment/:commentId', async (req, res, next) => {
+
+    try {
+
+        const comment = await Comment.findById(req.params.commentId);
+
+        if (!comment) return next(new Error('Comment not found.'));
+
+        const newData = req.body;
+
+        if (!newData.text) return next(new Error('Comment should not be empty.'));;
+    
+        await Comment.findOneAndUpdate({_id: req.params.commentId}, req.body, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: 'Comment updated successfully.'});
+        });
+
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error updating comment.' });
+    }
+
+});
 
 module.exports = router;

From 519683c7bb8ceb9350268a6f45101749a1381b0b Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 17:17:57 -0300
Subject: [PATCH 042/147] Create comment Routes file

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/index.js                |  1 +
 src/models/comment.js       | 37 +++++++++++++++--------
 src/routes/commentRoutes.js | 58 ++++++++++++++++++++++++++++++-------
 src/routes/topicRoutes.js   | 48 ------------------------------
 4 files changed, 73 insertions(+), 71 deletions(-)

diff --git a/src/index.js b/src/index.js
index 1647880..a049c1b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -11,6 +11,7 @@ const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
 const authRoutes = require('./routes/authRoutes');
 const topicRoutes = require('./routes/topicRoutes');
+const commentRoutes = require('./routes/commentRoutes');
 
 // MongoDB connection
 
diff --git a/src/models/comment.js b/src/models/comment.js
index 9e5973c..3d0abd7 100644
--- a/src/models/comment.js
+++ b/src/models/comment.js
@@ -1,23 +1,36 @@
 const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
 
-const commentSchema = new Schema({
-    text: {
+const CommentSchema = new mongoose.Schema({
+    username: {
         type: String,
-        require: true
+        require : true
     },
-    author: {
-        type: Schema.Types.ObjectId,
-        ref: 'User',
+    message: {
+        type: String,
         require: true
     },
-    topic: {
-        type: Schema.Types.ObjectId,
-        ref: 'Topics',
-        require: true
+    vote_count:{
+        type: Number,
+        require:true
     }
+
 });
 
-const Comment = mongoose.model('Comment', commentSchema);
+
+const Comment = mongoose.model('comment',CommentSchema);
 
 module.exports = Comment;
+//Exemplo de teste insominia
+//{
+//	"scientificName":"scientificName",
+//	"family_name":"family_name",
+//	"gender_name":"gender_name",
+//	"specie_name":"specie_name",
+//	"usage":"usage",
+//	"first_User":"first_User",
+//	"collection_count":"17",
+//	"extinction":"1",
+//	"profile_picture":"7",
+//	"gbifID":"17",
+//	"stateProvince":"brasilia"
+//}	
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index d8dc5bf..a9ea9b4 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,19 +1,55 @@
 const express = require('express');
-const Plant = require('../models/Plant');
-const Topico = require('../models/Topico');
-const Comment = require('../models/Comment');
-
 const router = express.Router();
 
-router.post('/register', async (req , res) => {
-    try{
-        const comment = await Comment.create(req.body);
+const Topic = require('../models/topic');
+const User = require('../models/user');
+const Comment = require('../models/comment');
+
+router.post('/create/:topicId/:userId', async (req, res, next) => {
+    try {
+
+        const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
+        const user = await User.findById(req.params.userId);
+        const topic = await Topic.findById(req.params.topicId);
+
+        if (!user) return next(new Error('User not found.'));
+        if (!topic) return next(new Error('Topic not found.'));
 
-        return res.send({ comment });
-    }catch (err){
-        return res.status(400).send({ error: 'Registration failed'});
+        await comment.save();
+
+        topic.comments.push(comment);
+        await topic.save();
+    
+        return res.send({ message: 'Comment successfully registered.' });
+
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error, it was not possible to comment.'});
     }
 });
 
+router.put('/update/:commentId', async (req, res, next) => {
+
+    try {
+
+        const comment = await Comment.findById(req.params.commentId);
+
+        if (!comment) return next(new Error('Comment not found.'));
+
+        const newData = req.body;
+
+        if (!newData.text) return next(new Error('Comment should not be empty.'));;
+    
+        await Comment.findOneAndUpdate({_id: req.params.commentId}, req.body, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: 'Comment updated successfully.'});
+        });
+
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error updating comment.' });
+    }
+
+});
 
-module.exports = router;
\ No newline at end of file
+module.exports = router;
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index e66ce5f..a5c22b3 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -3,7 +3,6 @@ const router = express.Router();
 
 const Topic = require('../models/topic');
 const User = require('../models/user');
-const Comment = require('../models/comment');
 
 router.post('/create/:userId', async (req, res, next) => {
     
@@ -79,51 +78,4 @@ router.get('/list_topics', async (req, res, next) => {
     }
 });
 
-router.post('/comment/:topicId/:userId', async (req, res, next) => {
-    try {
-
-        const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
-        const user = await User.findById(req.params.userId);
-        const topic = await Topic.findById(req.params.topicId);
-
-        if (!user) return next(new Error('User not found.'));
-        if (!topic) return next(new Error('Topic not found.'));
-
-        await comment.save();
-
-        topic.comments.push(comment);
-        await topic.save();
-    
-        return res.send({ message: 'Comment successfully registered.' });
-
-    } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error, it was not possible to comment.'});
-    }
-});
-
-router.put('/update_comment/:commentId', async (req, res, next) => {
-
-    try {
-
-        const comment = await Comment.findById(req.params.commentId);
-
-        if (!comment) return next(new Error('Comment not found.'));
-
-        const newData = req.body;
-
-        if (!newData.text) return next(new Error('Comment should not be empty.'));;
-    
-        await Comment.findOneAndUpdate({_id: req.params.commentId}, req.body, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: 'Comment updated successfully.'});
-        });
-
-    } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error updating comment.' });
-    }
-
-});
-
 module.exports = router;

From 4ea090046ee5ddcc3424daf06ef6906fb7cb4e3f Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 12:46:51 -0300
Subject: [PATCH 043/147] A#dd topic creation and error handlers

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/index.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/index.js b/src/index.js
index a049c1b..1647880 100644
--- a/src/index.js
+++ b/src/index.js
@@ -11,7 +11,6 @@ const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
 const authRoutes = require('./routes/authRoutes');
 const topicRoutes = require('./routes/topicRoutes');
-const commentRoutes = require('./routes/commentRoutes');
 
 // MongoDB connection
 

From b1ccbf1835371d419dbae4fe51979c1ec3956d66 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 13:31:57 -0300
Subject: [PATCH 044/147] Add update, delete and list topics functions

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/topicRoutes.js | 31 +++++++++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index a5c22b3..4c2ad1f 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -27,13 +27,16 @@ router.post('/create/:userId', async (req, res, next) => {
 
 });
 
-router.put('/update/:topicId', async (req, res, next) => {
+router.put('/update/:topicId', async (req, res) => {
 
     try {
 
         const topic = await Topic.findById(req.params.topicId);
 
-        if (!topic) return next(new Error('Topic not found.'));
+        if (!topic) {
+            const error = new Error('Topic not found.');
+            return next(error);
+        }
 
         const newData = req.body;
 
@@ -78,4 +81,28 @@ router.get('/list_topics', async (req, res, next) => {
     }
 });
 
+router.delete('/delete/:topicId', async (req, res) => {
+    try {
+        await Topic.findByIdAndRemove(req.params.topicId).populate('user');
+
+        return res.send({
+            message: 'Topic successfully removed.'
+        });
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error deleting topic.' });
+    }
+});
+
+router.get('/list_topics', async (req, res) => {
+    try {
+        const topic = await Topic.find().populate(['user']);
+
+        return res.send({ topic });
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error loading topics.' });
+    }
+});
+
 module.exports = router;

From 3b5df2f54ff98db323c6c36eae0d63947e6b5c00 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 16:33:04 -0300
Subject: [PATCH 045/147] Add comment model and its creation route

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/topicRoutes.js | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 4c2ad1f..9325d6f 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -3,6 +3,7 @@ const router = express.Router();
 
 const Topic = require('../models/topic');
 const User = require('../models/user');
+const Comment = require('../models/comment');
 
 router.post('/create/:userId', async (req, res, next) => {
     
@@ -27,7 +28,7 @@ router.post('/create/:userId', async (req, res, next) => {
 
 });
 
-router.put('/update/:topicId', async (req, res) => {
+router.put('/update/:topicId', async (req, res, next) => {
 
     try {
 
@@ -94,7 +95,7 @@ router.delete('/delete/:topicId', async (req, res) => {
     }
 });
 
-router.get('/list_topics', async (req, res) => {
+router.get('/list_topics', async (req, res, next) => {
     try {
         const topic = await Topic.find().populate(['user']);
 
@@ -105,4 +106,27 @@ router.get('/list_topics', async (req, res) => {
     }
 });
 
+router.post('/comment/:topicId/:userId', async (req, res, next) => {
+    try {
+
+        const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
+        const user = await User.findById(req.params.userId);
+        const topic = await Topic.findById(req.params.topicId);
+
+        if (!user) return next(new Error('User not found.'));
+        if (!topic) return next(new Error('Topic not found.'));
+
+        await comment.save();
+
+        topic.comments.push(comment);
+        await topic.save();
+    
+        return res.send({ message: 'Comment successfully registered.' });
+
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error, it was not possible to comment.'});
+    }
+})
+
 module.exports = router;

From f527be697bcd27b4e0aa5a8ba555e94fc01bcea0 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 17:13:24 -0300
Subject: [PATCH 046/147] Create update comment function

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/topicRoutes.js | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 9325d6f..4e83da4 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -34,10 +34,7 @@ router.put('/update/:topicId', async (req, res, next) => {
 
         const topic = await Topic.findById(req.params.topicId);
 
-        if (!topic) {
-            const error = new Error('Topic not found.');
-            return next(error);
-        }
+        if (!topic) return next(new Error('Topic not found.'));
 
         const newData = req.body;
 
@@ -127,6 +124,30 @@ router.post('/comment/:topicId/:userId', async (req, res, next) => {
         console.log(err);
         return res.next({ error: 'Error, it was not possible to comment.'});
     }
-})
+});
+
+router.put('/update_comment/:commentId', async (req, res, next) => {
+
+    try {
+
+        const comment = await Comment.findById(req.params.commentId);
+
+        if (!comment) return next(new Error('Comment not found.'));
+
+        const newData = req.body;
+
+        if (!newData.text) return next(new Error('Comment should not be empty.'));;
+    
+        await Comment.findOneAndUpdate({_id: req.params.commentId}, req.body, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: 'Comment updated successfully.'});
+        });
+
+    } catch (err) {
+        console.log(err);
+        return res.next({ error: 'Error updating comment.' });
+    }
+
+});
 
 module.exports = router;

From a55668a1aeb9f5cf9e0099dd6b11cfc8bcc304b6 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 24 Sep 2020 17:17:57 -0300
Subject: [PATCH 047/147] Create comment Routes file

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/index.js              | 1 +
 src/routes/topicRoutes.js | 1 -
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/index.js b/src/index.js
index 1647880..a049c1b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -11,6 +11,7 @@ const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
 const authRoutes = require('./routes/authRoutes');
 const topicRoutes = require('./routes/topicRoutes');
+const commentRoutes = require('./routes/commentRoutes');
 
 // MongoDB connection
 
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 4e83da4..3a91a0f 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -3,7 +3,6 @@ const router = express.Router();
 
 const Topic = require('../models/topic');
 const User = require('../models/user');
-const Comment = require('../models/comment');
 
 router.post('/create/:userId', async (req, res, next) => {
     

From 55337dae59e2a0ea6508514780d072db2ba75f8d Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Fri, 9 Oct 2020 11:12:53 -0300
Subject: [PATCH 048/147] Solve conflicts that were created after rebase

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/config/index.js       |  5 -----
 src/index.js              |  5 +----
 src/models/Comment.js     |  2 +-
 src/models/comment.js     | 36 ------------------------------------
 src/models/index.js       |  0
 src/routes/index.js       |  0
 src/routes/topicRoutes.js | 19 ++++++++-----------
 src/schemas/index.js      |  0
 8 files changed, 10 insertions(+), 57 deletions(-)
 delete mode 100644 src/config/index.js
 delete mode 100644 src/models/comment.js
 delete mode 100644 src/models/index.js
 delete mode 100644 src/routes/index.js
 delete mode 100644 src/schemas/index.js

diff --git a/src/config/index.js b/src/config/index.js
deleted file mode 100644
index aef1de3..0000000
--- a/src/config/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
-    app : {
-        port: process.env.PORT || 3000,
-    },    
-};
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
index a049c1b..eb8a212 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,5 +1,4 @@
 require('dotenv').config();
-const config = require('./config')
 const express = require('express');
 const app = express();
 const morgan = require('morgan');
@@ -10,9 +9,6 @@ const plantRoutes = require('./routes/plantRoutes');
 const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
 const authRoutes = require('./routes/authRoutes');
-const topicRoutes = require('./routes/topicRoutes');
-const commentRoutes = require('./routes/commentRoutes');
-
 // MongoDB connection
 
 //mongodb://localhost:27017/noderest  => meu banco de dados local polupado
@@ -39,6 +35,7 @@ app.use('/comment',commentRoutes);
 app.use('/auth',authRoutes);
 
 // starting the server
+app.set('port', process.env.PORT || 3000);
 app.listen(app.get('port'), () => {
     console.log(`Server on port ${app.get('port')}`);
 });
diff --git a/src/models/Comment.js b/src/models/Comment.js
index 3d0abd7..60a8623 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -33,4 +33,4 @@ module.exports = Comment;
 //	"profile_picture":"7",
 //	"gbifID":"17",
 //	"stateProvince":"brasilia"
-//}	
+//}	
\ No newline at end of file
diff --git a/src/models/comment.js b/src/models/comment.js
deleted file mode 100644
index 3d0abd7..0000000
--- a/src/models/comment.js
+++ /dev/null
@@ -1,36 +0,0 @@
-const mongoose = require('mongoose');
-
-const CommentSchema = new mongoose.Schema({
-    username: {
-        type: String,
-        require : true
-    },
-    message: {
-        type: String,
-        require: true
-    },
-    vote_count:{
-        type: Number,
-        require:true
-    }
-
-});
-
-
-const Comment = mongoose.model('comment',CommentSchema);
-
-module.exports = Comment;
-//Exemplo de teste insominia
-//{
-//	"scientificName":"scientificName",
-//	"family_name":"family_name",
-//	"gender_name":"gender_name",
-//	"specie_name":"specie_name",
-//	"usage":"usage",
-//	"first_User":"first_User",
-//	"collection_count":"17",
-//	"extinction":"1",
-//	"profile_picture":"7",
-//	"gbifID":"17",
-//	"stateProvince":"brasilia"
-//}	
diff --git a/src/models/index.js b/src/models/index.js
deleted file mode 100644
index e69de29..0000000
diff --git a/src/routes/index.js b/src/routes/index.js
deleted file mode 100644
index e69de29..0000000
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 3a91a0f..4483bcb 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -11,8 +11,6 @@ router.post('/create/:userId', async (req, res, next) => {
         const topic = await Topic.create({...req.body, user: req.params.userId});
         const user = await User.findById(req.params.userId);
 
-        if (!user) return next( new Error('User not found.'));
-
         await topic.save();
 
         user.topics.push(topic);
@@ -21,8 +19,7 @@ router.post('/create/:userId', async (req, res, next) => {
         return res.send({ topic });
 
     } catch (err) {
-        console.log(err);
-        return next({ error: 'Error creating topic.' });
+        return res.status(400).send({ error: 'Error while creating topic.'});
     }
 
 });
@@ -33,8 +30,6 @@ router.put('/update/:topicId', async (req, res, next) => {
 
         const topic = await Topic.findById(req.params.topicId);
 
-        if (!topic) return next(new Error('Topic not found.'));
-
         const newData = req.body;
 
         if (!newData.title) newData.title = topic.title;
@@ -48,33 +43,35 @@ router.put('/update/:topicId', async (req, res, next) => {
         });
 
     } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error updating topic.' });
+        return res.status(400).send({ error: 'Error while updating topic.'});
     }
 
 });
 
 router.delete('/delete/:topicId', async (req, res, next) => {
     try {
+
         await Topic.findByIdAndRemove(req.params.topicId).populate('user');
 
         return res.send({
             message: 'Topic successfully removed.'
         });
+
     } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error deleting topic.' });
+        return res.status(400).send({ error: 'Error while deleting topic.'});
     }
 });
 
 router.get('/list_topics', async (req, res, next) => {
     try {
+
         const topic = await Topic.find().populate(['user']);
 
         return res.send({ topic });
+
     } catch (err) {
         console.log(err);
-        return res.next({ error: 'Error loading topics.' });
+        return res.status(400).send({ error: 'Error while listing topics.'});
     }
 });
 
diff --git a/src/schemas/index.js b/src/schemas/index.js
deleted file mode 100644
index e69de29..0000000

From b6db8bb65c200b51e64345a777522dbfcd2efb50 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Fri, 9 Oct 2020 12:03:59 -0300
Subject: [PATCH 049/147] Fix error handling to follow project pattern

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/authRoutes.js  | 22 ++++++++++++----------
 src/routes/topicRoutes.js |  4 ++--
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 71f88b8..e491947 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -18,25 +18,24 @@ router.post('/signup', async(req, res, next) => {
         const newUserData = req.body;
         const result = userSchema.validate(req.body);
 
-        if( await User.findOne({ username: newUserData.username}) ) {
-            const error = new Error('Username already being used.');
-            return next(error);
-        }
+        await User.findOne({ username: newUserData.username});
 
         if( result.error ) {
-            return next(result.error);
+            return res.status(400).send({ error: 'Error while signing up. ' + result.error})
         }
 
         const user = new User(newUserData);
 
         user.save()
             .then( result => {
-                return res.send(result);
+                return res.send(user);
             })
-            .catch( err => next(err));
+            .catch(err => {
+                return res.status(400).send({ error: 'Error while signing up. ' + err});
+            });
 
     } catch(err) {
-        return next(err);
+        return res.status(400).send({ error: 'Error while signing up.'});
     }
 
 });
@@ -67,10 +66,13 @@ router.put('/update-user/:id', async(req, res, next) => {
         await User.findOneAndUpdate({_id: req.params.id}, req.body, { useFindAndModify: false})
                     .then( () => {
                         res.send({ message: 'User updated successfully.'});
+                    })
+                    .catch(err => {
+                        return res.status(400).send({ error: 'Error while updating user. ' + err});
                     });
 
     } catch(err) {
-        return next(err);
+        return res.status(400).send({ error: 'Error while updating user.' + err});
     }
 
 });
@@ -83,7 +85,7 @@ router.delete('/delete-user/:id', async(req, res, next) => {
         return res.send({ message: 'User successfully deleted.' });
 
     } catch(err) {
-        return next(err);
+        return res.status(400).send({ error: 'Error while deleting user. ' + err});
     }
 
 });
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 4483bcb..ba0aa01 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -19,7 +19,7 @@ router.post('/create/:userId', async (req, res, next) => {
         return res.send({ topic });
 
     } catch (err) {
-        return res.status(400).send({ error: 'Error while creating topic.'});
+        return res.status(400).send({ error: 'Error while creating topic.' + err});
     }
 
 });
@@ -51,7 +51,7 @@ router.put('/update/:topicId', async (req, res, next) => {
 router.delete('/delete/:topicId', async (req, res, next) => {
     try {
 
-        await Topic.findByIdAndRemove(req.params.topicId).populate('user');
+        await Topic.findByIdAndRemove(req.params.topicId).populate('user')
 
         return res.send({
             message: 'Topic successfully removed.'

From 52f17dc0177d36fc047001904a1f55e94116e6a7 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Fri, 9 Oct 2020 13:31:56 -0300
Subject: [PATCH 050/147] Adds upvote and downvote to topics

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/models/topic.js       |  8 ++++++++
 src/routes/authRoutes.js  | 28 +++++++++-------------------
 src/routes/topicRoutes.js | 35 ++++++++++++++++++++++++++++++-----
 3 files changed, 47 insertions(+), 24 deletions(-)

diff --git a/src/models/topic.js b/src/models/topic.js
index aee0ff1..548552a 100644
--- a/src/models/topic.js
+++ b/src/models/topic.js
@@ -15,6 +15,14 @@ const topicSchema = new Schema({
         ref: 'User',
         require: true,
     },
+    likes: {
+        type: Number,
+        default: 0
+    },
+    dislikes: {
+        type: Number,
+        default: 0
+    },
     comments: [{
         type: Schema.Types.ObjectId,
         ref: 'Comment'
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index e491947..39803db 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -11,7 +11,7 @@ router.get('/', (req, res) => {
     });
 });
 
-router.post('/signup', async(req, res, next) => {
+router.post('/signup', async(req, res) => {
 
     try {
 
@@ -20,14 +20,12 @@ router.post('/signup', async(req, res, next) => {
 
         await User.findOne({ username: newUserData.username});
 
-        if( result.error ) {
-            return res.status(400).send({ error: 'Error while signing up. ' + result.error})
-        }
+        if ( result.error ) return res.status(400).send({ error: 'Error while signing up. ' + result.error});
 
         const user = new User(newUserData);
 
         user.save()
-            .then( result => {
+            .then( () => {
                 return res.send(user);
             })
             .catch(err => {
@@ -40,28 +38,20 @@ router.post('/signup', async(req, res, next) => {
 
 });
 
-router.put('/update-user/:id', async(req, res, next) => {
+router.put('/update_user/:id', async(req, res) => {
 
     try {
 
         const user = await User.findById(req.params.id);
         const newData = req.body;
 
-        if ( !newData.username ) {
-            newData.username = user.username;
-        }
-        if ( !newData.password ) {
-            newData.password = user.password;
-        }
-        if ( !newData.email ) {
-            newData.email = user.email;
-        }
+        if ( !newData.username ) newData.username = user.username;
+        if ( !newData.password ) newData.password = user.password;
+        if ( !newData.email ) newData.email = user.email;
 
         const result = userSchema.validate(newData);
 
-        if(result.error) {
-            return next(result.error);
-        }
+        if ( result.error ) return res.status(400).send(result.error);
         
         await User.findOneAndUpdate({_id: req.params.id}, req.body, { useFindAndModify: false})
                     .then( () => {
@@ -77,7 +67,7 @@ router.put('/update-user/:id', async(req, res, next) => {
 
 });
 
-router.delete('/delete-user/:id', async(req, res, next) => {
+router.delete('/delete_user/:id', async(req, res) => {
     
     try {
         
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index ba0aa01..755b8b5 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -4,7 +4,7 @@ const router = express.Router();
 const Topic = require('../models/topic');
 const User = require('../models/user');
 
-router.post('/create/:userId', async (req, res, next) => {
+router.post('/create/:userId', async (req, res) => {
     
     try {
 
@@ -24,7 +24,7 @@ router.post('/create/:userId', async (req, res, next) => {
 
 });
 
-router.put('/update/:topicId', async (req, res, next) => {
+router.put('/update/:topicId', async (req, res) => {
 
     try {
 
@@ -48,7 +48,7 @@ router.put('/update/:topicId', async (req, res, next) => {
 
 });
 
-router.delete('/delete/:topicId', async (req, res, next) => {
+router.delete('/delete/:topicId', async (req, res) => {
     try {
 
         await Topic.findByIdAndRemove(req.params.topicId).populate('user')
@@ -62,7 +62,7 @@ router.delete('/delete/:topicId', async (req, res, next) => {
     }
 });
 
-router.get('/list_topics', async (req, res, next) => {
+router.get('/list', async (req, res) => {
     try {
 
         const topic = await Topic.find().populate(['user']);
@@ -70,7 +70,32 @@ router.get('/list_topics', async (req, res, next) => {
         return res.send({ topic });
 
     } catch (err) {
-        console.log(err);
+        return res.status(400).send({ error: 'Error while listing topics.'});
+    }
+});
+
+router.post('/like/:topicId', async (req, res) => {
+    try {
+
+        await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: 'Liked!'});
+        });
+        
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while listing topics.'});
+    }
+});
+
+router.post('/dislike/:topicId', async (req, res) => {
+    try {
+
+        await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: 'Disliked!'});
+        });
+        
+    } catch (err) {
         return res.status(400).send({ error: 'Error while listing topics.'});
     }
 });

From a81b874aac15b212ad98405dd681b77b95ba18a7 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Fri, 9 Oct 2020 14:06:01 -0300
Subject: [PATCH 051/147] Fix error handling to follow project pattern and add
 comment properties

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/models/Comment.js       | 44 +++++++++++++++++--------------------
 src/routes/commentRoutes.js | 23 ++++++++-----------
 2 files changed, 29 insertions(+), 38 deletions(-)

diff --git a/src/models/Comment.js b/src/models/Comment.js
index 60a8623..dcdb05d 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -1,36 +1,32 @@
 const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
 
 const CommentSchema = new mongoose.Schema({
-    username: {
+    text: {
         type: String,
-        require : true
+        require: true,
     },
-    message: {
-        type: String,
-        require: true
+    user: {
+        type: Schema.Types.ObjectId,
+        ref: 'User',
+        require: true,
+    },
+    topic: {
+        type: Schema.Types.ObjectId,
+        ref: 'Topic',
+        require: true,
     },
-    vote_count:{
+    likes: {
         type: Number,
-        require:true
-    }
-
+        default: 0
+    },
+    dislikes: {
+        type: Number,
+        default: 0
+    },
 });
 
 
-const Comment = mongoose.model('comment',CommentSchema);
+const Comment = mongoose.model('Comment',CommentSchema);
 
 module.exports = Comment;
-//Exemplo de teste insominia
-//{
-//	"scientificName":"scientificName",
-//	"family_name":"family_name",
-//	"gender_name":"gender_name",
-//	"specie_name":"specie_name",
-//	"usage":"usage",
-//	"first_User":"first_User",
-//	"collection_count":"17",
-//	"extinction":"1",
-//	"profile_picture":"7",
-//	"gbifID":"17",
-//	"stateProvince":"brasilia"
-//}	
\ No newline at end of file
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index a9ea9b4..cf685eb 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -5,40 +5,36 @@ const Topic = require('../models/topic');
 const User = require('../models/user');
 const Comment = require('../models/comment');
 
-router.post('/create/:topicId/:userId', async (req, res, next) => {
+router.post('/create/:topicId/:userId', async (req, res) => {
     try {
 
         const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
         const user = await User.findById(req.params.userId);
         const topic = await Topic.findById(req.params.topicId);
 
-        if (!user) return next(new Error('User not found.'));
-        if (!topic) return next(new Error('Topic not found.'));
-
         await comment.save();
 
         topic.comments.push(comment);
         await topic.save();
+
+        user.comments.push(comment);
+        await topic.save();
     
         return res.send({ message: 'Comment successfully registered.' });
 
     } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error, it was not possible to comment.'});
+        return res.status(400).send({ error: 'Error while commenting.' + err});
     }
 });
 
-router.put('/update/:commentId', async (req, res, next) => {
+router.put('/update/:commentId', async (req, res) => {
 
     try {
 
-        const comment = await Comment.findById(req.params.commentId);
-
-        if (!comment) return next(new Error('Comment not found.'));
-
+        await Comment.findById(req.params.commentId);
         const newData = req.body;
 
-        if (!newData.text) return next(new Error('Comment should not be empty.'));;
+        if ( !newData.text ) return res.status(400).send({ error: 'Comment should not be empty'});
     
         await Comment.findOneAndUpdate({_id: req.params.commentId}, req.body, { useFindAndModify: false})
         .then( () => {
@@ -46,8 +42,7 @@ router.put('/update/:commentId', async (req, res, next) => {
         });
 
     } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error updating comment.' });
+        return res.status(400).send({ error: 'Error while updating comment.' + err});
     }
 
 });

From 1db34ad1323227b3251b8cdf61046756583f4f82 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Sun, 11 Oct 2020 13:41:54 -0300
Subject: [PATCH 052/147] Associate topic with specific plant

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/models/Plant.js       | 9 ++++-----
 src/models/topic.js       | 5 +++++
 src/routes/topicRoutes.js | 7 ++++++-
 3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/models/Plant.js b/src/models/Plant.js
index 412b525..0e31893 100644
--- a/src/models/Plant.js
+++ b/src/models/Plant.js
@@ -50,14 +50,13 @@ const PlantSchema = new mongoose.Schema({
         type: String,
         require : true
     },
-    topicos: [{
+    topics: [{
         type: mongoose.Schema.Types.ObjectId,
-        ref: 'topic',
-  
+        ref: 'Topic',
     }],
 });
 
 
-const Plant = mongoose.model('plant',PlantSchema);
+const Plant = mongoose.model('Plant',PlantSchema);
 
-module.exports = Plant;
\ No newline at end of file
+module.exports = Plant;
diff --git a/src/models/topic.js b/src/models/topic.js
index 548552a..26d0e13 100644
--- a/src/models/topic.js
+++ b/src/models/topic.js
@@ -10,6 +10,11 @@ const topicSchema = new Schema({
         type: String,
         require: true,
     },
+    plant:{
+        type:mongoose.Schema.Types.ObjectId,
+        ref:'Plant',
+        require:true
+    },
     user: {
         type: Schema.Types.ObjectId,
         ref: 'User',
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 755b8b5..6a7dc9a 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -3,18 +3,23 @@ const router = express.Router();
 
 const Topic = require('../models/topic');
 const User = require('../models/user');
+const Plant = require('../models/Plant');
 
-router.post('/create/:userId', async (req, res) => {
+router.post('/create/:plantId/:userId', async (req, res) => {
     
     try {
 
         const topic = await Topic.create({...req.body, user: req.params.userId});
         const user = await User.findById(req.params.userId);
+        const plant = await Plant.findById(req.params.plantId);
 
         await topic.save();
 
         user.topics.push(topic);
         await user.save();
+
+        plant.topics.push(topic);
+        await plant.save();
     
         return res.send({ topic });
 

From a777192f03cedad36dd19fa9164cfb10b3bfe33e Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Sun, 11 Oct 2020 14:15:34 -0300
Subject: [PATCH 053/147] Add comment deletion

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/commentRoutes.js | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index cf685eb..3f29ecf 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -9,16 +9,12 @@ router.post('/create/:topicId/:userId', async (req, res) => {
     try {
 
         const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
-        const user = await User.findById(req.params.userId);
         const topic = await Topic.findById(req.params.topicId);
 
         await comment.save();
 
         topic.comments.push(comment);
         await topic.save();
-
-        user.comments.push(comment);
-        await topic.save();
     
         return res.send({ message: 'Comment successfully registered.' });
 
@@ -47,4 +43,20 @@ router.put('/update/:commentId', async (req, res) => {
 
 });
 
+router.delete('/update/:commentId', async (req, res) => {
+
+    try {
+
+        await Comment.findByIdAndRemove(req.params.commentId).populate('user')
+
+        return res.send({
+            message: 'Comment successfully removed.'
+        });
+
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while deleting topic.'});
+    }
+
+});
+
 module.exports = router;

From c8865686c53e7f7a4cd53c0d93bda509123e23d8 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Sun, 11 Oct 2020 14:21:21 -0300
Subject: [PATCH 054/147] Add comment upvote and downvote

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/models/{topic.js => Topic.js} |  0
 src/models/Topico.js              | 21 -------------------
 src/models/{user.js => User.js}   |  0
 src/routes/authRoutes.js          |  6 +++---
 src/routes/commentRoutes.js       | 34 +++++++++++++++++++++++++++----
 src/routes/itemRoutes.js          |  2 +-
 src/routes/plantRoutes.js         | 16 +++++++--------
 src/routes/topicRoutes.js         |  8 ++++----
 8 files changed, 46 insertions(+), 41 deletions(-)
 rename src/models/{topic.js => Topic.js} (100%)
 delete mode 100644 src/models/Topico.js
 rename src/models/{user.js => User.js} (100%)

diff --git a/src/models/topic.js b/src/models/Topic.js
similarity index 100%
rename from src/models/topic.js
rename to src/models/Topic.js
diff --git a/src/models/Topico.js b/src/models/Topico.js
deleted file mode 100644
index 9cead4a..0000000
--- a/src/models/Topico.js
+++ /dev/null
@@ -1,21 +0,0 @@
-const mongoose = require('mongoose');
-
-const TopicoSchema = new mongoose.Schema({
-    plant:{
-        type:mongoose.Schema.Types.ObjectId,
-        ref:'plant',
-        require:true
-
-    },
-    description: {
-        type: String,
-        require: true
-    }
-
-});
-
-
-
-const Topico = mongoose.model('topic',TopicoSchema);
-
-module.exports = Topico;
\ No newline at end of file
diff --git a/src/models/user.js b/src/models/User.js
similarity index 100%
rename from src/models/user.js
rename to src/models/User.js
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 39803db..eebf051 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -2,7 +2,7 @@ const express = require('express');
 
 const router = express.Router();
 
-const User = require('../models/user');
+const User = require('../models/User');
 const userSchema = require('../schemas/userSchema');
 
 router.get('/', (req, res) => {
@@ -38,7 +38,7 @@ router.post('/signup', async(req, res) => {
 
 });
 
-router.put('/update_user/:id', async(req, res) => {
+router.put('/update/:id', async(req, res) => {
 
     try {
 
@@ -67,7 +67,7 @@ router.put('/update_user/:id', async(req, res) => {
 
 });
 
-router.delete('/delete_user/:id', async(req, res) => {
+router.delete('/delete/:id', async(req, res) => {
     
     try {
         
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 3f29ecf..210de4c 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,9 +1,9 @@
 const express = require('express');
 const router = express.Router();
 
-const Topic = require('../models/topic');
-const User = require('../models/user');
-const Comment = require('../models/comment');
+const Topic = require('../models/Topic');
+const User = require('../models/User');
+const Comment = require('../models/Comment');
 
 router.post('/create/:topicId/:userId', async (req, res) => {
     try {
@@ -43,7 +43,7 @@ router.put('/update/:commentId', async (req, res) => {
 
 });
 
-router.delete('/update/:commentId', async (req, res) => {
+router.delete('/delete/:commentId', async (req, res) => {
 
     try {
 
@@ -59,4 +59,30 @@ router.delete('/update/:commentId', async (req, res) => {
 
 });
 
+router.post('/like/:commentId', async (req, res) => {
+    try {
+
+        await Comment.findOneAndUpdate({_id: req.params.commentId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: 'Liked!'});
+        });
+        
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while liking comment.'});
+    }
+});
+
+router.post('/dislike/:commentId', async (req, res) => {
+    try {
+
+        await Comment.findOneAndUpdate({_id: req.params.commentId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: 'Disliked!'});
+        });
+        
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while linking comment.'});
+    }
+});
+
 module.exports = router;
diff --git a/src/routes/itemRoutes.js b/src/routes/itemRoutes.js
index a1d8b76..2a8079c 100644
--- a/src/routes/itemRoutes.js
+++ b/src/routes/itemRoutes.js
@@ -1,6 +1,6 @@
 const { Router } = require('express');
 const router = Router();
-const Item = require('../models/item');
+const Item = require('../models/Item');
 const ItemSchema = require('../schemas/itemSchema');
 
 // Get all
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index ed4c1e0..54a5085 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -1,7 +1,7 @@
 const express = require('express');
 
 const Plant = require('../models/Plant');
-const Topico = require('../models/Topico');
+const Topic = require('../models/Topic');
 
 const router = express.Router();
 
@@ -30,7 +30,7 @@ router.post('/register', async (req , res) => {
 //Listagem de Todas as plantas
 router.get('/', async (req , res) => {
     try{
-        const plants = await Plant.find().populate('topicos');
+        const plants = await Plant.find().populate('topics');
 
         return res.send({ plants });
     }catch (err){
@@ -40,7 +40,7 @@ router.get('/', async (req , res) => {
 //Procurando planta por id
 router.get('/:plantId', async (req , res) => {
     try{
-        const plant = await Plant.findById(req.params.plantId).populate('topicos');
+        const plant = await Plant.findById(req.params.plantId).populate('topics');
 
         return res.send({ plant });
     }catch (err){
@@ -66,15 +66,15 @@ router.put('/:plantId', async (req , res) => {
             const plant = await Plant.findByIdAndUpdate(req.params.plantId,
                 {scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince},{ new: true});
             
-            plant.topicos = [];
-            await Topico.remove({plant: plant._id});
+            plant.topics = [];
+            await Topic.remove({plant: plant._id});
 
-            await Promise.all(topicos.map(async topico =>{
-                const plantTopic = new Topico({...topico,plant : plant._id});
+            await Promise.all(topics.map(async topic =>{
+                const plantTopic = new Topic({...topic,plant : plant._id});
     
                 await plantTopic.save();
     
-                plant.topicos.push(plantTopic);
+                plant.topics.push(plantTopic);
             }));
     
             await plant.save();
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 6a7dc9a..8481cb3 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -1,8 +1,8 @@
 const express = require('express');
 const router = express.Router();
 
-const Topic = require('../models/topic');
-const User = require('../models/user');
+const Topic = require('../models/Topic');
+const User = require('../models/User');
 const Plant = require('../models/Plant');
 
 router.post('/create/:plantId/:userId', async (req, res) => {
@@ -88,7 +88,7 @@ router.post('/like/:topicId', async (req, res) => {
         });
         
     } catch (err) {
-        return res.status(400).send({ error: 'Error while listing topics.'});
+        return res.status(400).send({ error: 'Error while liking topic.'});
     }
 });
 
@@ -101,7 +101,7 @@ router.post('/dislike/:topicId', async (req, res) => {
         });
         
     } catch (err) {
-        return res.status(400).send({ error: 'Error while listing topics.'});
+        return res.status(400).send({ error: 'Error while dislikinng topic.'});
     }
 });
 

From 864e36218897c3ce808c76e1ea4143f0a070887d Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Sun, 11 Oct 2020 14:59:18 -0300
Subject: [PATCH 055/147] Add topic schema and verificate if comment is not
 empty

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/commentRoutes.js |  2 ++
 src/routes/topicRoutes.js   | 15 ++++++++++++---
 src/schemas/topicSchema.js  |  8 ++++++++
 3 files changed, 22 insertions(+), 3 deletions(-)
 create mode 100644 src/schemas/topicSchema.js

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 210de4c..cd5e404 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -8,6 +8,8 @@ const Comment = require('../models/Comment');
 router.post('/create/:topicId/:userId', async (req, res) => {
     try {
 
+        if ( !req.body.text ) return res.status(400).send({ error: 'Comment should not be empty'});
+
         const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
         const topic = await Topic.findById(req.params.topicId);
 
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 8481cb3..5855e28 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -4,15 +4,21 @@ const router = express.Router();
 const Topic = require('../models/Topic');
 const User = require('../models/User');
 const Plant = require('../models/Plant');
+const topicSchema = require('../schemas/topicSchema');
 
 router.post('/create/:plantId/:userId', async (req, res) => {
     
     try {
 
-        const topic = await Topic.create({...req.body, user: req.params.userId});
         const user = await User.findById(req.params.userId);
         const plant = await Plant.findById(req.params.plantId);
 
+        const result = topicSchema.validate(req.body);
+
+        if ( result.error ) return res.status(400).send({ error: 'Error while creating topic. ' + result.error});
+
+        const topic = await Topic.create({...req.body, user: req.params.userId});
+
         await topic.save();
 
         user.topics.push(topic);
@@ -39,10 +45,13 @@ router.put('/update/:topicId', async (req, res) => {
 
         if (!newData.title) newData.title = topic.title;
         if (!newData.description) newData.description = topic.description;
-        if (!newData.completed) newData.completed = topic.completed;
 
+        const result = topicSchema.validate(newData);
+        if ( result.error ) return res.status(400).send({ error: 'Error while creating topic. ' + result.error});
+        
+        if (!newData.completed) newData.completed = topic.completed;
     
-        await Topic.findOneAndUpdate({_id: req.params.topicId}, req.body, { useFindAndModify: false})
+        await Topic.findOneAndUpdate({_id: req.params.topicId}, newData, { useFindAndModify: false})
         .then( () => {
             res.send({ message: 'Topic updated successfully.'});
         });
diff --git a/src/schemas/topicSchema.js b/src/schemas/topicSchema.js
new file mode 100644
index 0000000..e105942
--- /dev/null
+++ b/src/schemas/topicSchema.js
@@ -0,0 +1,8 @@
+const Joi = require('joi');
+
+const topicSchema = Joi.object({
+    title: Joi.string().min(4).max(30).required(),
+    description: Joi.string().min(5).required()
+});
+
+module.exports = topicSchema;

From 516d4b33bd500d90881a711a487fe24c526260e9 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Sun, 11 Oct 2020 16:01:11 -0300
Subject: [PATCH 056/147] Finish topic removal

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/topicRoutes.js | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 5855e28..bfe2fe9 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -17,7 +17,7 @@ router.post('/create/:plantId/:userId', async (req, res) => {
 
         if ( result.error ) return res.status(400).send({ error: 'Error while creating topic. ' + result.error});
 
-        const topic = await Topic.create({...req.body, user: req.params.userId});
+        const topic = await Topic.create({...req.body, user: req.params.userId, plant: req.params.plantId});
 
         await topic.save();
 
@@ -65,14 +65,31 @@ router.put('/update/:topicId', async (req, res) => {
 router.delete('/delete/:topicId', async (req, res) => {
     try {
 
-        await Topic.findByIdAndRemove(req.params.topicId).populate('user')
+        const topic = await Topic.findById(req.params.topicId);
+        const user = await User.findById(topic.user);
+        const plant = await Plant.findById(topic.plant);
+
+        const indexAtUser = user.topics.indexOf(req.params.topicId);
+        const indexAtPlant = plant.topics.indexOf(req.params.topicId);
+
+        if (indexAtUser > -1) {
+            user.topics.splice(indexAtUser, 1);
+        }
+        if (indexAtPlant > -1) {
+            plant.topics.splice(indexAtPlant, 1);
+        }
+
+        user.save();
+        plant.save();
+
+        await Topic.findByIdAndRemove(req.params.topicId, { useFindAndModify: false });
 
         return res.send({
             message: 'Topic successfully removed.'
         });
 
     } catch (err) {
-        return res.status(400).send({ error: 'Error while deleting topic.'});
+        return res.status(400).send({ error: 'Error while deleting topic.' + err });
     }
 });
 

From 72128b80217130ab61d4d4ed11f1da75da3624c4 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Sun, 11 Oct 2020 16:06:27 -0300
Subject: [PATCH 057/147] Finish comment removal

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/routes/authRoutes.js    |  4 ++--
 src/routes/commentRoutes.js | 21 ++++++++++++++++-----
 src/routes/topicRoutes.js   | 10 +++++-----
 3 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index eebf051..ec4d265 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -33,7 +33,7 @@ router.post('/signup', async(req, res) => {
             });
 
     } catch(err) {
-        return res.status(400).send({ error: 'Error while signing up.'});
+        return res.status(400).send({ error: 'Error while signing up.' + err });
     }
 
 });
@@ -75,7 +75,7 @@ router.delete('/delete/:id', async(req, res) => {
         return res.send({ message: 'User successfully deleted.' });
 
     } catch(err) {
-        return res.status(400).send({ error: 'Error while deleting user. ' + err});
+        return res.status(400).send({ error: 'Error while deleting user. ' + err });
     }
 
 });
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index cd5e404..4b708be 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -40,7 +40,7 @@ router.put('/update/:commentId', async (req, res) => {
         });
 
     } catch (err) {
-        return res.status(400).send({ error: 'Error while updating comment.' + err});
+        return res.status(400).send({ error: 'Error while updating comment.' + err });
     }
 
 });
@@ -49,14 +49,25 @@ router.delete('/delete/:commentId', async (req, res) => {
 
     try {
 
-        await Comment.findByIdAndRemove(req.params.commentId).populate('user')
+        const comment = await Comment.findById(req.params.commentId);
+        const topic = await Topic.findById(comment.topic);
+
+        const index = topic.comments.indexOf(req.params.commentId);
+
+        if (index > -1) {
+            topic.comments.splice(index, 1);
+        }
+
+        topic.save();
+
+        await Comment.findByIdAndRemove(req.params.commentId).populate('user');
 
         return res.send({
             message: 'Comment successfully removed.'
         });
 
     } catch (err) {
-        return res.status(400).send({ error: 'Error while deleting topic.'});
+        return res.status(400).send({ error: 'Error while deleting topic.' + err });
     }
 
 });
@@ -70,7 +81,7 @@ router.post('/like/:commentId', async (req, res) => {
         });
         
     } catch (err) {
-        return res.status(400).send({ error: 'Error while liking comment.'});
+        return res.status(400).send({ error: 'Error while liking comment.' + err });
     }
 });
 
@@ -83,7 +94,7 @@ router.post('/dislike/:commentId', async (req, res) => {
         });
         
     } catch (err) {
-        return res.status(400).send({ error: 'Error while linking comment.'});
+        return res.status(400).send({ error: 'Error while linking comment.' + err });
     }
 });
 
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index bfe2fe9..b6ab046 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -30,7 +30,7 @@ router.post('/create/:plantId/:userId', async (req, res) => {
         return res.send({ topic });
 
     } catch (err) {
-        return res.status(400).send({ error: 'Error while creating topic.' + err});
+        return res.status(400).send({ error: 'Error while creating topic.' + err });
     }
 
 });
@@ -57,7 +57,7 @@ router.put('/update/:topicId', async (req, res) => {
         });
 
     } catch (err) {
-        return res.status(400).send({ error: 'Error while updating topic.'});
+        return res.status(400).send({ error: 'Error while updating topic.' + err });
     }
 
 });
@@ -101,7 +101,7 @@ router.get('/list', async (req, res) => {
         return res.send({ topic });
 
     } catch (err) {
-        return res.status(400).send({ error: 'Error while listing topics.'});
+        return res.status(400).send({ error: 'Error while listing topics.' + err });
     }
 });
 
@@ -114,7 +114,7 @@ router.post('/like/:topicId', async (req, res) => {
         });
         
     } catch (err) {
-        return res.status(400).send({ error: 'Error while liking topic.'});
+        return res.status(400).send({ error: 'Error while liking topic.' + err });
     }
 });
 
@@ -127,7 +127,7 @@ router.post('/dislike/:topicId', async (req, res) => {
         });
         
     } catch (err) {
-        return res.status(400).send({ error: 'Error while dislikinng topic.'});
+        return res.status(400).send({ error: 'Error while dislikinng topic.' + err });
     }
 });
 

From 60891d0cf3e7102a9f354de5e1e5f21540c5b831 Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Mon, 12 Oct 2020 15:24:50 -0300
Subject: [PATCH 058/147] Fix password authentication in login

---
 src/routes/authRoutes.js | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 2bd2c05..4ed2239 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -22,10 +22,11 @@ router.post('/login', async(req, res) => {
     const {email, password} = req.body;
 
     const user = await User.findOne({ email, password });
-    /*const user = {
-        "email": "asda@asd.com",
-        "password": "asdz"
-    };*/
+    //Para testar estava utilizando a estrutura abaixo
+    // const user = {
+    //     "email": "asda@asd.com",
+    //     "password": "asdz"
+    // };
 
     if(!user){
         
@@ -33,7 +34,7 @@ router.post('/login', async(req, res) => {
 
     }
 
-    if(!await password == user.password){
+    if(await password != user.password){
         
         return res.status(400).send({ Error: 'Incorrect password'});
 

From 7c64a574e1ac7616e566cb7e24622fbac0a44d82 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Tue, 13 Oct 2020 09:56:18 -0300
Subject: [PATCH 059/147] Fix problems from review

---
 src/models/Topic.js        |  6 ----
 src/routes/topicRoutes.js  | 73 --------------------------------------
 src/schemas/topicSchema.js |  2 +-
 3 files changed, 1 insertion(+), 80 deletions(-)

diff --git a/src/models/Topic.js b/src/models/Topic.js
index 26d0e13..e08b34c 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -8,7 +8,6 @@ const topicSchema = new Schema({
     },
     description: {
         type: String,
-        require: true,
     },
     plant:{
         type:mongoose.Schema.Types.ObjectId,
@@ -36,11 +35,6 @@ const topicSchema = new Schema({
         type: Date,
         default: Date.now,
     },
-    completed: {
-        type: Boolean,
-        require: true,
-        default: false,
-    },
 });
 
 const Topic = mongoose.model('Topic', topicSchema);
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index b6ab046..525645b 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -48,8 +48,6 @@ router.put('/update/:topicId', async (req, res) => {
 
         const result = topicSchema.validate(newData);
         if ( result.error ) return res.status(400).send({ error: 'Error while creating topic. ' + result.error});
-        
-        if (!newData.completed) newData.completed = topic.completed;
     
         await Topic.findOneAndUpdate({_id: req.params.topicId}, newData, { useFindAndModify: false})
         .then( () => {
@@ -131,75 +129,4 @@ router.post('/dislike/:topicId', async (req, res) => {
     }
 });
 
-router.delete('/delete/:topicId', async (req, res) => {
-    try {
-        await Topic.findByIdAndRemove(req.params.topicId).populate('user');
-
-        return res.send({
-            message: 'Topic successfully removed.'
-        });
-    } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error deleting topic.' });
-    }
-});
-
-router.get('/list_topics', async (req, res, next) => {
-    try {
-        const topic = await Topic.find().populate(['user']);
-
-        return res.send({ topic });
-    } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error loading topics.' });
-    }
-});
-
-router.post('/comment/:topicId/:userId', async (req, res, next) => {
-    try {
-
-        const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
-        const user = await User.findById(req.params.userId);
-        const topic = await Topic.findById(req.params.topicId);
-
-        if (!user) return next(new Error('User not found.'));
-        if (!topic) return next(new Error('Topic not found.'));
-
-        await comment.save();
-
-        topic.comments.push(comment);
-        await topic.save();
-    
-        return res.send({ message: 'Comment successfully registered.' });
-
-    } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error, it was not possible to comment.'});
-    }
-});
-
-router.put('/update_comment/:commentId', async (req, res, next) => {
-
-    try {
-
-        const comment = await Comment.findById(req.params.commentId);
-
-        if (!comment) return next(new Error('Comment not found.'));
-
-        const newData = req.body;
-
-        if (!newData.text) return next(new Error('Comment should not be empty.'));;
-    
-        await Comment.findOneAndUpdate({_id: req.params.commentId}, req.body, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: 'Comment updated successfully.'});
-        });
-
-    } catch (err) {
-        console.log(err);
-        return res.next({ error: 'Error updating comment.' });
-    }
-
-});
-
 module.exports = router;
diff --git a/src/schemas/topicSchema.js b/src/schemas/topicSchema.js
index e105942..0e07919 100644
--- a/src/schemas/topicSchema.js
+++ b/src/schemas/topicSchema.js
@@ -2,7 +2,7 @@ const Joi = require('joi');
 
 const topicSchema = Joi.object({
     title: Joi.string().min(4).max(30).required(),
-    description: Joi.string().min(5).required()
+    description: Joi.string().min(5)
 });
 
 module.exports = topicSchema;

From 55dbe32a8d76144689e5f307cbf8ccfbd570c847 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Thu, 15 Oct 2020 13:13:23 -0300
Subject: [PATCH 060/147] Remove item files.

---
 src/index.js              |  2 --
 src/models/item.js        | 17 ---------
 src/routes/itemRoutes.js  | 73 ---------------------------------------
 src/schemas/itemSchema.js |  6 ----
 4 files changed, 98 deletions(-)
 delete mode 100644 src/models/item.js
 delete mode 100644 src/routes/itemRoutes.js
 delete mode 100644 src/schemas/itemSchema.js

diff --git a/src/index.js b/src/index.js
index b1861da..a29693a 100644
--- a/src/index.js
+++ b/src/index.js
@@ -3,7 +3,6 @@ const app = express();
 const morgan = require('morgan');
 const mongoose = require('mongoose');
 
-const itemRoutes = require('./routes/itemRoutes');
 const plantRoutes = require('./routes/plantRoutes');
 const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
@@ -27,7 +26,6 @@ app.use(express.urlencoded({extended: false}));
 app.use(express.json());
 
 // routes
-app.use('/item',itemRoutes);
 app.use('/plant',plantRoutes);
 app.use('/topic',topicRoutes);
 app.use('/comment',commentRoutes);
diff --git a/src/models/item.js b/src/models/item.js
deleted file mode 100644
index f550f7d..0000000
--- a/src/models/item.js
+++ /dev/null
@@ -1,17 +0,0 @@
-const mongoose = require('mongoose');
-
-var ItemSchema = mongoose.Schema({
-    name: {
-        type: String,
-        unique: true,
-        required: true
-    },
-    email: {
-        type: String,
-        required: true
-    },
-},{
-    timestamps: true
-});
-
-module.exports = Item = mongoose.model('Item', ItemSchema);
\ No newline at end of file
diff --git a/src/routes/itemRoutes.js b/src/routes/itemRoutes.js
deleted file mode 100644
index 2a8079c..0000000
--- a/src/routes/itemRoutes.js
+++ /dev/null
@@ -1,73 +0,0 @@
-const { Router } = require('express');
-const router = Router();
-const Item = require('../models/Item');
-const ItemSchema = require('../schemas/itemSchema');
-
-// Get all
-router.get('/', async (req,res,next) => {
-    try {
-        const items = await Item.find();
-        res.send(items);
-    } catch (error) {
-        next(error);
-    }
-});
-
-// Create One
-router.post('/add', async (req, res, next) => {
-    try {
-        const value = await ItemSchema.validateAsync(req.body, { abortEarly: false });
-        const validated = new Item(value);
-        const inserted = await validated.save();
-        res.json(inserted);
-    } catch (error) {
-        next(error);
-    }
-});
-
-// Get One
-router.get('/:id', async (req, res, next) => {
-    try {
-        const { id } = req.params;
-        const item = await Item.findOne({
-            _id: id
-        });
-        if (!item) return next();
-        return res.json(item);
-    } catch (error) {
-        next(error);
-    }
-})
-
-// Edit One
-router.put('/edit/:id', async (req,res, next) => {
-    try {
-        const { id } = req.params;
-        const value = await ItemSchema.validateAsync(req.body, { abortEarly: false })
-        const item = await Item.findOne({
-            _id: id
-        });
-        if (!item) return next();
-        const updated = await Item.update({
-            _id: id
-        }, {
-            $set: value
-        });
-        res.json(updated);
-    } catch (error) {
-        next(error);
-    }
-});
-
-router.delete('/delete/:id', async (req,res,next) => {
-    try {
-        const { id } = req.params;
-        const deleted = await Item.remove({_id: id});
-        res.json(deleted);
-    } catch (error) {
-        next(error);
-    }
-});
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/src/schemas/itemSchema.js b/src/schemas/itemSchema.js
deleted file mode 100644
index 75db8f2..0000000
--- a/src/schemas/itemSchema.js
+++ /dev/null
@@ -1,6 +0,0 @@
-const Joi = require('joi');
-
-module.exports = ItemSchema = Joi.object({
-    name: Joi.string().min(4).max(30).required(),
-    email: Joi.string().email().required(),
-})
\ No newline at end of file

From ca3fda51a586138dacc017ce39c01bd21ffb6856 Mon Sep 17 00:00:00 2001
From: Marofelipe <marofelipe@live.com>
Date: Fri, 16 Oct 2020 16:28:22 -0300
Subject: [PATCH 061/147] auth function was added and logout route was deleted

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 package-lock.json        | 20 ++++++---
 package.json             |  4 +-
 src/index.js             |  4 +-
 src/models/index.js      |  0
 src/models/user.js       |  6 ++-
 src/routes/auth.js       | 37 ++++++++++++++++
 src/routes/authRoutes.js | 92 +++++++++++-----------------------------
 src/routes/index.js      |  0
 src/schemas/index.js     |  0
 9 files changed, 86 insertions(+), 77 deletions(-)
 delete mode 100644 src/models/index.js
 create mode 100644 src/routes/auth.js
 delete mode 100644 src/routes/index.js
 delete mode 100644 src/schemas/index.js

diff --git a/package-lock.json b/package-lock.json
index 3cddde7..4f55c77 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -449,6 +449,11 @@
         "is-obj": "^2.0.0"
       }
     },
+    "dotenv": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
+      "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
+    },
     "duplexer3": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
@@ -663,6 +668,11 @@
         "toidentifier": "1.0.0"
       }
     },
+    "i": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
+      "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0="
+    },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -813,11 +823,6 @@
       "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
       "dev": true
     },
-    "kareem": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz",
-      "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
-    },
     "jsonwebtoken": {
       "version": "8.5.1",
       "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
@@ -861,6 +866,11 @@
         "safe-buffer": "^5.0.1"
       }
     },
+    "kareem": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz",
+      "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
+    },
     "keyv": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
diff --git a/package.json b/package.json
index a24ddad..cd92567 100644
--- a/package.json
+++ b/package.json
@@ -19,10 +19,12 @@
   },
   "homepage": "https://github.com/fga-eps-mds/2020.1-Grupo2-backend#readme",
   "dependencies": {
+    "dotenv": "^8.2.0",
     "express": "^4.17.1",
+    "i": "^0.3.6",
     "joi": "^17.2.1",
-    "mongoose": "^5.10.5",
     "jsonwebtoken": "^8.5.1",
+    "mongoose": "^5.10.5",
     "morgan": "^1.10.0"
   },
   "devDependencies": {
diff --git a/src/index.js b/src/index.js
index 7bc111d..a0b43e0 100644
--- a/src/index.js
+++ b/src/index.js
@@ -5,11 +5,12 @@ const mongoose = require('mongoose');
 
 const itemRoutes = require('./routes/itemRoutes');
 const authRoutes = require('./routes/authRoutes');
+const userRoutes = require('./routes/userRoutes');
 
 // MongoDB connection
 mongoose
     .connect(
-        'mongodb://mongo:27017/backend',
+        'mongodb://localhost:27017/noderest',
         { useNewUrlParser: true }
     )
     .then(() => console.log('MongoDB Connected'))
@@ -27,6 +28,7 @@ app.use(express.json());
 // routes
 app.use('/item',itemRoutes);
 app.use('/auth',authRoutes);
+app.use('/user',userRoutes);
 
 // starting the server
 app.listen(app.get('port'), () => {
diff --git a/src/models/index.js b/src/models/index.js
deleted file mode 100644
index e69de29..0000000
diff --git a/src/models/user.js b/src/models/user.js
index 5b87ad6..43af212 100644
--- a/src/models/user.js
+++ b/src/models/user.js
@@ -5,7 +5,8 @@ const Schema = mongoose.Schema;
 const userSchema = new Schema({
     username: {
         type: String,
-        required: true
+        required: true,
+        unique: true
     },
     password: {
         type: String,
@@ -13,7 +14,8 @@ const userSchema = new Schema({
     },
     email: {
         type: String,
-        required: true
+        required: true,
+        unique: true
     }
 });
 
diff --git a/src/routes/auth.js b/src/routes/auth.js
new file mode 100644
index 0000000..8ef7fe5
--- /dev/null
+++ b/src/routes/auth.js
@@ -0,0 +1,37 @@
+
+//confere se o token é valido
+
+const jsonwebtoken = require('jsonwebtoken');
+
+const authConfig = {
+    "secret": "d41d8cd98f00b204e9800998ecf8427e" 
+    
+};
+module.exports = (req, res, next) => {
+    const sessiontoken = req.headers.authtoken;
+
+    if(!sessiontoken){
+        return res.status(401).send({Error: 'Token not provided'});
+    }
+   
+    const parts = sessiontoken.split(' ');
+
+    if (!parts.length === 2){
+        return res.status(401).send({Error: 'Token error'});
+    }
+    
+    const [scheme, token] = parts;
+     
+    if(!/^Bearer$/i.test(scheme)){
+        return res.status(401).send({Error: 'Token malformated'});
+    }
+
+    jsonwebtoken.verify(token, authConfig.secret, (err, decoded) => {
+        if(err){
+            return res.status(401).send({Error: 'Token invalid'});
+        }
+    req.userId = decoded.id;
+    return next()
+        
+    });
+}
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 4ed2239..ce71b7e 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -7,15 +7,11 @@ const jsonwebtoken = require('jsonwebtoken');
 const User = require('../models/user');
 
 const userSchema = require('../schemas/userSchema');
+const auth = require('./auth');
 
-router.get('/', (req, res) => {
-    res.json({
-        message: 'Authentication!'
-    });
-});
 
 const authConfig = {
-    "secret": "d41d8cd98f00b204e9800998ecf8427e" 
+    "secret": "d41d8cd98f00b204e9800998ecf8427e"  
 };
 
 router.post('/login', async(req, res) => {    
@@ -55,104 +51,63 @@ router.post('/login', async(req, res) => {
     
 });
 
-router.get('/logout', async(req, res) => { 
-    const sessiontoken = req.headers.authtoken;
-
-    if(!sessiontoken){
-        return res.status(401).send({Error: 'Token not provided'});
-    }
-
-    const parts = sessiontoken.split(' ');
 
-    if (!parts.length === 2){
-        return res.status(401).send({Error: 'Token error'});
-    }
-    
-    const [scheme, token] = parts;
-
-    if(!/^Bearer$/i.test(scheme)){
-        return res.status(401).send({Error: 'Token malformated'});
-    }
-
-    jsonwebtoken.verify(token, authConfig.secret, (err, decoded) => {
-        if(err){
-            return res.status(401).send({Error: 'Token invalid'});
-        }
-
-        const token = jsonwebtoken.sign({id: decoded.id}, authConfig.secret,{
-            expiresIn: 1,
-        });
-
-    });
-
-    res.redirect('/login');
-});
-
-router.post('/signup', async(req, res, next) => {
+router.post('/signup', async(req, res) => {
 
     try {
 
         const newUserData = req.body;
         const result = userSchema.validate(req.body);
 
-        if( await User.findOne({ username: newUserData.username}) ) {
-            const error = new Error('Username already being used.');
-            return next(error);
-        }
+        await User.findOne({ username: newUserData.username});
 
-        if( result.error ) {
-            return next(result.error);
-        }
+        if ( result.error ) return res.status(400).send({ error: 'Error while signing up. ' + result.error});
 
         const user = new User(newUserData);
 
         user.save()
-            .then( result => {
-                return res.send(result);
+            .then( () => {
+                return res.send(user);
             })
-            .catch( err => next(err));
+            .catch(err => {
+                return res.status(400).send({ error: 'Error while signing up. ' + err});
+            });
 
     } catch(err) {
-        return next(err);
+        return res.status(400).send({ error: 'Error while signing up.' + err });
     }
 
 });
-
-router.put('/update-user/:id', async(req, res, next) => {
+router.put('/update/:id',auth, async(req, res) => {
 
     try {
 
         const user = await User.findById(req.params.id);
         const newData = req.body;
 
-        if ( !newData.username ) {
-            newData.username = user.username;
-        }
-        if ( !newData.password ) {
-            newData.password = user.password;
-        }
-        if ( !newData.email ) {
-            newData.email = user.email;
-        }
+        if ( !newData.username ) newData.username = user.username;
+        if ( !newData.password ) newData.password = user.password;
+        if ( !newData.email ) newData.email = user.email;
 
         const result = userSchema.validate(newData);
 
-        if(result.error) {
-            return next(result.error);
-        }
+        if ( result.error ) return res.status(400).send(result.error);
         
         await User.findOneAndUpdate({_id: req.params.id}, req.body, { useFindAndModify: false})
                     .then( () => {
                         res.send({ message: 'User updated successfully.'});
+                    })
+                    .catch(err => {
+                        return res.status(400).send({ error: 'Error while updating user. ' + err});
                     });
 
     } catch(err) {
-        return next(err);
+        return res.status(400).send({ error: 'Error while updating user.' + err});
     }
 
 });
 
-router.delete('/delete-user/:id', async(req, res, next) => {
+router.delete('/delete/:id',auth, async(req, res) => {
     
     try {
         
@@ -160,9 +115,10 @@ router.delete('/delete-user/:id', async(req, res, next) => {
         return res.send({ message: 'User successfully deleted.' });
 
     } catch(err) {
-        return next(err);
+        return res.status(400).send({ error: 'Error while deleting user. ' + err });
     }
 
 });
 
-module.exports = router;
\ No newline at end of file
+
+module.exports = router;
diff --git a/src/routes/index.js b/src/routes/index.js
deleted file mode 100644
index e69de29..0000000
diff --git a/src/schemas/index.js b/src/schemas/index.js
deleted file mode 100644
index e69de29..0000000

From ef14cb54ee7181dda15085d323698560e17c687d Mon Sep 17 00:00:00 2001
From: Marofelipe <marofelipe@live.com>
Date: Fri, 16 Oct 2020 16:44:55 -0300
Subject: [PATCH 062/147] put secret on .env

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/index.js             |  4 ++--
 src/routes/auth.js       |  7 ++++---
 src/routes/authRoutes.js | 13 +++----------
 3 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/src/index.js b/src/index.js
index a0b43e0..54fd137 100644
--- a/src/index.js
+++ b/src/index.js
@@ -5,7 +5,7 @@ const mongoose = require('mongoose');
 
 const itemRoutes = require('./routes/itemRoutes');
 const authRoutes = require('./routes/authRoutes');
-const userRoutes = require('./routes/userRoutes');
+
 
 // MongoDB connection
 mongoose
@@ -28,7 +28,7 @@ app.use(express.json());
 // routes
 app.use('/item',itemRoutes);
 app.use('/auth',authRoutes);
-app.use('/user',userRoutes);
+
 
 // starting the server
 app.listen(app.get('port'), () => {
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 8ef7fe5..178bee1 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -1,13 +1,13 @@
 
 //confere se o token é valido
-
+require('dotenv').config();
 const jsonwebtoken = require('jsonwebtoken');
 
 const authConfig = {
-    "secret": "d41d8cd98f00b204e9800998ecf8427e" 
+    "secret": process.env.SECRET 
     
 };
-module.exports = (req, res, next) => {
+function auth(req, res, next) {
     const sessiontoken = req.headers.authtoken;
 
     if(!sessiontoken){
@@ -35,3 +35,4 @@ module.exports = (req, res, next) => {
         
     });
 }
+module.exports = {authConfig,auth}
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index ce71b7e..e5b08f0 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -7,23 +7,16 @@ const jsonwebtoken = require('jsonwebtoken');
 const User = require('../models/user');
 
 const userSchema = require('../schemas/userSchema');
-const auth = require('./auth');
+const {auth,authConfig} = require('./auth');
 
 
-const authConfig = {
-    "secret": "d41d8cd98f00b204e9800998ecf8427e"  
-};
 
 router.post('/login', async(req, res) => {    
+
     const {email, password} = req.body;
 
     const user = await User.findOne({ email, password });
-    //Para testar estava utilizando a estrutura abaixo
-    // const user = {
-    //     "email": "asda@asd.com",
-    //     "password": "asdz"
-    // };
-
+  
     if(!user){
         
         return res.status(400).send({Error: 'User not found'});

From 1ab5a79f518f642fd47e11ff71aed003c35f0dc0 Mon Sep 17 00:00:00 2001
From: Marofelipe <marofelipe@live.com>
Date: Fri, 16 Oct 2020 16:51:40 -0300
Subject: [PATCH 063/147] uninstalled i dependence

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 package.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/package.json b/package.json
index cd92567..5b4c61a 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,6 @@
   "dependencies": {
     "dotenv": "^8.2.0",
     "express": "^4.17.1",
-    "i": "^0.3.6",
     "joi": "^17.2.1",
     "jsonwebtoken": "^8.5.1",
     "mongoose": "^5.10.5",

From 2104f8b533b4522fe2febac3b274ce5546162b61 Mon Sep 17 00:00:00 2001
From: Marofelipe <marofelipe@live.com>
Date: Fri, 16 Oct 2020 17:29:55 -0300
Subject: [PATCH 064/147] removed item and changed imports on authRoutes

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 package-lock.json        |  5 -----
 src/index.js             |  4 ++--
 src/models/user.js       | 16 +++++++++++-----
 src/routes/authRoutes.js |  4 ++--
 4 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 4f55c77..d788113 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -668,11 +668,6 @@
         "toidentifier": "1.0.0"
       }
     },
-    "i": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
-      "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0="
-    },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
diff --git a/src/index.js b/src/index.js
index f1d3bbe..6afa0b5 100644
--- a/src/index.js
+++ b/src/index.js
@@ -3,7 +3,7 @@ const app = express();
 const morgan = require('morgan');
 const mongoose = require('mongoose');
 
-const itemRoutes = require('./routes/itemRoutes');
+
 const authRoutes = require('./routes/authRoutes');
 const plantRoutes = require('./routes/plantRoutes');
 const topicRoutes = require('./routes/topicRoutes');
@@ -27,7 +27,7 @@ app.use(express.urlencoded({extended: false}));
 app.use(express.json());
 
 // routes
-app.use('/item',itemRoutes);
+
 app.use('/auth',authRoutes);
 app.use('/plant',plantRoutes);
 app.use('/topic',topicRoutes);
diff --git a/src/models/user.js b/src/models/user.js
index 43af212..26825bc 100644
--- a/src/models/user.js
+++ b/src/models/user.js
@@ -1,12 +1,11 @@
 const mongoose = require('mongoose');
-
 const Schema = mongoose.Schema;
 
 const userSchema = new Schema({
     username: {
         type: String,
         required: true,
-        unique: true
+        unique:true
     },
     password: {
         type: String,
@@ -15,10 +14,17 @@ const userSchema = new Schema({
     email: {
         type: String,
         required: true,
-        unique: true
-    }
+        unique:true
+    },
+    topics: [{
+        type: mongoose.Schema.Types.ObjectId,
+        ref: 'Topics',
+        require: true,
+    }]
 });
 
 const User = mongoose.model('User', userSchema);
 
-module.exports = User;
\ No newline at end of file
+module.exports = User;
+
+
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index d42e1a8..672e07b 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -1,12 +1,12 @@
 const express = require('express');
 const router = express.Router();
 const jsonwebtoken = require('jsonwebtoken');
-const User = require('../models/user');
+const User = require('../models/User');
 const userSchema = require('../schemas/userSchema');
 const {auth,authConfig} = require('./auth');
 
 
-router.post('/login', async(req, res) => {
+router.post('/login', async(req, res ,next) => {
   try{
     const {email, password} = req.body;
     const user = await User.findOne({ email, password });

From d8289708e609e2c961eff2874ff19eaabdbced89 Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Fri, 16 Oct 2020 17:42:14 -0300
Subject: [PATCH 065/147] Removes user.js and Update User.js

Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
Co-authored-by: Marcos Filipe <marofelipe@live.com>
---
 src/models/User.js |  6 ++++--
 src/models/user.js | 30 ------------------------------
 2 files changed, 4 insertions(+), 32 deletions(-)
 delete mode 100644 src/models/user.js

diff --git a/src/models/User.js b/src/models/User.js
index eb95e35..0faf8c4 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -4,7 +4,8 @@ const Schema = mongoose.Schema;
 const userSchema = new Schema({
     username: {
         type: String,
-        required: true
+        required: true,
+        unique:true
     },
     password: {
         type: String,
@@ -12,7 +13,8 @@ const userSchema = new Schema({
     },
     email: {
         type: String,
-        required: true
+        required: true,
+        unique:true
     },
     topics: [{
         type: mongoose.Schema.Types.ObjectId,
diff --git a/src/models/user.js b/src/models/user.js
deleted file mode 100644
index 26825bc..0000000
--- a/src/models/user.js
+++ /dev/null
@@ -1,30 +0,0 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
-
-const userSchema = new Schema({
-    username: {
-        type: String,
-        required: true,
-        unique:true
-    },
-    password: {
-        type: String,
-        required: true
-    },
-    email: {
-        type: String,
-        required: true,
-        unique:true
-    },
-    topics: [{
-        type: mongoose.Schema.Types.ObjectId,
-        ref: 'Topics',
-        require: true,
-    }]
-});
-
-const User = mongoose.model('User', userSchema);
-
-module.exports = User;
-
-

From bbc0c8a6cc4fc9378f4b65d785a1bd629cb19c15 Mon Sep 17 00:00:00 2001
From: Guilherme de Lyra <guilyra12@gmail.com>
Date: Mon, 19 Oct 2020 20:45:42 -0300
Subject: [PATCH 066/147] adding eslint
 https://github.com/fga-eps-mds/2020.1-GaiaDex-wiki/issues/101

---
 .eslintrc.json    |   33 +
 package-lock.json | 3561 ++++++++++++++++++++++++++++++++++++++++-----
 package.json      |  408 +++++-
 src/index.js      |    1 -
 yarn.lock         | 1356 -----------------
 5 files changed, 3607 insertions(+), 1752 deletions(-)
 create mode 100644 .eslintrc.json
 delete mode 100644 yarn.lock

diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..2a0e12c
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,33 @@
+{
+    "extends": [
+        "airbnb",
+        "prettier",
+        "prettier/react",
+        "plugin:prettier/recommended",
+        "eslint-config-prettier"
+    ],
+    "parser": "babel-eslint",
+    "rules": {
+        "import/no-unresolved": "off",
+        "react/jsx-filename-extension": [
+            1,
+            {
+                "extensions": [
+                    ".js",
+                    ".jsx"
+                ]
+            }
+        ],
+        "prettier/prettier": [
+            "error",
+            {
+                "trailingComma": "es5",
+                "singleQuote": true,
+                "printWidth": 100
+            }
+        ]
+    },
+    "plugins": [
+        "prettier"
+    ]
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index d788113..423614e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,9 +1,219 @@
 {
-  "name": "2020.1-Grupo2-backend",
+  "name": "2020.1-gaiadex-backend",
   "version": "1.0.0",
   "lockfileVersion": 1,
   "requires": true,
   "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==",
+      "requires": {
+        "@babel/highlight": "^7.10.4"
+      }
+    },
+    "@babel/generator": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+      "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.12.1",
+        "jsesc": "^2.5.1",
+        "source-map": "^0.5.0"
+      }
+    },
+    "@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-get-function-arity": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+      "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@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/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=="
+    },
+    "@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"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "color-convert": {
+          "version": "1.9.3",
+          "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz",
+          "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+          "requires": {
+            "color-name": "1.1.3"
+          }
+        },
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+        }
+      }
+    },
+    "@babel/parser": {
+      "version": "7.12.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+      "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+      "dev": true
+    },
+    "@babel/runtime": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz",
+      "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==",
+      "requires": {
+        "regenerator-runtime": "^0.13.4"
+      }
+    },
+    "@babel/runtime-corejs3": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.1.tgz",
+      "integrity": "sha512-umhPIcMrlBZ2aTWlWjUseW9LjQKxi1dpFlQS8DzsxB//5K+u6GLTC/JliPKHsd5kJVPIU6X/Hy0YvWOYPcMxBw==",
+      "requires": {
+        "core-js-pure": "^3.0.0",
+        "regenerator-runtime": "^0.13.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/traverse": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+      "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.12.1",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/parser": "^7.12.1",
+        "@babel/types": "^7.12.1",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0",
+        "lodash": "^4.17.19"
+      },
+      "dependencies": {
+        "debug": {
+          "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.2"
+          }
+        },
+        "globals": {
+          "version": "11.12.0",
+          "resolved": "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz",
+          "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+          "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
+        }
+      }
+    },
+    "@babel/types": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+      "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "lodash": "^4.17.19",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "@eslint/eslintrc": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz",
+      "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.12.4",
+        "debug": "^4.1.1",
+        "espree": "^7.3.0",
+        "globals": "^12.1.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^3.13.1",
+        "lodash": "^4.17.19",
+        "minimatch": "^3.0.4",
+        "strip-json-comments": "^3.1.1"
+      },
+      "dependencies": {
+        "debug": {
+          "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.2"
+          }
+        }
+      }
+    },
     "@hapi/address": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz",
@@ -38,14 +248,12 @@
     "@sindresorhus/is": {
       "version": "0.14.0",
       "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
-      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
-      "dev": true
+      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
     },
     "@szmarczak/http-timer": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
       "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
-      "dev": true,
       "requires": {
         "defer-to-connect": "^1.0.1"
       }
@@ -53,14 +261,22 @@
     "@types/color-name": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
-      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
-      "dev": true
+      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+    },
+    "@types/json5": {
+      "version": "0.0.29",
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4="
+    },
+    "@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
     },
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
     },
     "accepts": {
       "version": "1.3.7",
@@ -71,54 +287,270 @@
         "negotiator": "0.6.2"
       }
     },
+    "acorn": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+    },
+    "acorn-jsx": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+      "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng=="
+    },
+    "aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      }
+    },
+    "ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "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-align": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
       "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
-      "dev": true,
       "requires": {
         "string-width": "^3.0.0"
       },
       "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+        },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+        },
         "string-width": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
           "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
           "requires": {
             "emoji-regex": "^7.0.1",
             "is-fullwidth-code-point": "^2.0.0",
             "strip-ansi": "^5.1.0"
           }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "ansi-colors": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+    },
+    "ansi-escapes": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+      "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+      "requires": {
+        "type-fest": "^0.11.0"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ=="
         }
       }
     },
     "ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+    },
+    "ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "requires": {
+        "color-convert": "^2.0.1"
+      }
     },
     "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"
       }
     },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "aria-query": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+      "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
+      "requires": {
+        "@babel/runtime": "^7.10.2",
+        "@babel/runtime-corejs3": "^7.10.2"
+      }
+    },
     "array-flatten": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
       "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
     },
+    "array-includes": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+      "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0",
+        "is-string": "^1.0.5"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "array.prototype.flat": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+      "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "array.prototype.flatmap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz",
+      "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1",
+        "function-bind": "^1.1.1"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "ast-types-flow": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+      "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
+    },
+    "astral-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+    },
+    "axe-core": {
+      "version": "3.5.5",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz",
+      "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q=="
+    },
+    "axobject-query": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+      "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
+    },
+    "babel-eslint": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/parser": "^7.7.0",
+        "@babel/traverse": "^7.7.0",
+        "@babel/types": "^7.7.0",
+        "eslint-visitor-keys": "^1.0.0",
+        "resolve": "^1.12.0"
+      }
+    },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
     },
     "basic-auth": {
       "version": "2.0.1",
@@ -131,8 +563,7 @@
     "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
+      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ=="
     },
     "bl": {
       "version": "2.2.1",
@@ -141,6 +572,13 @@
       "requires": {
         "readable-stream": "^2.3.5",
         "safe-buffer": "^5.1.1"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+        }
       }
     },
     "bluebird": {
@@ -169,7 +607,6 @@
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
       "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
-      "dev": true,
       "requires": {
         "ansi-align": "^3.0.0",
         "camelcase": "^5.3.1",
@@ -185,7 +622,6 @@
           "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"
@@ -195,7 +631,6 @@
           "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"
@@ -205,7 +640,6 @@
           "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"
           }
@@ -213,20 +647,17 @@
         "color-name": {
           "version": "1.1.4",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "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
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
         },
         "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"
           }
@@ -237,7 +668,6 @@
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -247,7 +677,6 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
       "requires": {
         "fill-range": "^7.0.1"
       }
@@ -271,7 +700,6 @@
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
       "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
-      "dev": true,
       "requires": {
         "clone-response": "^1.0.2",
         "get-stream": "^5.1.0",
@@ -286,7 +714,6 @@
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
           "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
           "requires": {
             "pump": "^3.0.0"
           }
@@ -294,22 +721,53 @@
         "lowercase-keys": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
-          "dev": true
+          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
         }
       }
     },
+    "callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+    },
     "camelcase": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+    },
+    "chalk": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "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==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
     },
     "chokidar": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
-      "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
-      "dev": true,
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
+      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
       "requires": {
         "anymatch": "~3.1.1",
         "braces": "~3.0.2",
@@ -318,56 +776,154 @@
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
         "normalize-path": "~3.0.0",
-        "readdirp": "~3.4.0"
+        "readdirp": "~3.5.0"
       }
     },
     "ci-info": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-      "dev": true
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+    },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
     },
     "cli-boxes": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
-      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
-      "dev": true
+      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="
     },
-    "clone-response": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
-      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
-      "dev": true,
-      "requires": {
-        "mimic-response": "^1.0.0"
-      }
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "configstore": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
-      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
-      "dev": true,
+    "cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
       "requires": {
-        "dot-prop": "^5.2.0",
-        "graceful-fs": "^4.1.2",
-        "make-dir": "^3.0.0",
-        "unique-string": "^2.0.0",
-        "write-file-atomic": "^3.0.0",
-        "xdg-basedir": "^4.0.0"
+        "restore-cursor": "^3.1.0"
       }
     },
-    "content-disposition": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
-      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+    "cli-truncate": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+      "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
       "requires": {
-        "safe-buffer": "5.1.2"
+        "slice-ansi": "^3.0.0",
+        "string-width": "^4.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "astral-regex": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+        },
+        "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==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "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=="
+        },
+        "slice-ansi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+          "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "astral-regex": "^2.0.0",
+            "is-fullwidth-code-point": "^3.0.0"
+          }
+        }
+      }
+    },
+    "cli-width": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha1-ovSEN6LKqaIkNueUvwceyeYc7fY= sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
+    },
+    "clone-response": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "requires": {
+        "mimic-response": "^1.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==",
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "commander": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz",
+      "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA=="
+    },
+    "compare-versions": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
+      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "configstore": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+      "requires": {
+        "dot-prop": "^5.2.0",
+        "graceful-fs": "^4.1.2",
+        "make-dir": "^3.0.0",
+        "unique-string": "^2.0.0",
+        "write-file-atomic": "^3.0.0",
+        "xdg-basedir": "^4.0.0"
+      }
+    },
+    "confusing-browser-globals": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
+      "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw=="
+    },
+    "contains-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
+    },
+    "content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "requires": {
+        "safe-buffer": "5.1.2"
       }
     },
     "content-type": {
@@ -385,16 +941,65 @@
       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
       "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
     },
+    "core-js-pure": {
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz",
+      "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA=="
+    },
     "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="
     },
+    "cosmiconfig": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+      "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+      "requires": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.2.1",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.10.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-even-better-errors": "^2.3.0",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+        }
+      }
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
+    },
     "crypto-random-string": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
-      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
-      "dev": true
+      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
+    },
+    "damerau-levenshtein": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
+      "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug=="
     },
     "debug": {
       "version": "2.6.9",
@@ -402,28 +1007,50 @@
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "requires": {
         "ms": "2.0.0"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
       }
     },
     "decompress-response": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
       "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
-      "dev": true,
       "requires": {
         "mimic-response": "^1.0.0"
       }
     },
+    "dedent": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw="
+    },
     "deep-extend": {
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-      "dev": true
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
     },
     "defer-to-connect": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
-      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
-      "dev": true
+      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
     },
     "denque": {
       "version": "1.4.1",
@@ -440,13 +1067,28 @@
       "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
       "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
     },
+    "doctrine": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+      "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+      "requires": {
+        "esutils": "^2.0.2",
+        "isarray": "^1.0.0"
+      }
+    },
     "dot-prop": {
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
       "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
-      "dev": true,
       "requires": {
         "is-obj": "^2.0.0"
+      },
+      "dependencies": {
+        "is-obj": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz",
+          "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI= sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
+        }
       }
     },
     "dotenv": {
@@ -457,8 +1099,7 @@
     "duplexer3": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
-      "dev": true
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
     },
     "ecdsa-sig-formatter": {
       "version": "1.0.11",
@@ -466,6 +1107,13 @@
       "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
       "requires": {
         "safe-buffer": "^5.0.1"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+        }
       }
     },
     "ee-first": {
@@ -474,10 +1122,9 @@
       "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
     },
     "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
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
     },
     "encodeurl": {
       "version": "1.0.2",
@@ -488,136 +1135,669 @@
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
       "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
       "requires": {
         "once": "^1.4.0"
       }
     },
+    "enquirer": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+      "requires": {
+        "ansi-colors": "^4.1.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.17.7",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+      "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+      "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.2",
+        "is-regex": "^1.1.1",
+        "object-inspect": "^1.8.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.1",
+        "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==",
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
     "escape-goat": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
-      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
-      "dev": true
+      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
     },
     "escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
     },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+    "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="
     },
-    "express": {
-      "version": "4.17.1",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
-      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+    "eslint": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz",
+      "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==",
+      "dev": true,
       "requires": {
-        "accepts": "~1.3.7",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.19.0",
-        "content-disposition": "0.5.3",
-        "content-type": "~1.0.4",
-        "cookie": "0.4.0",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "~1.1.2",
-        "fresh": "0.5.2",
-        "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.5",
-        "qs": "6.7.0",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.1.2",
-        "send": "0.17.1",
-        "serve-static": "1.14.1",
-        "setprototypeof": "1.1.1",
-        "statuses": "~1.5.0",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
+        "@babel/code-frame": "^7.0.0",
+        "@eslint/eslintrc": "^0.1.3",
+        "ajv": "^6.10.0",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "enquirer": "^2.3.5",
+        "eslint-scope": "^5.1.1",
+        "eslint-utils": "^2.1.0",
+        "eslint-visitor-keys": "^2.0.0",
+        "espree": "^7.3.0",
+        "esquery": "^1.2.0",
+        "esutils": "^2.0.2",
+        "file-entry-cache": "^5.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^5.0.0",
+        "globals": "^12.1.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^3.13.1",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash": "^4.17.19",
+        "minimatch": "^3.0.4",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.1",
+        "progress": "^2.0.0",
+        "regexpp": "^3.1.0",
+        "semver": "^7.2.1",
+        "strip-ansi": "^6.0.0",
+        "strip-json-comments": "^3.1.0",
+        "table": "^5.2.3",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      },
+      "dependencies": {
+        "debug": {
+          "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.2"
+          }
+        },
+        "doctrine": {
+          "version": "3.0.0",
+          "resolved": "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz",
+          "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
+        "eslint-visitor-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+          "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+          "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
+        }
       }
     },
-    "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==",
+    "eslint-config-airbnb": {
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz",
+      "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==",
       "dev": true,
       "requires": {
-        "to-regex-range": "^5.0.1"
+        "eslint-config-airbnb-base": "^14.2.0",
+        "object.assign": "^4.1.0",
+        "object.entries": "^1.1.2"
       }
     },
-    "finalhandler": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
-      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+    "eslint-config-airbnb-base": {
+      "version": "14.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz",
+      "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==",
+      "dev": true,
       "requires": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "statuses": "~1.5.0",
-        "unpipe": "~1.0.0"
+        "confusing-browser-globals": "^1.0.9",
+        "object.assign": "^4.1.0",
+        "object.entries": "^1.1.2"
       }
     },
-    "forwarded": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
-      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
-    },
-    "fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
-    },
-    "fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
-      "dev": true,
-      "optional": true
-    },
-    "get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+    "eslint-config-prettier": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.13.0.tgz",
+      "integrity": "sha512-LcT0i0LSmnzqK2t764pyIt7kKH2AuuqKRTtJTdddWxOiUja9HdG5GXBVF2gmCTvVYWVsTu8J2MhJLVGRh+pj8w==",
       "dev": true,
       "requires": {
-        "pump": "^3.0.0"
+        "get-stdin": "^6.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==",
+    "eslint-import-resolver-node": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+      "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
       "dev": true,
       "requires": {
-        "is-glob": "^4.0.1"
+        "debug": "^2.6.9",
+        "resolve": "^1.13.1"
       }
     },
-    "global-dirs": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
-      "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
+    "eslint-module-utils": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+      "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
       "dev": true,
       "requires": {
-        "ini": "^1.3.5"
+        "debug": "^2.6.9",
+        "pkg-dir": "^2.0.0"
+      },
+      "dependencies": {
+        "pkg-dir": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz",
+          "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.1.0"
+          }
+        }
       }
     },
-    "got": {
-      "version": "9.6.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
-      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+    "eslint-plugin-import": {
+      "version": "2.22.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
+      "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
+      "dev": true,
+      "requires": {
+        "array-includes": "^3.1.1",
+        "array.prototype.flat": "^1.2.3",
+        "contains-path": "^0.1.0",
+        "debug": "^2.6.9",
+        "doctrine": "1.5.0",
+        "eslint-import-resolver-node": "^0.3.4",
+        "eslint-module-utils": "^2.6.0",
+        "has": "^1.0.3",
+        "minimatch": "^3.0.4",
+        "object.values": "^1.1.1",
+        "read-pkg-up": "^2.0.0",
+        "resolve": "^1.17.0",
+        "tsconfig-paths": "^3.9.0"
+      },
+      "dependencies": {
+        "doctrine": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "isarray": "^1.0.0"
+          }
+        }
+      }
+    },
+    "eslint-plugin-jsx-a11y": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz",
+      "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.10.2",
+        "aria-query": "^4.2.2",
+        "array-includes": "^3.1.1",
+        "ast-types-flow": "^0.0.7",
+        "axe-core": "^3.5.4",
+        "axobject-query": "^2.1.2",
+        "damerau-levenshtein": "^1.0.6",
+        "emoji-regex": "^9.0.0",
+        "has": "^1.0.3",
+        "jsx-ast-utils": "^2.4.1",
+        "language-tags": "^1.0.5"
+      },
+      "dependencies": {
+        "emoji-regex": {
+          "version": "9.1.1",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.1.1.tgz",
+          "integrity": "sha512-AaWyDiNO9rbtMIcGl7tdxMcNu8SOLaDLxmQEFT5JhgKufOJzPPkYmgN2QwqTgw4doWMZZQttC6sUWVQjb+1VdA==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-prettier": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz",
+      "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==",
+      "dev": true,
+      "requires": {
+        "prettier-linter-helpers": "^1.0.0"
+      }
+    },
+    "eslint-plugin-react": {
+      "version": "7.21.4",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.4.tgz",
+      "integrity": "sha512-uHeQ8A0hg0ltNDXFu3qSfFqTNPXm1XithH6/SY318UX76CMj7Q599qWpgmMhVQyvhq36pm7qvoN3pb6/3jsTFg==",
+      "dev": true,
+      "requires": {
+        "array-includes": "^3.1.1",
+        "array.prototype.flatmap": "^1.2.3",
+        "doctrine": "^2.1.0",
+        "has": "^1.0.3",
+        "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+        "object.entries": "^1.1.2",
+        "object.fromentries": "^2.0.2",
+        "object.values": "^1.1.1",
+        "prop-types": "^15.7.2",
+        "resolve": "^1.17.0",
+        "string.prototype.matchall": "^4.0.2"
+      },
+      "dependencies": {
+        "doctrine": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
+        "jsx-ast-utils": {
+          "version": "3.1.0",
+          "resolved": "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz",
+          "integrity": "sha1-ZC8de4iqbX652PIhDhZkeERPqJE= sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==",
+          "dev": true,
+          "requires": {
+            "array-includes": "^3.1.1",
+            "object.assign": "^4.1.1"
+          }
+        }
+      }
+    },
+    "eslint-plugin-react-hooks": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.0.tgz",
+      "integrity": "sha1-gRlrmQBDzeM54lxmYq7r4yrFLQE= sha512-YKBY+kilK5wrwIdQnCF395Ya6nDro3EAMoe+2xFkmyklyhF16fH83TrQOo9zbZIDxBsXFgBbywta/0JKRNFDkw==",
+      "dev": true
+    },
+    "eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "4.3.0",
+          "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz",
+          "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
       "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+    },
+    "espree": {
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
+      "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+      "requires": {
+        "acorn": "^7.4.0",
+        "acorn-jsx": "^5.2.0",
+        "eslint-visitor-keys": "^1.3.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=="
+    },
+    "esquery": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+      "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+      "requires": {
+        "estraverse": "^5.1.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+        }
+      }
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "requires": {
+        "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=="
+        }
+      }
+    },
+    "estraverse": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+      "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+    },
+    "execa": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
+      "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+      "requires": {
+        "cross-spawn": "^7.0.0",
+        "get-stream": "^5.0.0",
+        "human-signals": "^1.1.1",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.0",
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2",
+        "strip-final-newline": "^2.0.0"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        }
+      }
+    },
+    "express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+      "requires": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      }
+    },
+    "external-editor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "requires": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      }
+    },
+    "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=="
+    },
+    "fast-diff": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+      "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=="
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+    },
+    "figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "file-entry-cache": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+      "requires": {
+        "flat-cache": "^2.0.1"
+      }
+    },
+    "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==",
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      }
+    },
+    "find-up": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "requires": {
+        "locate-path": "^2.0.0"
+      }
+    },
+    "find-versions": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
+      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+      "requires": {
+        "semver-regex": "^2.0.0"
+      }
+    },
+    "flat-cache": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+      "requires": {
+        "flatted": "^2.0.0",
+        "rimraf": "2.6.3",
+        "write": "1.0.3"
+      }
+    },
+    "flatted": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "fsevents": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+    },
+    "get-own-enumerable-property-symbols": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+    },
+    "get-stdin": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+      "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "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",
+      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "global-dirs": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
+      "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
+      "requires": {
+        "ini": "^1.3.5"
+      }
+    },
+    "globals": {
+      "version": "12.4.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+      "requires": {
+        "type-fest": "^0.8.1"
+      }
+    },
+    "got": {
+      "version": "9.6.0",
+      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
       "requires": {
         "@sindresorhus/is": "^0.14.0",
         "@szmarczak/http-timer": "^1.1.2",
@@ -630,31 +1810,55 @@
         "p-cancelable": "^1.0.0",
         "to-readable-stream": "^1.0.0",
         "url-parse-lax": "^3.0.0"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU= sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "requires": {
+            "pump": "^3.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
+      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
     },
     "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.1",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
     },
     "has-yarn": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
-      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
-      "dev": true
+      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
+    },
+    "hosted-git-info": {
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+      "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
     },
     "http-cache-semantics": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-      "dev": true
+      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
     },
     "http-errors": {
       "version": "1.7.2",
@@ -666,6 +1870,145 @@
         "setprototypeof": "1.1.1",
         "statuses": ">= 1.5.0 < 2",
         "toidentifier": "1.0.0"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        }
+      }
+    },
+    "human-signals": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
+    },
+    "husky": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz",
+      "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0",
+        "ci-info": "^2.0.0",
+        "compare-versions": "^3.6.0",
+        "cosmiconfig": "^7.0.0",
+        "find-versions": "^3.2.0",
+        "opencollective-postinstall": "^2.0.2",
+        "pkg-dir": "^4.2.0",
+        "please-upgrade-node": "^3.2.0",
+        "slash": "^3.0.0",
+        "which-pm-runs": "^1.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "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==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.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": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "p-try": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+          "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
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        },
+        "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"
+          }
+        }
       }
     },
     "iconv-lite": {
@@ -676,75 +2019,174 @@
         "safer-buffer": ">= 2.1.2 < 3"
       }
     },
+    "ignore": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+    },
     "ignore-by-default": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
-      "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
-      "dev": true
+      "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk="
+    },
+    "import-fresh": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+      "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+        }
+      }
     },
     "import-lazy": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
-      "dev": true
+      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
     },
     "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",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
     },
     "inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "ini": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
-      "dev": true
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+    },
+    "inquirer": {
+      "version": "7.3.3",
+      "resolved": "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha1-BNF2sq8Er8FXqD/XwQDpjuCq0AM= sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-width": "^3.0.0",
+        "external-editor": "^3.0.3",
+        "figures": "^3.0.0",
+        "lodash": "^4.17.19",
+        "mute-stream": "0.0.8",
+        "run-async": "^2.4.0",
+        "rxjs": "^6.6.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "through": "^2.3.6"
+      }
+    },
+    "internal-slot": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz",
+      "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==",
+      "requires": {
+        "es-abstract": "^1.17.0-next.1",
+        "has": "^1.0.3",
+        "side-channel": "^1.0.2"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
     },
     "ipaddr.js": {
       "version": "1.9.1",
       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
       "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
     },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+    },
     "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-callable": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
+    },
     "is-ci": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
       "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
-      "dev": true,
       "requires": {
         "ci-info": "^2.0.0"
       }
     },
+    "is-core-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz",
+      "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==",
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-date-object": {
+      "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=="
+    },
     "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",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true
+      "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=="
     },
     "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"
       }
@@ -753,53 +2195,87 @@
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
       "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
-      "dev": true,
       "requires": {
         "global-dirs": "^2.0.1",
         "is-path-inside": "^3.0.1"
       }
     },
+    "is-negative-zero": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
+      "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
+    },
     "is-npm": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
-      "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
-      "dev": true
+      "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig=="
     },
     "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
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
     },
     "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
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
     },
     "is-path-inside": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
-      "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
-      "dev": true
+      "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg=="
+    },
+    "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==",
+      "requires": {
+        "has-symbols": "^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-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+    },
+    "is-string": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
+    },
+    "is-symbol": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
     },
     "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-yarn-global": {
       "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
+      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
     },
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
       "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
     },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
     "joi": {
       "version": "17.2.1",
       "resolved": "https://registry.npmjs.org/joi/-/joi-17.2.1.tgz",
@@ -812,12 +2288,53 @@
         "@hapi/topo": "^5.0.0"
       }
     },
-    "json-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
-      "dev": true
-    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "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==",
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+    },
+    "json-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
+    "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=="
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+    },
+    "json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "requires": {
+        "minimist": "^1.2.0"
+      }
+    },
     "jsonwebtoken": {
       "version": "8.5.1",
       "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
@@ -842,6 +2359,15 @@
         }
       }
     },
+    "jsx-ast-utils": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
+      "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==",
+      "requires": {
+        "array-includes": "^3.1.1",
+        "object.assign": "^4.1.0"
+      }
+    },
     "jwa": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -850,6 +2376,13 @@
         "buffer-equal-constant-time": "1.0.1",
         "ecdsa-sig-formatter": "1.0.11",
         "safe-buffer": "^5.0.1"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+        }
       }
     },
     "jws": {
@@ -859,6 +2392,13 @@
       "requires": {
         "jwa": "^1.4.1",
         "safe-buffer": "^5.0.1"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+        }
       }
     },
     "kareem": {
@@ -870,66 +2410,388 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
       "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
-      "dev": true,
       "requires": {
         "json-buffer": "3.0.0"
       }
     },
+    "language-subtag-registry": {
+      "version": "0.3.20",
+      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz",
+      "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg=="
+    },
+    "language-tags": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+      "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
+      "requires": {
+        "language-subtag-registry": "~0.3.2"
+      }
+    },
     "latest-version": {
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
       "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+      "requires": {
+        "package-json": "^6.3.0"
+      }
+    },
+    "levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "requires": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      }
+    },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+    },
+    "lint-staged": {
+      "version": "10.4.2",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.4.2.tgz",
+      "integrity": "sha512-OLCA9K1hS+Sl179SO6kX0JtnsaKj/MZalEhUj5yAgXsb63qPI/Gfn6Ua1KuZdbfkZNEu3/n5C/obYCu70IMt9g==",
       "dev": true,
       "requires": {
-        "package-json": "^6.3.0"
+        "chalk": "^4.1.0",
+        "cli-truncate": "^2.1.0",
+        "commander": "^6.0.0",
+        "cosmiconfig": "^7.0.0",
+        "debug": "^4.1.1",
+        "dedent": "^0.7.0",
+        "enquirer": "^2.3.6",
+        "execa": "^4.0.3",
+        "listr2": "^2.6.0",
+        "log-symbols": "^4.0.0",
+        "micromatch": "^4.0.2",
+        "normalize-path": "^3.0.0",
+        "please-upgrade-node": "^3.2.0",
+        "string-argv": "0.3.1",
+        "stringify-object": "^3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "debug": {
+          "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.2"
+          }
+        },
+        "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
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "listr2": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz",
+      "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "cli-truncate": "^2.1.0",
+        "figures": "^3.2.0",
+        "indent-string": "^4.0.0",
+        "log-update": "^4.0.0",
+        "p-map": "^4.0.0",
+        "rxjs": "^6.6.2",
+        "through": "^2.3.8"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "requires": {
+            "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==",
+          "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==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "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==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "load-json-file": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "strip-bom": "^3.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "2.2.0",
+          "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz",
+          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+          "requires": {
+            "error-ex": "^1.2.0"
+          }
+        }
+      }
+    },
+    "locate-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "requires": {
+        "p-locate": "^2.0.0",
+        "path-exists": "^3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.20",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+    },
+    "lodash.includes": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+    },
+    "lodash.isboolean": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+    },
+    "lodash.isinteger": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+      "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+    },
+    "lodash.isnumber": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+      "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+    },
+    "lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+    },
+    "lodash.isstring": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+    },
+    "lodash.once": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+    },
+    "log-symbols": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+      "requires": {
+        "chalk": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "requires": {
+            "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==",
+          "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==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "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==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "log-update": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+      "requires": {
+        "ansi-escapes": "^4.3.0",
+        "cli-cursor": "^3.1.0",
+        "slice-ansi": "^4.0.0",
+        "wrap-ansi": "^6.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "astral-regex": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+        },
+        "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==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "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=="
+        },
+        "slice-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "astral-regex": "^2.0.0",
+            "is-fullwidth-code-point": "^3.0.0"
+          }
+        }
+      }
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
       }
     },
-    "lodash.includes": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
-      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
-    },
-    "lodash.isboolean": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
-      "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
-    },
-    "lodash.isinteger": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
-      "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
-    },
-    "lodash.isnumber": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
-      "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
-    },
-    "lodash.isplainobject": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
-    },
-    "lodash.isstring": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
-      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
-    },
-    "lodash.once": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
-    },
     "lowercase-keys": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
-      "dev": true
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
     },
     "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"
       },
@@ -937,8 +2799,7 @@
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
         }
       }
     },
@@ -950,19 +2811,32 @@
     "memory-pager": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
-      "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
-      "optional": true
+      "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
     },
     "merge-descriptors": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
       "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
     },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+    },
     "methods": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
       "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
     },
+    "micromatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+      "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+      "requires": {
+        "braces": "^3.0.1",
+        "picomatch": "^2.0.5"
+      }
+    },
     "mime": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
@@ -981,17 +2855,20 @@
         "mime-db": "1.44.0"
       }
     },
+    "mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+    },
     "mimic-response": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
-      "dev": true
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
     },
     "minimatch": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
       }
@@ -999,8 +2876,15 @@
     "minimist": {
       "version": "1.2.5",
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
     },
     "mongodb": {
       "version": "3.6.2",
@@ -1013,6 +2897,13 @@
         "require_optional": "^1.0.1",
         "safe-buffer": "^5.1.2",
         "saslprep": "^1.0.0"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+        }
       }
     },
     "mongoose": {
@@ -1093,13 +2984,28 @@
           "requires": {
             "ms": "2.0.0"
           }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
         }
       }
     },
     "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "mute-stream": {
+      "version": "0.0.8",
+      "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
     },
     "negotiator": {
       "version": "0.6.2",
@@ -1145,22 +3051,177 @@
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
       "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
-      "dev": true,
       "requires": {
         "abbrev": "1"
       }
     },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.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==",
-      "dev": true
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
     },
     "normalize-url": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
-      "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
-      "dev": true
+      "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
+    },
+    "npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "requires": {
+        "path-key": "^3.0.0"
+      }
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "object-inspect": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+      "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+    },
+    "object.assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
+      "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.0",
+        "has-symbols": "^1.0.1",
+        "object-keys": "^1.1.1"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.18.0-next.1",
+          "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg= sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+          "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.2",
+            "is-negative-zero": "^2.0.0",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "object.entries": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz",
+      "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5",
+        "has": "^1.0.3"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "object.fromentries": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz",
+      "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==",
+      "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.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.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==",
+      "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.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
     },
     "on-finished": {
       "version": "2.3.0",
@@ -1179,22 +3240,79 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
       "requires": {
         "wrappy": "1"
       }
     },
+    "onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "requires": {
+        "mimic-fn": "^2.1.0"
+      }
+    },
+    "opencollective-postinstall": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q=="
+    },
+    "optionator": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+      "requires": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.3"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+    },
     "p-cancelable": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
-      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
-      "dev": true
+      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
+    },
+    "p-limit": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+      "requires": {
+        "p-try": "^1.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "requires": {
+        "p-limit": "^1.1.0"
+      }
+    },
+    "p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
+    },
+    "p-try": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
     },
     "package-json": {
       "version": "6.5.0",
       "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
       "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
-      "dev": true,
       "requires": {
         "got": "^9.6.0",
         "registry-auth-token": "^4.0.0",
@@ -1205,38 +3323,180 @@
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
         }
       }
     },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "parse-json": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+      "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      }
+    },
     "parseurl": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
       "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
     },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+    },
+    "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=="
+    },
     "path-to-regexp": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
       "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
     },
+    "path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+    },
     "picomatch": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+    },
+    "pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "requires": {
+        "find-up": "^4.0.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==",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+          "requires": {
+            "p-try": "^2.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==",
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "p-try": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+        },
+        "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=="
+        }
+      }
+    },
+    "please-upgrade-node": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
+      "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+      "requires": {
+        "semver-compare": "^1.0.0"
+      }
+    },
+    "prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
     },
     "prepend-http": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+    },
+    "prettier": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
+      "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==",
       "dev": true
     },
+    "prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "dev": true,
+      "requires": {
+        "fast-diff": "^1.1.2"
+      }
+    },
     "process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
       "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
     },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+    },
+    "prop-types": {
+      "version": "15.7.2",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
+      "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+      "requires": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.8.1"
+      }
+    },
     "proxy-addr": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
@@ -1249,24 +3509,26 @@
     "pstree.remy": {
       "version": "1.1.8",
       "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
-      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
-      "dev": true
+      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
     },
     "pump": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
       "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
       "requires": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.1"
       }
     },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+    },
     "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"
       }
@@ -1296,12 +3558,52 @@
       "version": "1.2.8",
       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
-      "dev": true,
       "requires": {
         "deep-extend": "^0.6.0",
         "ini": "~1.3.0",
         "minimist": "^1.2.0",
         "strip-json-comments": "~2.0.1"
+      },
+      "dependencies": {
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "resolved": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+        }
+      }
+    },
+    "react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+    },
+    "read-pkg": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+      "requires": {
+        "load-json-file": "^2.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^2.0.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "requires": {
+            "pify": "^2.0.0"
+          }
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+      "requires": {
+        "find-up": "^2.0.0",
+        "read-pkg": "^2.0.0"
       }
     },
     "readable-stream": {
@@ -1319,24 +3621,61 @@
       }
     },
     "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,
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
       "requires": {
         "picomatch": "^2.2.1"
       }
     },
+    "regenerator-runtime": {
+      "version": "0.13.7",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
+    },
     "regexp-clone": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
       "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
     },
+    "regexp.prototype.flags": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+      "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "regexpp": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
+    },
     "registry-auth-token": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
       "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
-      "dev": true,
       "requires": {
         "rc": "^1.2.8"
       }
@@ -1345,7 +3684,6 @@
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
       "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
-      "dev": true,
       "requires": {
         "rc": "^1.2.8"
       }
@@ -1359,6 +3697,15 @@
         "semver": "^5.1.0"
       }
     },
+    "resolve": {
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
+      "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
+      "requires": {
+        "is-core-module": "^2.0.0",
+        "path-parse": "^1.0.6"
+      }
+    },
     "resolve-from": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
@@ -1368,9 +3715,38 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
       "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
-      "dev": true,
       "requires": {
-        "lowercase-keys": "^1.0.0"
+        "lowercase-keys": "^1.0.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==",
+      "requires": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "rimraf": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU= sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
+    },
+    "rxjs": {
+      "version": "6.6.3",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
+      "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
+      "requires": {
+        "tslib": "^1.9.0"
       }
     },
     "safe-buffer": {
@@ -1387,7 +3763,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
       "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
-      "optional": true,
       "requires": {
         "sparse-bitfield": "^3.0.3"
       }
@@ -1397,11 +3772,15 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
       "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
     },
+    "semver-compare": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
+    },
     "semver-diff": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
       "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
-      "dev": true,
       "requires": {
         "semver": "^6.3.0"
       },
@@ -1409,11 +3788,15 @@
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
         }
       }
     },
+    "semver-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
+      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+    },
     "send": {
       "version": "0.17.1",
       "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -1434,6 +3817,18 @@
         "statuses": "~1.5.0"
       },
       "dependencies": {
+        "http-errors": {
+          "version": "1.7.3",
+          "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz",
+          "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.4",
+            "setprototypeof": "1.1.1",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.0"
+          }
+        },
         "ms": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
@@ -1457,6 +3852,49 @@
       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
       "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
     },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+    },
+    "side-channel": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz",
+      "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==",
+      "requires": {
+        "es-abstract": "^1.18.0-next.0",
+        "object-inspect": "^1.8.0"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.18.0-next.1",
+          "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg= sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+          "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.2",
+            "is-negative-zero": "^2.0.0",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
     "sift": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
@@ -1465,33 +3903,121 @@
     "signal-exit": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
-      "dev": true
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+    },
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+    },
+    "slice-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+      "requires": {
+        "ansi-styles": "^3.2.0",
+        "astral-regex": "^1.0.0",
+        "is-fullwidth-code-point": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "astral-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz",
+          "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k= sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
+        },
+        "color-convert": {
+          "version": "1.9.3",
+          "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz",
+          "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+          "requires": {
+            "color-name": "1.1.3"
+          }
+        },
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+        }
+      }
     },
     "sliced": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
       "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
     },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
     "sparse-bitfield": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
       "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
-      "optional": true,
       "requires": {
         "memory-pager": "^1.0.2"
       }
     },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
+      "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw=="
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+    },
     "statuses": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
       "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
     },
+    "string-argv": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
+      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg=="
+    },
     "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",
@@ -1501,32 +4027,119 @@
         "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
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
         },
         "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=="
         },
         "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
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
         },
         "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"
           }
         }
       }
     },
+    "string.prototype.matchall": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz",
+      "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0",
+        "has-symbols": "^1.0.1",
+        "internal-slot": "^1.0.2",
+        "regexp.prototype.flags": "^1.3.0",
+        "side-channel": "^1.0.2"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "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==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "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==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
     "string_decoder": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -1535,47 +4148,137 @@
         "safe-buffer": "~5.1.0"
       }
     },
+    "stringify-object": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+      "requires": {
+        "get-own-enumerable-property-symbols": "^3.0.0",
+        "is-obj": "^1.0.1",
+        "is-regexp": "^1.0.0"
+      },
+      "dependencies": {
+        "is-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+        }
+      }
+    },
     "strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
       "requires": {
-        "ansi-regex": "^4.1.0"
+        "ansi-regex": "^5.0.0"
       }
     },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+    },
     "strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
-      "dev": true
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
     },
     "supports-color": {
       "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"
       }
     },
+    "table": {
+      "version": "5.4.6",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+      "requires": {
+        "ajv": "^6.10.2",
+        "lodash": "^4.17.14",
+        "slice-ansi": "^2.1.0",
+        "string-width": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+        },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
     "term-size": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
-      "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
-      "dev": true
+      "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw=="
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "requires": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
+    "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="
     },
     "to-readable-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
-      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
-      "dev": true
+      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
     },
     "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"
       }
@@ -1589,16 +4292,38 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
       "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
-      "dev": true,
       "requires": {
         "nopt": "~1.0.10"
       }
     },
+    "tsconfig-paths": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
+      "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
+      "requires": {
+        "@types/json5": "^0.0.29",
+        "json5": "^1.0.1",
+        "minimist": "^1.2.0",
+        "strip-bom": "^3.0.0"
+      }
+    },
+    "tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+    },
+    "type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "requires": {
+        "prelude-ls": "^1.2.1"
+      }
+    },
     "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
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
     },
     "type-is": {
       "version": "1.6.18",
@@ -1613,7 +4338,6 @@
       "version": "3.1.5",
       "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
       "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-      "dev": true,
       "requires": {
         "is-typedarray": "^1.0.0"
       }
@@ -1622,7 +4346,6 @@
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
       "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
-      "dev": true,
       "requires": {
         "debug": "^2.2.0"
       }
@@ -1631,7 +4354,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
       "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
-      "dev": true,
       "requires": {
         "crypto-random-string": "^2.0.0"
       }
@@ -1642,10 +4364,9 @@
       "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
     },
     "update-notifier": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz",
-      "integrity": "sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==",
-      "dev": true,
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
+      "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
       "requires": {
         "boxen": "^4.2.0",
         "chalk": "^3.0.0",
@@ -1662,63 +4383,42 @@
         "xdg-basedir": "^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": "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"
           }
         },
-        "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"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "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
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
         },
         "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"
           }
         }
       }
     },
+    "uri-js": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
+      "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
     "url-parse-lax": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
       "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
-      "dev": true,
       "requires": {
         "prepend-http": "^2.0.0"
       }
@@ -1733,31 +4433,114 @@
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
       "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
     },
+    "v8-compile-cache": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
+      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ=="
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
     "vary": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
       "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
     },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-pm-runs": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
+      "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
+    },
     "widest-line": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
       "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
-      "dev": true,
       "requires": {
         "string-width": "^4.0.0"
       }
     },
+    "word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+    },
+    "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==",
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "requires": {
+            "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==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "write": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "requires": {
+        "mkdirp": "^0.5.1"
+      }
     },
     "write-file-atomic": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
       "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-      "dev": true,
       "requires": {
         "imurmurhash": "^0.1.4",
         "is-typedarray": "^1.0.0",
@@ -1768,8 +4551,12 @@
     "xdg-basedir": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
-      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
-      "dev": true
+      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
+    },
+    "yaml": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+      "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg=="
     }
   }
 }
diff --git a/package.json b/package.json
index 4fa3ad8..d363a91 100644
--- a/package.json
+++ b/package.json
@@ -1,34 +1,426 @@
 {
-  "name": "2020.1-Grupo2-backend",
+  "name": "2020.1-gaiadex-backend",
   "version": "1.0.0",
   "description": "",
   "main": "index.js",
   "scripts": {
     "start": "node src/index.js",
-    "dev": "nodemon src/index.js"
+    "dev": "nodemon src/index.js",
+    "precommit": "lint-staged"
+  },
+  "lint-staged": {
+    "*.{js,jsx}": [
+      "eslint --fix",
+      "git add"
+    ]
   },
   "repository": {
     "type": "git",
-    "url": "git+https://github.com/fga-eps-mds/2020.1-Grupo2-backend.git"
+    "url": "git+https://github.com/fga-eps-mds/2020.1-GaiaDex-backend.git"
   },
   "keywords": [],
   "author": "",
   "license": "ISC",
   "bugs": {
-    "url": "https://github.com/fga-eps-mds/2020.1-Grupo2-backend/issues"
+    "url": "https://github.com/fga-eps-mds/2020.1-GaiaDex-backend/issues"
   },
-  "homepage": "https://github.com/fga-eps-mds/2020.1-Grupo2-backend#readme",
+  "homepage": "https://github.com/fga-eps-mds/2020.1-GaiaDex-backend#readme",
   "dependencies": {
+    "abbrev": "^1.1.1",
+    "accepts": "^1.3.7",
+    "acorn": "^7.4.1",
+    "acorn-jsx": "^5.3.1",
+    "aggregate-error": "^3.1.0",
+    "ajv": "^6.12.6",
+    "ansi-align": "^3.0.0",
+    "ansi-colors": "^4.1.1",
+    "ansi-escapes": "^4.3.1",
+    "ansi-regex": "^5.0.0",
+    "ansi-styles": "^4.3.0",
+    "anymatch": "^3.1.1",
+    "argparse": "^1.0.10",
+    "aria-query": "^4.2.2",
+    "array-flatten": "^1.1.1",
+    "array-includes": "^3.1.1",
+    "array.prototype.flat": "^1.2.3",
+    "array.prototype.flatmap": "^1.2.3",
+    "ast-types-flow": "^0.0.7",
+    "astral-regex": "^2.0.0",
+    "axe-core": "^3.5.5",
+    "axobject-query": "^2.2.0",
+    "balanced-match": "^1.0.0",
+    "basic-auth": "^2.0.1",
+    "binary-extensions": "^2.1.0",
+    "bl": "^2.2.1",
+    "bluebird": "^3.5.1",
+    "body-parser": "^1.19.0",
+    "boxen": "^4.2.0",
+    "brace-expansion": "^1.1.11",
+    "braces": "^3.0.2",
+    "bson": "^1.1.5",
+    "buffer-equal-constant-time": "^1.0.1",
+    "bytes": "^3.1.0",
+    "cacheable-request": "^6.1.0",
+    "callsites": "^3.1.0",
+    "camelcase": "^5.3.1",
+    "chalk": "^4.1.0",
+    "chardet": "^0.7.0",
+    "chokidar": "^3.4.3",
+    "ci-info": "^2.0.0",
+    "clean-stack": "^2.2.0",
+    "cli-boxes": "^2.2.1",
+    "cli-cursor": "^3.1.0",
+    "cli-truncate": "^2.1.0",
+    "cli-width": "^3.0.0",
+    "clone-response": "^1.0.2",
+    "color-convert": "^2.0.1",
+    "color-name": "^1.1.4",
+    "commander": "^6.1.0",
+    "compare-versions": "^3.6.0",
+    "concat-map": "^0.0.1",
+    "configstore": "^5.0.1",
+    "confusing-browser-globals": "^1.0.9",
+    "contains-path": "^0.1.0",
+    "content-disposition": "^0.5.3",
+    "content-type": "^1.0.4",
+    "cookie": "^0.4.0",
+    "cookie-signature": "^1.0.6",
+    "core-js-pure": "^3.6.5",
+    "cosmiconfig": "^7.0.0",
+    "core-util-is": "^1.0.2",
+    "cross-spawn": "^7.0.3",
+    "crypto-random-string": "^2.0.0",
+    "damerau-levenshtein": "^1.0.6",
+    "debug": "^2.6.9",
+    "decompress-response": "^3.3.0",
+    "dedent": "^0.7.0",
+    "deep-extend": "^0.6.0",
+    "deep-is": "^0.1.3",
+    "defer-to-connect": "^1.1.3",
+    "define-properties": "^1.1.3",
+    "denque": "^1.4.1",
+    "depd": "^1.1.2",
+    "destroy": "^1.0.4",
+    "doctrine": "^1.5.0",
+    "dot-prop": "^5.3.0",
     "dotenv": "^8.2.0",
+    "duplexer3": "^0.1.4",
+    "ecdsa-sig-formatter": "^1.0.11",
+    "ee-first": "^1.1.1",
+    "emoji-regex": "^8.0.0",
+    "encodeurl": "^1.0.2",
+    "end-of-stream": "^1.4.4",
+    "enquirer": "^2.3.6",
+    "error-ex": "^1.3.2",
+    "es-abstract": "^1.17.7",
+    "es-to-primitive": "^1.2.1",
+    "escape-goat": "^2.1.1",
+    "escape-html": "^1.0.3",
+    "escape-string-regexp": "^1.0.5",
+    "espree": "^7.3.0",
+    "esprima": "^4.0.1",
+    "esquery": "^1.3.1",
+    "esrecurse": "^4.3.0",
+    "estraverse": "^5.2.0",
+    "esutils": "^2.0.3",
+    "etag": "^1.8.1",
+    "execa": "^4.0.3",
     "express": "^4.17.1",
+    "external-editor": "^3.1.0",
+    "fast-deep-equal": "^3.1.3",
+    "fast-json-stable-stringify": "^2.1.0",
+    "fast-levenshtein": "^2.0.6",
+    "figures": "^3.2.0",
+    "file-entry-cache": "^5.0.1",
+    "fill-range": "^7.0.1",
+    "finalhandler": "^1.1.2",
+    "find-up": "^2.1.0",
+    "find-versions": "^3.2.0",
+    "flat-cache": "^2.0.1",
+    "flatted": "^2.0.2",
+    "forwarded": "^0.1.2",
+    "fresh": "^0.5.2",
+    "fs.realpath": "^1.0.0",
+    "function-bind": "^1.1.1",
+    "functional-red-black-tree": "^1.0.1",
+    "get-own-enumerable-property-symbols": "^3.0.2",
+    "get-stream": "^5.2.0",
+    "glob": "^7.1.6",
+    "glob-parent": "^5.1.1",
+    "global-dirs": "^2.0.1",
+    "globals": "^12.4.0",
+    "got": "^9.6.0",
+    "graceful-fs": "^4.2.4",
+    "has": "^1.0.3",
+    "has-flag": "^3.0.0",
+    "has-yarn": "^2.1.0",
+    "has-symbols": "^1.0.1",
+    "hosted-git-info": "^2.8.8",
+    "http-cache-semantics": "^4.1.0",
+    "http-errors": "^1.7.2",
+    "human-signals": "^1.1.1",
+    "iconv-lite": "^0.4.24",
+    "ignore": "^4.0.6",
+    "ignore-by-default": "^1.0.1",
+    "import-fresh": "^3.2.1",
+    "import-lazy": "^2.1.0",
+    "imurmurhash": "^0.1.4",
+    "indent-string": "^4.0.0",
+    "inflight": "^1.0.6",
+    "inherits": "^2.0.4",
+    "ini": "^1.3.5",
+    "inquirer": "^7.3.3",
+    "internal-slot": "^1.0.2",
+    "ipaddr.js": "^1.9.1",
+    "is-arrayish": "^0.2.1",
+    "is-binary-path": "^2.1.0",
+    "is-callable": "^1.2.2",
+    "is-ci": "^2.0.0",
+    "is-core-module": "^2.0.0",
+    "is-date-object": "^1.0.2",
+    "is-extglob": "^2.1.1",
+    "is-fullwidth-code-point": "^3.0.0",
+    "is-glob": "^4.0.1",
+    "is-installed-globally": "^0.3.2",
+    "is-negative-zero": "^2.0.0",
+    "is-npm": "^4.0.0",
+    "is-number": "^7.0.0",
+    "is-obj": "^1.0.1",
+    "is-path-inside": "^3.0.2",
+    "is-regex": "^1.1.1",
+    "is-regexp": "^1.0.0",
+    "is-stream": "^2.0.0",
+    "is-string": "^1.0.5",
+    "is-symbol": "^1.0.3",
+    "is-typedarray": "^1.0.0",
+    "is-yarn-global": "^0.3.0",
+    "isarray": "^1.0.0",
+    "isexe": "^2.0.0",
     "joi": "^17.2.1",
+    "js-tokens": "^4.0.0",
+    "js-yaml": "^3.14.0",
+    "jsesc": "^2.5.2",
+    "json-buffer": "^3.0.0",
+    "json-parse-even-better-errors": "^2.3.1",
+    "json-schema-traverse": "^0.4.1",
+    "json-stable-stringify-without-jsonify": "^1.0.1",
+    "json5": "^1.0.1",
     "jsonwebtoken": "^8.5.1",
-    "body-parser": "^1.19.0",
+    "jsx-ast-utils": "^2.4.1",
+    "jwa": "^1.4.1",
+    "jws": "^3.2.2",
+    "kareem": "^2.3.1",
+    "keyv": "^3.1.0",
+    "language-subtag-registry": "^0.3.20",
+    "language-tags": "^1.0.5",
+    "latest-version": "^5.1.0",
+    "levn": "^0.4.1",
+    "lines-and-columns": "^1.1.6",
+    "listr2": "^2.6.2",
+    "load-json-file": "^2.0.0",
+    "locate-path": "^2.0.0",
+    "lodash": "^4.17.20",
+    "lodash.includes": "^4.3.0",
+    "lodash.isboolean": "^3.0.3",
+    "lodash.isinteger": "^4.0.4",
+    "lodash.isnumber": "^3.0.3",
+    "lodash.isplainobject": "^4.0.6",
+    "lodash.isstring": "^4.0.1",
+    "lodash.once": "^4.1.1",
+    "log-update": "^4.0.0",
+    "loose-envify": "^1.4.0",
+    "log-symbols": "^4.0.0",
+    "lowercase-keys": "^1.0.1",
+    "make-dir": "^3.1.0",
+    "media-typer": "^0.3.0",
+    "memory-pager": "^1.5.0",
+    "merge-descriptors": "^1.0.1",
+    "merge-stream": "^2.0.0",
+    "methods": "^1.1.2",
+    "micromatch": "^4.0.2",
+    "mime": "^1.6.0",
+    "mime-db": "^1.44.0",
+    "mime-types": "^2.1.27",
+    "mimic-fn": "^2.1.0",
+    "mimic-response": "^1.0.1",
+    "minimatch": "^3.0.4",
+    "minimist": "^1.2.5",
+    "mkdirp": "^0.5.5",
     "mongodb": "^3.6.2",
+    "morgan": "^1.10.0",
     "mongoose": "^5.10.5",
-    "morgan": "^1.10.0"
+    "mongoose-legacy-pluralize": "^1.0.2",
+    "mpath": "^0.7.0",
+    "mquery": "^3.2.2",
+    "ms": "^2.1.2",
+    "mute-stream": "^0.0.8",
+    "natural-compare": "^1.4.0",
+    "negotiator": "^0.6.2",
+    "nopt": "^1.0.10",
+    "normalize-package-data": "^2.5.0",
+    "normalize-path": "^3.0.0",
+    "normalize-url": "^4.5.0",
+    "npm-run-path": "^4.0.1",
+    "object-assign": "^4.1.1",
+    "object-inspect": "^1.8.0",
+    "object-keys": "^1.1.1",
+    "object.assign": "^4.1.1",
+    "object.entries": "^1.1.2",
+    "object.fromentries": "^2.0.2",
+    "object.values": "^1.1.1",
+    "on-finished": "^2.3.0",
+    "on-headers": "^1.0.2",
+    "once": "^1.4.0",
+    "onetime": "^5.1.2",
+    "opencollective-postinstall": "^2.0.3",
+    "optionator": "^0.9.1",
+    "os-tmpdir": "^1.0.2",
+    "p-cancelable": "^1.1.0",
+    "p-limit": "^1.3.0",
+    "p-locate": "^2.0.0",
+    "p-map": "^4.0.0",
+    "p-try": "^1.0.0",
+    "package-json": "^6.5.0",
+    "parent-module": "^1.0.1",
+    "parse-json": "^5.1.0",
+    "parseurl": "^1.3.3",
+    "path-exists": "^3.0.0",
+    "path-is-absolute": "^1.0.1",
+    "path-key": "^3.1.1",
+    "path-parse": "^1.0.6",
+    "path-to-regexp": "^0.1.7",
+    "path-type": "^4.0.0",
+    "picomatch": "^2.2.2",
+    "pify": "^2.3.0",
+    "pkg-dir": "^4.2.0",
+    "please-upgrade-node": "^3.2.0",
+    "prelude-ls": "^1.2.1",
+    "prepend-http": "^2.0.0",
+    "process-nextick-args": "^2.0.1",
+    "progress": "^2.0.3",
+    "prop-types": "^15.7.2",
+    "proxy-addr": "^2.0.6",
+    "pstree.remy": "^1.1.8",
+    "pump": "^3.0.0",
+    "punycode": "^2.1.1",
+    "pupa": "^2.0.1",
+    "qs": "^6.7.0",
+    "range-parser": "^1.2.1",
+    "raw-body": "^2.4.0",
+    "rc": "^1.2.8",
+    "react-is": "^16.13.1",
+    "read-pkg": "^2.0.0",
+    "read-pkg-up": "^2.0.0",
+    "readable-stream": "^2.3.7",
+    "readdirp": "^3.5.0",
+    "regenerator-runtime": "^0.13.7",
+    "regexp-clone": "^1.0.0",
+    "regexp.prototype.flags": "^1.3.0",
+    "regexpp": "^3.1.0",
+    "registry-auth-token": "^4.2.0",
+    "registry-url": "^5.1.0",
+    "require_optional": "^1.0.1",
+    "resolve": "^1.18.1",
+    "resolve-from": "^2.0.0",
+    "responselike": "^1.0.2",
+    "restore-cursor": "^3.1.0",
+    "rimraf": "^2.6.3",
+    "run-async": "^2.4.1",
+    "rxjs": "^6.6.3",
+    "safe-buffer": "^5.1.2",
+    "safer-buffer": "^2.1.2",
+    "saslprep": "^1.0.3",
+    "semver": "^5.7.1",
+    "semver-compare": "^1.0.0",
+    "semver-diff": "^3.1.1",
+    "semver-regex": "^2.0.0",
+    "send": "^0.17.1",
+    "serve-static": "^1.14.1",
+    "setprototypeof": "^1.1.1",
+    "shebang-command": "^2.0.0",
+    "shebang-regex": "^3.0.0",
+    "side-channel": "^1.0.3",
+    "sift": "^7.0.1",
+    "signal-exit": "^3.0.3",
+    "slash": "^3.0.0",
+    "slice-ansi": "^2.1.0",
+    "sliced": "^1.0.1",
+    "source-map": "^0.5.7",
+    "sparse-bitfield": "^3.0.3",
+    "spdx-correct": "^3.1.1",
+    "spdx-exceptions": "^2.3.0",
+    "spdx-expression-parse": "^3.0.1",
+    "spdx-license-ids": "^3.0.6",
+    "sprintf-js": "^1.0.3",
+    "statuses": "^1.5.0",
+    "string-argv": "^0.3.1",
+    "string-width": "^4.2.0",
+    "string.prototype.matchall": "^4.0.2",
+    "string.prototype.trimend": "^1.0.1",
+    "string.prototype.trimstart": "^1.0.1",
+    "string_decoder": "^1.1.1",
+    "stringify-object": "^3.3.0",
+    "strip-ansi": "^6.0.0",
+    "strip-bom": "^3.0.0",
+    "strip-final-newline": "^2.0.0",
+    "strip-json-comments": "^3.1.1",
+    "supports-color": "^5.5.0",
+    "table": "^5.4.6",
+    "term-size": "^2.2.0",
+    "text-table": "^0.2.0",
+    "through": "^2.3.8",
+    "tmp": "^0.0.33",
+    "to-fast-properties": "^2.0.0",
+    "to-readable-stream": "^1.0.0",
+    "to-regex-range": "^5.0.1",
+    "toidentifier": "^1.0.0",
+    "touch": "^3.1.0",
+    "tsconfig-paths": "^3.9.0",
+    "tslib": "^1.14.1",
+    "type-check": "^0.4.0",
+    "type-fest": "^0.8.1",
+    "type-is": "^1.6.18",
+    "typedarray-to-buffer": "^3.1.5",
+    "undefsafe": "^2.0.3",
+    "unique-string": "^2.0.0",
+    "unpipe": "^1.0.0",
+    "update-notifier": "^4.1.3",
+    "uri-js": "^4.4.0",
+    "url-parse-lax": "^3.0.0",
+    "util-deprecate": "^1.0.2",
+    "utils-merge": "^1.0.1",
+    "v8-compile-cache": "^2.1.1",
+    "validate-npm-package-license": "^3.0.4",
+    "vary": "^1.1.2",
+    "which": "^2.0.2",
+    "which-pm-runs": "^1.0.0",
+    "widest-line": "^3.1.0",
+    "word-wrap": "^1.2.3",
+    "wrap-ansi": "^6.2.0",
+    "wrappy": "^1.0.2",
+    "write": "^1.0.3",
+    "write-file-atomic": "^3.0.3",
+    "xdg-basedir": "^4.0.0",
+    "yaml": "^1.10.0"
   },
   "devDependencies": {
-    "nodemon": "^2.0.4"
+    "babel-eslint": "^10.1.0",
+    "eslint": "^7.11.0",
+    "eslint-config-airbnb": "^18.2.0",
+    "eslint-config-prettier": "^6.13.0",
+    "eslint-import-resolver-node": "^0.3.4",
+    "eslint-module-utils": "^2.6.0",
+    "eslint-plugin-import": "^2.22.1",
+    "eslint-plugin-jsx-a11y": "^6.3.1",
+    "eslint-plugin-prettier": "^3.1.4",
+    "eslint-plugin-react": "^7.21.4",
+    "eslint-plugin-react-hooks": "^4.0.0",
+    "eslint-scope": "^5.1.1",
+    "eslint-utils": "^2.1.0",
+    "eslint-visitor-keys": "^1.3.0",
+    "husky": "^4.3.0",
+    "lint-staged": "^10.4.2",
+    "nodemon": "^2.0.4",
+    "prettier": "2.1.2"
   }
 }
diff --git a/src/index.js b/src/index.js
index 6afa0b5..7d410a9 100644
--- a/src/index.js
+++ b/src/index.js
@@ -3,7 +3,6 @@ const app = express();
 const morgan = require('morgan');
 const mongoose = require('mongoose');
 
-
 const authRoutes = require('./routes/authRoutes');
 const plantRoutes = require('./routes/plantRoutes');
 const topicRoutes = require('./routes/topicRoutes');
diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index c81745f..0000000
--- a/yarn.lock
+++ /dev/null
@@ -1,1356 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@sindresorhus/is@^0.14.0":
-  version "0.14.0"
-  resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
-  integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
-
-"@szmarczak/http-timer@^1.1.2":
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
-  integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
-  dependencies:
-    defer-to-connect "^1.0.1"
-
-"@types/color-name@^1.1.1":
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
-  integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
-
-abbrev@1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
-  integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
-
-accepts@~1.3.7:
-  version "1.3.7"
-  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
-  integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
-  dependencies:
-    mime-types "~2.1.24"
-    negotiator "0.6.2"
-
-ansi-align@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
-  integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
-  dependencies:
-    string-width "^3.0.0"
-
-ansi-regex@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
-  integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
-
-ansi-regex@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
-  integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
-
-ansi-styles@^4.1.0:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
-  integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
-  dependencies:
-    "@types/color-name" "^1.1.1"
-    color-convert "^2.0.1"
-
-anymatch@~3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
-  integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
-  dependencies:
-    normalize-path "^3.0.0"
-    picomatch "^2.0.4"
-
-array-flatten@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
-  integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
-
-balanced-match@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
-  integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
-
-basic-auth@~2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a"
-  integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==
-  dependencies:
-    safe-buffer "5.1.2"
-
-binary-extensions@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
-  integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
-
-bl@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5"
-  integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==
-  dependencies:
-    readable-stream "^2.3.5"
-    safe-buffer "^5.1.1"
-
-bluebird@3.5.1:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
-  integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==
-
-body-parser@1.19.0, body-parser@^1.19.0:
-  version "1.19.0"
-  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
-  integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
-  dependencies:
-    bytes "3.1.0"
-    content-type "~1.0.4"
-    debug "2.6.9"
-    depd "~1.1.2"
-    http-errors "1.7.2"
-    iconv-lite "0.4.24"
-    on-finished "~2.3.0"
-    qs "6.7.0"
-    raw-body "2.4.0"
-    type-is "~1.6.17"
-
-boxen@^4.2.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64"
-  integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==
-  dependencies:
-    ansi-align "^3.0.0"
-    camelcase "^5.3.1"
-    chalk "^3.0.0"
-    cli-boxes "^2.2.0"
-    string-width "^4.1.0"
-    term-size "^2.1.0"
-    type-fest "^0.8.1"
-    widest-line "^3.1.0"
-
-brace-expansion@^1.1.7:
-  version "1.1.11"
-  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
-  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
-  dependencies:
-    balanced-match "^1.0.0"
-    concat-map "0.0.1"
-
-braces@~3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
-  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
-  dependencies:
-    fill-range "^7.0.1"
-
-bson@^1.1.4:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.5.tgz#2aaae98fcdf6750c0848b0cba1ddec3c73060a34"
-  integrity sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==
-
-bytes@3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
-  integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
-
-cacheable-request@^6.0.0:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
-  integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
-  dependencies:
-    clone-response "^1.0.2"
-    get-stream "^5.1.0"
-    http-cache-semantics "^4.0.0"
-    keyv "^3.0.0"
-    lowercase-keys "^2.0.0"
-    normalize-url "^4.1.0"
-    responselike "^1.0.2"
-
-camelcase@^5.3.1:
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
-  integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-
-chalk@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
-  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
-  dependencies:
-    ansi-styles "^4.1.0"
-    supports-color "^7.1.0"
-
-chokidar@^3.2.2:
-  version "3.4.2"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d"
-  integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==
-  dependencies:
-    anymatch "~3.1.1"
-    braces "~3.0.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"
-  optionalDependencies:
-    fsevents "~2.1.2"
-
-ci-info@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
-  integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
-
-cli-boxes@^2.2.0:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
-  integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
-
-clone-response@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
-  integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
-  dependencies:
-    mimic-response "^1.0.0"
-
-color-convert@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
-  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
-  dependencies:
-    color-name "~1.1.4"
-
-color-name@~1.1.4:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
-  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
-concat-map@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
-  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-
-configstore@^5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
-  integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
-  dependencies:
-    dot-prop "^5.2.0"
-    graceful-fs "^4.1.2"
-    make-dir "^3.0.0"
-    unique-string "^2.0.0"
-    write-file-atomic "^3.0.0"
-    xdg-basedir "^4.0.0"
-
-content-disposition@0.5.3:
-  version "0.5.3"
-  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
-  integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
-  dependencies:
-    safe-buffer "5.1.2"
-
-content-type@~1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
-  integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
-
-cookie-signature@1.0.6:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
-  integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
-
-cookie@0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
-  integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
-
-core-util-is@~1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
-  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-
-crypto-random-string@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
-  integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
-
-debug@2.6.9, debug@^2.2.0:
-  version "2.6.9"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
-  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
-  dependencies:
-    ms "2.0.0"
-
-debug@3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
-  integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
-  dependencies:
-    ms "2.0.0"
-
-debug@^3.2.6:
-  version "3.2.6"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
-  integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
-  dependencies:
-    ms "^2.1.1"
-
-decompress-response@^3.3.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
-  integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
-  dependencies:
-    mimic-response "^1.0.0"
-
-deep-extend@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
-  integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
-
-defer-to-connect@^1.0.1:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
-  integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
-
-denque@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf"
-  integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==
-
-depd@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
-  integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
-
-depd@~2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
-  integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-
-destroy@~1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
-  integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
-
-dot-prop@^5.2.0:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
-  integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
-  dependencies:
-    is-obj "^2.0.0"
-
-dotenv@^8.2.0:
-  version "8.2.0"
-  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
-  integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==
-
-duplexer3@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
-  integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
-
-ee-first@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
-  integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-
-emoji-regex@^7.0.1:
-  version "7.0.3"
-  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
-  integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
-
-emoji-regex@^8.0.0:
-  version "8.0.0"
-  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
-  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
-encodeurl@~1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
-  integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
-
-end-of-stream@^1.1.0:
-  version "1.4.4"
-  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
-  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
-  dependencies:
-    once "^1.4.0"
-
-escape-goat@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
-  integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
-
-escape-html@~1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
-  integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
-
-etag@~1.8.1:
-  version "1.8.1"
-  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
-  integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
-
-express@^4.17.1:
-  version "4.17.1"
-  resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
-  integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
-  dependencies:
-    accepts "~1.3.7"
-    array-flatten "1.1.1"
-    body-parser "1.19.0"
-    content-disposition "0.5.3"
-    content-type "~1.0.4"
-    cookie "0.4.0"
-    cookie-signature "1.0.6"
-    debug "2.6.9"
-    depd "~1.1.2"
-    encodeurl "~1.0.2"
-    escape-html "~1.0.3"
-    etag "~1.8.1"
-    finalhandler "~1.1.2"
-    fresh "0.5.2"
-    merge-descriptors "1.0.1"
-    methods "~1.1.2"
-    on-finished "~2.3.0"
-    parseurl "~1.3.3"
-    path-to-regexp "0.1.7"
-    proxy-addr "~2.0.5"
-    qs "6.7.0"
-    range-parser "~1.2.1"
-    safe-buffer "5.1.2"
-    send "0.17.1"
-    serve-static "1.14.1"
-    setprototypeof "1.1.1"
-    statuses "~1.5.0"
-    type-is "~1.6.18"
-    utils-merge "1.0.1"
-    vary "~1.1.2"
-
-fill-range@^7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
-  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
-  dependencies:
-    to-regex-range "^5.0.1"
-
-finalhandler@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
-  integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
-  dependencies:
-    debug "2.6.9"
-    encodeurl "~1.0.2"
-    escape-html "~1.0.3"
-    on-finished "~2.3.0"
-    parseurl "~1.3.3"
-    statuses "~1.5.0"
-    unpipe "~1.0.0"
-
-forwarded@~0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
-  integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
-
-fresh@0.5.2:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
-  integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
-
-fsevents@~2.1.2:
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
-  integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
-
-get-stream@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
-  integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
-  dependencies:
-    pump "^3.0.0"
-
-get-stream@^5.1.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
-  integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
-  dependencies:
-    pump "^3.0.0"
-
-glob-parent@~5.1.0:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
-  integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
-  dependencies:
-    is-glob "^4.0.1"
-
-global-dirs@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201"
-  integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==
-  dependencies:
-    ini "^1.3.5"
-
-got@^9.6.0:
-  version "9.6.0"
-  resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
-  integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
-  dependencies:
-    "@sindresorhus/is" "^0.14.0"
-    "@szmarczak/http-timer" "^1.1.2"
-    cacheable-request "^6.0.0"
-    decompress-response "^3.3.0"
-    duplexer3 "^0.1.4"
-    get-stream "^4.1.0"
-    lowercase-keys "^1.0.1"
-    mimic-response "^1.0.1"
-    p-cancelable "^1.0.0"
-    to-readable-stream "^1.0.0"
-    url-parse-lax "^3.0.0"
-
-graceful-fs@^4.1.2:
-  version "4.2.4"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
-  integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
-
-has-flag@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
-  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
-
-has-flag@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
-  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
-has-yarn@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
-  integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
-
-http-cache-semantics@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
-  integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
-
-http-errors@1.7.2:
-  version "1.7.2"
-  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
-  integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
-  dependencies:
-    depd "~1.1.2"
-    inherits "2.0.3"
-    setprototypeof "1.1.1"
-    statuses ">= 1.5.0 < 2"
-    toidentifier "1.0.0"
-
-http-errors@~1.7.2:
-  version "1.7.3"
-  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
-  integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
-  dependencies:
-    depd "~1.1.2"
-    inherits "2.0.4"
-    setprototypeof "1.1.1"
-    statuses ">= 1.5.0 < 2"
-    toidentifier "1.0.0"
-
-iconv-lite@0.4.24:
-  version "0.4.24"
-  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
-  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
-  dependencies:
-    safer-buffer ">= 2.1.2 < 3"
-
-ignore-by-default@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
-  integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
-
-import-lazy@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
-  integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
-
-imurmurhash@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
-  integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
-
-inherits@2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
-  integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
-
-inherits@2.0.4, inherits@~2.0.3:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
-  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-ini@^1.3.5, ini@~1.3.0:
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
-  integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
-
-ipaddr.js@1.9.1:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
-  integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
-
-is-binary-path@~2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
-  integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
-  dependencies:
-    binary-extensions "^2.0.0"
-
-is-ci@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
-  integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
-  dependencies:
-    ci-info "^2.0.0"
-
-is-extglob@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
-  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-
-is-fullwidth-code-point@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
-  integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
-
-is-fullwidth-code-point@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
-  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
-is-glob@^4.0.1, is-glob@~4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
-  integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
-  dependencies:
-    is-extglob "^2.1.1"
-
-is-installed-globally@^0.3.1:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
-  integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==
-  dependencies:
-    global-dirs "^2.0.1"
-    is-path-inside "^3.0.1"
-
-is-npm@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d"
-  integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==
-
-is-number@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
-  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
-is-obj@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
-  integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
-
-is-path-inside@^3.0.1:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
-  integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
-
-is-typedarray@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
-  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
-
-is-yarn-global@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
-  integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
-
-isarray@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
-  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
-
-json-buffer@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
-  integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
-
-kareem@2.3.1:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.1.tgz#def12d9c941017fabfb00f873af95e9c99e1be87"
-  integrity sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==
-
-keyv@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
-  integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
-  dependencies:
-    json-buffer "3.0.0"
-
-latest-version@^5.0.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
-  integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
-  dependencies:
-    package-json "^6.3.0"
-
-lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
-  integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
-
-lowercase-keys@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
-  integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
-
-make-dir@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
-  integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
-  dependencies:
-    semver "^6.0.0"
-
-media-typer@0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
-  integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
-
-memory-pager@^1.0.2:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5"
-  integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==
-
-merge-descriptors@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
-  integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
-
-methods@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
-  integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
-
-mime-db@1.44.0:
-  version "1.44.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
-  integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
-
-mime-types@~2.1.24:
-  version "2.1.27"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
-  integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
-  dependencies:
-    mime-db "1.44.0"
-
-mime@1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
-  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-
-mimic-response@^1.0.0, mimic-response@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
-  integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
-
-minimatch@^3.0.4:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
-  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
-  dependencies:
-    brace-expansion "^1.1.7"
-
-minimist@^1.2.0:
-  version "1.2.5"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
-  integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-
-mongodb@3.6.2:
-  version "3.6.2"
-  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.2.tgz#1154a4ac107bf1375112d83a29c5cf97704e96b6"
-  integrity sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==
-  dependencies:
-    bl "^2.2.1"
-    bson "^1.1.4"
-    denque "^1.4.1"
-    require_optional "^1.0.1"
-    safe-buffer "^5.1.2"
-  optionalDependencies:
-    saslprep "^1.0.0"
-
-mongoose-legacy-pluralize@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4"
-  integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==
-
-mongoose@^5.10.5:
-  version "5.10.5"
-  resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.10.5.tgz#47bef488d1fd39ab9c93ab05a9b6d0b08fd8c662"
-  integrity sha512-BOQZsZn9Y79f3rWZFLD1gvOLNN5gOiGvGr5raqQ5v/T4fdAmnjXGCVynpW4SRnQLtrcCeLXyaaXVRT75863Q0w==
-  dependencies:
-    bson "^1.1.4"
-    kareem "2.3.1"
-    mongodb "3.6.2"
-    mongoose-legacy-pluralize "1.0.2"
-    mpath "0.7.0"
-    mquery "3.2.2"
-    ms "2.1.2"
-    regexp-clone "1.0.0"
-    safe-buffer "5.2.1"
-    sift "7.0.1"
-    sliced "1.0.1"
-
-morgan@^1.10.0:
-  version "1.10.0"
-  resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7"
-  integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==
-  dependencies:
-    basic-auth "~2.0.1"
-    debug "2.6.9"
-    depd "~2.0.0"
-    on-finished "~2.3.0"
-    on-headers "~1.0.2"
-
-mpath@0.7.0:
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.7.0.tgz#20e8102e276b71709d6e07e9f8d4d0f641afbfb8"
-  integrity sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==
-
-mquery@3.2.2:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.2.tgz#e1383a3951852ce23e37f619a9b350f1fb3664e7"
-  integrity sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==
-  dependencies:
-    bluebird "3.5.1"
-    debug "3.1.0"
-    regexp-clone "^1.0.0"
-    safe-buffer "5.1.2"
-    sliced "1.0.1"
-
-ms@2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
-  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-
-ms@2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
-  integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
-
-ms@2.1.2, ms@^2.1.1:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
-  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-negotiator@0.6.2:
-  version "0.6.2"
-  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
-  integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
-
-nodemon@^2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416"
-  integrity sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==
-  dependencies:
-    chokidar "^3.2.2"
-    debug "^3.2.6"
-    ignore-by-default "^1.0.1"
-    minimatch "^3.0.4"
-    pstree.remy "^1.1.7"
-    semver "^5.7.1"
-    supports-color "^5.5.0"
-    touch "^3.1.0"
-    undefsafe "^2.0.2"
-    update-notifier "^4.0.0"
-
-nopt@~1.0.10:
-  version "1.0.10"
-  resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
-  integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
-  dependencies:
-    abbrev "1"
-
-normalize-path@^3.0.0, normalize-path@~3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
-  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-normalize-url@^4.1.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
-  integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
-
-on-finished@~2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
-  integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
-  dependencies:
-    ee-first "1.1.1"
-
-on-headers@~1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
-  integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
-
-once@^1.3.1, once@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
-  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
-  dependencies:
-    wrappy "1"
-
-p-cancelable@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
-  integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
-
-package-json@^6.3.0:
-  version "6.5.0"
-  resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
-  integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
-  dependencies:
-    got "^9.6.0"
-    registry-auth-token "^4.0.0"
-    registry-url "^5.0.0"
-    semver "^6.2.0"
-
-parseurl@~1.3.3:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
-  integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
-
-path-to-regexp@0.1.7:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
-  integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
-
-picomatch@^2.0.4, picomatch@^2.2.1:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
-  integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
-
-prepend-http@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
-  integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
-
-process-nextick-args@~2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
-  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-
-proxy-addr@~2.0.5:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
-  integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
-  dependencies:
-    forwarded "~0.1.2"
-    ipaddr.js "1.9.1"
-
-pstree.remy@^1.1.7:
-  version "1.1.8"
-  resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
-  integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
-
-pump@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
-  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
-  dependencies:
-    end-of-stream "^1.1.0"
-    once "^1.3.1"
-
-pupa@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726"
-  integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==
-  dependencies:
-    escape-goat "^2.0.0"
-
-qs@6.7.0:
-  version "6.7.0"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
-  integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
-
-range-parser@~1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
-  integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-
-raw-body@2.4.0:
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
-  integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
-  dependencies:
-    bytes "3.1.0"
-    http-errors "1.7.2"
-    iconv-lite "0.4.24"
-    unpipe "1.0.0"
-
-rc@^1.2.8:
-  version "1.2.8"
-  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
-  integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
-  dependencies:
-    deep-extend "^0.6.0"
-    ini "~1.3.0"
-    minimist "^1.2.0"
-    strip-json-comments "~2.0.1"
-
-readable-stream@^2.3.5:
-  version "2.3.7"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
-  integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.3"
-    isarray "~1.0.0"
-    process-nextick-args "~2.0.0"
-    safe-buffer "~5.1.1"
-    string_decoder "~1.1.1"
-    util-deprecate "~1.0.1"
-
-readdirp@~3.4.0:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
-  integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
-  dependencies:
-    picomatch "^2.2.1"
-
-regexp-clone@1.0.0, regexp-clone@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63"
-  integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==
-
-registry-auth-token@^4.0.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da"
-  integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==
-  dependencies:
-    rc "^1.2.8"
-
-registry-url@^5.0.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
-  integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
-  dependencies:
-    rc "^1.2.8"
-
-require_optional@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
-  integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==
-  dependencies:
-    resolve-from "^2.0.0"
-    semver "^5.1.0"
-
-resolve-from@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
-  integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=
-
-responselike@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
-  integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
-  dependencies:
-    lowercase-keys "^1.0.0"
-
-safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
-  version "5.1.2"
-  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
-  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
-safe-buffer@5.2.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2:
-  version "5.2.1"
-  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
-  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-"safer-buffer@>= 2.1.2 < 3":
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
-  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-
-saslprep@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226"
-  integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==
-  dependencies:
-    sparse-bitfield "^3.0.3"
-
-semver-diff@^3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
-  integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
-  dependencies:
-    semver "^6.3.0"
-
-semver@^5.1.0, semver@^5.7.1:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
-  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
-  version "6.3.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
-  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-
-send@0.17.1:
-  version "0.17.1"
-  resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
-  integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
-  dependencies:
-    debug "2.6.9"
-    depd "~1.1.2"
-    destroy "~1.0.4"
-    encodeurl "~1.0.2"
-    escape-html "~1.0.3"
-    etag "~1.8.1"
-    fresh "0.5.2"
-    http-errors "~1.7.2"
-    mime "1.6.0"
-    ms "2.1.1"
-    on-finished "~2.3.0"
-    range-parser "~1.2.1"
-    statuses "~1.5.0"
-
-serve-static@1.14.1:
-  version "1.14.1"
-  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
-  integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
-  dependencies:
-    encodeurl "~1.0.2"
-    escape-html "~1.0.3"
-    parseurl "~1.3.3"
-    send "0.17.1"
-
-setprototypeof@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
-  integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
-
-sift@7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08"
-  integrity sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==
-
-signal-exit@^3.0.2:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
-  integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
-
-sliced@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41"
-  integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=
-
-sparse-bitfield@^3.0.3:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11"
-  integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE=
-  dependencies:
-    memory-pager "^1.0.2"
-
-"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
-  integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
-
-string-width@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
-  integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
-  dependencies:
-    emoji-regex "^7.0.1"
-    is-fullwidth-code-point "^2.0.0"
-    strip-ansi "^5.1.0"
-
-string-width@^4.0.0, string-width@^4.1.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
-  integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
-  dependencies:
-    emoji-regex "^8.0.0"
-    is-fullwidth-code-point "^3.0.0"
-    strip-ansi "^6.0.0"
-
-string_decoder@~1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
-  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
-  dependencies:
-    safe-buffer "~5.1.0"
-
-strip-ansi@^5.1.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
-  integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
-  dependencies:
-    ansi-regex "^4.1.0"
-
-strip-ansi@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
-  integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
-  dependencies:
-    ansi-regex "^5.0.0"
-
-strip-json-comments@~2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
-  integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
-
-supports-color@^5.5.0:
-  version "5.5.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
-  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
-  dependencies:
-    has-flag "^3.0.0"
-
-supports-color@^7.1.0:
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
-  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
-  dependencies:
-    has-flag "^4.0.0"
-
-term-size@^2.1.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753"
-  integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==
-
-to-readable-stream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
-  integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
-
-to-regex-range@^5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
-  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
-  dependencies:
-    is-number "^7.0.0"
-
-toidentifier@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
-  integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
-
-touch@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
-  integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
-  dependencies:
-    nopt "~1.0.10"
-
-type-fest@^0.8.1:
-  version "0.8.1"
-  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
-  integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-
-type-is@~1.6.17, type-is@~1.6.18:
-  version "1.6.18"
-  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
-  integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
-  dependencies:
-    media-typer "0.3.0"
-    mime-types "~2.1.24"
-
-typedarray-to-buffer@^3.1.5:
-  version "3.1.5"
-  resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
-  integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
-  dependencies:
-    is-typedarray "^1.0.0"
-
-undefsafe@^2.0.2:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
-  integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==
-  dependencies:
-    debug "^2.2.0"
-
-unique-string@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
-  integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
-  dependencies:
-    crypto-random-string "^2.0.0"
-
-unpipe@1.0.0, unpipe@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
-  integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
-
-update-notifier@^4.0.0:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.1.tgz#895fc8562bbe666179500f9f2cebac4f26323746"
-  integrity sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==
-  dependencies:
-    boxen "^4.2.0"
-    chalk "^3.0.0"
-    configstore "^5.0.1"
-    has-yarn "^2.1.0"
-    import-lazy "^2.1.0"
-    is-ci "^2.0.0"
-    is-installed-globally "^0.3.1"
-    is-npm "^4.0.0"
-    is-yarn-global "^0.3.0"
-    latest-version "^5.0.0"
-    pupa "^2.0.1"
-    semver-diff "^3.1.1"
-    xdg-basedir "^4.0.0"
-
-url-parse-lax@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
-  integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
-  dependencies:
-    prepend-http "^2.0.0"
-
-util-deprecate@~1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
-  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-
-utils-merge@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
-  integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
-
-vary@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
-  integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
-
-widest-line@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
-  integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
-  dependencies:
-    string-width "^4.0.0"
-
-wrappy@1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
-  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-
-write-file-atomic@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
-  integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
-  dependencies:
-    imurmurhash "^0.1.4"
-    is-typedarray "^1.0.0"
-    signal-exit "^3.0.2"
-    typedarray-to-buffer "^3.1.5"
-
-xdg-basedir@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
-  integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==

From 55b0fb59ffdbc1b86b3513a059bae703c537e671 Mon Sep 17 00:00:00 2001
From: Guilherme de Lyra <guilyra12@gmail.com>
Date: Tue, 20 Oct 2020 01:42:25 -0300
Subject: [PATCH 067/147] Create .stickler.yml

---
 .stickler.yml | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 .stickler.yml

diff --git a/.stickler.yml b/.stickler.yml
new file mode 100644
index 0000000..216bddc
--- /dev/null
+++ b/.stickler.yml
@@ -0,0 +1,11 @@
+linters:
+    eslint:
+        config: './eslint.config'
+
+files:
+  ignore:
+    - 'bower_components/*'
+    - 'node_modules/*'
+
+fixers:
+  enable: true

From 2c7a3682e8f5275569537e5948b0c6ed97fc47d1 Mon Sep 17 00:00:00 2001
From: Guilherme de Lyra <guilyra12@gmail.com>
Date: Tue, 20 Oct 2020 01:43:25 -0300
Subject: [PATCH 068/147] Update .stickler.yml

---
 .stickler.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.stickler.yml b/.stickler.yml
index 216bddc..32c9168 100644
--- a/.stickler.yml
+++ b/.stickler.yml
@@ -1,6 +1,6 @@
 linters:
     eslint:
-        config: './eslint.config'
+        config: './.eslintrc.json'
 
 files:
   ignore:

From 550f9d4016b36c746644bb1580b1219dea1e8835 Mon Sep 17 00:00:00 2001
From: Guilherme de Lyra <guilyra12@gmail.com>
Date: Tue, 20 Oct 2020 02:06:17 -0300
Subject: [PATCH 069/147] fixing .eslintrc (using very useful script in here ->
 https://github.com/paulolramos/eslint-prettier-airbnb-react)

---
 .eslintrc.json              |   61 +-
 .prettierrc.json            |    5 +
 package-lock.json           | 2803 +++++++++++++++++++++++++----------
 package.json                |  226 +--
 src/index.js                |   27 +-
 src/models/Comment.js       |   50 +-
 src/models/Plant.js         |  111 +-
 src/models/Topic.js         |   69 +-
 src/models/User.js          |   41 +-
 src/routes/auth.js          |   51 +-
 src/routes/authRoutes.js    |   99 +-
 src/routes/commentRoutes.js |  136 +-
 src/routes/plantRoutes.js   |  198 ++-
 src/routes/topicRoutes.js   |  182 ++-
 src/schemas/topicSchema.js  |    4 +-
 src/schemas/userSchema.js   |   12 +-
 16 files changed, 2689 insertions(+), 1386 deletions(-)
 create mode 100644 .prettierrc.json

diff --git a/.eslintrc.json b/.eslintrc.json
index 2a0e12c..38be060 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,33 +1,32 @@
 {
-    "extends": [
-        "airbnb",
-        "prettier",
-        "prettier/react",
-        "plugin:prettier/recommended",
-        "eslint-config-prettier"
-    ],
-    "parser": "babel-eslint",
-    "rules": {
-        "import/no-unresolved": "off",
-        "react/jsx-filename-extension": [
-            1,
-            {
-                "extensions": [
-                    ".js",
-                    ".jsx"
-                ]
-            }
-        ],
-        "prettier/prettier": [
-            "error",
-            {
-                "trailingComma": "es5",
-                "singleQuote": true,
-                "printWidth": 100
-            }
-        ]
-    },
-    "plugins": [
-        "prettier"
+  "extends": [
+    "airbnb",
+    "plugin:prettier/recommended",
+    "prettier/react"
+  ],
+  "env": {
+    "browser": true,
+    "commonjs": true,
+    "es6": true,
+    "jest": true,
+    "node": true
+  },
+  "rules": {
+    "jsx-a11y/href-no-hash": ["off"],
+    "react/jsx-filename-extension": ["warn", { "extensions": [".js", ".jsx"] }],
+    "max-len": [
+      "warn",
+      {
+        "code": 80,
+        "tabWidth": 2,
+        "comments": 80,
+        "ignoreComments": false,
+        "ignoreTrailingComments": true,
+        "ignoreUrls": true,
+        "ignoreStrings": true,
+        "ignoreTemplateLiterals": true,
+        "ignoreRegExpLiterals": true
+      }
     ]
-}
\ No newline at end of file
+  }
+}
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..11d9d42
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,5 @@
+{
+  "printWidth": 80,
+  "singleQuote": true,
+  "trailingComma": "es5"
+}
diff --git a/package-lock.json b/package-lock.json
index 423614e..d26bd23 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,6 +21,20 @@
         "@babel/types": "^7.12.1",
         "jsesc": "^2.5.1",
         "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
+        },
+        "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-function-name": {
@@ -83,6 +97,21 @@
             "ansi-styles": "^3.2.1",
             "escape-string-regexp": "^1.0.5",
             "supports-color": "^5.3.0"
+          },
+          "dependencies": {
+            "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="
+            },
+            "supports-color": {
+              "version": "5.5.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
           }
         },
         "color-convert": {
@@ -97,6 +126,16 @@
           "version": "1.1.3",
           "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz",
           "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
         }
       }
     },
@@ -151,26 +190,11 @@
         "lodash": "^4.17.19"
       },
       "dependencies": {
-        "debug": {
-          "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.2"
-          }
-        },
         "globals": {
           "version": "11.12.0",
           "resolved": "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz",
           "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
           "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
         }
       }
     },
@@ -183,6 +207,14 @@
         "@babel/helper-validator-identifier": "^7.10.4",
         "lodash": "^4.17.19",
         "to-fast-properties": "^2.0.0"
+      },
+      "dependencies": {
+        "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
+        }
       }
     },
     "@eslint/eslintrc": {
@@ -203,14 +235,26 @@
         "strip-json-comments": "^3.1.1"
       },
       "dependencies": {
-        "debug": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
-          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+        "globals": {
+          "version": "12.4.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
           "dev": true,
           "requires": {
-            "ms": "2.1.2"
+            "type-fest": "^0.8.1"
           }
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+          "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
         }
       }
     },
@@ -246,16 +290,27 @@
       }
     },
     "@sindresorhus/is": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
-      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz",
+      "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ=="
     },
     "@szmarczak/http-timer": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
-      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz",
+      "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==",
+      "requires": {
+        "defer-to-connect": "^2.0.0"
+      }
+    },
+    "@types/cacheable-request": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz",
+      "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==",
       "requires": {
-        "defer-to-connect": "^1.0.1"
+        "@types/http-cache-semantics": "*",
+        "@types/keyv": "*",
+        "@types/node": "*",
+        "@types/responselike": "*"
       }
     },
     "@types/color-name": {
@@ -263,16 +318,47 @@
       "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
       "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
     },
+    "@types/http-cache-semantics": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz",
+      "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A=="
+    },
     "@types/json5": {
       "version": "0.0.29",
       "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
       "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4="
     },
+    "@types/keyv": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz",
+      "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/node": {
+      "version": "14.11.10",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.10.tgz",
+      "integrity": "sha512-yV1nWZPlMFpoXyoknm4S56y2nlTAuFYaJuQtYRAOU7xA/FJ9RY0Xm7QOkaYMMmr8ESdHIuUb6oQgR/0+2NqlyA=="
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA=="
+    },
     "@types/parse-json": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
       "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
     },
+    "@types/responselike": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
+      "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -288,15 +374,23 @@
       }
     },
     "acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+      "version": "8.0.4",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
+      "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ=="
     },
     "acorn-jsx": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
       "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng=="
     },
+    "add-filename-increment": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/add-filename-increment/-/add-filename-increment-1.0.0.tgz",
+      "integrity": "sha512-pFV8VZX8jxuVMIycKvGZkWF/ihnUubu9lbQVnOnZWp7noVxbKQTNj7zG2y9fXdPcuZ6lAN3Drr517HaivGCjdQ==",
+      "requires": {
+        "strip-filename-increment": "^2.0.1"
+      }
+    },
     "aggregate-error": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
@@ -304,6 +398,13 @@
       "requires": {
         "clean-stack": "^2.0.0",
         "indent-string": "^4.0.0"
+      },
+      "dependencies": {
+        "clean-stack": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+          "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+        }
       }
     },
     "ajv": {
@@ -315,6 +416,13 @@
         "fast-json-stable-stringify": "^2.0.0",
         "json-schema-traverse": "^0.4.1",
         "uri-js": "^4.2.2"
+      },
+      "dependencies": {
+        "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=="
+        }
       }
     },
     "ansi-align": {
@@ -403,12 +511,9 @@
       }
     },
     "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
     },
     "aria-query": {
       "version": "4.2.2",
@@ -420,9 +525,9 @@
       }
     },
     "array-flatten": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz",
+      "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA=="
     },
     "array-includes": {
       "version": "3.1.1",
@@ -524,9 +629,9 @@
       "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
     },
     "axe-core": {
-      "version": "3.5.5",
-      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz",
-      "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q=="
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.0.2.tgz",
+      "integrity": "sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA=="
     },
     "axobject-query": {
       "version": "2.2.0",
@@ -545,6 +650,14 @@
         "@babel/types": "^7.7.0",
         "eslint-visitor-keys": "^1.0.0",
         "resolve": "^1.12.0"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
+        }
       }
     },
     "balanced-match": {
@@ -552,12 +665,24 @@
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
     },
+    "base64-js": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+    },
     "basic-auth": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
       "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
       "requires": {
         "safe-buffer": "5.1.2"
+      },
+      "dependencies": {
+        "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=="
+        }
       }
     },
     "binary-extensions": {
@@ -566,25 +691,19 @@
       "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ=="
     },
     "bl": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
-      "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
+      "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
       "requires": {
-        "readable-stream": "^2.3.5",
-        "safe-buffer": "^5.1.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
       }
     },
     "bluebird": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
-      "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
     },
     "body-parser": {
       "version": "1.19.0",
@@ -601,6 +720,77 @@
         "qs": "6.7.0",
         "raw-body": "2.4.0",
         "type-is": "~1.6.17"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+        },
+        "http-errors": {
+          "version": "1.7.2",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+          "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.1",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+        },
+        "raw-body": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+          "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+          "requires": {
+            "bytes": "3.1.0",
+            "http-errors": "1.7.2",
+            "iconv-lite": "0.4.24",
+            "unpipe": "1.0.0"
+          }
+        },
+        "setprototypeof": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+        }
       }
     },
     "boxen": {
@@ -627,6 +817,11 @@
             "color-convert": "^2.0.1"
           }
         },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        },
         "chalk": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
@@ -661,16 +856,20 @@
           "requires": {
             "has-flag": "^4.0.0"
           }
+        },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
         }
       }
     },
     "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.0.tgz",
+      "integrity": "sha512-A4GHY1GpcTnp+Elcwp1CbKHY6ZQwwVR7QdjZk4fPetEh7oNBfICu+eLvvVvTEMHgC+SGn+XiLAgGo0MnPPBGOg==",
       "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+        "balanced-match": "^1.0.0"
       }
     },
     "braces": {
@@ -682,9 +881,21 @@
       }
     },
     "bson": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
-      "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/bson/-/bson-4.2.0.tgz",
+      "integrity": "sha512-c3MlJqdROnCRvDr/+MLfaDvQ7CvGI4p1hKX45/fvgzSwKRdOjsfRug1NJJ8ty5mXCNtUdjJEWzoZWcBQxV4TyA==",
+      "requires": {
+        "buffer": "^5.6.0"
+      }
+    },
+    "buffer": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
+      "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4"
+      }
     },
     "buffer-equal-constant-time": {
       "version": "1.0.1",
@@ -696,18 +907,23 @@
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
       "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
     },
+    "cacheable-lookup": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz",
+      "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w=="
+    },
     "cacheable-request": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
-      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz",
+      "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==",
       "requires": {
         "clone-response": "^1.0.2",
         "get-stream": "^5.1.0",
         "http-cache-semantics": "^4.0.0",
-        "keyv": "^3.0.0",
+        "keyv": "^4.0.0",
         "lowercase-keys": "^2.0.0",
         "normalize-url": "^4.1.0",
-        "responselike": "^1.0.2"
+        "responselike": "^2.0.0"
       },
       "dependencies": {
         "get-stream": {
@@ -718,10 +934,10 @@
             "pump": "^3.0.0"
           }
         },
-        "lowercase-keys": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+        "normalize-url": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
+          "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
         }
       }
     },
@@ -731,9 +947,9 @@
       "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
     },
     "camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz",
+      "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ=="
     },
     "chalk": {
       "version": "4.1.0",
@@ -760,9 +976,9 @@
       }
     },
     "chardet": {
-      "version": "0.7.0",
-      "resolved": "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz",
-      "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.3.0.tgz",
+      "integrity": "sha512-cyTQGGptIjIT+CMGT5J/0l9c6Fb+565GCFjjeUTKxUO7w3oR+FcNCMEKTn5xtVKaLFmladN7QF68IiQsv5Fbdw=="
     },
     "chokidar": {
       "version": "3.4.3",
@@ -785,9 +1001,12 @@
       "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
     },
     "clean-stack": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.0.tgz",
+      "integrity": "sha512-RHxtgFvXsRQ+1AM7dlozLDY7ssmvUUh0XEnfnyhYgJTO6beNZHBogiaCwGM9Q3rFrUkYxOtsZRC0zAturg5bjg==",
+      "requires": {
+        "escape-string-regexp": "4.0.0"
+      }
     },
     "cli-boxes": {
       "version": "2.2.1",
@@ -865,6 +1084,13 @@
       "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
       "requires": {
         "mimic-response": "^1.0.0"
+      },
+      "dependencies": {
+        "mimic-response": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+          "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+        }
       }
     },
     "color-convert": {
@@ -906,6 +1132,16 @@
         "unique-string": "^2.0.0",
         "write-file-atomic": "^3.0.0",
         "xdg-basedir": "^4.0.0"
+      },
+      "dependencies": {
+        "dot-prop": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+          "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+          "requires": {
+            "is-obj": "^2.0.0"
+          }
+        }
       }
     },
     "confusing-browser-globals": {
@@ -914,9 +1150,23 @@
       "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw=="
     },
     "contains-path": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
-      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-1.0.0.tgz",
+      "integrity": "sha1-NFizMhhWA+ju0Y9RjUoQiIo6vJE=",
+      "requires": {
+        "normalize-path": "^2.1.1",
+        "path-starts-with": "^1.0.0"
+      },
+      "dependencies": {
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        }
+      }
     },
     "content-disposition": {
       "version": "0.5.3",
@@ -924,6 +1174,13 @@
       "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
       "requires": {
         "safe-buffer": "5.1.2"
+      },
+      "dependencies": {
+        "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=="
+        }
       }
     },
     "content-type": {
@@ -932,14 +1189,14 @@
       "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
     },
     "cookie": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
-      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+      "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
     },
     "cookie-signature": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz",
+      "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A=="
     },
     "core-js-pure": {
       "version": "3.6.5",
@@ -992,9 +1249,19 @@
       }
     },
     "crypto-random-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
-      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.3.0.tgz",
+      "integrity": "sha512-teWAwfMb1d6brahYyKqcBEb5Yp8PJPvPOdOonXDnvaKOTmKDFNVE8E3Y2XQuzjNV/3XMwHbrX9fHWvrhRKt4Gg==",
+      "requires": {
+        "type-fest": "^0.8.1"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+        }
+      }
     },
     "damerau-levenshtein": {
       "version": "1.0.6",
@@ -1002,26 +1269,19 @@
       "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug=="
     },
     "debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+      "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
       "requires": {
-        "ms": "2.0.0"
-      },
-      "dependencies": {
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        }
+        "ms": "2.1.2"
       }
     },
     "decompress-response": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
       "requires": {
-        "mimic-response": "^1.0.0"
+        "mimic-response": "^3.1.0"
       }
     },
     "dedent": {
@@ -1040,9 +1300,9 @@
       "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
     },
     "defer-to-connect": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
-      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz",
+      "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg=="
     },
     "define-properties": {
       "version": "1.1.3",
@@ -1058,9 +1318,9 @@
       "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
     },
     "depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
     },
     "destroy": {
       "version": "1.0.4",
@@ -1068,27 +1328,19 @@
       "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
     },
     "doctrine": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
-      "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
       "requires": {
-        "esutils": "^2.0.2",
-        "isarray": "^1.0.0"
+        "esutils": "^2.0.2"
       }
     },
     "dot-prop": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
-      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.0.tgz",
+      "integrity": "sha512-xCbB8IN3IT+tdgoEPOnJmYTNJDrygGFOmiQEiVa5eAD+JEB1vTgMNhVGRnN5Eex/6amck7cdcrixb1qN9Go+GQ==",
       "requires": {
         "is-obj": "^2.0.0"
-      },
-      "dependencies": {
-        "is-obj": {
-          "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz",
-          "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI= sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
-        }
       }
     },
     "dotenv": {
@@ -1122,9 +1374,9 @@
       "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
     },
     "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=="
+      "version": "9.1.1",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.1.1.tgz",
+      "integrity": "sha512-AaWyDiNO9rbtMIcGl7tdxMcNu8SOLaDLxmQEFT5JhgKufOJzPPkYmgN2QwqTgw4doWMZZQttC6sUWVQjb+1VdA=="
     },
     "encodeurl": {
       "version": "1.0.2",
@@ -1153,6 +1405,13 @@
       "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
       "requires": {
         "is-arrayish": "^0.2.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+          "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+        }
       }
     },
     "es-abstract": {
@@ -1184,9 +1443,9 @@
       }
     },
     "escape-goat": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
-      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz",
+      "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw=="
     },
     "escape-html": {
       "version": "1.0.3",
@@ -1194,9 +1453,9 @@
       "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
     },
     "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="
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
     },
     "eslint": {
       "version": "7.11.0",
@@ -1243,41 +1502,125 @@
         "v8-compile-cache": "^2.0.3"
       },
       "dependencies": {
-        "debug": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
-          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "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": {
-            "ms": "2.1.2"
+            "color-convert": "^1.9.0"
           }
         },
-        "doctrine": {
-          "version": "3.0.0",
-          "resolved": "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz",
-          "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+        "astral-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+          "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+          "dev": true
+        },
+        "color-convert": {
+          "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": {
-            "esutils": "^2.0.2"
+            "color-name": "1.1.3"
           }
         },
-        "eslint-visitor-keys": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-          "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
           "dev": true
         },
-        "semver": {
-          "version": "7.3.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+        "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
-        }
-      }
-    },
-    "eslint-config-airbnb": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz",
+        },
+        "globals": {
+          "version": "12.4.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.8.1"
+          }
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "slice-ansi": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+          "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "astral-regex": "^1.0.0",
+            "is-fullwidth-code-point": "^2.0.0"
+          }
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "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": "^4.1.0"
+              }
+            }
+          }
+        },
+        "table": {
+          "version": "5.4.6",
+          "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+          "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.10.2",
+            "lodash": "^4.17.14",
+            "slice-ansi": "^2.1.0",
+            "string-width": "^3.0.0"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "eslint-config-airbnb": {
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz",
       "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==",
       "dev": true,
       "requires": {
@@ -1314,6 +1657,23 @@
       "requires": {
         "debug": "^2.6.9",
         "resolve": "^1.13.1"
+      },
+      "dependencies": {
+        "debug": {
+          "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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
       }
     },
     "eslint-module-utils": {
@@ -1326,6 +1686,61 @@
         "pkg-dir": "^2.0.0"
       },
       "dependencies": {
+        "debug": {
+          "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"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
         "pkg-dir": {
           "version": "2.0.0",
           "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz",
@@ -1333,6 +1748,17 @@
           "dev": true,
           "requires": {
             "find-up": "^2.1.0"
+          },
+          "dependencies": {
+            "find-up": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+              "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+              "dev": true,
+              "requires": {
+                "locate-path": "^2.0.0"
+              }
+            }
           }
         }
       }
@@ -1358,6 +1784,21 @@
         "tsconfig-paths": "^3.9.0"
       },
       "dependencies": {
+        "contains-path": {
+          "version": "0.1.0",
+          "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+          "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+          "dev": true
+        },
+        "debug": {
+          "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"
+          }
+        },
         "doctrine": {
           "version": "1.5.0",
           "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
@@ -1367,6 +1808,154 @@
             "esutils": "^2.0.2",
             "isarray": "^1.0.0"
           }
+        },
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "dev": true
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+          "dev": true
+        },
+        "load-json-file": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "normalize-package-data": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.1.4",
+            "resolve": "^1.10.0",
+            "semver": "2 || 3 || 4 || 5",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "parse-json": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "dev": true,
+          "requires": {
+            "pify": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^2.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^2.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.0.0",
+            "read-pkg": "^2.0.0"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
         }
       }
     },
@@ -1389,11 +1978,21 @@
         "language-tags": "^1.0.5"
       },
       "dependencies": {
-        "emoji-regex": {
-          "version": "9.1.1",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.1.1.tgz",
-          "integrity": "sha512-AaWyDiNO9rbtMIcGl7tdxMcNu8SOLaDLxmQEFT5JhgKufOJzPPkYmgN2QwqTgw4doWMZZQttC6sUWVQjb+1VdA==",
+        "axe-core": {
+          "version": "3.5.5",
+          "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz",
+          "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==",
           "dev": true
+        },
+        "jsx-ast-utils": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
+          "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==",
+          "dev": true,
+          "requires": {
+            "array-includes": "^3.1.1",
+            "object.assign": "^4.1.0"
+          }
         }
       }
     },
@@ -1407,9 +2006,9 @@
       }
     },
     "eslint-plugin-react": {
-      "version": "7.21.4",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.4.tgz",
-      "integrity": "sha512-uHeQ8A0hg0ltNDXFu3qSfFqTNPXm1XithH6/SY318UX76CMj7Q599qWpgmMhVQyvhq36pm7qvoN3pb6/3jsTFg==",
+      "version": "7.21.5",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz",
+      "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==",
       "dev": true,
       "requires": {
         "array-includes": "^3.1.1",
@@ -1421,7 +2020,7 @@
         "object.fromentries": "^2.0.2",
         "object.values": "^1.1.1",
         "prop-types": "^15.7.2",
-        "resolve": "^1.17.0",
+        "resolve": "^1.18.1",
         "string.prototype.matchall": "^4.0.2"
       },
       "dependencies": {
@@ -1433,23 +2032,13 @@
           "requires": {
             "esutils": "^2.0.2"
           }
-        },
-        "jsx-ast-utils": {
-          "version": "3.1.0",
-          "resolved": "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz",
-          "integrity": "sha1-ZC8de4iqbX652PIhDhZkeERPqJE= sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==",
-          "dev": true,
-          "requires": {
-            "array-includes": "^3.1.1",
-            "object.assign": "^4.1.1"
-          }
         }
       }
     },
     "eslint-plugin-react-hooks": {
-      "version": "4.0.0",
-      "resolved": "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.0.tgz",
-      "integrity": "sha1-gRlrmQBDzeM54lxmYq7r4yrFLQE= sha512-YKBY+kilK5wrwIdQnCF395Ya6nDro3EAMoe+2xFkmyklyhF16fH83TrQOo9zbZIDxBsXFgBbywta/0JKRNFDkw==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.2.tgz",
+      "integrity": "sha512-ykUeqkGyUGgwTtk78C0o8UG2fzwmgJ0qxBGPp2WqRKsTwcLuVf01kTDRAtOsd4u6whX2XOC8749n2vPydP82fg==",
       "dev": true
     },
     "eslint-scope": {
@@ -1477,12 +2066,21 @@
       "dev": true,
       "requires": {
         "eslint-visitor-keys": "^1.1.0"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
+        }
       }
     },
     "eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+      "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+      "dev": true
     },
     "espree": {
       "version": "7.3.0",
@@ -1492,6 +2090,18 @@
         "acorn": "^7.4.0",
         "acorn-jsx": "^5.2.0",
         "eslint-visitor-keys": "^1.3.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+        },
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+        }
       }
     },
     "esprima": {
@@ -1567,6 +2177,11 @@
           "requires": {
             "pump": "^3.0.0"
           }
+        },
+        "human-signals": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
         }
       }
     },
@@ -1605,6 +2220,66 @@
         "type-is": "~1.6.18",
         "utils-merge": "1.0.1",
         "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+        },
+        "cookie": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+          "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+        },
+        "cookie-signature": {
+          "version": "1.0.6",
+          "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+          "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        },
+        "path-to-regexp": {
+          "version": "0.1.7",
+          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+          "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+        },
+        "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=="
+        },
+        "setprototypeof": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+        }
       }
     },
     "external-editor": {
@@ -1615,6 +2290,29 @@
         "chardet": "^0.7.0",
         "iconv-lite": "^0.4.24",
         "tmp": "^0.0.33"
+      },
+      "dependencies": {
+        "chardet": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+          "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "tmp": {
+          "version": "0.0.33",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+          "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+          "requires": {
+            "os-tmpdir": "~1.0.2"
+          }
+        }
       }
     },
     "fast-deep-equal": {
@@ -1634,9 +2332,17 @@
       "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
     },
     "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz",
+      "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==",
+      "requires": {
+        "fastest-levenshtein": "^1.0.7"
+      }
+    },
+    "fastest-levenshtein": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+      "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow=="
     },
     "figures": {
       "version": "3.2.0",
@@ -1644,6 +2350,13 @@
       "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
       "requires": {
         "escape-string-regexp": "^1.0.5"
+      },
+      "dependencies": {
+        "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="
+        }
       }
     },
     "file-entry-cache": {
@@ -1674,14 +2387,35 @@
         "parseurl": "~1.3.3",
         "statuses": "~1.5.0",
         "unpipe": "~1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+        }
       }
     },
     "find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "requires": {
-        "locate-path": "^2.0.0"
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
       }
     },
     "find-versions": {
@@ -1690,6 +2424,13 @@
       "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
       "requires": {
         "semver-regex": "^2.0.0"
+      },
+      "dependencies": {
+        "semver-regex": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
+          "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+        }
       }
     },
     "flat-cache": {
@@ -1700,12 +2441,43 @@
         "flatted": "^2.0.0",
         "rimraf": "2.6.3",
         "write": "1.0.3"
+      },
+      "dependencies": {
+        "flatted": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+          "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.3",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "write": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+          "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+          "requires": {
+            "mkdirp": "^0.5.1"
+          }
+        }
       }
     },
     "flatted": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
-      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+      "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA=="
     },
     "forwarded": {
       "version": "0.1.2",
@@ -1750,12 +2522,9 @@
       "dev": true
     },
     "get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-      "requires": {
-        "pump": "^3.0.0"
-      }
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+      "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg=="
     },
     "glob": {
       "version": "7.1.6",
@@ -1787,41 +2556,38 @@
       }
     },
     "globals": {
-      "version": "12.4.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+      "version": "13.2.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.2.0.tgz",
+      "integrity": "sha512-OjvFbGDlR7aIsLqFrraxoqIP3bb+wgp+Aarel5S56lwS3se4uUrwKkChnv1MqsMIv/Opexbmu7qCfHL9T0mBEg==",
       "requires": {
         "type-fest": "^0.8.1"
-      }
-    },
-    "got": {
-      "version": "9.6.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
-      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
-      "requires": {
-        "@sindresorhus/is": "^0.14.0",
-        "@szmarczak/http-timer": "^1.1.2",
-        "cacheable-request": "^6.0.0",
-        "decompress-response": "^3.3.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^4.1.0",
-        "lowercase-keys": "^1.0.1",
-        "mimic-response": "^1.0.1",
-        "p-cancelable": "^1.0.0",
-        "to-readable-stream": "^1.0.0",
-        "url-parse-lax": "^3.0.0"
       },
       "dependencies": {
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU= sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "requires": {
-            "pump": "^3.0.0"
-          }
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
         }
       }
     },
+    "got": {
+      "version": "11.7.0",
+      "resolved": "https://registry.npmjs.org/got/-/got-11.7.0.tgz",
+      "integrity": "sha512-7en2XwH2MEqOsrK0xaKhbWibBoZqy+f1RSUoIeF1BLcnf+pyQdDsljWMfmOh+QKJwuvDIiKx38GtPh5wFdGGjg==",
+      "requires": {
+        "@sindresorhus/is": "^3.1.1",
+        "@szmarczak/http-timer": "^4.0.5",
+        "@types/cacheable-request": "^6.0.1",
+        "@types/responselike": "^1.0.0",
+        "cacheable-lookup": "^5.0.3",
+        "cacheable-request": "^7.0.1",
+        "decompress-response": "^6.0.0",
+        "http2-wrapper": "^1.0.0-beta.5.2",
+        "lowercase-keys": "^2.0.0",
+        "p-cancelable": "^2.0.0",
+        "responselike": "^2.0.0"
+      }
+    },
     "graceful-fs": {
       "version": "4.2.4",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
@@ -1836,9 +2602,9 @@
       }
     },
     "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
     },
     "has-symbols": {
       "version": "1.0.1",
@@ -1851,9 +2617,12 @@
       "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
     },
     "hosted-git-info": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-      "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
+      "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
     },
     "http-cache-semantics": {
       "version": "4.1.0",
@@ -1861,28 +2630,42 @@
       "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
     },
     "http-errors": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz",
+      "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==",
       "requires": {
         "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.1",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
         "statuses": ">= 1.5.0 < 2",
         "toidentifier": "1.0.0"
       },
       "dependencies": {
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
         }
       }
     },
+    "http2-wrapper": {
+      "version": "1.0.0-beta.5.2",
+      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz",
+      "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==",
+      "requires": {
+        "quick-lru": "^5.1.1",
+        "resolve-alpn": "^1.0.0"
+      }
+    },
     "human-signals": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
-      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
     },
     "husky": {
       "version": "4.3.0",
@@ -2012,22 +2795,27 @@
       }
     },
     "iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
+      "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
       "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
       }
     },
+    "ieee754": {
+      "version": "1.1.13",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
+      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
+    },
     "ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+      "version": "5.1.8",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
     },
     "ignore-by-default": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
-      "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.0.0.tgz",
+      "integrity": "sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA=="
     },
     "import-fresh": {
       "version": "3.2.1",
@@ -2038,6 +2826,14 @@
         "resolve-from": "^4.0.0"
       },
       "dependencies": {
+        "parent-module": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+          "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+          "requires": {
+            "callsites": "^3.0.0"
+          }
+        },
         "resolve-from": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -2046,9 +2842,9 @@
       }
     },
     "import-lazy": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+      "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw=="
     },
     "imurmurhash": {
       "version": "0.1.4",
@@ -2130,14 +2926,14 @@
       }
     },
     "ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.0.tgz",
+      "integrity": "sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w=="
     },
     "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
     },
     "is-binary-path": {
       "version": "2.1.0",
@@ -2206,9 +3002,9 @@
       "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
     },
     "is-npm": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
-      "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig=="
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
+      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="
     },
     "is-number": {
       "version": "7.0.0",
@@ -2216,9 +3012,9 @@
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
     },
     "is-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
     },
     "is-path-inside": {
       "version": "3.0.2",
@@ -2234,9 +3030,9 @@
       }
     },
     "is-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
+      "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA=="
     },
     "is-stream": {
       "version": "2.0.0",
@@ -2267,9 +3063,9 @@
       "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
     },
     "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
     },
     "isexe": {
       "version": "2.0.0",
@@ -2289,9 +3085,9 @@
       }
     },
     "js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-6.0.0.tgz",
+      "integrity": "sha512-QJUTLeNZNFl/w4MmhHztb1I1UzV42KV/L/zNwNVGlCNc+zl8g01Nve0hPDGU+j2N7ctFZdLot49lUSi78L7WGg=="
     },
     "js-yaml": {
       "version": "3.14.0",
@@ -2300,17 +3096,32 @@
       "requires": {
         "argparse": "^1.0.7",
         "esprima": "^4.0.0"
+      },
+      "dependencies": {
+        "argparse": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "requires": {
+            "sprintf-js": "~1.0.2"
+          }
+        },
+        "sprintf-js": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+          "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+        }
       }
     },
     "jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.1.tgz",
+      "integrity": "sha512-w+MMxnByppM4jwskitZotEtvtO3a2C7WOz31NxJToGisHuysCAQQU7umb/pA/6soPFe8LGjXFEFbuPuLEPm7Ag=="
     },
     "json-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
     },
     "json-parse-even-better-errors": {
       "version": "2.3.1",
@@ -2318,9 +3129,9 @@
       "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
     },
     "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=="
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.5.0.tgz",
+      "integrity": "sha512-x+TRJIQFskrNnFKE2Viz9FCSjK1vIh+H/uaBiOYszh/IcZmAFneQ35H4osWDJp1NPXccuV2I0RMXmi2ZS6Kqcg=="
     },
     "json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
@@ -2328,11 +3139,11 @@
       "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
     },
     "json5": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
       "requires": {
-        "minimist": "^1.2.0"
+        "minimist": "^1.2.5"
       }
     },
     "jsonwebtoken": {
@@ -2352,53 +3163,63 @@
         "semver": "^5.6.0"
       },
       "dependencies": {
+        "jwa": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+          "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+          "requires": {
+            "buffer-equal-constant-time": "1.0.1",
+            "ecdsa-sig-formatter": "1.0.11",
+            "safe-buffer": "^5.0.1"
+          }
+        },
+        "jws": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+          "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+          "requires": {
+            "jwa": "^1.4.1",
+            "safe-buffer": "^5.0.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": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
         }
       }
     },
     "jsx-ast-utils": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
-      "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz",
+      "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==",
       "requires": {
         "array-includes": "^3.1.1",
-        "object.assign": "^4.1.0"
+        "object.assign": "^4.1.1"
       }
     },
     "jwa": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
-      "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+      "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
       "requires": {
         "buffer-equal-constant-time": "1.0.1",
         "ecdsa-sig-formatter": "1.0.11",
         "safe-buffer": "^5.0.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
       }
     },
     "jws": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
-      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+      "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
       "requires": {
-        "jwa": "^1.4.1",
+        "jwa": "^2.0.0",
         "safe-buffer": "^5.0.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
       }
     },
     "kareem": {
@@ -2407,11 +3228,11 @@
       "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
     },
     "keyv": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
-      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz",
+      "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==",
       "requires": {
-        "json-buffer": "3.0.0"
+        "json-buffer": "3.0.1"
       }
     },
     "language-subtag-registry": {
@@ -2521,6 +3342,22 @@
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "listr2": {
+          "version": "2.6.2",
+          "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz",
+          "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "cli-truncate": "^2.1.0",
+            "figures": "^3.2.0",
+            "indent-string": "^4.0.0",
+            "log-update": "^4.0.0",
+            "p-map": "^4.0.0",
+            "rxjs": "^6.6.2",
+            "through": "^2.3.8"
+          }
+        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -2539,9 +3376,9 @@
       }
     },
     "listr2": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz",
-      "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.1.1.tgz",
+      "integrity": "sha512-5HjYFP0FpG2dOuSAth2vQ172rWqI78746itLIvgg0KjHMAyW8CVNc9wzBzEo4/5UYfNbmT28u0J29NoA3W0z+Q==",
       "requires": {
         "chalk": "^4.1.0",
         "cli-truncate": "^2.1.0",
@@ -2549,83 +3386,34 @@
         "indent-string": "^4.0.0",
         "log-update": "^4.0.0",
         "p-map": "^4.0.0",
-        "rxjs": "^6.6.2",
+        "rxjs": "^6.6.3",
         "through": "^2.3.8"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "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==",
-          "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==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
-        },
-        "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==",
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
       }
     },
     "load-json-file": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
-      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz",
+      "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==",
       "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "strip-bom": "^3.0.0"
+        "graceful-fs": "^4.1.15",
+        "parse-json": "^5.0.0",
+        "strip-bom": "^4.0.0",
+        "type-fest": "^0.6.0"
       },
       "dependencies": {
-        "parse-json": {
-          "version": "2.2.0",
-          "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz",
-          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-          "requires": {
-            "error-ex": "^1.2.0"
-          }
+        "type-fest": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
         }
       }
     },
     "locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "requires": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
+        "p-locate": "^5.0.0"
       }
     },
     "lodash": {
@@ -2772,6 +3560,16 @@
             "astral-regex": "^2.0.0",
             "is-fullwidth-code-point": "^3.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==",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
         }
       }
     },
@@ -2781,12 +3579,27 @@
       "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
       "requires": {
         "js-tokens": "^3.0.0 || ^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=="
+        }
       }
     },
     "lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+    },
+    "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==",
+      "requires": {
+        "yallist": "^4.0.0"
+      }
     },
     "make-dir": {
       "version": "3.1.0",
@@ -2804,9 +3617,9 @@
       }
     },
     "media-typer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+      "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="
     },
     "memory-pager": {
       "version": "1.5.0",
@@ -2838,14 +3651,14 @@
       }
     },
     "mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+      "version": "2.4.6",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+      "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
     },
     "mime-db": {
-      "version": "1.44.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
+      "version": "1.45.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
+      "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
     },
     "mime-types": {
       "version": "2.1.27",
@@ -2853,17 +3666,24 @@
       "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
       "requires": {
         "mime-db": "1.44.0"
+      },
+      "dependencies": {
+        "mime-db": {
+          "version": "1.44.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+          "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
+        }
       }
     },
     "mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz",
+      "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ=="
     },
     "mimic-response": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
     },
     "minimatch": {
       "version": "3.0.4",
@@ -2871,6 +3691,17 @@
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
       "requires": {
         "brace-expansion": "^1.1.7"
+      },
+      "dependencies": {
+        "brace-expansion": {
+          "version": "1.1.11",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        }
       }
     },
     "minimist": {
@@ -2879,12 +3710,9 @@
       "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
     },
     "mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "requires": {
-        "minimist": "^1.2.5"
-      }
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
     },
     "mongodb": {
       "version": "3.6.2",
@@ -2899,17 +3727,72 @@
         "saslprep": "^1.0.0"
       },
       "dependencies": {
+        "bl": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
+          "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
+          "requires": {
+            "readable-stream": "^2.3.5",
+            "safe-buffer": "^5.1.1"
+          }
+        },
+        "bson": {
+          "version": "1.1.5",
+          "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
+          "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+        },
+        "readable-stream": {
+          "version": "2.3.7",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          },
+          "dependencies": {
+            "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=="
+            }
+          }
+        },
         "safe-buffer": {
           "version": "5.2.1",
           "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
           "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          },
+          "dependencies": {
+            "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=="
+            }
+          }
         }
       }
     },
     "mongoose": {
-      "version": "5.10.5",
-      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.5.tgz",
-      "integrity": "sha512-BOQZsZn9Y79f3rWZFLD1gvOLNN5gOiGvGr5raqQ5v/T4fdAmnjXGCVynpW4SRnQLtrcCeLXyaaXVRT75863Q0w==",
+      "version": "5.10.9",
+      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.9.tgz",
+      "integrity": "sha512-7dkr1d6Uyk87hELzoc6B7Zo7kkPTx8rKummk51Y0je2V2Ttsw0KFPwTp1G8JIbBta7Wpw8j15PJi0d33Ode2nw==",
       "requires": {
         "bson": "^1.1.4",
         "kareem": "2.3.1",
@@ -2924,15 +3807,15 @@
         "sliced": "1.0.1"
       },
       "dependencies": {
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        "bson": {
+          "version": "1.1.5",
+          "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
+          "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
         },
-        "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=="
+        "sift": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
+          "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
         }
       }
     },
@@ -2953,10 +3836,23 @@
         "on-headers": "~1.0.2"
       },
       "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
         "depd": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
           "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
         }
       }
     },
@@ -2977,6 +3873,11 @@
         "sliced": "1.0.1"
       },
       "dependencies": {
+        "bluebird": {
+          "version": "3.5.1",
+          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+          "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
+        },
         "debug": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
@@ -2989,6 +3890,11 @@
           "version": "2.0.0",
           "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz",
           "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        },
+        "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=="
         }
       }
     },
@@ -3013,9 +3919,9 @@
       "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
     },
     "nodemon": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz",
-      "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==",
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz",
+      "integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==",
       "dev": true,
       "requires": {
         "chokidar": "^3.2.2",
@@ -3026,10 +3932,37 @@
         "semver": "^5.7.1",
         "supports-color": "^5.5.0",
         "touch": "^3.1.0",
-        "undefsafe": "^2.0.2",
-        "update-notifier": "^4.0.0"
+        "undefsafe": "^2.0.3",
+        "update-notifier": "^4.1.0"
       },
       "dependencies": {
+        "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"
+          },
+          "dependencies": {
+            "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"
+              }
+            }
+          }
+        },
         "debug": {
           "version": "3.2.6",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
@@ -3039,30 +3972,84 @@
             "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==",
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "ignore-by-default": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+          "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
+          "dev": true
+        },
+        "import-lazy": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+          "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+          "dev": true
+        },
+        "is-npm": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
+          "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
           "dev": true
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "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"
+          }
+        },
+        "update-notifier": {
+          "version": "4.1.3",
+          "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
+          "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
+          "dev": true,
+          "requires": {
+            "boxen": "^4.2.0",
+            "chalk": "^3.0.0",
+            "configstore": "^5.0.1",
+            "has-yarn": "^2.1.0",
+            "import-lazy": "^2.1.0",
+            "is-ci": "^2.0.0",
+            "is-installed-globally": "^0.3.1",
+            "is-npm": "^4.0.0",
+            "is-yarn-global": "^0.3.0",
+            "latest-version": "^5.0.0",
+            "pupa": "^2.0.1",
+            "semver-diff": "^3.1.1",
+            "xdg-basedir": "^4.0.0"
+          }
         }
       }
     },
     "nopt": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
-      "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
       "requires": {
         "abbrev": "1"
       }
     },
     "normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz",
+      "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==",
       "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
+        "hosted-git-info": "^3.0.6",
+        "resolve": "^1.17.0",
+        "semver": "^7.3.2",
         "validate-npm-package-license": "^3.0.1"
       }
     },
@@ -3072,9 +4059,9 @@
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
     },
     "normalize-url": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
-      "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.3.0.tgz",
+      "integrity": "sha512-9/nOVLYYe/dO/eJeQUNaGUF4m4Z5E7cb9oNTKabH+bNf19mqj60txTcveQxL0GlcWLXCxkOu2/LwL8oW0idIDA=="
     },
     "npm-run-path": {
       "version": "4.0.1",
@@ -3250,6 +4237,13 @@
       "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
       "requires": {
         "mimic-fn": "^2.1.0"
+      },
+      "dependencies": {
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+        }
       }
     },
     "opencollective-postinstall": {
@@ -3268,6 +4262,13 @@
         "prelude-ls": "^1.2.1",
         "type-check": "^0.4.0",
         "word-wrap": "^1.2.3"
+      },
+      "dependencies": {
+        "fast-levenshtein": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+          "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+        }
       }
     },
     "os-tmpdir": {
@@ -3276,24 +4277,24 @@
       "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
     },
     "p-cancelable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
-      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz",
+      "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg=="
     },
     "p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+      "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
       "requires": {
-        "p-try": "^1.0.0"
+        "p-try": "^2.0.0"
       }
     },
     "p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "requires": {
-        "p-limit": "^1.1.0"
+        "p-limit": "^3.0.2"
       }
     },
     "p-map": {
@@ -3305,9 +4306,9 @@
       }
     },
     "p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
     },
     "package-json": {
       "version": "6.5.0",
@@ -3320,19 +4321,159 @@
         "semver": "^6.2.0"
       },
       "dependencies": {
+        "@sindresorhus/is": {
+          "version": "0.14.0",
+          "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+          "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
+        },
+        "@szmarczak/http-timer": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+          "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+          "requires": {
+            "defer-to-connect": "^1.0.1"
+          }
+        },
+        "cacheable-request": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+          "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+          "requires": {
+            "clone-response": "^1.0.2",
+            "get-stream": "^5.1.0",
+            "http-cache-semantics": "^4.0.0",
+            "keyv": "^3.0.0",
+            "lowercase-keys": "^2.0.0",
+            "normalize-url": "^4.1.0",
+            "responselike": "^1.0.2"
+          },
+          "dependencies": {
+            "get-stream": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+              "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+              "requires": {
+                "pump": "^3.0.0"
+              }
+            },
+            "lowercase-keys": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+              "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+            }
+          }
+        },
+        "decompress-response": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+          "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+          "requires": {
+            "mimic-response": "^1.0.0"
+          }
+        },
+        "defer-to-connect": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+          "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+        },
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "got": {
+          "version": "9.6.0",
+          "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+          "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+          "requires": {
+            "@sindresorhus/is": "^0.14.0",
+            "@szmarczak/http-timer": "^1.1.2",
+            "cacheable-request": "^6.0.0",
+            "decompress-response": "^3.3.0",
+            "duplexer3": "^0.1.4",
+            "get-stream": "^4.1.0",
+            "lowercase-keys": "^1.0.1",
+            "mimic-response": "^1.0.1",
+            "p-cancelable": "^1.0.0",
+            "to-readable-stream": "^1.0.0",
+            "url-parse-lax": "^3.0.0"
+          }
+        },
+        "json-buffer": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+          "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+        },
+        "keyv": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+          "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+          "requires": {
+            "json-buffer": "3.0.0"
+          }
+        },
+        "lowercase-keys": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+          "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+        },
+        "mimic-response": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+          "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+        },
+        "normalize-url": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
+          "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
+        },
+        "p-cancelable": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+          "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
+        },
+        "prepend-http": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+          "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+        },
+        "responselike": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+          "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+          "requires": {
+            "lowercase-keys": "^1.0.0"
+          }
+        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
           "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        },
+        "to-readable-stream": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+          "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
+        },
+        "url-parse-lax": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+          "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+          "requires": {
+            "prepend-http": "^2.0.0"
+          }
         }
       }
     },
     "parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz",
+      "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==",
       "requires": {
-        "callsites": "^3.0.0"
+        "callsites": "^3.1.0"
       }
     },
     "parse-json": {
@@ -3352,9 +4493,9 @@
       "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
     },
     "path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
     },
     "path-is-absolute": {
       "version": "1.0.1",
@@ -3371,10 +4512,28 @@
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
       "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
     },
+    "path-starts-with": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/path-starts-with/-/path-starts-with-1.0.0.tgz",
+      "integrity": "sha1-soJDAV6LE43lcmgqxS2kLmRq2E4=",
+      "requires": {
+        "normalize-path": "^2.1.1"
+      },
+      "dependencies": {
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        }
+      }
+    },
     "path-to-regexp": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz",
+      "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg=="
     },
     "path-type": {
       "version": "4.0.0",
@@ -3387,61 +4546,16 @@
       "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
     },
     "pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
+      "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA=="
     },
     "pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+      "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
       "requires": {
-        "find-up": "^4.0.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==",
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "requires": {
-            "p-try": "^2.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==",
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
-        },
-        "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=="
-        }
+        "find-up": "^5.0.0"
       }
     },
     "please-upgrade-node": {
@@ -3458,9 +4572,9 @@
       "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
     },
     "prepend-http": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-3.0.1.tgz",
+      "integrity": "sha512-BLxfZh+m6UiAiCPZFJ4+vYoL7NrRs5XgCTRrjseATAggXhdZKKxn+JUNmuVYWY23bDHgaEHodxw8mnmtVEDtHw=="
     },
     "prettier": {
       "version": "2.1.2",
@@ -3504,6 +4618,13 @@
       "requires": {
         "forwarded": "~0.1.2",
         "ipaddr.js": "1.9.1"
+      },
+      "dependencies": {
+        "ipaddr.js": {
+          "version": "1.9.1",
+          "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+          "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+        }
       }
     },
     "pstree.remy": {
@@ -3531,12 +4652,24 @@
       "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
       "requires": {
         "escape-goat": "^2.0.0"
+      },
+      "dependencies": {
+        "escape-goat": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+          "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
+        }
       }
     },
     "qs": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+      "version": "6.9.4",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
+      "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="
+    },
+    "quick-lru": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
     },
     "range-parser": {
       "version": "1.2.1",
@@ -3544,14 +4677,51 @@
       "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
     },
     "raw-body": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
-      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz",
+      "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==",
       "requires": {
         "bytes": "3.1.0",
-        "http-errors": "1.7.2",
+        "http-errors": "1.7.3",
         "iconv-lite": "0.4.24",
         "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+        },
+        "http-errors": {
+          "version": "1.7.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
+          "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.4",
+            "setprototypeof": "1.1.1",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "setprototypeof": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+        }
       }
     },
     "rc": {
@@ -3578,46 +4748,102 @@
       "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
     },
     "read-pkg": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
-      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
       "requires": {
-        "load-json-file": "^2.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^2.0.0"
+        "@types/normalize-package-data": "^2.4.0",
+        "normalize-package-data": "^2.5.0",
+        "parse-json": "^5.0.0",
+        "type-fest": "^0.6.0"
       },
       "dependencies": {
-        "path-type": {
-          "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz",
-          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
+        },
+        "normalize-package-data": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+          "requires": {
+            "hosted-git-info": "^2.1.4",
+            "resolve": "^1.10.0",
+            "semver": "2 || 3 || 4 || 5",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+        },
+        "type-fest": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+      "requires": {
+        "find-up": "^4.1.0",
+        "read-pkg": "^5.2.0",
+        "type-fest": "^0.8.1"
+      },
+      "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==",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
           "requires": {
-            "pify": "^2.0.0"
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+          "requires": {
+            "p-try": "^2.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==",
+          "requires": {
+            "p-limit": "^2.2.0"
           }
+        },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
         }
       }
     },
-    "read-pkg-up": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
-      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
-      "requires": {
-        "find-up": "^2.0.0",
-        "read-pkg": "^2.0.0"
-      }
-    },
     "readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
       "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
       }
     },
     "readdirp": {
@@ -3688,6 +4914,11 @@
         "rc": "^1.2.8"
       }
     },
+    "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="
+    },
     "require_optional": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
@@ -3695,6 +4926,18 @@
       "requires": {
         "resolve-from": "^2.0.0",
         "semver": "^5.1.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
+          "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+        }
       }
     },
     "resolve": {
@@ -3706,17 +4949,22 @@
         "path-parse": "^1.0.6"
       }
     },
+    "resolve-alpn": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz",
+      "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA=="
+    },
     "resolve-from": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
-      "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
     },
     "responselike": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
+      "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
       "requires": {
-        "lowercase-keys": "^1.0.0"
+        "lowercase-keys": "^2.0.0"
       }
     },
     "restore-cursor": {
@@ -3729,9 +4977,9 @@
       }
     },
     "rimraf": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
       "requires": {
         "glob": "^7.1.3"
       }
@@ -3747,12 +4995,19 @@
       "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
       "requires": {
         "tslib": "^1.9.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+        }
       }
     },
     "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=="
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
     },
     "safer-buffer": {
       "version": "2.1.2",
@@ -3768,9 +5023,9 @@
       }
     },
     "semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+      "version": "7.3.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+      "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
     },
     "semver-compare": {
       "version": "1.0.0",
@@ -3793,9 +5048,9 @@
       }
     },
     "semver-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.1.tgz",
+      "integrity": "sha512-3dPcmFqxblWB/cppQ2qXWqlp9b6GLgAS032+Ec5E0waDVHTkwYIL+7BFI9UqEe0tkoHle2f3pBgvT/Xl95+Dig=="
     },
     "send": {
       "version": "0.17.1",
@@ -3817,6 +5072,26 @@
         "statuses": "~1.5.0"
       },
       "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+            }
+          }
+        },
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+        },
         "http-errors": {
           "version": "1.7.3",
           "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz",
@@ -3827,12 +5102,29 @@
             "setprototypeof": "1.1.1",
             "statuses": ">= 1.5.0 < 2",
             "toidentifier": "1.0.0"
+          },
+          "dependencies": {
+            "setprototypeof": {
+              "version": "1.1.1",
+              "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+              "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+            }
           }
         },
+        "mime": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+          "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+        },
         "ms": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
           "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
         }
       }
     },
@@ -3848,9 +5140,9 @@
       }
     },
     "setprototypeof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
     },
     "shebang-command": {
       "version": "2.0.0",
@@ -3896,9 +5188,9 @@
       }
     },
     "sift": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
-      "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
+      "version": "13.3.5",
+      "resolved": "https://registry.npmjs.org/sift/-/sift-13.3.5.tgz",
+      "integrity": "sha512-apSwBXO0Xpl7zGb26xwq7KGre9/WwyzMxUv0zmI6mLpDJQGOX+CynBgKDaSrn+AXuAuiS4orQo1ty6bU+OEN/Q=="
     },
     "signal-exit": {
       "version": "3.0.3",
@@ -3911,46 +5203,13 @@
       "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
     },
     "slice-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
-      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
       "requires": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "astral-regex": {
-          "version": "1.0.0",
-          "resolved": "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz",
-          "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k= sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
-        }
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
       }
     },
     "sliced": {
@@ -3959,9 +5218,9 @@
       "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
     },
     "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
     },
     "sparse-bitfield": {
       "version": "3.0.3",
@@ -4000,14 +5259,14 @@
       "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw=="
     },
     "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+      "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
     },
     "statuses": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.0.tgz",
+      "integrity": "sha512-w9jNUUQdpuVoYqXxnyOakhckBbOxRaoYqJscyIBYCS5ixyCnO7nQn7zBZvP9zf5QOPZcz2DLUpE3KsNPbJBOFA=="
     },
     "string-argv": {
       "version": "0.3.1",
@@ -4141,11 +5400,11 @@
       }
     },
     "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "requires": {
-        "safe-buffer": "~5.1.0"
+        "safe-buffer": "~5.2.0"
       }
     },
     "stringify-object": {
@@ -4162,6 +5421,11 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
           "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+        },
+        "is-regexp": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+          "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
         }
       }
     },
@@ -4174,9 +5438,14 @@
       }
     },
     "strip-bom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
+    },
+    "strip-filename-increment": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-filename-increment/-/strip-filename-increment-2.0.1.tgz",
+      "integrity": "sha512-+v5xsiTTsdYqkPj7qz1zlngIsjZedhHDi3xp/9bMurV8kXe9DAr732gNVqtt4X8sI3hOqS3nlFfps5gyVcux6w=="
     },
     "strip-final-newline": {
       "version": "2.0.0",
@@ -4189,57 +5458,22 @@
       "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
     },
     "supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "requires": {
-        "has-flag": "^3.0.0"
+        "has-flag": "^4.0.0"
       }
     },
     "table": {
-      "version": "5.4.6",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
-      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/table/-/table-6.0.3.tgz",
+      "integrity": "sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==",
       "requires": {
-        "ajv": "^6.10.2",
-        "lodash": "^4.17.14",
-        "slice-ansi": "^2.1.0",
-        "string-width": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "ajv": "^6.12.4",
+        "lodash": "^4.17.20",
+        "slice-ansi": "^4.0.0",
+        "string-width": "^4.2.0"
       }
     },
     "term-size": {
@@ -4258,22 +5492,22 @@
       "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
     },
     "tmp": {
-      "version": "0.0.33",
-      "resolved": "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+      "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
       "requires": {
-        "os-tmpdir": "~1.0.2"
+        "rimraf": "^3.0.0"
       }
     },
     "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="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-3.0.1.tgz",
+      "integrity": "sha512-/wtNi1tW1F3nf0OL6AqVxGw9Tr1ET70InMhJuVxPwFdGqparF0nQ4UWGLf2DsoI2bFDtthlBnALncZpUzOnsUw=="
     },
     "to-readable-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
-      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz",
+      "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w=="
     },
     "to-regex-range": {
       "version": "5.0.1",
@@ -4294,6 +5528,16 @@
       "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
       "requires": {
         "nopt": "~1.0.10"
+      },
+      "dependencies": {
+        "nopt": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+          "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+          "requires": {
+            "abbrev": "1"
+          }
+        }
       }
     },
     "tsconfig-paths": {
@@ -4305,12 +5549,27 @@
         "json5": "^1.0.1",
         "minimist": "^1.2.0",
         "strip-bom": "^3.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+        }
       }
     },
     "tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+      "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
     },
     "type-check": {
       "version": "0.4.0",
@@ -4321,9 +5580,9 @@
       }
     },
     "type-fest": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.0.tgz",
+      "integrity": "sha512-fbDukFPnJBdn2eZ3RR+5mK2slHLFd6gYHY7jna1KWWy4Yr4XysHuCdXRzy+RiG/HwG4WJat00vdC2UHky5eKiQ=="
     },
     "type-is": {
       "version": "1.6.18",
@@ -4332,6 +5591,13 @@
       "requires": {
         "media-typer": "0.3.0",
         "mime-types": "~2.1.24"
+      },
+      "dependencies": {
+        "media-typer": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+          "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+        }
       }
     },
     "typedarray-to-buffer": {
@@ -4348,6 +5614,21 @@
       "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
       "requires": {
         "debug": "^2.2.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
       }
     },
     "unique-string": {
@@ -4356,6 +5637,13 @@
       "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
       "requires": {
         "crypto-random-string": "^2.0.0"
+      },
+      "dependencies": {
+        "crypto-random-string": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+          "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
+        }
       }
     },
     "unpipe": {
@@ -4364,46 +5652,30 @@
       "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
     },
     "update-notifier": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
-      "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.0.tgz",
+      "integrity": "sha512-8tqsiVrMv7aZsKNSjqA6DdBLKJpZG1hRpkj1RbOJu1PgyP69OX+EInAnP1EK/ShX5YdPFgwWdk19oquZ0HTM8g==",
       "requires": {
         "boxen": "^4.2.0",
-        "chalk": "^3.0.0",
+        "chalk": "^4.1.0",
         "configstore": "^5.0.1",
         "has-yarn": "^2.1.0",
         "import-lazy": "^2.1.0",
         "is-ci": "^2.0.0",
         "is-installed-globally": "^0.3.1",
-        "is-npm": "^4.0.0",
+        "is-npm": "^5.0.0",
         "is-yarn-global": "^0.3.0",
         "latest-version": "^5.0.0",
         "pupa": "^2.0.1",
+        "semver": "^7.3.2",
         "semver-diff": "^3.1.1",
         "xdg-basedir": "^4.0.0"
       },
       "dependencies": {
-        "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
-        },
-        "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==",
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
+        "import-lazy": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+          "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
         }
       }
     },
@@ -4416,11 +5688,11 @@
       }
     },
     "url-parse-lax": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-4.0.0.tgz",
+      "integrity": "sha512-CazaJJZUPr1EWmHjcntgS1F1q6YOpQROD6Z+aTb9obxgOFsRydnqYkRCh5xDJ3LhqTID46JrWaT7PsF7Oms0PA==",
       "requires": {
-        "prepend-http": "^2.0.0"
+        "prepend-http": "^3.0.1"
       }
     },
     "util-deprecate": {
@@ -4479,49 +5751,13 @@
       "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
     },
     "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==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "requires": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
         "strip-ansi": "^6.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "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==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "strip-ansi": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-          "requires": {
-            "ansi-regex": "^5.0.0"
-          }
-        }
       }
     },
     "wrappy": {
@@ -4530,11 +5766,11 @@
       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
     "write": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
-      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/write/-/write-2.0.0.tgz",
+      "integrity": "sha512-yam9TAqN8sAZokECAejo9HpT2j2s39OgK8i8yxadrFBVo+iSWLfnipRVFulfAw1d2dz5vSuGmlMHYRKG4fysOA==",
       "requires": {
-        "mkdirp": "^0.5.1"
+        "add-filename-increment": "^1.0.0"
       }
     },
     "write-file-atomic": {
@@ -4553,6 +5789,11 @@
       "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
       "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
     },
+    "yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
     "yaml": {
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
diff --git a/package.json b/package.json
index d363a91..47d437f 100644
--- a/package.json
+++ b/package.json
@@ -28,7 +28,7 @@
   "dependencies": {
     "abbrev": "^1.1.1",
     "accepts": "^1.3.7",
-    "acorn": "^7.4.1",
+    "acorn": "^8.0.4",
     "acorn-jsx": "^5.3.1",
     "aggregate-error": "^3.1.0",
     "ajv": "^6.12.6",
@@ -38,36 +38,36 @@
     "ansi-regex": "^5.0.0",
     "ansi-styles": "^4.3.0",
     "anymatch": "^3.1.1",
-    "argparse": "^1.0.10",
+    "argparse": "^2.0.1",
     "aria-query": "^4.2.2",
-    "array-flatten": "^1.1.1",
+    "array-flatten": "^3.0.0",
     "array-includes": "^3.1.1",
     "array.prototype.flat": "^1.2.3",
     "array.prototype.flatmap": "^1.2.3",
     "ast-types-flow": "^0.0.7",
     "astral-regex": "^2.0.0",
-    "axe-core": "^3.5.5",
+    "axe-core": "^4.0.2",
     "axobject-query": "^2.2.0",
     "balanced-match": "^1.0.0",
     "basic-auth": "^2.0.1",
     "binary-extensions": "^2.1.0",
-    "bl": "^2.2.1",
-    "bluebird": "^3.5.1",
+    "bl": "^4.0.3",
+    "bluebird": "^3.7.2",
     "body-parser": "^1.19.0",
     "boxen": "^4.2.0",
-    "brace-expansion": "^1.1.11",
+    "brace-expansion": "^2.0.0",
     "braces": "^3.0.2",
-    "bson": "^1.1.5",
+    "bson": "^4.2.0",
     "buffer-equal-constant-time": "^1.0.1",
     "bytes": "^3.1.0",
-    "cacheable-request": "^6.1.0",
+    "cacheable-request": "^7.0.1",
     "callsites": "^3.1.0",
-    "camelcase": "^5.3.1",
+    "camelcase": "^6.1.0",
     "chalk": "^4.1.0",
-    "chardet": "^0.7.0",
+    "chardet": "^1.3.0",
     "chokidar": "^3.4.3",
     "ci-info": "^2.0.0",
-    "clean-stack": "^2.2.0",
+    "clean-stack": "^3.0.0",
     "cli-boxes": "^2.2.1",
     "cli-cursor": "^3.1.0",
     "cli-truncate": "^2.1.0",
@@ -80,43 +80,43 @@
     "concat-map": "^0.0.1",
     "configstore": "^5.0.1",
     "confusing-browser-globals": "^1.0.9",
-    "contains-path": "^0.1.0",
+    "contains-path": "^1.0.0",
     "content-disposition": "^0.5.3",
     "content-type": "^1.0.4",
-    "cookie": "^0.4.0",
-    "cookie-signature": "^1.0.6",
+    "cookie": "^0.4.1",
+    "cookie-signature": "^1.1.0",
     "core-js-pure": "^3.6.5",
     "cosmiconfig": "^7.0.0",
     "core-util-is": "^1.0.2",
     "cross-spawn": "^7.0.3",
-    "crypto-random-string": "^2.0.0",
+    "crypto-random-string": "^3.3.0",
     "damerau-levenshtein": "^1.0.6",
-    "debug": "^2.6.9",
-    "decompress-response": "^3.3.0",
+    "debug": "^4.2.0",
+    "decompress-response": "^6.0.0",
     "dedent": "^0.7.0",
     "deep-extend": "^0.6.0",
     "deep-is": "^0.1.3",
-    "defer-to-connect": "^1.1.3",
+    "defer-to-connect": "^2.0.0",
     "define-properties": "^1.1.3",
     "denque": "^1.4.1",
-    "depd": "^1.1.2",
+    "depd": "^2.0.0",
     "destroy": "^1.0.4",
-    "doctrine": "^1.5.0",
-    "dot-prop": "^5.3.0",
+    "doctrine": "^3.0.0",
+    "dot-prop": "^6.0.0",
     "dotenv": "^8.2.0",
     "duplexer3": "^0.1.4",
     "ecdsa-sig-formatter": "^1.0.11",
     "ee-first": "^1.1.1",
-    "emoji-regex": "^8.0.0",
+    "emoji-regex": "^9.1.1",
     "encodeurl": "^1.0.2",
     "end-of-stream": "^1.4.4",
     "enquirer": "^2.3.6",
     "error-ex": "^1.3.2",
     "es-abstract": "^1.17.7",
     "es-to-primitive": "^1.2.1",
-    "escape-goat": "^2.1.1",
+    "escape-goat": "^3.0.0",
     "escape-html": "^1.0.3",
-    "escape-string-regexp": "^1.0.5",
+    "escape-string-regexp": "^4.0.0",
     "espree": "^7.3.0",
     "esprima": "^4.0.1",
     "esquery": "^1.3.1",
@@ -129,41 +129,41 @@
     "external-editor": "^3.1.0",
     "fast-deep-equal": "^3.1.3",
     "fast-json-stable-stringify": "^2.1.0",
-    "fast-levenshtein": "^2.0.6",
+    "fast-levenshtein": "^3.0.0",
     "figures": "^3.2.0",
     "file-entry-cache": "^5.0.1",
     "fill-range": "^7.0.1",
     "finalhandler": "^1.1.2",
-    "find-up": "^2.1.0",
+    "find-up": "^5.0.0",
     "find-versions": "^3.2.0",
     "flat-cache": "^2.0.1",
-    "flatted": "^2.0.2",
+    "flatted": "^3.1.0",
     "forwarded": "^0.1.2",
     "fresh": "^0.5.2",
     "fs.realpath": "^1.0.0",
     "function-bind": "^1.1.1",
     "functional-red-black-tree": "^1.0.1",
     "get-own-enumerable-property-symbols": "^3.0.2",
-    "get-stream": "^5.2.0",
+    "get-stream": "^6.0.0",
     "glob": "^7.1.6",
     "glob-parent": "^5.1.1",
     "global-dirs": "^2.0.1",
-    "globals": "^12.4.0",
-    "got": "^9.6.0",
+    "globals": "^13.2.0",
+    "got": "^11.7.0",
     "graceful-fs": "^4.2.4",
     "has": "^1.0.3",
-    "has-flag": "^3.0.0",
+    "has-flag": "^4.0.0",
     "has-yarn": "^2.1.0",
     "has-symbols": "^1.0.1",
-    "hosted-git-info": "^2.8.8",
+    "hosted-git-info": "^3.0.7",
     "http-cache-semantics": "^4.1.0",
-    "http-errors": "^1.7.2",
-    "human-signals": "^1.1.1",
-    "iconv-lite": "^0.4.24",
-    "ignore": "^4.0.6",
-    "ignore-by-default": "^1.0.1",
+    "http-errors": "^1.8.0",
+    "human-signals": "^2.1.0",
+    "iconv-lite": "^0.6.2",
+    "ignore": "^5.1.8",
+    "ignore-by-default": "^2.0.0",
     "import-fresh": "^3.2.1",
-    "import-lazy": "^2.1.0",
+    "import-lazy": "^4.0.0",
     "imurmurhash": "^0.1.4",
     "indent-string": "^4.0.0",
     "inflight": "^1.0.6",
@@ -171,8 +171,8 @@
     "ini": "^1.3.5",
     "inquirer": "^7.3.3",
     "internal-slot": "^1.0.2",
-    "ipaddr.js": "^1.9.1",
-    "is-arrayish": "^0.2.1",
+    "ipaddr.js": "^2.0.0",
+    "is-arrayish": "^0.3.2",
     "is-binary-path": "^2.1.0",
     "is-callable": "^1.2.2",
     "is-ci": "^2.0.0",
@@ -183,42 +183,42 @@
     "is-glob": "^4.0.1",
     "is-installed-globally": "^0.3.2",
     "is-negative-zero": "^2.0.0",
-    "is-npm": "^4.0.0",
+    "is-npm": "^5.0.0",
     "is-number": "^7.0.0",
-    "is-obj": "^1.0.1",
+    "is-obj": "^2.0.0",
     "is-path-inside": "^3.0.2",
     "is-regex": "^1.1.1",
-    "is-regexp": "^1.0.0",
+    "is-regexp": "^2.1.0",
     "is-stream": "^2.0.0",
     "is-string": "^1.0.5",
     "is-symbol": "^1.0.3",
     "is-typedarray": "^1.0.0",
     "is-yarn-global": "^0.3.0",
-    "isarray": "^1.0.0",
+    "isarray": "^2.0.5",
     "isexe": "^2.0.0",
     "joi": "^17.2.1",
-    "js-tokens": "^4.0.0",
+    "js-tokens": "^6.0.0",
     "js-yaml": "^3.14.0",
-    "jsesc": "^2.5.2",
-    "json-buffer": "^3.0.0",
+    "jsesc": "^3.0.1",
+    "json-buffer": "^3.0.1",
     "json-parse-even-better-errors": "^2.3.1",
-    "json-schema-traverse": "^0.4.1",
+    "json-schema-traverse": "^0.5.0",
     "json-stable-stringify-without-jsonify": "^1.0.1",
-    "json5": "^1.0.1",
+    "json5": "^2.1.3",
     "jsonwebtoken": "^8.5.1",
-    "jsx-ast-utils": "^2.4.1",
-    "jwa": "^1.4.1",
-    "jws": "^3.2.2",
+    "jsx-ast-utils": "^3.1.0",
+    "jwa": "^2.0.0",
+    "jws": "^4.0.0",
     "kareem": "^2.3.1",
-    "keyv": "^3.1.0",
+    "keyv": "^4.0.3",
     "language-subtag-registry": "^0.3.20",
     "language-tags": "^1.0.5",
     "latest-version": "^5.1.0",
     "levn": "^0.4.1",
     "lines-and-columns": "^1.1.6",
-    "listr2": "^2.6.2",
-    "load-json-file": "^2.0.0",
-    "locate-path": "^2.0.0",
+    "listr2": "^3.1.1",
+    "load-json-file": "^6.2.0",
+    "locate-path": "^6.0.0",
     "lodash": "^4.17.20",
     "lodash.includes": "^4.3.0",
     "lodash.isboolean": "^3.0.3",
@@ -230,25 +230,25 @@
     "log-update": "^4.0.0",
     "loose-envify": "^1.4.0",
     "log-symbols": "^4.0.0",
-    "lowercase-keys": "^1.0.1",
+    "lowercase-keys": "^2.0.0",
     "make-dir": "^3.1.0",
-    "media-typer": "^0.3.0",
+    "media-typer": "^1.1.0",
     "memory-pager": "^1.5.0",
     "merge-descriptors": "^1.0.1",
     "merge-stream": "^2.0.0",
     "methods": "^1.1.2",
     "micromatch": "^4.0.2",
-    "mime": "^1.6.0",
-    "mime-db": "^1.44.0",
+    "mime": "^2.4.6",
+    "mime-db": "^1.45.0",
     "mime-types": "^2.1.27",
-    "mimic-fn": "^2.1.0",
-    "mimic-response": "^1.0.1",
+    "mimic-fn": "^3.1.0",
+    "mimic-response": "^3.1.0",
     "minimatch": "^3.0.4",
     "minimist": "^1.2.5",
-    "mkdirp": "^0.5.5",
+    "mkdirp": "^1.0.4",
     "mongodb": "^3.6.2",
     "morgan": "^1.10.0",
-    "mongoose": "^5.10.5",
+    "mongoose": "^5.10.9",
     "mongoose-legacy-pluralize": "^1.0.2",
     "mpath": "^0.7.0",
     "mquery": "^3.2.2",
@@ -256,10 +256,10 @@
     "mute-stream": "^0.0.8",
     "natural-compare": "^1.4.0",
     "negotiator": "^0.6.2",
-    "nopt": "^1.0.10",
-    "normalize-package-data": "^2.5.0",
+    "nopt": "^5.0.0",
+    "normalize-package-data": "^3.0.0",
     "normalize-path": "^3.0.0",
-    "normalize-url": "^4.5.0",
+    "normalize-url": "^5.3.0",
     "npm-run-path": "^4.0.1",
     "object-assign": "^4.1.1",
     "object-inspect": "^1.8.0",
@@ -275,27 +275,27 @@
     "opencollective-postinstall": "^2.0.3",
     "optionator": "^0.9.1",
     "os-tmpdir": "^1.0.2",
-    "p-cancelable": "^1.1.0",
-    "p-limit": "^1.3.0",
-    "p-locate": "^2.0.0",
+    "p-cancelable": "^2.0.0",
+    "p-limit": "^3.0.2",
+    "p-locate": "^5.0.0",
     "p-map": "^4.0.0",
-    "p-try": "^1.0.0",
+    "p-try": "^2.2.0",
     "package-json": "^6.5.0",
-    "parent-module": "^1.0.1",
+    "parent-module": "^2.0.0",
     "parse-json": "^5.1.0",
     "parseurl": "^1.3.3",
-    "path-exists": "^3.0.0",
+    "path-exists": "^4.0.0",
     "path-is-absolute": "^1.0.1",
     "path-key": "^3.1.1",
     "path-parse": "^1.0.6",
-    "path-to-regexp": "^0.1.7",
+    "path-to-regexp": "^6.2.0",
     "path-type": "^4.0.0",
     "picomatch": "^2.2.2",
-    "pify": "^2.3.0",
-    "pkg-dir": "^4.2.0",
+    "pify": "^5.0.0",
+    "pkg-dir": "^5.0.0",
     "please-upgrade-node": "^3.2.0",
     "prelude-ls": "^1.2.1",
-    "prepend-http": "^2.0.0",
+    "prepend-http": "^3.0.1",
     "process-nextick-args": "^2.0.1",
     "progress": "^2.0.3",
     "prop-types": "^15.7.2",
@@ -304,14 +304,14 @@
     "pump": "^3.0.0",
     "punycode": "^2.1.1",
     "pupa": "^2.0.1",
-    "qs": "^6.7.0",
+    "qs": "^6.9.4",
     "range-parser": "^1.2.1",
-    "raw-body": "^2.4.0",
+    "raw-body": "^2.4.1",
     "rc": "^1.2.8",
     "react-is": "^16.13.1",
-    "read-pkg": "^2.0.0",
-    "read-pkg-up": "^2.0.0",
-    "readable-stream": "^2.3.7",
+    "read-pkg": "^5.2.0",
+    "read-pkg-up": "^7.0.1",
+    "readable-stream": "^3.6.0",
     "readdirp": "^3.5.0",
     "regenerator-runtime": "^0.13.7",
     "regexp-clone": "^1.0.0",
@@ -321,72 +321,72 @@
     "registry-url": "^5.1.0",
     "require_optional": "^1.0.1",
     "resolve": "^1.18.1",
-    "resolve-from": "^2.0.0",
-    "responselike": "^1.0.2",
+    "resolve-from": "^5.0.0",
+    "responselike": "^2.0.0",
     "restore-cursor": "^3.1.0",
-    "rimraf": "^2.6.3",
+    "rimraf": "^3.0.2",
     "run-async": "^2.4.1",
     "rxjs": "^6.6.3",
-    "safe-buffer": "^5.1.2",
+    "safe-buffer": "^5.2.1",
     "safer-buffer": "^2.1.2",
     "saslprep": "^1.0.3",
-    "semver": "^5.7.1",
+    "semver": "^7.3.2",
     "semver-compare": "^1.0.0",
     "semver-diff": "^3.1.1",
-    "semver-regex": "^2.0.0",
+    "semver-regex": "^3.1.1",
     "send": "^0.17.1",
     "serve-static": "^1.14.1",
-    "setprototypeof": "^1.1.1",
+    "setprototypeof": "^1.2.0",
     "shebang-command": "^2.0.0",
     "shebang-regex": "^3.0.0",
     "side-channel": "^1.0.3",
-    "sift": "^7.0.1",
+    "sift": "^13.3.5",
     "signal-exit": "^3.0.3",
     "slash": "^3.0.0",
-    "slice-ansi": "^2.1.0",
+    "slice-ansi": "^4.0.0",
     "sliced": "^1.0.1",
-    "source-map": "^0.5.7",
+    "source-map": "^0.7.3",
     "sparse-bitfield": "^3.0.3",
     "spdx-correct": "^3.1.1",
     "spdx-exceptions": "^2.3.0",
     "spdx-expression-parse": "^3.0.1",
     "spdx-license-ids": "^3.0.6",
-    "sprintf-js": "^1.0.3",
-    "statuses": "^1.5.0",
+    "sprintf-js": "^1.1.2",
+    "statuses": "^2.0.0",
     "string-argv": "^0.3.1",
     "string-width": "^4.2.0",
     "string.prototype.matchall": "^4.0.2",
     "string.prototype.trimend": "^1.0.1",
     "string.prototype.trimstart": "^1.0.1",
-    "string_decoder": "^1.1.1",
+    "string_decoder": "^1.3.0",
     "stringify-object": "^3.3.0",
     "strip-ansi": "^6.0.0",
-    "strip-bom": "^3.0.0",
+    "strip-bom": "^4.0.0",
     "strip-final-newline": "^2.0.0",
     "strip-json-comments": "^3.1.1",
-    "supports-color": "^5.5.0",
-    "table": "^5.4.6",
+    "supports-color": "^7.2.0",
+    "table": "^6.0.3",
     "term-size": "^2.2.0",
     "text-table": "^0.2.0",
     "through": "^2.3.8",
-    "tmp": "^0.0.33",
-    "to-fast-properties": "^2.0.0",
-    "to-readable-stream": "^1.0.0",
+    "tmp": "^0.2.1",
+    "to-fast-properties": "^3.0.1",
+    "to-readable-stream": "^2.1.0",
     "to-regex-range": "^5.0.1",
     "toidentifier": "^1.0.0",
     "touch": "^3.1.0",
     "tsconfig-paths": "^3.9.0",
-    "tslib": "^1.14.1",
+    "tslib": "^2.0.3",
     "type-check": "^0.4.0",
-    "type-fest": "^0.8.1",
+    "type-fest": "^0.18.0",
     "type-is": "^1.6.18",
     "typedarray-to-buffer": "^3.1.5",
     "undefsafe": "^2.0.3",
     "unique-string": "^2.0.0",
     "unpipe": "^1.0.0",
-    "update-notifier": "^4.1.3",
+    "update-notifier": "^5.0.0",
     "uri-js": "^4.4.0",
-    "url-parse-lax": "^3.0.0",
+    "url-parse-lax": "^4.0.0",
     "util-deprecate": "^1.0.2",
     "utils-merge": "^1.0.1",
     "v8-compile-cache": "^2.1.1",
@@ -396,9 +396,9 @@
     "which-pm-runs": "^1.0.0",
     "widest-line": "^3.1.0",
     "word-wrap": "^1.2.3",
-    "wrap-ansi": "^6.2.0",
+    "wrap-ansi": "^7.0.0",
     "wrappy": "^1.0.2",
-    "write": "^1.0.3",
+    "write": "^2.0.0",
     "write-file-atomic": "^3.0.3",
     "xdg-basedir": "^4.0.0",
     "yaml": "^1.10.0"
@@ -413,14 +413,14 @@
     "eslint-plugin-import": "^2.22.1",
     "eslint-plugin-jsx-a11y": "^6.3.1",
     "eslint-plugin-prettier": "^3.1.4",
-    "eslint-plugin-react": "^7.21.4",
-    "eslint-plugin-react-hooks": "^4.0.0",
+    "eslint-plugin-react": "^7.21.5",
+    "eslint-plugin-react-hooks": "^4.1.2",
     "eslint-scope": "^5.1.1",
     "eslint-utils": "^2.1.0",
-    "eslint-visitor-keys": "^1.3.0",
+    "eslint-visitor-keys": "^2.0.0",
     "husky": "^4.3.0",
     "lint-staged": "^10.4.2",
-    "nodemon": "^2.0.4",
-    "prettier": "2.1.2"
+    "nodemon": "^2.0.6",
+    "prettier": "^2.1.2"
   }
 }
diff --git a/src/index.js b/src/index.js
index 7d410a9..d4d2616 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,4 +1,5 @@
 const express = require('express');
+
 const app = express();
 const morgan = require('morgan');
 const mongoose = require('mongoose');
@@ -9,31 +10,27 @@ const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
 
 // MongoDB connection
-//mongodb://localhost:27017/noderest  => meu banco de dados local polupado
-//mongodb://mongo:27017/backend => banco de dados da develop
+// mongodb://localhost:27017/noderest  => meu banco de dados local polupado
+// mongodb://mongo:27017/backend => banco de dados da develop
 mongoose
-    .connect(
-        'mongodb://localhost:27017/noderest',
-        { useNewUrlParser: true }
-    )
-    .then(() => console.log('MongoDB Connected'))
-    .catch(err => console.log(err));
-
+  .connect('mongodb://localhost:27017/noderest', { useNewUrlParser: true })
+  .then(() => console.log('MongoDB Connected'))
+  .catch((err) => console.log(err));
 
 // middlewares
 app.use(morgan('dev'));
-app.use(express.urlencoded({extended: false}));
+app.use(express.urlencoded({ extended: false }));
 app.use(express.json());
 
 // routes
 
-app.use('/auth',authRoutes);
-app.use('/plant',plantRoutes);
-app.use('/topic',topicRoutes);
-app.use('/comment',commentRoutes);
+app.use('/auth', authRoutes);
+app.use('/plant', plantRoutes);
+app.use('/topic', topicRoutes);
+app.use('/comment', commentRoutes);
 
 // starting the server
 app.set('port', process.env.PORT || 3000);
 app.listen(app.get('port'), () => {
-    console.log(`Server on port ${app.get('port')}`);
+  console.log(`Server on port ${app.get('port')}`);
 });
diff --git a/src/models/Comment.js b/src/models/Comment.js
index dcdb05d..79ff587 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -1,32 +1,32 @@
 const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
+
+const { Schema } = mongoose;
 
 const CommentSchema = new mongoose.Schema({
-    text: {
-        type: String,
-        require: true,
-    },
-    user: {
-        type: Schema.Types.ObjectId,
-        ref: 'User',
-        require: true,
-    },
-    topic: {
-        type: Schema.Types.ObjectId,
-        ref: 'Topic',
-        require: true,
-    },
-    likes: {
-        type: Number,
-        default: 0
-    },
-    dislikes: {
-        type: Number,
-        default: 0
-    },
+  text: {
+    type: String,
+    require: true,
+  },
+  user: {
+    type: Schema.Types.ObjectId,
+    ref: 'User',
+    require: true,
+  },
+  topic: {
+    type: Schema.Types.ObjectId,
+    ref: 'Topic',
+    require: true,
+  },
+  likes: {
+    type: Number,
+    default: 0,
+  },
+  dislikes: {
+    type: Number,
+    default: 0,
+  },
 });
 
-
-const Comment = mongoose.model('Comment',CommentSchema);
+const Comment = mongoose.model('Comment', CommentSchema);
 
 module.exports = Comment;
diff --git a/src/models/Plant.js b/src/models/Plant.js
index 0e31893..3294204 100644
--- a/src/models/Plant.js
+++ b/src/models/Plant.js
@@ -1,62 +1,63 @@
 const mongoose = require('mongoose');
 
 const PlantSchema = new mongoose.Schema({
-    scientificName: {
-        type: String,
-        require: true,
-        unique: true
-    },
-    family_name: {
-        type: String,
-        require: true
-    },
-    gender_name: {
-        type: String,
-        require: true
-    },
-    specie_name: {
-        type: String,
-        require: true
-    },
-    common_name: {
-        type: String,
-        require: true
-    },
-    usage: {
-        type: String,
-        require: true
-    },
-    first_User: {
-        type: String,
-        require: true
-    },
-    collection_count: {
-        type: Number,
-        require: true
-    },
-    extinction: {
-        type: Boolean,
-        require: true
-    },
-    profile_picture: {
-        type: String,
-        require : true
-    },   
-    gbifID: {
-        type: Number,
-        require: true,    
-    },
-    stateProvince: {
-        type: String,
-        require : true
-    },
-    topics: [{
-        type: mongoose.Schema.Types.ObjectId,
-        ref: 'Topic',
-    }],
+  scientificName: {
+    type: String,
+    require: true,
+    unique: true,
+  },
+  family_name: {
+    type: String,
+    require: true,
+  },
+  gender_name: {
+    type: String,
+    require: true,
+  },
+  specie_name: {
+    type: String,
+    require: true,
+  },
+  common_name: {
+    type: String,
+    require: true,
+  },
+  usage: {
+    type: String,
+    require: true,
+  },
+  first_User: {
+    type: String,
+    require: true,
+  },
+  collection_count: {
+    type: Number,
+    require: true,
+  },
+  extinction: {
+    type: Boolean,
+    require: true,
+  },
+  profile_picture: {
+    type: String,
+    require: true,
+  },
+  gbifID: {
+    type: Number,
+    require: true,
+  },
+  stateProvince: {
+    type: String,
+    require: true,
+  },
+  topics: [
+    {
+      type: mongoose.Schema.Types.ObjectId,
+      ref: 'Topic',
+    },
+  ],
 });
 
-
-const Plant = mongoose.model('Plant',PlantSchema);
+const Plant = mongoose.model('Plant', PlantSchema);
 
 module.exports = Plant;
diff --git a/src/models/Topic.js b/src/models/Topic.js
index e08b34c..9b41e3c 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -1,40 +1,43 @@
 const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
+
+const { Schema } = mongoose;
 
 const topicSchema = new Schema({
-    title: {
-        type: String,
-        require: true,
-    },
-    description: {
-        type: String,
-    },
-    plant:{
-        type:mongoose.Schema.Types.ObjectId,
-        ref:'Plant',
-        require:true
-    },
-    user: {
-        type: Schema.Types.ObjectId,
-        ref: 'User',
-        require: true,
-    },
-    likes: {
-        type: Number,
-        default: 0
-    },
-    dislikes: {
-        type: Number,
-        default: 0
-    },
-    comments: [{
-        type: Schema.Types.ObjectId,
-        ref: 'Comment'
-    }],
-    createdAt: {
-        type: Date,
-        default: Date.now,
+  title: {
+    type: String,
+    require: true,
+  },
+  description: {
+    type: String,
+  },
+  plant: {
+    type: mongoose.Schema.Types.ObjectId,
+    ref: 'Plant',
+    require: true,
+  },
+  user: {
+    type: Schema.Types.ObjectId,
+    ref: 'User',
+    require: true,
+  },
+  likes: {
+    type: Number,
+    default: 0,
+  },
+  dislikes: {
+    type: Number,
+    default: 0,
+  },
+  comments: [
+    {
+      type: Schema.Types.ObjectId,
+      ref: 'Comment',
     },
+  ],
+  createdAt: {
+    type: Date,
+    default: Date.now,
+  },
 });
 
 const Topic = mongoose.model('Topic', topicSchema);
diff --git a/src/models/User.js b/src/models/User.js
index 0faf8c4..a88a9a2 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -1,26 +1,29 @@
 const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
+
+const { Schema } = mongoose;
 
 const userSchema = new Schema({
-    username: {
-        type: String,
-        required: true,
-        unique:true
-    },
-    password: {
-        type: String,
-        required: true
-    },
-    email: {
-        type: String,
-        required: true,
-        unique:true
+  username: {
+    type: String,
+    required: true,
+    unique: true,
+  },
+  password: {
+    type: String,
+    required: true,
+  },
+  email: {
+    type: String,
+    required: true,
+    unique: true,
+  },
+  topics: [
+    {
+      type: mongoose.Schema.Types.ObjectId,
+      ref: 'Topics',
+      require: true,
     },
-    topics: [{
-        type: mongoose.Schema.Types.ObjectId,
-        ref: 'Topics',
-        require: true,
-    }]
+  ],
 });
 
 const User = mongoose.model('User', userSchema);
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 178bee1..e58d17f 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -1,38 +1,35 @@
-
-//confere se o token é valido
+// confere se o token é valido
 require('dotenv').config();
 const jsonwebtoken = require('jsonwebtoken');
 
 const authConfig = {
-    "secret": process.env.SECRET 
-    
+  secret: process.env.SECRET,
 };
 function auth(req, res, next) {
-    const sessiontoken = req.headers.authtoken;
+  const sessiontoken = req.headers.authtoken;
 
-    if(!sessiontoken){
-        return res.status(401).send({Error: 'Token not provided'});
-    }
-   
-    const parts = sessiontoken.split(' ');
+  if (!sessiontoken) {
+    return res.status(401).send({ Error: 'Token not provided' });
+  }
 
-    if (!parts.length === 2){
-        return res.status(401).send({Error: 'Token error'});
-    }
-    
-    const [scheme, token] = parts;
-     
-    if(!/^Bearer$/i.test(scheme)){
-        return res.status(401).send({Error: 'Token malformated'});
-    }
+  const parts = sessiontoken.split(' ');
 
-    jsonwebtoken.verify(token, authConfig.secret, (err, decoded) => {
-        if(err){
-            return res.status(401).send({Error: 'Token invalid'});
-        }
+  if (!parts.length === 2) {
+    return res.status(401).send({ Error: 'Token error' });
+  }
+
+  const [scheme, token] = parts;
+
+  if (!/^Bearer$/i.test(scheme)) {
+    return res.status(401).send({ Error: 'Token malformated' });
+  }
+
+  jsonwebtoken.verify(token, authConfig.secret, (err, decoded) => {
+    if (err) {
+      return res.status(401).send({ Error: 'Token invalid' });
+    }
     req.userId = decoded.id;
-    return next()
-        
-    });
+    return next();
+  });
 }
-module.exports = {authConfig,auth}
+module.exports = { authConfig, auth };
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 672e07b..acea393 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -1,83 +1,84 @@
 const express = require('express');
+
 const router = express.Router();
 const jsonwebtoken = require('jsonwebtoken');
 const User = require('../models/User');
 const userSchema = require('../schemas/userSchema');
-const {auth,authConfig} = require('./auth');
-
+const { auth, authConfig } = require('./auth');
 
-router.post('/login', async(req, res ,next) => {
-  try{
-    const {email, password} = req.body;
+router.post('/login', async (req, res, next) => {
+  try {
+    const { email, password } = req.body;
     const user = await User.findOne({ email, password });
-    if(!user){
-        return res.status(400).send({Error: 'User not found'});
+    if (!user) {
+      return res.status(400).send({ Error: 'User not found' });
     }
-    if(await password != user.password){
-        return res.status(400).send({ Error: 'Incorrect password'});
+    if ((await password) != user.password) {
+      return res.status(400).send({ Error: 'Incorrect password' });
     }
     user.password = undefined;
-    const token = jsonwebtoken.sign({id: user.id}, authConfig.secret,{
-        expiresIn: 86400,
+    const token = jsonwebtoken.sign({ id: user.id }, authConfig.secret, {
+      expiresIn: 86400,
     });
-    const aToken = "Bearer "+token;
+    const aToken = `Bearer ${token}`;
     res.header('authtoken', aToken);
-    res.json({
-        message: 'Auth token generated'
-    }).redirect('/main');
-  }catch(err){
+    res
+      .json({
+        message: 'Auth token generated',
+      })
+      .redirect('/main');
+  } catch (err) {
     next(err);
   }
 });
 
-router.post('/signup', async(req, res) => {
+router.post('/signup', async (req, res) => {
   try {
-      const newUserData = req.body;
-      const result = userSchema.validate(req.body);
+    const newUserData = req.body;
+    const result = userSchema.validate(req.body);
 
-      await User.findOne({ username: newUserData.username});
+    await User.findOne({ username: newUserData.username });
 
-      if ( result.error ) return res.status(400).send({ error: 'Error while signing up. ' + result.error});
+    if (result.error)
+      return res.status(400).send({ error: `Error while signing up. ${result.error}` });
 
-      const user = new User(newUserData);
-      await user.save()
+    const user = new User(newUserData);
+    await user.save();
 
-      return res.send(user);
-      
-  } catch(err) {
-      return res.status(400).send({ error: 'Error while signing up.' + err });
+    return res.send(user);
+  } catch (err) {
+    return res.status(400).send({ error: `Error while signing up.${err}` });
   }
 });
 
-router.put('/update/:id',auth, async(req, res) => {
-    try {
-      const user = await User.findById(req.params.id);
-      const newData = req.body;
+router.put('/update/:id', auth, async (req, res) => {
+  try {
+    const user = await User.findById(req.params.id);
+    const newData = req.body;
 
-      if ( !newData.username ) newData.username = user.username;
-      if ( !newData.password ) newData.password = user.password;
-      if ( !newData.email ) newData.email = user.email;
+    if (!newData.username) newData.username = user.username;
+    if (!newData.password) newData.password = user.password;
+    if (!newData.email) newData.email = user.email;
 
-      const result = userSchema.validate(newData);
+    const result = userSchema.validate(newData);
 
-      if ( result.error ) return res.status(400).send(result.error);
+    if (result.error) return res.status(400).send(result.error);
 
-      await User.findOneAndUpdate({_id: req.params.id}, req.body, { useFindAndModify: false})
-        
-      res.send({ message: 'User updated successfully.'});
+    await User.findOneAndUpdate({ _id: req.params.id }, req.body, { useFindAndModify: false });
 
-    } catch(err) {
-      return res.status(400).send({ error: 'Error while updating user.' + err});
-    }
+    res.send({ message: 'User updated successfully.' });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while updating user.${err}` });
+  }
 });
 
-router.delete('/delete/:id',auth, async(req, res) => {
-    try {
-        await User.findByIdAndDelete(req.params.id);
-        return res.send({ message: 'User successfully deleted.' });
-    } catch(err) {
-        return res.status(400).send({ error: 'Error while deleting user. ' + err });
-    }
+router.delete('/delete/:id', auth, async (req, res) => {
+  try {
+    await User.findByIdAndDelete(req.params.id);
+    return res.send({ message: 'User successfully deleted.' });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while deleting user. ${err}` });
+  }
 });
 
 module.exports = router;
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 4b708be..6cf62cf 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,4 +1,5 @@
 const express = require('express');
+
 const router = express.Router();
 
 const Topic = require('../models/Topic');
@@ -6,96 +7,93 @@ const User = require('../models/User');
 const Comment = require('../models/Comment');
 
 router.post('/create/:topicId/:userId', async (req, res) => {
-    try {
-
-        if ( !req.body.text ) return res.status(400).send({ error: 'Comment should not be empty'});
+  try {
+    if (!req.body.text) return res.status(400).send({ error: 'Comment should not be empty' });
 
-        const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
-        const topic = await Topic.findById(req.params.topicId);
+    const comment = await Comment.create({
+      ...req.body,
+      user: req.params.userId,
+      topic: req.params.topicId,
+    });
+    const topic = await Topic.findById(req.params.topicId);
 
-        await comment.save();
+    await comment.save();
 
-        topic.comments.push(comment);
-        await topic.save();
-    
-        return res.send({ message: 'Comment successfully registered.' });
+    topic.comments.push(comment);
+    await topic.save();
 
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while commenting.' + err});
-    }
+    return res.send({ message: 'Comment successfully registered.' });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while commenting.${err}` });
+  }
 });
 
 router.put('/update/:commentId', async (req, res) => {
-
-    try {
-
-        await Comment.findById(req.params.commentId);
-        const newData = req.body;
-
-        if ( !newData.text ) return res.status(400).send({ error: 'Comment should not be empty'});
-    
-        await Comment.findOneAndUpdate({_id: req.params.commentId}, req.body, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: 'Comment updated successfully.'});
-        });
-
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while updating comment.' + err });
-    }
-
+  try {
+    await Comment.findById(req.params.commentId);
+    const newData = req.body;
+
+    if (!newData.text) return res.status(400).send({ error: 'Comment should not be empty' });
+
+    await Comment.findOneAndUpdate({ _id: req.params.commentId }, req.body, {
+      useFindAndModify: false,
+    }).then(() => {
+      res.send({ message: 'Comment updated successfully.' });
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while updating comment.${err}` });
+  }
 });
 
 router.delete('/delete/:commentId', async (req, res) => {
+  try {
+    const comment = await Comment.findById(req.params.commentId);
+    const topic = await Topic.findById(comment.topic);
 
-    try {
+    const index = topic.comments.indexOf(req.params.commentId);
 
-        const comment = await Comment.findById(req.params.commentId);
-        const topic = await Topic.findById(comment.topic);
-
-        const index = topic.comments.indexOf(req.params.commentId);
-
-        if (index > -1) {
-            topic.comments.splice(index, 1);
-        }
-
-        topic.save();
-
-        await Comment.findByIdAndRemove(req.params.commentId).populate('user');
+    if (index > -1) {
+      topic.comments.splice(index, 1);
+    }
 
-        return res.send({
-            message: 'Comment successfully removed.'
-        });
+    topic.save();
 
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while deleting topic.' + err });
-    }
+    await Comment.findByIdAndRemove(req.params.commentId).populate('user');
 
+    return res.send({
+      message: 'Comment successfully removed.',
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while deleting topic.${err}` });
+  }
 });
 
 router.post('/like/:commentId', async (req, res) => {
-    try {
-
-        await Comment.findOneAndUpdate({_id: req.params.commentId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: 'Liked!'});
-        });
-        
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while liking comment.' + err });
-    }
+  try {
+    await Comment.findOneAndUpdate(
+      { _id: req.params.commentId },
+      { $inc: { likes: 1 } },
+      { useFindAndModify: false }
+    ).then(() => {
+      res.send({ message: 'Liked!' });
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while liking comment.${err}` });
+  }
 });
 
 router.post('/dislike/:commentId', async (req, res) => {
-    try {
-
-        await Comment.findOneAndUpdate({_id: req.params.commentId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: 'Disliked!'});
-        });
-        
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while linking comment.' + err });
-    }
+  try {
+    await Comment.findOneAndUpdate(
+      { _id: req.params.commentId },
+      { $inc: { dislikes: 1 } },
+      { useFindAndModify: false }
+    ).then(() => {
+      res.send({ message: 'Disliked!' });
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while linking comment.${err}` });
+  }
 });
 
 module.exports = router;
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 54a5085..eaa5040 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -5,86 +5,142 @@ const Topic = require('../models/Topic');
 
 const router = express.Router();
 
-//registro de uma nova planta
-router.post('/register', async (req , res) => {
-    try{
-        const { scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince,topicos} = req.body;
+// registro de uma nova planta
+router.post('/register', async (req, res) => {
+  try {
+    const {
+      scientificName,
+      family_name,
+      gender_name,
+      specie_name,
+      common_name,
+      usage,
+      first_User,
+      collection_count,
+      extinction,
+      profile_picture,
+      gbifID,
+      stateProvince,
+      topicos,
+    } = req.body;
 
-        const plant = await Plant.create({scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince});
+    const plant = await Plant.create({
+      scientificName,
+      family_name,
+      gender_name,
+      specie_name,
+      common_name,
+      usage,
+      first_User,
+      collection_count,
+      extinction,
+      profile_picture,
+      gbifID,
+      stateProvince,
+    });
 
-        // await Promise.all(topicos.map(async topico =>{
-        //     const plantTopic = new Topico({...topico,plant : plant._id});
+    // await Promise.all(topicos.map(async topico =>{
+    //     const plantTopic = new Topico({...topico,plant : plant._id});
 
-        //     await plantTopic.save();
+    //     await plantTopic.save();
 
-        //     plant.topicos.push(plantTopic);
-        // }));
+    //     plant.topicos.push(plantTopic);
+    // }));
 
-        await plant.save();
+    await plant.save();
 
-        return res.send({ plant });
-    }catch (err){
-        return res.send(err);
-    }
+    return res.send({ plant });
+  } catch (err) {
+    return res.send(err);
+  }
 });
-//Listagem de Todas as plantas
-router.get('/', async (req , res) => {
-    try{
-        const plants = await Plant.find().populate('topics');
-
-        return res.send({ plants });
-    }catch (err){
-        return res.status(400).send({ error: 'Loading plants failed'});
-    }
+// Listagem de Todas as plantas
+router.get('/', async (req, res) => {
+  try {
+    const plants = await Plant.find().populate('topics');
+
+    return res.send({ plants });
+  } catch (err) {
+    return res.status(400).send({ error: 'Loading plants failed' });
+  }
 });
-//Procurando planta por id
-router.get('/:plantId', async (req , res) => {
-    try{
-        const plant = await Plant.findById(req.params.plantId).populate('topics');
-
-        return res.send({ plant });
-    }catch (err){
-        return res.status(400).send({ error: 'error when searching for this plant '});
-    }
+// Procurando planta por id
+router.get('/:plantId', async (req, res) => {
+  try {
+    const plant = await Plant.findById(req.params.plantId).populate('topics');
+
+    return res.send({ plant });
+  } catch (err) {
+    return res.status(400).send({ error: 'error when searching for this plant ' });
+  }
 });
-//Deletando planta por id
-router.delete('/:plantId', async (req , res) => {
-    try{
-        const deleted = await Plant.findByIdAndRemove(req.params.plantId);
-
-        return res.send(deleted);
-    }catch (err){
-        return res.status(400).send({ error: 'Error when Delete this plant'});
-    }
+// Deletando planta por id
+router.delete('/:plantId', async (req, res) => {
+  try {
+    const deleted = await Plant.findByIdAndRemove(req.params.plantId);
+
+    return res.send(deleted);
+  } catch (err) {
+    return res.status(400).send({ error: 'Error when Delete this plant' });
+  }
 });
-//Dando upgrade planta por id
-router.put('/:plantId', async (req , res) => {
-    
-        try{
-            const { scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince,topicos} = req.body;
-    
-            const plant = await Plant.findByIdAndUpdate(req.params.plantId,
-                {scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince},{ new: true});
-            
-            plant.topics = [];
-            await Topic.remove({plant: plant._id});
-
-            await Promise.all(topics.map(async topic =>{
-                const plantTopic = new Topic({...topic,plant : plant._id});
-    
-                await plantTopic.save();
-    
-                plant.topics.push(plantTopic);
-            }));
-    
-            await plant.save();
-    
-    
-            return res.send({ plant });
-        }catch (err){
-            return res.status(400).send({ error: 'Registration failed'});
-        }
-   
+// Dando upgrade planta por id
+router.put('/:plantId', async (req, res) => {
+  try {
+    const {
+      scientificName,
+      family_name,
+      gender_name,
+      specie_name,
+      common_name,
+      usage,
+      first_User,
+      collection_count,
+      extinction,
+      profile_picture,
+      gbifID,
+      stateProvince,
+      topicos,
+    } = req.body;
+
+    const plant = await Plant.findByIdAndUpdate(
+      req.params.plantId,
+      {
+        scientificName,
+        family_name,
+        gender_name,
+        specie_name,
+        common_name,
+        usage,
+        first_User,
+        collection_count,
+        extinction,
+        profile_picture,
+        gbifID,
+        stateProvince,
+      },
+      { new: true }
+    );
+
+    plant.topics = [];
+    await Topic.remove({ plant: plant._id });
+
+    await Promise.all(
+      topics.map(async (topic) => {
+        const plantTopic = new Topic({ ...topic, plant: plant._id });
+
+        await plantTopic.save();
+
+        plant.topics.push(plantTopic);
+      })
+    );
+
+    await plant.save();
+
+    return res.send({ plant });
+  } catch (err) {
+    return res.status(400).send({ error: 'Registration failed' });
+  }
 });
 
-module.exports = router;
\ No newline at end of file
+module.exports = router;
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 525645b..862423a 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -1,4 +1,5 @@
 const express = require('express');
+
 const router = express.Router();
 
 const Topic = require('../models/Topic');
@@ -7,126 +8,123 @@ const Plant = require('../models/Plant');
 const topicSchema = require('../schemas/topicSchema');
 
 router.post('/create/:plantId/:userId', async (req, res) => {
-    
-    try {
-
-        const user = await User.findById(req.params.userId);
-        const plant = await Plant.findById(req.params.plantId);
-
-        const result = topicSchema.validate(req.body);
+  try {
+    const user = await User.findById(req.params.userId);
+    const plant = await Plant.findById(req.params.plantId);
 
-        if ( result.error ) return res.status(400).send({ error: 'Error while creating topic. ' + result.error});
+    const result = topicSchema.validate(req.body);
 
-        const topic = await Topic.create({...req.body, user: req.params.userId, plant: req.params.plantId});
+    if (result.error)
+      return res.status(400).send({ error: `Error while creating topic. ${result.error}` });
 
-        await topic.save();
+    const topic = await Topic.create({
+      ...req.body,
+      user: req.params.userId,
+      plant: req.params.plantId,
+    });
 
-        user.topics.push(topic);
-        await user.save();
+    await topic.save();
 
-        plant.topics.push(topic);
-        await plant.save();
-    
-        return res.send({ topic });
+    user.topics.push(topic);
+    await user.save();
 
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while creating topic.' + err });
-    }
+    plant.topics.push(topic);
+    await plant.save();
 
+    return res.send({ topic });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while creating topic.${err}` });
+  }
 });
 
 router.put('/update/:topicId', async (req, res) => {
-
-    try {
-
-        const topic = await Topic.findById(req.params.topicId);
-
-        const newData = req.body;
-
-        if (!newData.title) newData.title = topic.title;
-        if (!newData.description) newData.description = topic.description;
-
-        const result = topicSchema.validate(newData);
-        if ( result.error ) return res.status(400).send({ error: 'Error while creating topic. ' + result.error});
-    
-        await Topic.findOneAndUpdate({_id: req.params.topicId}, newData, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: 'Topic updated successfully.'});
-        });
-
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while updating topic.' + err });
-    }
-
+  try {
+    const topic = await Topic.findById(req.params.topicId);
+
+    const newData = req.body;
+
+    if (!newData.title) newData.title = topic.title;
+    if (!newData.description) newData.description = topic.description;
+
+    const result = topicSchema.validate(newData);
+    if (result.error)
+      return res.status(400).send({ error: `Error while creating topic. ${result.error}` });
+
+    await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
+      useFindAndModify: false,
+    }).then(() => {
+      res.send({ message: 'Topic updated successfully.' });
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while updating topic.${err}` });
+  }
 });
 
 router.delete('/delete/:topicId', async (req, res) => {
-    try {
-
-        const topic = await Topic.findById(req.params.topicId);
-        const user = await User.findById(topic.user);
-        const plant = await Plant.findById(topic.plant);
-
-        const indexAtUser = user.topics.indexOf(req.params.topicId);
-        const indexAtPlant = plant.topics.indexOf(req.params.topicId);
+  try {
+    const topic = await Topic.findById(req.params.topicId);
+    const user = await User.findById(topic.user);
+    const plant = await Plant.findById(topic.plant);
 
-        if (indexAtUser > -1) {
-            user.topics.splice(indexAtUser, 1);
-        }
-        if (indexAtPlant > -1) {
-            plant.topics.splice(indexAtPlant, 1);
-        }
+    const indexAtUser = user.topics.indexOf(req.params.topicId);
+    const indexAtPlant = plant.topics.indexOf(req.params.topicId);
 
-        user.save();
-        plant.save();
+    if (indexAtUser > -1) {
+      user.topics.splice(indexAtUser, 1);
+    }
+    if (indexAtPlant > -1) {
+      plant.topics.splice(indexAtPlant, 1);
+    }
 
-        await Topic.findByIdAndRemove(req.params.topicId, { useFindAndModify: false });
+    user.save();
+    plant.save();
 
-        return res.send({
-            message: 'Topic successfully removed.'
-        });
+    await Topic.findByIdAndRemove(req.params.topicId, { useFindAndModify: false });
 
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while deleting topic.' + err });
-    }
+    return res.send({
+      message: 'Topic successfully removed.',
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while deleting topic.${err}` });
+  }
 });
 
 router.get('/list', async (req, res) => {
-    try {
+  try {
+    const topic = await Topic.find().populate(['user']);
 
-        const topic = await Topic.find().populate(['user']);
-
-        return res.send({ topic });
-
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while listing topics.' + err });
-    }
+    return res.send({ topic });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while listing topics.${err}` });
+  }
 });
 
 router.post('/like/:topicId', async (req, res) => {
-    try {
-
-        await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: 'Liked!'});
-        });
-        
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while liking topic.' + err });
-    }
+  try {
+    await Topic.findOneAndUpdate(
+      { _id: req.params.topicId },
+      { $inc: { likes: 1 } },
+      { useFindAndModify: false }
+    ).then(() => {
+      res.send({ message: 'Liked!' });
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while liking topic.${err}` });
+  }
 });
 
 router.post('/dislike/:topicId', async (req, res) => {
-    try {
-
-        await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: 'Disliked!'});
-        });
-        
-    } catch (err) {
-        return res.status(400).send({ error: 'Error while dislikinng topic.' + err });
-    }
+  try {
+    await Topic.findOneAndUpdate(
+      { _id: req.params.topicId },
+      { $inc: { dislikes: 1 } },
+      { useFindAndModify: false }
+    ).then(() => {
+      res.send({ message: 'Disliked!' });
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while dislikinng topic.${err}` });
+  }
 });
 
 module.exports = router;
diff --git a/src/schemas/topicSchema.js b/src/schemas/topicSchema.js
index 0e07919..9a0379e 100644
--- a/src/schemas/topicSchema.js
+++ b/src/schemas/topicSchema.js
@@ -1,8 +1,8 @@
 const Joi = require('joi');
 
 const topicSchema = Joi.object({
-    title: Joi.string().min(4).max(30).required(),
-    description: Joi.string().min(5)
+  title: Joi.string().min(4).max(30).required(),
+  description: Joi.string().min(5),
 });
 
 module.exports = topicSchema;
diff --git a/src/schemas/userSchema.js b/src/schemas/userSchema.js
index 5853b2b..20101d6 100644
--- a/src/schemas/userSchema.js
+++ b/src/schemas/userSchema.js
@@ -1,10 +1,14 @@
 const Joi = require('joi');
 
 const userSchema = Joi.object({
-    username: Joi.string().alphanum().min(4).max(30).required(),
-    password: Joi.string().min(8).required(),
-    passwordConfirmation: Joi.string().min(8).required().valid(Joi.ref('password')).error(new Error('Password confirmation does not match.')),
-    email: Joi.string().email().required()
+  username: Joi.string().alphanum().min(4).max(30).required(),
+  password: Joi.string().min(8).required(),
+  passwordConfirmation: Joi.string()
+    .min(8)
+    .required()
+    .valid(Joi.ref('password'))
+    .error(new Error('Password confirmation does not match.')),
+  email: Joi.string().email().required(),
 });
 
 module.exports = userSchema;

From 83580ebaabb666c109e2d5f71225512edbd0269d Mon Sep 17 00:00:00 2001
From: Guilherme de Lyra <guilyra12@gmail.com>
Date: Tue, 20 Oct 2020 02:14:28 -0300
Subject: [PATCH 070/147] Update .stickler.yml

---
 .stickler.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.stickler.yml b/.stickler.yml
index 32c9168..15af50e 100644
--- a/.stickler.yml
+++ b/.stickler.yml
@@ -4,6 +4,7 @@ linters:
 
 files:
   ignore:
+    - '.eslintrc.json'
     - 'bower_components/*'
     - 'node_modules/*'
 

From 80c0674cd19bc37eda978c9711b1401bf951d697 Mon Sep 17 00:00:00 2001
From: Guilherme de Lyra <guilyra12@gmail.com>
Date: Tue, 20 Oct 2020 16:59:01 -0300
Subject: [PATCH 071/147] fixing lint errors

---
 .eslintrc.json              |  1 +
 src/routes/auth.js          | 15 +++++----
 src/routes/authRoutes.js    |  8 ++---
 src/routes/commentRoutes.js | 14 +++-----
 src/routes/plantRoutes.js   | 67 +++++++++++++++++++------------------
 src/routes/topicRoutes.js   | 13 +++----
 6 files changed, 58 insertions(+), 60 deletions(-)

diff --git a/.eslintrc.json b/.eslintrc.json
index d685852..43d1e28 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -14,6 +14,7 @@
   "rules": {
     "jsx-a11y/href-no-hash": ["off"],
     "no-console": "off",
+    "no-underscore-dangle": "off",
     "react/jsx-filename-extension": ["warn", { "extensions": [".js", ".jsx"] }],
     "max-len": [
       "warn",
diff --git a/src/routes/auth.js b/src/routes/auth.js
index e58d17f..2b6ba85 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -1,6 +1,6 @@
 // confere se o token é valido
 require('dotenv').config();
-const jsonwebtoken = require('jsonwebtoken');
+const jwt = require('jsonwebtoken');
 
 const authConfig = {
   secret: process.env.SECRET,
@@ -24,12 +24,13 @@ function auth(req, res, next) {
     return res.status(401).send({ Error: 'Token malformated' });
   }
 
-  jsonwebtoken.verify(token, authConfig.secret, (err, decoded) => {
-    if (err) {
-      return res.status(401).send({ Error: 'Token invalid' });
-    }
-    req.userId = decoded.id;
+  try {
+    const { userId } = jwt.verify(token, authConfig.secret);
+    req.userId = userId;
     return next();
-  });
+  } catch (err) {
+    req.redirect('/login_page');
+    return res.status(400);
+  }
 }
 module.exports = { authConfig, auth };
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index df73193..c29b72c 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -13,7 +13,7 @@ router.post('/login', async (req, res, next) => {
     if (!user) {
       return res.status(400).send({ Error: 'User not found' });
     }
-    if ((await password) != user.password) {
+    if (password !== user.password) {
       return res.status(400).send({ Error: 'Incorrect password' });
     }
     user.password = undefined;
@@ -22,13 +22,13 @@ router.post('/login', async (req, res, next) => {
     });
     const aToken = `Bearer ${token}`;
     res.header('authtoken', aToken);
-    res
+    return res
       .json({
         message: 'Auth token generated',
       })
       .redirect('/main');
   } catch (err) {
-    next(err);
+    return next(err);
   }
 });
 
@@ -70,7 +70,7 @@ router.put('/update/:id', auth, async (req, res) => {
       useFindAndModify: false,
     });
 
-    res.send({ message: 'User updated successfully.' });
+    return res.send({ message: 'User updated successfully.' });
   } catch (err) {
     return res.status(400).send({ error: `Error while updating user.${err}` });
   }
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 939a6a9..f3bfcc2 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -3,7 +3,6 @@ const express = require('express');
 const router = express.Router();
 
 const Topic = require('../models/Topic');
-const User = require('../models/User');
 const Comment = require('../models/Comment');
 
 router.post('/create/:topicId/:userId', async (req, res) => {
@@ -39,9 +38,8 @@ router.put('/update/:commentId', async (req, res) => {
 
     await Comment.findOneAndUpdate({ _id: req.params.commentId }, req.body, {
       useFindAndModify: false,
-    }).then(() => {
-      res.send({ message: 'Comment updated successfully.' });
     });
+    return res.send({ message: 'Comment updated successfully.' });
   } catch (err) {
     return res
       .status(400)
@@ -78,9 +76,8 @@ router.post('/like/:commentId', async (req, res) => {
       { _id: req.params.commentId },
       { $inc: { likes: 1 } },
       { useFindAndModify: false }
-    ).then(() => {
-      res.send({ message: 'Liked!' });
-    });
+    );
+    return res.send({ message: 'Liked!' });
   } catch (err) {
     return res.status(400).send({ error: `Error while liking comment.${err}` });
   }
@@ -92,9 +89,8 @@ router.post('/dislike/:commentId', async (req, res) => {
       { _id: req.params.commentId },
       { $inc: { dislikes: 1 } },
       { useFindAndModify: false }
-    ).then(() => {
-      res.send({ message: 'Disliked!' });
-    });
+    );
+    return res.send({ message: 'Disliked!' });
   } catch (err) {
     return res
       .status(400)
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index bf98267..3985c29 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -10,41 +10,40 @@ router.post('/register', async (req, res) => {
   try {
     const {
       scientificName,
-      family_name,
-      gender_name,
-      specie_name,
-      common_name,
+      familyName,
+      genderName,
+      specieName,
+      commonName,
       usage,
-      first_User,
-      collection_count,
+      firstUser,
+      collectionCount,
       extinction,
-      profile_picture,
+      profilePicture,
       gbifID,
       stateProvince,
-      topicos,
     } = req.body;
 
     const plant = await Plant.create({
       scientificName,
-      family_name,
-      gender_name,
-      specie_name,
-      common_name,
+      familyName,
+      genderName,
+      specieName,
+      commonName,
       usage,
-      first_User,
-      collection_count,
+      firstUser,
+      collectionCount,
       extinction,
-      profile_picture,
+      profilePicture,
       gbifID,
       stateProvince,
     });
 
-    // await Promise.all(topicos.map(async topico =>{
+    // await Promise.all(topics.map(async topico =>{
     //     const plantTopic = new Topico({...topico,plant : plant._id});
 
     //     await plantTopic.save();
 
-    //     plant.topicos.push(plantTopic);
+    //     plant.topics.push(plantTopic);
     // }));
 
     await plant.save();
@@ -54,6 +53,7 @@ router.post('/register', async (req, res) => {
     return res.send(err);
   }
 });
+
 // Listagem de Todas as plantas
 router.get('/', async (req, res) => {
   try {
@@ -64,6 +64,7 @@ router.get('/', async (req, res) => {
     return res.status(400).send({ error: 'Loading plants failed' });
   }
 });
+
 // Procurando planta por id
 router.get('/:plantId', async (req, res) => {
   try {
@@ -76,6 +77,7 @@ router.get('/:plantId', async (req, res) => {
       .send({ error: 'error when searching for this plant ' });
   }
 });
+
 // Deletando planta por id
 router.delete('/:plantId', async (req, res) => {
   try {
@@ -86,38 +88,39 @@ router.delete('/:plantId', async (req, res) => {
     return res.status(400).send({ error: 'Error when Delete this plant' });
   }
 });
+
 // Dando upgrade planta por id
 router.put('/:plantId', async (req, res) => {
   try {
     const {
       scientificName,
-      family_name,
-      gender_name,
-      specie_name,
-      common_name,
+      familyName,
+      genderName,
+      specieName,
+      commonName,
       usage,
-      first_User,
-      collection_count,
+      firstUser,
+      collectionCount,
       extinction,
-      profile_picture,
+      profilePicture,
       gbifID,
       stateProvince,
-      topicos,
+      topics,
     } = req.body;
 
     const plant = await Plant.findByIdAndUpdate(
       req.params.plantId,
       {
         scientificName,
-        family_name,
-        gender_name,
-        specie_name,
-        common_name,
+        familyName,
+        genderName,
+        specieName,
+        commonName,
         usage,
-        first_User,
-        collection_count,
+        firstUser,
+        collectionCount,
         extinction,
-        profile_picture,
+        profilePicture,
         gbifID,
         stateProvince,
       },
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 173da3a..878f1dd 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -56,9 +56,8 @@ router.put('/update/:topicId', async (req, res) => {
 
     await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
       useFindAndModify: false,
-    }).then(() => {
-      res.send({ message: 'Topic updated successfully.' });
     });
+    return res.send({ message: 'Topic updated successfully.' });
   } catch (err) {
     return res.status(400).send({ error: `Error while updating topic.${err}` });
   }
@@ -111,9 +110,8 @@ router.post('/like/:topicId', async (req, res) => {
       { _id: req.params.topicId },
       { $inc: { likes: 1 } },
       { useFindAndModify: false }
-    ).then(() => {
-      res.send({ message: 'Liked!' });
-    });
+    );
+    return res.send({ message: 'Liked!' });
   } catch (err) {
     return res.status(400).send({ error: `Error while liking topic.${err}` });
   }
@@ -125,9 +123,8 @@ router.post('/dislike/:topicId', async (req, res) => {
       { _id: req.params.topicId },
       { $inc: { dislikes: 1 } },
       { useFindAndModify: false }
-    ).then(() => {
-      res.send({ message: 'Disliked!' });
-    });
+    );
+    return res.send({ message: 'Disliked!' });
   } catch (err) {
     return res
       .status(400)

From b005261b7a6c1563df280f0f5ad5ccfd96b28100 Mon Sep 17 00:00:00 2001
From: Guilherme de Lyra <guilyra12@gmail.com>
Date: Tue, 20 Oct 2020 18:12:19 -0300
Subject: [PATCH 072/147] adding github action

---
 .eslintrc.json                |  3 +--
 .github/workflows/linters.yml | 22 ++++++++++++++++++++++
 2 files changed, 23 insertions(+), 2 deletions(-)
 create mode 100644 .github/workflows/linters.yml

diff --git a/.eslintrc.json b/.eslintrc.json
index 43d1e28..5d9f147 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -4,6 +4,7 @@
     "plugin:prettier/recommended",
     "prettier/react"
   ],
+  "parser": "babel-eslint",
   "env": {
     "browser": true,
     "commonjs": true,
@@ -12,10 +13,8 @@
     "node": true
   },
   "rules": {
-    "jsx-a11y/href-no-hash": ["off"],
     "no-console": "off",
     "no-underscore-dangle": "off",
-    "react/jsx-filename-extension": ["warn", { "extensions": [".js", ".jsx"] }],
     "max-len": [
       "warn",
       {
diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml
new file mode 100644
index 0000000..be4aebc
--- /dev/null
+++ b/.github/workflows/linters.yml
@@ -0,0 +1,22 @@
+name: Linters
+
+on: pull_request
+
+env:
+  FORCE_COLOR: 1
+
+jobs:
+  eslint:
+    name: ESLint
+    runs-on: ubuntu-18.04
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions/setup-node@v1
+        with:
+          node-version: '12.x'
+      - name: Setup ESLint
+        run: |
+          npm install --save-dev babel-eslint@10.1.x eslint@7.11.x eslint-config-airbnb@18.2.x eslint-config-prettier@6.13.x eslint-import-resolver-node@0.3.x eslint-module-utils@2.6.x eslint-plugin-import@2.22.x eslint-plugin-jsx-a11y@6.3.x eslint-plugin-prettier@3.1.x eslint-plugin-react@7.21.x eslint-plugin-react-hooks@4.1.x eslint-scope@5.1.x eslint-utils@2.1.x eslint-visitor-keys@2.0.x
+          [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/fga-eps-mds/2020.1-GaiaDex-BackEnd/adding_eslint/.eslintrc.json
+      - name: ESLint Report
+        run: npx eslint .

From 3e6fd0a4f1877156fa6c5d0c0dbc527bcede5650 Mon Sep 17 00:00:00 2001
From: Guilherme de Lyra <guilyra12@gmail.com>
Date: Tue, 20 Oct 2020 18:25:23 -0300
Subject: [PATCH 073/147] adding precommit hook

---
 package.json | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/package.json b/package.json
index 47d437f..4dcaec5 100644
--- a/package.json
+++ b/package.json
@@ -6,14 +6,22 @@
   "scripts": {
     "start": "node src/index.js",
     "dev": "nodemon src/index.js",
-    "precommit": "lint-staged"
+    "lint:js": "npx eslint . --ext .js,.jsx",
+    "lint:js:fix": "npm run lint:js -- --fix"
   },
   "lint-staged": {
-    "*.{js,jsx}": [
-      "eslint --fix",
-      "git add"
+    "src/**/*.{js,jsx}": [
+      "npx eslint . --fix", "git add"
+    ],
+    "src/*.{js,jsx}": [
+      "npx eslint . --fix", "git add"
     ]
   },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged"
+    }
+  },
   "repository": {
     "type": "git",
     "url": "git+https://github.com/fga-eps-mds/2020.1-GaiaDex-backend.git"

From aaae2b0310700dd1f7b6b71b67f86ffac26ab160 Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Tue, 3 Nov 2020 16:16:02 -0300
Subject: [PATCH 074/147] Fix default mongodb url

Co-authored-by: Marcos Filipe <marofelipe@live.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/index.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/index.js b/src/index.js
index d4d2616..19cf9c0 100644
--- a/src/index.js
+++ b/src/index.js
@@ -13,7 +13,7 @@ const commentRoutes = require('./routes/commentRoutes');
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
 // mongodb://mongo:27017/backend => banco de dados da develop
 mongoose
-  .connect('mongodb://localhost:27017/noderest', { useNewUrlParser: true })
+  .connect('mongodb://mongo:27017/backend', { useNewUrlParser: true })
   .then(() => console.log('MongoDB Connected'))
   .catch((err) => console.log(err));
 

From 524a6f473712210dae81d7455316c11bf35e75c0 Mon Sep 17 00:00:00 2001
From: Antonio Ruan Moura Barreto <ruanmoura13@outlook.com>
Date: Tue, 20 Oct 2020 19:19:32 -0300
Subject: [PATCH 075/147] Adding scanner plant rounter

Co-authored-by: Marcos Felipe De Almeida Souza <marofelipe@live.com>
---
 package-lock.json     | 1025 +++++++++++------------------------------
 package.json          |    8 +-
 src/index.js          |   14 +-
 src/routes/scanner.js |   47 ++
 4 files changed, 341 insertions(+), 753 deletions(-)
 create mode 100644 src/routes/scanner.js

diff --git a/package-lock.json b/package-lock.json
index d26bd23..9d592c3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -83,50 +83,40 @@
       "dependencies": {
         "ansi-styles": {
           "version": "3.2.1",
-          "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
           "requires": {
             "color-convert": "^1.9.0"
           }
         },
         "chalk": {
           "version": "2.4.2",
-          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
           "requires": {
             "ansi-styles": "^3.2.1",
             "escape-string-regexp": "^1.0.5",
             "supports-color": "^5.3.0"
-          },
-          "dependencies": {
-            "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="
-            },
-            "supports-color": {
-              "version": "5.5.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-              "requires": {
-                "has-flag": "^3.0.0"
-              }
-            }
           }
         },
         "color-convert": {
           "version": "1.9.3",
-          "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
           "requires": {
             "color-name": "1.1.3"
           }
         },
         "color-name": {
           "version": "1.1.3",
-          "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
           "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
         },
+        "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="
+        },
         "has-flag": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -136,6 +126,14 @@
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
           "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
@@ -192,8 +190,8 @@
       "dependencies": {
         "globals": {
           "version": "11.12.0",
-          "resolved": "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz",
-          "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+          "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
           "dev": true
         }
       }
@@ -218,9 +216,9 @@
       }
     },
     "@eslint/eslintrc": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz",
-      "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==",
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz",
+      "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
@@ -290,9 +288,9 @@
       }
     },
     "@sindresorhus/is": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz",
-      "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ=="
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz",
+      "integrity": "sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ=="
     },
     "@szmarczak/http-timer": {
       "version": "4.0.5",
@@ -337,9 +335,9 @@
       }
     },
     "@types/node": {
-      "version": "14.11.10",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.10.tgz",
-      "integrity": "sha512-yV1nWZPlMFpoXyoknm4S56y2nlTAuFYaJuQtYRAOU7xA/FJ9RY0Xm7QOkaYMMmr8ESdHIuUb6oQgR/0+2NqlyA=="
+      "version": "14.14.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz",
+      "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw=="
     },
     "@types/normalize-package-data": {
       "version": "2.4.0",
@@ -435,18 +433,8 @@
       "dependencies": {
         "ansi-regex": {
           "version": "4.1.0",
-          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
         },
         "string-width": {
           "version": "3.1.0",
@@ -456,14 +444,26 @@
             "emoji-regex": "^7.0.1",
             "is-fullwidth-code-point": "^2.0.0",
             "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "requires": {
-            "ansi-regex": "^4.1.0"
+          },
+          "dependencies": {
+            "emoji-regex": {
+              "version": "7.0.3",
+              "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+              "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+            },
+            "is-fullwidth-code-point": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+              "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+            },
+            "strip-ansi": {
+              "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": "^4.1.0"
+              }
+            }
           }
         }
       }
@@ -537,26 +537,6 @@
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.0",
         "is-string": "^1.0.5"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "array.prototype.flat": {
@@ -566,26 +546,6 @@
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.0-next.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "array.prototype.flatmap": {
@@ -596,26 +556,6 @@
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.0-next.1",
         "function-bind": "^1.1.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "ast-types-flow": {
@@ -628,11 +568,24 @@
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
       "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
     },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+    },
     "axe-core": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.0.2.tgz",
       "integrity": "sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA=="
     },
+    "axios": {
+      "version": "0.20.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz",
+      "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==",
+      "requires": {
+        "follow-redirects": "^1.10.0"
+      }
+    },
     "axobject-query": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
@@ -889,12 +842,12 @@
       }
     },
     "buffer": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
-      "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
+      "version": "5.7.0",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.0.tgz",
+      "integrity": "sha512-cd+5r1VLBwUqTrmnzW+D7ABkJUM6mr7uv1dv+6jRw4Rcl7tFIFHDqHPL98LhpGFn3dbAt3gtLxtrWp4m1kFrqg==",
       "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4"
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
       }
     },
     "buffer-equal-constant-time": {
@@ -941,15 +894,24 @@
         }
       }
     },
+    "call-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz",
+      "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.0"
+      }
+    },
     "callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
       "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
     },
     "camelcase": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz",
-      "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ=="
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg=="
     },
     "chalk": {
       "version": "4.1.0",
@@ -958,21 +920,6 @@
       "requires": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
-        },
-        "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==",
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
       }
     },
     "chardet": {
@@ -1030,37 +977,6 @@
         "string-width": "^4.2.0"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "astral-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
-        },
-        "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==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "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=="
-        },
         "slice-ansi": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
@@ -1075,8 +991,8 @@
     },
     "cli-width": {
       "version": "3.0.0",
-      "resolved": "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz",
-      "integrity": "sha1-ovSEN6LKqaIkNueUvwceyeYc7fY= sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
     },
     "clone-response": {
       "version": "1.0.2",
@@ -1106,10 +1022,18 @@
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
     "commander": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz",
-      "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA=="
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
+      "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q=="
     },
     "compare-versions": {
       "version": "3.6.0",
@@ -1145,9 +1069,9 @@
       }
     },
     "confusing-browser-globals": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
-      "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw=="
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz",
+      "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA=="
     },
     "contains-path": {
       "version": "1.0.0",
@@ -1218,24 +1142,6 @@
         "parse-json": "^5.0.0",
         "path-type": "^4.0.0",
         "yaml": "^1.10.0"
-      },
-      "dependencies": {
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "error-ex": "^1.3.1",
-            "json-parse-even-better-errors": "^2.3.0",
-            "lines-and-columns": "^1.1.6"
-          }
-        },
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
-        }
       }
     },
     "cross-spawn": {
@@ -1312,6 +1218,11 @@
         "object-keys": "^1.0.12"
       }
     },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+    },
     "denque": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
@@ -1359,13 +1270,6 @@
       "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
       "requires": {
         "safe-buffer": "^5.0.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
       }
     },
     "ee-first": {
@@ -1374,9 +1278,9 @@
       "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
     },
     "emoji-regex": {
-      "version": "9.1.1",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.1.1.tgz",
-      "integrity": "sha512-AaWyDiNO9rbtMIcGl7tdxMcNu8SOLaDLxmQEFT5JhgKufOJzPPkYmgN2QwqTgw4doWMZZQttC6sUWVQjb+1VdA=="
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz",
+      "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug=="
     },
     "encodeurl": {
       "version": "1.0.2",
@@ -1458,13 +1362,13 @@
       "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
     },
     "eslint": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz",
-      "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz",
+      "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
-        "@eslint/eslintrc": "^0.1.3",
+        "@eslint/eslintrc": "^0.2.1",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
@@ -1641,9 +1545,9 @@
       }
     },
     "eslint-config-prettier": {
-      "version": "6.13.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.13.0.tgz",
-      "integrity": "sha512-LcT0i0LSmnzqK2t764pyIt7kKH2AuuqKRTtJTdddWxOiUja9HdG5GXBVF2gmCTvVYWVsTu8J2MhJLVGRh+pj8w==",
+      "version": "6.15.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz",
+      "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==",
       "dev": true,
       "requires": {
         "get-stdin": "^6.0.0"
@@ -1695,6 +1599,15 @@
             "ms": "2.0.0"
           }
         },
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
         "locate-path": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
@@ -1743,22 +1656,11 @@
         },
         "pkg-dir": {
           "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
           "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
           "dev": true,
           "requires": {
             "find-up": "^2.1.0"
-          },
-          "dependencies": {
-            "find-up": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-              "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-              "dev": true,
-              "requires": {
-                "locate-path": "^2.0.0"
-              }
-            }
           }
         }
       }
@@ -1960,40 +1862,22 @@
       }
     },
     "eslint-plugin-jsx-a11y": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz",
-      "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==",
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz",
+      "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.10.2",
+        "@babel/runtime": "^7.11.2",
         "aria-query": "^4.2.2",
         "array-includes": "^3.1.1",
         "ast-types-flow": "^0.0.7",
-        "axe-core": "^3.5.4",
-        "axobject-query": "^2.1.2",
+        "axe-core": "^4.0.2",
+        "axobject-query": "^2.2.0",
         "damerau-levenshtein": "^1.0.6",
         "emoji-regex": "^9.0.0",
         "has": "^1.0.3",
-        "jsx-ast-utils": "^2.4.1",
+        "jsx-ast-utils": "^3.1.0",
         "language-tags": "^1.0.5"
-      },
-      "dependencies": {
-        "axe-core": {
-          "version": "3.5.5",
-          "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz",
-          "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==",
-          "dev": true
-        },
-        "jsx-ast-utils": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
-          "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==",
-          "dev": true,
-          "requires": {
-            "array-includes": "^3.1.1",
-            "object.assign": "^4.1.0"
-          }
-        }
       }
     },
     "eslint-plugin-prettier": {
@@ -2036,9 +1920,9 @@
       }
     },
     "eslint-plugin-react-hooks": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.2.tgz",
-      "integrity": "sha512-ykUeqkGyUGgwTtk78C0o8UG2fzwmgJ0qxBGPp2WqRKsTwcLuVf01kTDRAtOsd4u6whX2XOC8749n2vPydP82fg==",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz",
+      "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==",
       "dev": true
     },
     "eslint-scope": {
@@ -2053,8 +1937,8 @@
       "dependencies": {
         "estraverse": {
           "version": "4.3.0",
-          "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz",
-          "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+          "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
           "dev": true
         }
       }
@@ -2115,13 +1999,6 @@
       "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
       "requires": {
         "estraverse": "^5.1.0"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
-        }
       }
     },
     "esrecurse": {
@@ -2130,13 +2007,6 @@
       "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "requires": {
         "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=="
-        }
       }
     },
     "estraverse": {
@@ -2155,9 +2025,9 @@
       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
     },
     "execa": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
-      "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+      "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
       "requires": {
         "cross-spawn": "^7.0.0",
         "get-stream": "^5.0.0",
@@ -2284,8 +2154,8 @@
     },
     "external-editor": {
       "version": "3.1.0",
-      "resolved": "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz",
-      "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
       "requires": {
         "chardet": "^0.7.0",
         "iconv-lite": "^0.4.24",
@@ -2479,6 +2349,21 @@
       "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
       "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA=="
     },
+    "follow-redirects": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
+      "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA=="
+    },
+    "form-data": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
+      "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      }
+    },
     "forwarded": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -2510,6 +2395,16 @@
       "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
       "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
     },
+    "get-intrinsic": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz",
+      "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
+    },
     "get-own-enumerable-property-symbols": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
@@ -2556,9 +2451,9 @@
       }
     },
     "globals": {
-      "version": "13.2.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.2.0.tgz",
-      "integrity": "sha512-OjvFbGDlR7aIsLqFrraxoqIP3bb+wgp+Aarel5S56lwS3se4uUrwKkChnv1MqsMIv/Opexbmu7qCfHL9T0mBEg==",
+      "version": "13.3.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.3.0.tgz",
+      "integrity": "sha512-RjuvsMnQXQWjVGClrHIVdKOkYZcP/4UrgrZxIFdEyp+NvradqD4bNtPmtTn4mv4NMvVqdFCzaJuGGA9QpKjZmA==",
       "requires": {
         "type-fest": "^0.8.1"
       },
@@ -2571,11 +2466,11 @@
       }
     },
     "got": {
-      "version": "11.7.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-11.7.0.tgz",
-      "integrity": "sha512-7en2XwH2MEqOsrK0xaKhbWibBoZqy+f1RSUoIeF1BLcnf+pyQdDsljWMfmOh+QKJwuvDIiKx38GtPh5wFdGGjg==",
+      "version": "11.8.0",
+      "resolved": "https://registry.npmjs.org/got/-/got-11.8.0.tgz",
+      "integrity": "sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ==",
       "requires": {
-        "@sindresorhus/is": "^3.1.1",
+        "@sindresorhus/is": "^4.0.0",
         "@szmarczak/http-timer": "^4.0.5",
         "@types/cacheable-request": "^6.0.1",
         "@types/responselike": "^1.0.0",
@@ -2685,72 +2580,32 @@
         "which-pm-runs": "^1.0.0"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+        "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": {
-            "color-convert": "^2.0.1"
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
           }
         },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+        "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": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
+            "p-locate": "^4.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==",
+        "p-limit": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
           "dev": true,
           "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "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"
-          }
-        },
-        "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==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
+            "p-try": "^2.0.0"
           }
         },
         "p-locate": {
@@ -2762,18 +2617,6 @@
             "p-limit": "^2.2.0"
           }
         },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "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
-        },
         "pkg-dir": {
           "version": "4.2.0",
           "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -2782,15 +2625,6 @@
           "requires": {
             "find-up": "^4.0.0"
           }
-        },
-        "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"
-          }
         }
       }
     },
@@ -2803,9 +2637,9 @@
       }
     },
     "ieee754": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
-      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
     },
     "ignore": {
       "version": "5.1.8",
@@ -2818,9 +2652,9 @@
       "integrity": "sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA=="
     },
     "import-fresh": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-      "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
+      "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
       "requires": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
@@ -2877,8 +2711,8 @@
     },
     "inquirer": {
       "version": "7.3.3",
-      "resolved": "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz",
-      "integrity": "sha1-BNF2sq8Er8FXqD/XwQDpjuCq0AM= sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
       "requires": {
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.1.0",
@@ -2903,26 +2737,6 @@
         "es-abstract": "^1.17.0-next.1",
         "has": "^1.0.3",
         "side-channel": "^1.0.2"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "ipaddr.js": {
@@ -3114,9 +2928,9 @@
       }
     },
     "jsesc": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.1.tgz",
-      "integrity": "sha512-w+MMxnByppM4jwskitZotEtvtO3a2C7WOz31NxJToGisHuysCAQQU7umb/pA/6soPFe8LGjXFEFbuPuLEPm7Ag=="
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+      "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="
     },
     "json-buffer": {
       "version": "3.0.1",
@@ -3236,9 +3050,9 @@
       }
     },
     "language-subtag-registry": {
-      "version": "0.3.20",
-      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz",
-      "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg=="
+      "version": "0.3.21",
+      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
+      "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg=="
     },
     "language-tags": {
       "version": "1.0.5",
@@ -3271,114 +3085,32 @@
       "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
     },
     "lint-staged": {
-      "version": "10.4.2",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.4.2.tgz",
-      "integrity": "sha512-OLCA9K1hS+Sl179SO6kX0JtnsaKj/MZalEhUj5yAgXsb63qPI/Gfn6Ua1KuZdbfkZNEu3/n5C/obYCu70IMt9g==",
+      "version": "10.5.1",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.1.tgz",
+      "integrity": "sha512-fTkTGFtwFIJJzn/PbUO3RXyEBHIhbfYBE7+rJyLcOXabViaO/h6OslgeK6zpeUtzkDrzkgyAYDTLAwx6JzDTHw==",
       "dev": true,
       "requires": {
         "chalk": "^4.1.0",
         "cli-truncate": "^2.1.0",
-        "commander": "^6.0.0",
+        "commander": "^6.2.0",
         "cosmiconfig": "^7.0.0",
-        "debug": "^4.1.1",
+        "debug": "^4.2.0",
         "dedent": "^0.7.0",
         "enquirer": "^2.3.6",
-        "execa": "^4.0.3",
-        "listr2": "^2.6.0",
+        "execa": "^4.1.0",
+        "listr2": "^3.2.2",
         "log-symbols": "^4.0.0",
         "micromatch": "^4.0.2",
         "normalize-path": "^3.0.0",
         "please-upgrade-node": "^3.2.0",
         "string-argv": "0.3.1",
         "stringify-object": "^3.3.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "debug": {
-          "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.2"
-          }
-        },
-        "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
-        },
-        "listr2": {
-          "version": "2.6.2",
-          "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz",
-          "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==",
-          "dev": true,
-          "requires": {
-            "chalk": "^4.1.0",
-            "cli-truncate": "^2.1.0",
-            "figures": "^3.2.0",
-            "indent-string": "^4.0.0",
-            "log-update": "^4.0.0",
-            "p-map": "^4.0.0",
-            "rxjs": "^6.6.2",
-            "through": "^2.3.8"
-          }
-        },
-        "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
-        },
-        "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"
-          }
-        }
       }
     },
     "listr2": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.1.1.tgz",
-      "integrity": "sha512-5HjYFP0FpG2dOuSAth2vQ172rWqI78746itLIvgg0KjHMAyW8CVNc9wzBzEo4/5UYfNbmT28u0J29NoA3W0z+Q==",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.2.tgz",
+      "integrity": "sha512-AajqcZEUikF2ioph6PfH3dIuxJclhr3i3kHgTOP0xeXdWQohrvJAAmqVcV43/GI987HFY/vzT73jYXoa4esDHg==",
       "requires": {
         "chalk": "^4.1.0",
         "cli-truncate": "^2.1.0",
@@ -3462,51 +3194,6 @@
       "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
       "requires": {
         "chalk": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "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==",
-          "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==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
-        },
-        "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==",
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
       }
     },
     "log-update": {
@@ -3520,47 +3207,6 @@
         "wrap-ansi": "^6.2.0"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "astral-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
-        },
-        "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==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "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=="
-        },
-        "slice-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        },
         "wrap-ansi": {
           "version": "6.2.0",
           "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@@ -3767,11 +3413,6 @@
             }
           }
         },
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        },
         "string_decoder": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -3790,9 +3431,9 @@
       }
     },
     "mongoose": {
-      "version": "5.10.9",
-      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.9.tgz",
-      "integrity": "sha512-7dkr1d6Uyk87hELzoc6B7Zo7kkPTx8rKummk51Y0je2V2Ttsw0KFPwTp1G8JIbBta7Wpw8j15PJi0d33Ode2nw==",
+      "version": "5.10.11",
+      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.11.tgz",
+      "integrity": "sha512-R5BFitKW94/S/Z48w+X+qi/eto66jWBcVEVA8nYVkBoBAPFGq7JSYP/0uso+ZHs+7XjSzTuui+SUllzxIrf9yA==",
       "requires": {
         "bson": "^1.1.4",
         "kareem": "2.3.1",
@@ -3884,13 +3525,15 @@
           "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
           "requires": {
             "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+            }
           }
         },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        },
         "safe-buffer": {
           "version": "5.1.2",
           "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -3905,8 +3548,8 @@
     },
     "mute-stream": {
       "version": "0.0.8",
-      "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz",
-      "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
     },
     "natural-compare": {
       "version": "1.4.0",
@@ -4087,35 +3730,14 @@
       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
     },
     "object.assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
-      "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
       "requires": {
+        "call-bind": "^1.0.0",
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.0",
         "has-symbols": "^1.0.1",
         "object-keys": "^1.1.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.18.0-next.1",
-          "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-          "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg= sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
-          "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.2",
-            "is-negative-zero": "^2.0.0",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "object.entries": {
@@ -4126,26 +3748,6 @@
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5",
         "has": "^1.0.3"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "object.fromentries": {
@@ -4157,26 +3759,6 @@
         "es-abstract": "^1.17.0-next.1",
         "function-bind": "^1.1.1",
         "has": "^1.0.3"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "object.values": {
@@ -4188,26 +3770,6 @@
         "es-abstract": "^1.17.0-next.1",
         "function-bind": "^1.1.1",
         "has": "^1.0.3"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "on-finished": {
@@ -4273,7 +3835,7 @@
     },
     "os-tmpdir": {
       "version": "1.0.2",
-      "resolved": "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
       "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
     },
     "p-cancelable": {
@@ -4737,7 +4299,7 @@
       "dependencies": {
         "strip-json-comments": {
           "version": "2.0.1",
-          "resolved": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
           "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
         }
       }
@@ -4871,26 +4433,6 @@
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.0-next.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "regexpp": {
@@ -4986,8 +4528,8 @@
     },
     "run-async": {
       "version": "2.4.1",
-      "resolved": "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz",
-      "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU= sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
     },
     "rxjs": {
       "version": "6.6.3",
@@ -5094,21 +4636,14 @@
         },
         "http-errors": {
           "version": "1.7.3",
-          "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz",
-          "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
+          "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
           "requires": {
             "depd": "~1.1.2",
             "inherits": "2.0.4",
             "setprototypeof": "1.1.1",
             "statuses": ">= 1.5.0 < 2",
             "toidentifier": "1.0.0"
-          },
-          "dependencies": {
-            "setprototypeof": {
-              "version": "1.1.1",
-              "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-              "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
-            }
           }
         },
         "mime": {
@@ -5121,6 +4656,11 @@
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
           "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
         },
+        "setprototypeof": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+        },
         "statuses": {
           "version": "1.5.0",
           "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
@@ -5168,8 +4708,8 @@
       "dependencies": {
         "es-abstract": {
           "version": "1.18.0-next.1",
-          "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-          "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg= sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
           "requires": {
             "es-to-primitive": "^1.2.1",
             "function-bind": "^1.1.1",
@@ -5319,47 +4859,28 @@
         "internal-slot": "^1.0.2",
         "regexp.prototype.flags": "^1.3.0",
         "side-channel": "^1.0.2"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "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==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz",
+      "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==",
       "requires": {
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5"
+        "es-abstract": "^1.18.0-next.1"
       },
       "dependencies": {
         "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "version": "1.18.0-next.1",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
           "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.2",
+            "is-negative-zero": "^2.0.0",
             "is-regex": "^1.1.1",
             "object-inspect": "^1.8.0",
             "object-keys": "^1.1.1",
@@ -5371,24 +4892,25 @@
       }
     },
     "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==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz",
+      "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==",
       "requires": {
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5"
+        "es-abstract": "^1.18.0-next.1"
       },
       "dependencies": {
         "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "version": "1.18.0-next.1",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
           "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.2",
+            "is-negative-zero": "^2.0.0",
             "is-regex": "^1.1.1",
             "object-inspect": "^1.8.0",
             "object-keys": "^1.1.1",
@@ -5652,9 +5174,9 @@
       "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
     },
     "update-notifier": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.0.tgz",
-      "integrity": "sha512-8tqsiVrMv7aZsKNSjqA6DdBLKJpZG1hRpkj1RbOJu1PgyP69OX+EInAnP1EK/ShX5YdPFgwWdk19oquZ0HTM8g==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.1.tgz",
+      "integrity": "sha512-BuVpRdlwxeIOvmc32AGYvO1KVdPlsmqSh8KDDBxS6kDE5VR7R8OMP1d8MdhaVBvxl4H3551k9akXr0Y1iIB2Wg==",
       "requires": {
         "boxen": "^4.2.0",
         "chalk": "^4.1.0",
@@ -5662,20 +5184,33 @@
         "has-yarn": "^2.1.0",
         "import-lazy": "^2.1.0",
         "is-ci": "^2.0.0",
-        "is-installed-globally": "^0.3.1",
+        "is-installed-globally": "^0.3.2",
         "is-npm": "^5.0.0",
         "is-yarn-global": "^0.3.0",
-        "latest-version": "^5.0.0",
-        "pupa": "^2.0.1",
+        "latest-version": "^5.1.0",
+        "pupa": "^2.1.1",
         "semver": "^7.3.2",
         "semver-diff": "^3.1.1",
         "xdg-basedir": "^4.0.0"
       },
       "dependencies": {
+        "escape-goat": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+          "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
+        },
         "import-lazy": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
           "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+        },
+        "pupa": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
+          "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
+          "requires": {
+            "escape-goat": "^2.0.0"
+          }
         }
       }
     },
@@ -5706,9 +5241,9 @@
       "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
     },
     "v8-compile-cache": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
-      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ=="
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+      "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q=="
     },
     "validate-npm-package-license": {
       "version": "3.0.4",
diff --git a/package.json b/package.json
index 4dcaec5..d4714c0 100644
--- a/package.json
+++ b/package.json
@@ -11,10 +11,12 @@
   },
   "lint-staged": {
     "src/**/*.{js,jsx}": [
-      "npx eslint . --fix", "git add"
+      "npx eslint . --fix",
+      "git add"
     ],
     "src/*.{js,jsx}": [
-      "npx eslint . --fix", "git add"
+      "npx eslint . --fix",
+      "git add"
     ]
   },
   "husky": {
@@ -111,6 +113,7 @@
     "destroy": "^1.0.4",
     "doctrine": "^3.0.0",
     "dot-prop": "^6.0.0",
+    "axios": "^0.20.0",
     "dotenv": "^8.2.0",
     "duplexer3": "^0.1.4",
     "ecdsa-sig-formatter": "^1.0.11",
@@ -204,6 +207,7 @@
     "is-yarn-global": "^0.3.0",
     "isarray": "^2.0.5",
     "isexe": "^2.0.0",
+    "form-data": "^3.0.0",
     "joi": "^17.2.1",
     "js-tokens": "^6.0.0",
     "js-yaml": "^3.14.0",
diff --git a/src/index.js b/src/index.js
index d4d2616..7433e88 100644
--- a/src/index.js
+++ b/src/index.js
@@ -8,6 +8,7 @@ const authRoutes = require('./routes/authRoutes');
 const plantRoutes = require('./routes/plantRoutes');
 const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
+const scanner = require('./routes/scanner')
 
 // MongoDB connection
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
@@ -18,19 +19,20 @@ mongoose
   .catch((err) => console.log(err));
 
 // middlewares
+app.use(express.json({ limit: 20*1024*1024}));
 app.use(morgan('dev'));
 app.use(express.urlencoded({ extended: false }));
 app.use(express.json());
 
 // routes
-
-app.use('/auth', authRoutes);
-app.use('/plant', plantRoutes);
-app.use('/topic', topicRoutes);
-app.use('/comment', commentRoutes);
+app.use('/auth',authRoutes);
+app.use('/plant',plantRoutes);
+app.use('/topic',topicRoutes);
+app.use('/comment',commentRoutes);
+app.use('/scanner',scanner);
 
 // starting the server
-app.set('port', process.env.PORT || 3000);
+app.set('port', process.env.PORT || 2000);
 app.listen(app.get('port'), () => {
   console.log(`Server on port ${app.get('port')}`);
 });
diff --git a/src/routes/scanner.js b/src/routes/scanner.js
new file mode 100644
index 0000000..d855945
--- /dev/null
+++ b/src/routes/scanner.js
@@ -0,0 +1,47 @@
+const express = require('express');
+const router = express.Router();
+const fs = require('fs'); // File System | Node.js
+const axios = require('axios'); // HTTP client
+const FormData = require('form-data'); // Readable "multipart/form-data" streams
+const path = require('path');
+require('dotenv').config();
+
+function openFileReadStream(filePath) {
+    return new Promise((resolve,reject)=>{
+        const readStream = fs.createReadStream(filePath);
+        readStream.on('open', () => resolve(readStream));
+        readStream.on('error', (err) => reject(err));
+    });
+}
+
+router.post('/',async(req,res,next) => {
+    try{
+        const apiKey = process.env.PLANT_NET_API_KEY; // api key do plant net
+        const {data,filename,mime,plantType} = req.body;
+        const requireFields = {data,filename,mime,plantType};
+        const erros = [];
+        Object.entries(requireFields).forEach( ([key,value]) => {
+            if(!value) erros.push(`${key} is required`);
+        });
+        if (erros.length) throw erros;
+        const fileFormat = mime.split("/").pop();
+        const filePath = path.join(__dirname, '..', `${filename}.${fileFormat}`);
+
+        fs.writeFileSync(filePath, data, {encoding: 'base64'});
+
+        const form = new FormData();
+        form.append('organs', plantType);
+        const stream = await openFileReadStream(filePath);
+        form.append('images', stream);
+
+        const response = await axios.post(`https://my-api.plantnet.org/v2/identify/all?api-key=${apiKey}`,form, {headers: form.getHeaders()});
+        fs.unlinkSync(filePath);
+        
+        res.send(response.data);
+    }catch(err){
+        if(Array.isArray(err)) res.status(400).send({errors : err});
+        next(err);
+    }
+});
+
+module.exports = router;
\ No newline at end of file

From 105d78598e0fc52fb8a43d80e53f20aba5e2cb30 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Thu, 29 Oct 2020 23:25:14 -0300
Subject: [PATCH 076/147] adding topic search by id and change the response to
 like qnt

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/scanner.js     |  2 +-
 src/routes/topicRoutes.js | 51 ++++++++++++++++++++++-----------------
 2 files changed, 30 insertions(+), 23 deletions(-)

diff --git a/src/routes/scanner.js b/src/routes/scanner.js
index d855945..a8deaf5 100644
--- a/src/routes/scanner.js
+++ b/src/routes/scanner.js
@@ -37,7 +37,7 @@ router.post('/',async(req,res,next) => {
         const response = await axios.post(`https://my-api.plantnet.org/v2/identify/all?api-key=${apiKey}`,form, {headers: form.getHeaders()});
         fs.unlinkSync(filePath);
         
-        res.send(response.data);
+        res.send(response.data.results);
     }catch(err){
         if(Array.isArray(err)) res.status(400).send({errors : err});
         next(err);
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 878f1dd..8b988fe 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -104,32 +104,39 @@ router.get('/list', async (req, res) => {
   }
 });
 
+router.get('/find/:topicId', async (req, res) => {
+    try {
+
+        const topic = await Topic.findById(req.params.topicId).populate(['user']);
+
+        return res.send({ topic });
+
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while listing topics.' + err });
+    }
+});
+
 router.post('/like/:topicId', async (req, res) => {
-  try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { likes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Liked!' });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while liking topic.${err}` });
-  }
+    try {
+
+        const topic = await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
+        res.send(topic)
+        
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while liking topic.' + err });
+    }
 });
 
 router.post('/dislike/:topicId', async (req, res) => {
-  try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Disliked!' });
-  } catch (err) {
-    return res
-      .status(400)
-      .send({ error: `Error while dislikinng topic.${err}` });
-  }
+    try {
+
+        const topic = await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
+        res.send(topic)
+        
+        
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while dislikinng topic.' + err });
+    }
 });
 
 module.exports = router;

From c1541916e48c2819e0abf55945a0f49af712f52c Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Thu, 29 Oct 2020 23:31:38 -0300
Subject: [PATCH 077/147] change port to 3000 at index.js

---
 src/index.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/index.js b/src/index.js
index 7433e88..c00d1a6 100644
--- a/src/index.js
+++ b/src/index.js
@@ -32,7 +32,7 @@ app.use('/comment',commentRoutes);
 app.use('/scanner',scanner);
 
 // starting the server
-app.set('port', process.env.PORT || 2000);
+app.set('port', process.env.PORT || 3000);
 app.listen(app.get('port'), () => {
   console.log(`Server on port ${app.get('port')}`);
 });

From 96d68ccbd7332d27bc6058e7d10066ecd5bbd16f Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Tue, 3 Nov 2020 15:25:04 -0300
Subject: [PATCH 078/147] adding some changes to err treatment

Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
---
 src/index.js              | 10 ++++++++++
 src/routes/plantRoutes.js | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/src/index.js b/src/index.js
index c00d1a6..4e84633 100644
--- a/src/index.js
+++ b/src/index.js
@@ -14,9 +14,19 @@ const scanner = require('./routes/scanner')
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
 // mongodb://mongo:27017/backend => banco de dados da develop
 mongoose
+<<<<<<< HEAD
   .connect('mongodb://localhost:27017/noderest', { useNewUrlParser: true })
   .then(() => console.log('MongoDB Connected'))
   .catch((err) => console.log(err));
+=======
+    .connect(
+        'mongodb://mongo:27017/backend',
+        { useNewUrlParser: true }
+    )
+    .then(() => console.log('MongoDB Connected'))
+    .catch(err => console.log(err));
+
+>>>>>>> 816d47f (adding some changes to err treatment)
 
 // middlewares
 app.use(express.json({ limit: 20*1024*1024}));
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 3985c29..b9df3b7 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -48,6 +48,7 @@ router.post('/register', async (req, res) => {
 
     await plant.save();
 
+<<<<<<< HEAD
     return res.send({ plant });
   } catch (err) {
     return res.send(err);
@@ -63,6 +64,28 @@ router.get('/', async (req, res) => {
   } catch (err) {
     return res.status(400).send({ error: 'Loading plants failed' });
   }
+=======
+        return res.send({ plant });
+    }catch (err){
+        if (err.code == 11000){
+            const {scientificName} = req.body;
+            const plant = await Plant.find({'scientificName':scientificName}).populate('topics');
+            return res.send({plant});
+        }else{
+            return res.send(err);
+        }
+       
+    }
+});
+//Listagem de Todas as plantas
+router.get('/', async (req , res) => {
+    try{
+        const plants = await Plant.find().populate('topics');
+        return res.send({ plants });
+    }catch (err){
+        return res.status(400).send({ error: 'Loading plants failed'});
+    }
+>>>>>>> 816d47f (adding some changes to err treatment)
 });
 
 // Procurando planta por id
@@ -77,6 +100,7 @@ router.get('/:plantId', async (req, res) => {
       .send({ error: 'error when searching for this plant ' });
   }
 });
+<<<<<<< HEAD
 
 // Deletando planta por id
 router.delete('/:plantId', async (req, res) => {
@@ -87,6 +111,17 @@ router.delete('/:plantId', async (req, res) => {
   } catch (err) {
     return res.status(400).send({ error: 'Error when Delete this plant' });
   }
+=======
+//Detando planta por id
+router.delete('/:plantId', async (req , res) => {
+    try{
+        const deleted = await Plant.findByIdAndRemove(req.params.plantId);
+
+        return res.send(deleted);
+    }catch (err){
+        return res.status(400).send({ error: 'Error when Delete this plant'});
+    }
+>>>>>>> 816d47f (adding some changes to err treatment)
 });
 
 // Dando upgrade planta por id

From 171589aaacd1080b20aade40dd5771d7f443fe8b Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Tue, 3 Nov 2020 17:06:02 -0300
Subject: [PATCH 079/147] rebase

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/index.js              |  6 ------
 src/models/Plant.js       | 13 ++++++-------
 src/routes/plantRoutes.js | 31 -------------------------------
 3 files changed, 6 insertions(+), 44 deletions(-)

diff --git a/src/index.js b/src/index.js
index 4e84633..90bdab2 100644
--- a/src/index.js
+++ b/src/index.js
@@ -14,11 +14,6 @@ const scanner = require('./routes/scanner')
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
 // mongodb://mongo:27017/backend => banco de dados da develop
 mongoose
-<<<<<<< HEAD
-  .connect('mongodb://localhost:27017/noderest', { useNewUrlParser: true })
-  .then(() => console.log('MongoDB Connected'))
-  .catch((err) => console.log(err));
-=======
     .connect(
         'mongodb://mongo:27017/backend',
         { useNewUrlParser: true }
@@ -26,7 +21,6 @@ mongoose
     .then(() => console.log('MongoDB Connected'))
     .catch(err => console.log(err));
 
->>>>>>> 816d47f (adding some changes to err treatment)
 
 // middlewares
 app.use(express.json({ limit: 20*1024*1024}));
diff --git a/src/models/Plant.js b/src/models/Plant.js
index 3294204..080b159 100644
--- a/src/models/Plant.js
+++ b/src/models/Plant.js
@@ -16,7 +16,6 @@ const PlantSchema = new mongoose.Schema({
   },
   specie_name: {
     type: String,
-    require: true,
   },
   common_name: {
     type: String,
@@ -24,23 +23,23 @@ const PlantSchema = new mongoose.Schema({
   },
   usage: {
     type: String,
-    require: true,
+
   },
   first_User: {
     type: String,
-    require: true,
+
   },
   collection_count: {
     type: Number,
-    require: true,
+
   },
   extinction: {
     type: Boolean,
-    require: true,
+
   },
   profile_picture: {
     type: String,
-    require: true,
+
   },
   gbifID: {
     type: Number,
@@ -48,7 +47,7 @@ const PlantSchema = new mongoose.Schema({
   },
   stateProvince: {
     type: String,
-    require: true,
+
   },
   topics: [
     {
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index b9df3b7..2adccd7 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -48,23 +48,6 @@ router.post('/register', async (req, res) => {
 
     await plant.save();
 
-<<<<<<< HEAD
-    return res.send({ plant });
-  } catch (err) {
-    return res.send(err);
-  }
-});
-
-// Listagem de Todas as plantas
-router.get('/', async (req, res) => {
-  try {
-    const plants = await Plant.find().populate('topics');
-
-    return res.send({ plants });
-  } catch (err) {
-    return res.status(400).send({ error: 'Loading plants failed' });
-  }
-=======
         return res.send({ plant });
     }catch (err){
         if (err.code == 11000){
@@ -85,7 +68,6 @@ router.get('/', async (req , res) => {
     }catch (err){
         return res.status(400).send({ error: 'Loading plants failed'});
     }
->>>>>>> 816d47f (adding some changes to err treatment)
 });
 
 // Procurando planta por id
@@ -100,18 +82,6 @@ router.get('/:plantId', async (req, res) => {
       .send({ error: 'error when searching for this plant ' });
   }
 });
-<<<<<<< HEAD
-
-// Deletando planta por id
-router.delete('/:plantId', async (req, res) => {
-  try {
-    const deleted = await Plant.findByIdAndRemove(req.params.plantId);
-
-    return res.send(deleted);
-  } catch (err) {
-    return res.status(400).send({ error: 'Error when Delete this plant' });
-  }
-=======
 //Detando planta por id
 router.delete('/:plantId', async (req , res) => {
     try{
@@ -121,7 +91,6 @@ router.delete('/:plantId', async (req , res) => {
     }catch (err){
         return res.status(400).send({ error: 'Error when Delete this plant'});
     }
->>>>>>> 816d47f (adding some changes to err treatment)
 });
 
 // Dando upgrade planta por id

From 2c80cc3c0de091a5c9702f28180e9f6efbfd3162 Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Tue, 3 Nov 2020 17:21:14 -0300
Subject: [PATCH 080/147] Removes unused dependencies on package.json

Co-authored-by: Marcos Filipe <marofelipe@live.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 package-lock.json | 4119 ++++++++++++---------------------------------
 package.json      |  405 +----
 2 files changed, 1113 insertions(+), 3411 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d26bd23..afc7a4d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,73 +8,22 @@
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
       "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-      "requires": {
-        "@babel/highlight": "^7.10.4"
-      }
-    },
-    "@babel/generator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
-      "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.12.1",
-        "jsesc": "^2.5.1",
-        "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
-        },
-        "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-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-get-function-arity": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
-      "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@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/highlight": "^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=="
+      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+      "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==",
+      "dev": true,
       "requires": {
         "@babel/helper-validator-identifier": "^7.10.4",
         "chalk": "^2.0.0",
@@ -85,6 +34,7 @@
           "version": "3.2.1",
           "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
           "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
           "requires": {
             "color-convert": "^1.9.0"
           }
@@ -93,6 +43,7 @@
           "version": "2.4.2",
           "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
           "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
           "requires": {
             "ansi-styles": "^3.2.1",
             "escape-string-regexp": "^1.0.5",
@@ -102,12 +53,14 @@
             "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
             },
             "supports-color": {
               "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"
               }
@@ -118,6 +71,7 @@
           "version": "1.9.3",
           "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz",
           "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+          "dev": true,
           "requires": {
             "color-name": "1.1.3"
           }
@@ -125,102 +79,27 @@
         "color-name": {
           "version": "1.1.3",
           "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+          "dev": true
         },
         "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
         },
         "js-tokens": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-        }
-      }
-    },
-    "@babel/parser": {
-      "version": "7.12.3",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
-      "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
-      "dev": true
-    },
-    "@babel/runtime": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz",
-      "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==",
-      "requires": {
-        "regenerator-runtime": "^0.13.4"
-      }
-    },
-    "@babel/runtime-corejs3": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.1.tgz",
-      "integrity": "sha512-umhPIcMrlBZ2aTWlWjUseW9LjQKxi1dpFlQS8DzsxB//5K+u6GLTC/JliPKHsd5kJVPIU6X/Hy0YvWOYPcMxBw==",
-      "requires": {
-        "core-js-pure": "^3.0.0",
-        "regenerator-runtime": "^0.13.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/traverse": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
-      "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/generator": "^7.12.1",
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-split-export-declaration": "^7.11.0",
-        "@babel/parser": "^7.12.1",
-        "@babel/types": "^7.12.1",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0",
-        "lodash": "^4.17.19"
-      },
-      "dependencies": {
-        "globals": {
-          "version": "11.12.0",
-          "resolved": "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz",
-          "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/types": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-      "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "lodash": "^4.17.19",
-        "to-fast-properties": "^2.0.0"
-      },
-      "dependencies": {
-        "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": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
           "dev": true
         }
       }
     },
     "@eslint/eslintrc": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz",
-      "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==",
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz",
+      "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
@@ -233,54 +112,13 @@
         "lodash": "^4.17.19",
         "minimatch": "^3.0.4",
         "strip-json-comments": "^3.1.1"
-      },
-      "dependencies": {
-        "globals": {
-          "version": "12.4.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.8.1"
-          }
-        },
-        "ignore": {
-          "version": "4.0.6",
-          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-          "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
-        }
-      }
-    },
-    "@hapi/address": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz",
-      "integrity": "sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ==",
-      "requires": {
-        "@hapi/hoek": "^9.0.0"
       }
     },
-    "@hapi/formula": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz",
-      "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A=="
-    },
     "@hapi/hoek": {
       "version": "9.1.0",
       "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz",
       "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw=="
     },
-    "@hapi/pinpoint": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz",
-      "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw=="
-    },
     "@hapi/topo": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
@@ -289,80 +127,56 @@
         "@hapi/hoek": "^9.0.0"
       }
     },
-    "@sindresorhus/is": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz",
-      "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ=="
-    },
-    "@szmarczak/http-timer": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz",
-      "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==",
-      "requires": {
-        "defer-to-connect": "^2.0.0"
-      }
-    },
-    "@types/cacheable-request": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz",
-      "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==",
+    "@sideway/address": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.0.tgz",
+      "integrity": "sha512-wAH/JYRXeIFQRsxerIuLjgUu2Xszam+O5xKeatJ4oudShOOirfmsQ1D6LL54XOU2tizpCYku+s1wmU0SYdpoSA==",
       "requires": {
-        "@types/http-cache-semantics": "*",
-        "@types/keyv": "*",
-        "@types/node": "*",
-        "@types/responselike": "*"
+        "@hapi/hoek": "^9.0.0"
       }
     },
-    "@types/color-name": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
-      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+    "@sideway/formula": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
+      "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg=="
     },
-    "@types/http-cache-semantics": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz",
-      "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A=="
+    "@sideway/pinpoint": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+      "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
     },
-    "@types/json5": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4="
+    "@sindresorhus/is": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
+      "dev": true
     },
-    "@types/keyv": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz",
-      "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==",
+    "@szmarczak/http-timer": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+      "dev": true,
       "requires": {
-        "@types/node": "*"
+        "defer-to-connect": "^1.0.1"
       }
     },
-    "@types/node": {
-      "version": "14.11.10",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.10.tgz",
-      "integrity": "sha512-yV1nWZPlMFpoXyoknm4S56y2nlTAuFYaJuQtYRAOU7xA/FJ9RY0Xm7QOkaYMMmr8ESdHIuUb6oQgR/0+2NqlyA=="
-    },
-    "@types/normalize-package-data": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
-      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA=="
+    "@types/json5": {
+      "version": "0.0.29",
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+      "dev": true
     },
     "@types/parse-json": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
-    },
-    "@types/responselike": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
-      "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
-      "requires": {
-        "@types/node": "*"
-      }
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+      "dev": true
     },
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+      "dev": true
     },
     "accepts": {
       "version": "1.3.7",
@@ -374,109 +188,59 @@
       }
     },
     "acorn": {
-      "version": "8.0.4",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
-      "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ=="
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+      "dev": true
     },
     "acorn-jsx": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-      "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng=="
-    },
-    "add-filename-increment": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/add-filename-increment/-/add-filename-increment-1.0.0.tgz",
-      "integrity": "sha512-pFV8VZX8jxuVMIycKvGZkWF/ihnUubu9lbQVnOnZWp7noVxbKQTNj7zG2y9fXdPcuZ6lAN3Drr517HaivGCjdQ==",
-      "requires": {
-        "strip-filename-increment": "^2.0.1"
-      }
+      "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+      "dev": true
     },
     "aggregate-error": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
       "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "dev": true,
       "requires": {
         "clean-stack": "^2.0.0",
         "indent-string": "^4.0.0"
-      },
-      "dependencies": {
-        "clean-stack": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-          "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
-        }
       }
     },
     "ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "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"
-      },
-      "dependencies": {
-        "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=="
-        }
       }
     },
     "ansi-align": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
       "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
+      "dev": true,
       "requires": {
         "string-width": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
       }
     },
     "ansi-colors": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+      "dev": true
     },
     "ansi-escapes": {
       "version": "4.3.1",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
       "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+      "dev": true,
       "requires": {
         "type-fest": "^0.11.0"
       },
@@ -484,19 +248,22 @@
         "type-fest": {
           "version": "0.11.0",
           "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
-          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ=="
+          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+          "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=="
+      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+      "dev": true
     },
     "ansi-styles": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
       "requires": {
         "color-convert": "^2.0.1"
       }
@@ -505,170 +272,66 @@
       "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"
       }
     },
     "argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
-    },
-    "aria-query": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
-      "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
       "requires": {
-        "@babel/runtime": "^7.10.2",
-        "@babel/runtime-corejs3": "^7.10.2"
+        "sprintf-js": "~1.0.2"
       }
     },
     "array-flatten": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz",
-      "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA=="
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
     },
     "array-includes": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
       "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+      "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.0",
         "is-string": "^1.0.5"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "array.prototype.flat": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
       "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+      "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.0-next.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
-      }
-    },
-    "array.prototype.flatmap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz",
-      "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==",
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0-next.1",
-        "function-bind": "^1.1.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
-    "ast-types-flow": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
-      "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
-    },
     "astral-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
-    },
-    "axe-core": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.0.2.tgz",
-      "integrity": "sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA=="
-    },
-    "axobject-query": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
-      "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "dev": true
     },
-    "babel-eslint": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
-      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
-      "dev": true,
+    "axios": {
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz",
+      "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==",
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.7.0",
-        "@babel/traverse": "^7.7.0",
-        "@babel/types": "^7.7.0",
-        "eslint-visitor-keys": "^1.0.0",
-        "resolve": "^1.12.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
+        "follow-redirects": "^1.10.0"
       }
     },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-    },
-    "base64-js": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
-      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
     },
     "basic-auth": {
       "version": "2.0.1",
@@ -676,34 +339,27 @@
       "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
       "requires": {
         "safe-buffer": "5.1.2"
-      },
-      "dependencies": {
-        "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=="
-        }
       }
     },
     "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=="
+      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+      "dev": true
     },
     "bl": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
-      "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
+      "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
       "requires": {
-        "buffer": "^5.5.0",
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.4.0"
+        "readable-stream": "^2.3.5",
+        "safe-buffer": "^5.1.1"
       }
     },
     "bluebird": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
-      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+      "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
     },
     "body-parser": {
       "version": "1.19.0",
@@ -730,66 +386,10 @@
             "ms": "2.0.0"
           }
         },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
-        },
-        "http-errors": {
-          "version": "1.7.2",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-          "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
-          }
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-        },
         "ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        },
-        "qs": {
-          "version": "6.7.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
-        },
-        "raw-body": {
-          "version": "2.4.0",
-          "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
-          "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
-          "requires": {
-            "bytes": "3.1.0",
-            "http-errors": "1.7.2",
-            "iconv-lite": "0.4.24",
-            "unpipe": "1.0.0"
-          }
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
         }
       }
     },
@@ -797,6 +397,7 @@
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
       "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
+      "dev": true,
       "requires": {
         "ansi-align": "^3.0.0",
         "camelcase": "^5.3.1",
@@ -808,94 +409,64 @@
         "widest-line": "^3.1.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==",
-          "requires": {
-            "@types/color-name": "^1.1.1",
-            "color-convert": "^2.0.1"
-          }
-        },
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
-        },
         "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"
           }
         },
-        "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==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        "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
         },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        "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
         },
-        "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==",
+        "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": {
-            "has-flag": "^4.0.0"
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
           }
-        },
-        "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
         }
       }
     },
     "brace-expansion": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.0.tgz",
-      "integrity": "sha512-A4GHY1GpcTnp+Elcwp1CbKHY6ZQwwVR7QdjZk4fPetEh7oNBfICu+eLvvVvTEMHgC+SGn+XiLAgGo0MnPPBGOg==",
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
       "requires": {
-        "balanced-match": "^1.0.0"
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
     "braces": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
       "requires": {
         "fill-range": "^7.0.1"
       }
     },
     "bson": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/bson/-/bson-4.2.0.tgz",
-      "integrity": "sha512-c3MlJqdROnCRvDr/+MLfaDvQ7CvGI4p1hKX45/fvgzSwKRdOjsfRug1NJJ8ty5mXCNtUdjJEWzoZWcBQxV4TyA==",
-      "requires": {
-        "buffer": "^5.6.0"
-      }
-    },
-    "buffer": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
-      "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4"
-      }
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
+      "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
     },
     "buffer-equal-constant-time": {
       "version": "1.0.1",
@@ -907,83 +478,75 @@
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
       "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
     },
-    "cacheable-lookup": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz",
-      "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w=="
-    },
     "cacheable-request": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz",
-      "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+      "dev": true,
       "requires": {
         "clone-response": "^1.0.2",
         "get-stream": "^5.1.0",
         "http-cache-semantics": "^4.0.0",
-        "keyv": "^4.0.0",
+        "keyv": "^3.0.0",
         "lowercase-keys": "^2.0.0",
         "normalize-url": "^4.1.0",
-        "responselike": "^2.0.0"
+        "responselike": "^1.0.2"
       },
       "dependencies": {
         "get-stream": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
           "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
           "requires": {
             "pump": "^3.0.0"
           }
         },
-        "normalize-url": {
-          "version": "4.5.0",
-          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
-          "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
+        "lowercase-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+          "dev": true
         }
       }
     },
+    "call-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz",
+      "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.0"
+      }
+    },
     "callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true
     },
     "camelcase": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz",
-      "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ=="
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "dev": true
     },
     "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"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
-        },
-        "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==",
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
       }
     },
-    "chardet": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.3.0.tgz",
-      "integrity": "sha512-cyTQGGptIjIT+CMGT5J/0l9c6Fb+565GCFjjeUTKxUO7w3oR+FcNCMEKTn5xtVKaLFmladN7QF68IiQsv5Fbdw=="
-    },
     "chokidar": {
       "version": "3.4.3",
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
       "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+      "dev": true,
       "requires": {
         "anymatch": "~3.1.1",
         "braces": "~3.0.2",
@@ -998,25 +561,26 @@
     "ci-info": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+      "dev": true
     },
     "clean-stack": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.0.tgz",
-      "integrity": "sha512-RHxtgFvXsRQ+1AM7dlozLDY7ssmvUUh0XEnfnyhYgJTO6beNZHBogiaCwGM9Q3rFrUkYxOtsZRC0zAturg5bjg==",
-      "requires": {
-        "escape-string-regexp": "4.0.0"
-      }
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true
     },
     "cli-boxes": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
-      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="
+      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+      "dev": true
     },
     "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"
       }
@@ -1025,78 +589,68 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
       "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+      "dev": true,
       "requires": {
         "slice-ansi": "^3.0.0",
         "string-width": "^4.2.0"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
         "astral-regex": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
-        },
-        "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==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
+          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+          "dev": true
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        "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
         },
         "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=="
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
         },
         "slice-ansi": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
           "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+          "dev": true,
           "requires": {
             "ansi-styles": "^4.0.0",
             "astral-regex": "^2.0.0",
             "is-fullwidth-code-point": "^3.0.0"
           }
+        },
+        "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"
+          }
         }
       }
     },
-    "cli-width": {
-      "version": "3.0.0",
-      "resolved": "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz",
-      "integrity": "sha1-ovSEN6LKqaIkNueUvwceyeYc7fY= sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
-    },
     "clone-response": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
       "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "dev": true,
       "requires": {
         "mimic-response": "^1.0.0"
-      },
-      "dependencies": {
-        "mimic-response": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-          "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
-        }
       }
     },
     "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"
       }
@@ -1104,27 +658,32 @@
     "color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
     },
     "commander": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz",
-      "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA=="
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
+      "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==",
+      "dev": true
     },
     "compare-versions": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
-      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
+      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
+      "dev": true
     },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
     },
     "configstore": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
       "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+      "dev": true,
       "requires": {
         "dot-prop": "^5.2.0",
         "graceful-fs": "^4.1.2",
@@ -1132,41 +691,19 @@
         "unique-string": "^2.0.0",
         "write-file-atomic": "^3.0.0",
         "xdg-basedir": "^4.0.0"
-      },
-      "dependencies": {
-        "dot-prop": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
-          "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
-          "requires": {
-            "is-obj": "^2.0.0"
-          }
-        }
       }
     },
     "confusing-browser-globals": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
-      "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw=="
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz",
+      "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==",
+      "dev": true
     },
     "contains-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-1.0.0.tgz",
-      "integrity": "sha1-NFizMhhWA+ju0Y9RjUoQiIo6vJE=",
-      "requires": {
-        "normalize-path": "^2.1.1",
-        "path-starts-with": "^1.0.0"
-      },
-      "dependencies": {
-        "normalize-path": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-          "requires": {
-            "remove-trailing-separator": "^1.0.1"
-          }
-        }
-      }
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+      "dev": true
     },
     "content-disposition": {
       "version": "0.5.3",
@@ -1174,13 +711,6 @@
       "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
       "requires": {
         "safe-buffer": "5.1.2"
-      },
-      "dependencies": {
-        "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=="
-        }
       }
     },
     "content-type": {
@@ -1189,19 +719,14 @@
       "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
     },
     "cookie": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
-      "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
     },
     "cookie-signature": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz",
-      "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A=="
-    },
-    "core-js-pure": {
-      "version": "3.6.5",
-      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz",
-      "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA=="
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
     },
     "core-util-is": {
       "version": "1.0.2",
@@ -1212,6 +737,7 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
       "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+      "dev": true,
       "requires": {
         "@types/parse-json": "^4.0.0",
         "import-fresh": "^3.2.1",
@@ -1224,6 +750,7 @@
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
           "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+          "dev": true,
           "requires": {
             "@babel/code-frame": "^7.0.0",
             "error-ex": "^1.3.1",
@@ -1234,7 +761,8 @@
         "path-type": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+          "dev": true
         }
       }
     },
@@ -1242,6 +770,7 @@
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
       "requires": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
@@ -1249,65 +778,58 @@
       }
     },
     "crypto-random-string": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.3.0.tgz",
-      "integrity": "sha512-teWAwfMb1d6brahYyKqcBEb5Yp8PJPvPOdOonXDnvaKOTmKDFNVE8E3Y2XQuzjNV/3XMwHbrX9fHWvrhRKt4Gg==",
-      "requires": {
-        "type-fest": "^0.8.1"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
-        }
-      }
-    },
-    "damerau-levenshtein": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
-      "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+      "dev": true
     },
     "debug": {
       "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.2"
       }
     },
     "decompress-response": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "dev": true,
       "requires": {
-        "mimic-response": "^3.1.0"
+        "mimic-response": "^1.0.0"
       }
     },
     "dedent": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw="
+      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+      "dev": true
     },
     "deep-extend": {
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "dev": true
     },
     "deep-is": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+      "dev": true
     },
     "defer-to-connect": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz",
-      "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg=="
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
+      "dev": true
     },
     "define-properties": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "dev": true,
       "requires": {
         "object-keys": "^1.0.12"
       }
@@ -1318,9 +840,9 @@
       "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
     },
     "depd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
-      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
     },
     "destroy": {
       "version": "1.0.4",
@@ -1331,14 +853,16 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
       "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
       "requires": {
         "esutils": "^2.0.2"
       }
     },
     "dot-prop": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.0.tgz",
-      "integrity": "sha512-xCbB8IN3IT+tdgoEPOnJmYTNJDrygGFOmiQEiVa5eAD+JEB1vTgMNhVGRnN5Eex/6amck7cdcrixb1qN9Go+GQ==",
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+      "dev": true,
       "requires": {
         "is-obj": "^2.0.0"
       }
@@ -1351,7 +875,8 @@
     "duplexer3": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+      "dev": true
     },
     "ecdsa-sig-formatter": {
       "version": "1.0.11",
@@ -1359,13 +884,6 @@
       "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
       "requires": {
         "safe-buffer": "^5.0.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
       }
     },
     "ee-first": {
@@ -1374,9 +892,10 @@
       "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
     },
     "emoji-regex": {
-      "version": "9.1.1",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.1.1.tgz",
-      "integrity": "sha512-AaWyDiNO9rbtMIcGl7tdxMcNu8SOLaDLxmQEFT5JhgKufOJzPPkYmgN2QwqTgw4doWMZZQttC6sUWVQjb+1VdA=="
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "dev": true
     },
     "encodeurl": {
       "version": "1.0.2",
@@ -1387,6 +906,7 @@
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
       "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
       "requires": {
         "once": "^1.4.0"
       }
@@ -1395,6 +915,7 @@
       "version": "2.3.6",
       "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
       "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+      "dev": true,
       "requires": {
         "ansi-colors": "^4.1.1"
       }
@@ -1403,6 +924,7 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
       "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
       "requires": {
         "is-arrayish": "^0.2.1"
       },
@@ -1410,7 +932,8 @@
         "is-arrayish": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-          "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+          "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+          "dev": true
         }
       }
     },
@@ -1418,6 +941,7 @@
       "version": "1.17.7",
       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
       "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+      "dev": true,
       "requires": {
         "es-to-primitive": "^1.2.1",
         "function-bind": "^1.1.1",
@@ -1436,6 +960,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",
@@ -1443,9 +968,10 @@
       }
     },
     "escape-goat": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz",
-      "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw=="
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
+      "dev": true
     },
     "escape-html": {
       "version": "1.0.3",
@@ -1453,18 +979,19 @@
       "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
     },
     "escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+      "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
     },
     "eslint": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz",
-      "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz",
+      "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
-        "@eslint/eslintrc": "^0.1.3",
+        "@eslint/eslintrc": "^0.2.1",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
@@ -1500,133 +1027,6 @@
         "table": "^5.2.3",
         "text-table": "^0.2.0",
         "v8-compile-cache": "^2.0.3"
-      },
-      "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==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "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"
-          }
-        },
-        "astral-regex": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
-          "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
-          "dev": true
-        },
-        "color-convert": {
-          "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"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true
-        },
-        "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
-        },
-        "globals": {
-          "version": "12.4.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.8.1"
-          }
-        },
-        "ignore": {
-          "version": "4.0.6",
-          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "slice-ansi": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
-          "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.0",
-            "astral-regex": "^1.0.0",
-            "is-fullwidth-code-point": "^2.0.0"
-          }
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          },
-          "dependencies": {
-            "strip-ansi": {
-              "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": "^4.1.0"
-              }
-            }
-          }
-        },
-        "table": {
-          "version": "5.4.6",
-          "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
-          "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.10.2",
-            "lodash": "^4.17.14",
-            "slice-ansi": "^2.1.0",
-            "string-width": "^3.0.0"
-          }
-        },
-        "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
-        }
-      }
-    },
-    "eslint-config-airbnb": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz",
-      "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==",
-      "dev": true,
-      "requires": {
-        "eslint-config-airbnb-base": "^14.2.0",
-        "object.assign": "^4.1.0",
-        "object.entries": "^1.1.2"
       }
     },
     "eslint-config-airbnb-base": {
@@ -1640,15 +1040,6 @@
         "object.entries": "^1.1.2"
       }
     },
-    "eslint-config-prettier": {
-      "version": "6.13.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.13.0.tgz",
-      "integrity": "sha512-LcT0i0LSmnzqK2t764pyIt7kKH2AuuqKRTtJTdddWxOiUja9HdG5GXBVF2gmCTvVYWVsTu8J2MhJLVGRh+pj8w==",
-      "dev": true,
-      "requires": {
-        "get-stdin": "^6.0.0"
-      }
-    },
     "eslint-import-resolver-node": {
       "version": "0.3.4",
       "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
@@ -1681,366 +1072,76 @@
       "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
       "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
       "dev": true,
-      "requires": {
-        "debug": "^2.6.9",
-        "pkg-dir": "^2.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "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"
-          }
-        },
-        "locate-path": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-          "dev": true,
-          "requires": {
-            "p-locate": "^2.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
-        "p-limit": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-          "dev": true,
-          "requires": {
-            "p-try": "^1.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-          "dev": true,
-          "requires": {
-            "p-limit": "^1.1.0"
-          }
-        },
-        "p-try": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-          "dev": true
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        },
-        "pkg-dir": {
-          "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz",
-          "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-          "dev": true,
-          "requires": {
-            "find-up": "^2.1.0"
-          },
-          "dependencies": {
-            "find-up": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-              "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-              "dev": true,
-              "requires": {
-                "locate-path": "^2.0.0"
-              }
-            }
-          }
-        }
-      }
-    },
-    "eslint-plugin-import": {
-      "version": "2.22.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
-      "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
-      "dev": true,
-      "requires": {
-        "array-includes": "^3.1.1",
-        "array.prototype.flat": "^1.2.3",
-        "contains-path": "^0.1.0",
-        "debug": "^2.6.9",
-        "doctrine": "1.5.0",
-        "eslint-import-resolver-node": "^0.3.4",
-        "eslint-module-utils": "^2.6.0",
-        "has": "^1.0.3",
-        "minimatch": "^3.0.4",
-        "object.values": "^1.1.1",
-        "read-pkg-up": "^2.0.0",
-        "resolve": "^1.17.0",
-        "tsconfig-paths": "^3.9.0"
-      },
-      "dependencies": {
-        "contains-path": {
-          "version": "0.1.0",
-          "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
-          "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
-          "dev": true
-        },
-        "debug": {
-          "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"
-          }
-        },
-        "doctrine": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
-          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "isarray": "^1.0.0"
-          }
-        },
-        "find-up": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-          "dev": true,
-          "requires": {
-            "locate-path": "^2.0.0"
-          }
-        },
-        "hosted-git-info": {
-          "version": "2.8.8",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
-          "dev": true
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-          "dev": true
-        },
-        "load-json-file": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
-          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "parse-json": "^2.2.0",
-            "pify": "^2.0.0",
-            "strip-bom": "^3.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-          "dev": true,
-          "requires": {
-            "p-locate": "^2.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
-        "normalize-package-data": {
-          "version": "2.5.0",
-          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-          "dev": true,
-          "requires": {
-            "hosted-git-info": "^2.1.4",
-            "resolve": "^1.10.0",
-            "semver": "2 || 3 || 4 || 5",
-            "validate-npm-package-license": "^3.0.1"
-          }
-        },
-        "p-limit": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-          "dev": true,
-          "requires": {
-            "p-try": "^1.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-          "dev": true,
-          "requires": {
-            "p-limit": "^1.1.0"
-          }
-        },
-        "p-try": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-          "dev": true
-        },
-        "parse-json": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-          "dev": true,
-          "requires": {
-            "error-ex": "^1.2.0"
-          }
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        },
-        "path-type": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
-          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
-          "dev": true,
-          "requires": {
-            "pify": "^2.0.0"
-          }
-        },
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        },
-        "read-pkg": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
-          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
-          "dev": true,
-          "requires": {
-            "load-json-file": "^2.0.0",
-            "normalize-package-data": "^2.3.2",
-            "path-type": "^2.0.0"
-          }
-        },
-        "read-pkg-up": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
-          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
-          "dev": true,
-          "requires": {
-            "find-up": "^2.0.0",
-            "read-pkg": "^2.0.0"
-          }
-        },
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        },
-        "strip-bom": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
-          "dev": true
-        }
-      }
-    },
-    "eslint-plugin-jsx-a11y": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz",
-      "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==",
-      "dev": true,
-      "requires": {
-        "@babel/runtime": "^7.10.2",
-        "aria-query": "^4.2.2",
-        "array-includes": "^3.1.1",
-        "ast-types-flow": "^0.0.7",
-        "axe-core": "^3.5.4",
-        "axobject-query": "^2.1.2",
-        "damerau-levenshtein": "^1.0.6",
-        "emoji-regex": "^9.0.0",
-        "has": "^1.0.3",
-        "jsx-ast-utils": "^2.4.1",
-        "language-tags": "^1.0.5"
+      "requires": {
+        "debug": "^2.6.9",
+        "pkg-dir": "^2.0.0"
       },
       "dependencies": {
-        "axe-core": {
-          "version": "3.5.5",
-          "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz",
-          "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==",
-          "dev": true
-        },
-        "jsx-ast-utils": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
-          "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==",
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
-            "array-includes": "^3.1.1",
-            "object.assign": "^4.1.0"
+            "ms": "2.0.0"
           }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
         }
       }
     },
-    "eslint-plugin-prettier": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz",
-      "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==",
-      "dev": true,
-      "requires": {
-        "prettier-linter-helpers": "^1.0.0"
-      }
-    },
-    "eslint-plugin-react": {
-      "version": "7.21.5",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz",
-      "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==",
+    "eslint-plugin-import": {
+      "version": "2.22.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
+      "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
       "dev": true,
       "requires": {
         "array-includes": "^3.1.1",
-        "array.prototype.flatmap": "^1.2.3",
-        "doctrine": "^2.1.0",
+        "array.prototype.flat": "^1.2.3",
+        "contains-path": "^0.1.0",
+        "debug": "^2.6.9",
+        "doctrine": "1.5.0",
+        "eslint-import-resolver-node": "^0.3.4",
+        "eslint-module-utils": "^2.6.0",
         "has": "^1.0.3",
-        "jsx-ast-utils": "^2.4.1 || ^3.0.0",
-        "object.entries": "^1.1.2",
-        "object.fromentries": "^2.0.2",
+        "minimatch": "^3.0.4",
         "object.values": "^1.1.1",
-        "prop-types": "^15.7.2",
-        "resolve": "^1.18.1",
-        "string.prototype.matchall": "^4.0.2"
+        "read-pkg-up": "^2.0.0",
+        "resolve": "^1.17.0",
+        "tsconfig-paths": "^3.9.0"
       },
       "dependencies": {
+        "debug": {
+          "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"
+          }
+        },
         "doctrine": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
           "dev": true,
           "requires": {
-            "esutils": "^2.0.2"
+            "esutils": "^2.0.2",
+            "isarray": "^1.0.0"
           }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
         }
       }
     },
-    "eslint-plugin-react-hooks": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.2.tgz",
-      "integrity": "sha512-ykUeqkGyUGgwTtk78C0o8UG2fzwmgJ0qxBGPp2WqRKsTwcLuVf01kTDRAtOsd4u6whX2XOC8749n2vPydP82fg==",
-      "dev": true
-    },
     "eslint-scope": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -2049,14 +1150,6 @@
       "requires": {
         "esrecurse": "^4.3.0",
         "estraverse": "^4.1.1"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.3.0",
-          "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz",
-          "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-          "dev": true
-        }
       }
     },
     "eslint-utils": {
@@ -2086,33 +1179,32 @@
       "version": "7.3.0",
       "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
       "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+      "dev": true,
       "requires": {
         "acorn": "^7.4.0",
         "acorn-jsx": "^5.2.0",
         "eslint-visitor-keys": "^1.3.0"
       },
       "dependencies": {
-        "acorn": {
-          "version": "7.4.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
-        },
         "eslint-visitor-keys": {
           "version": "1.3.0",
           "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
         }
       }
     },
     "esprima": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
     },
     "esquery": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
       "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+      "dev": true,
       "requires": {
         "estraverse": "^5.1.0"
       },
@@ -2120,7 +1212,8 @@
         "estraverse": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+          "dev": true
         }
       }
     },
@@ -2128,6 +1221,7 @@
       "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": "^5.2.0"
       },
@@ -2135,19 +1229,22 @@
         "estraverse": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+          "dev": true
         }
       }
     },
     "estraverse": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-      "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
     },
     "esutils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
     },
     "etag": {
       "version": "1.8.1",
@@ -2155,9 +1252,10 @@
       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
     },
     "execa": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
-      "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+      "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+      "dev": true,
       "requires": {
         "cross-spawn": "^7.0.0",
         "get-stream": "^5.0.0",
@@ -2174,14 +1272,10 @@
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
           "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
           "requires": {
             "pump": "^3.0.0"
           }
-        },
-        "human-signals": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
-          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
         }
       }
     },
@@ -2222,21 +1316,6 @@
         "vary": "~1.1.2"
       },
       "dependencies": {
-        "array-flatten": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
-        },
-        "cookie": {
-          "version": "0.4.0",
-          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
-          "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
-        },
-        "cookie-signature": {
-          "version": "1.0.6",
-          "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-          "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
-        },
         "debug": {
           "version": "2.6.9",
           "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -2245,124 +1324,45 @@
             "ms": "2.0.0"
           }
         },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
-        },
         "ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        },
-        "path-to-regexp": {
-          "version": "0.1.7",
-          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-          "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
-        },
-        "qs": {
-          "version": "6.7.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
-        },
-        "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=="
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
-        }
-      }
-    },
-    "external-editor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz",
-      "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
-      "requires": {
-        "chardet": "^0.7.0",
-        "iconv-lite": "^0.4.24",
-        "tmp": "^0.0.33"
-      },
-      "dependencies": {
-        "chardet": {
-          "version": "0.7.0",
-          "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
-          "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "tmp": {
-          "version": "0.0.33",
-          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-          "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
-          "requires": {
-            "os-tmpdir": "~1.0.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=="
-    },
-    "fast-diff": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
-      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+      "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=="
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
     },
     "fast-levenshtein": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz",
-      "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==",
-      "requires": {
-        "fastest-levenshtein": "^1.0.7"
-      }
-    },
-    "fastest-levenshtein": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
-      "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow=="
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
     },
     "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"
-      },
-      "dependencies": {
-        "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="
-        }
       }
     },
     "file-entry-cache": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
       "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+      "dev": true,
       "requires": {
         "flat-cache": "^2.0.1"
       }
@@ -2371,6 +1371,7 @@
       "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": {
         "to-regex-range": "^5.0.1"
       }
@@ -2401,27 +1402,23 @@
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
         }
       }
     },
     "find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "dev": true,
       "requires": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
+        "locate-path": "^2.0.0"
       }
     },
     "find-versions": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
       "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+      "dev": true,
       "requires": {
         "semver-regex": "^2.0.0"
       },
@@ -2429,7 +1426,8 @@
         "semver-regex": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-          "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+          "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
+          "dev": true
         }
       }
     },
@@ -2437,47 +1435,23 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
       "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+      "dev": true,
       "requires": {
         "flatted": "^2.0.0",
         "rimraf": "2.6.3",
         "write": "1.0.3"
-      },
-      "dependencies": {
-        "flatted": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
-          "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
-        },
-        "mkdirp": {
-          "version": "0.5.5",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-          "requires": {
-            "minimist": "^1.2.5"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "write": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
-          "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
-          "requires": {
-            "mkdirp": "^0.5.1"
-          }
-        }
       }
     },
     "flatted": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
-      "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA=="
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+      "dev": true
+    },
+    "follow-redirects": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
+      "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA=="
     },
     "forwarded": {
       "version": "0.1.2",
@@ -2492,44 +1466,59 @@
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
     },
     "fsevents": {
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
       "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+      "dev": true,
       "optional": true
     },
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
     },
     "functional-red-black-tree": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
+    },
+    "get-intrinsic": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz",
+      "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
     },
     "get-own-enumerable-property-symbols": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
-      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
-    },
-    "get-stdin": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
-      "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
       "dev": true
     },
     "get-stream": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
-      "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg=="
+      "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"
+      }
     },
     "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",
@@ -2543,6 +1532,7 @@
       "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"
       }
@@ -2551,52 +1541,50 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
       "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
+      "dev": true,
       "requires": {
         "ini": "^1.3.5"
       }
     },
     "globals": {
-      "version": "13.2.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.2.0.tgz",
-      "integrity": "sha512-OjvFbGDlR7aIsLqFrraxoqIP3bb+wgp+Aarel5S56lwS3se4uUrwKkChnv1MqsMIv/Opexbmu7qCfHL9T0mBEg==",
+      "version": "12.4.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+      "dev": true,
       "requires": {
         "type-fest": "^0.8.1"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
-        }
       }
     },
     "got": {
-      "version": "11.7.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-11.7.0.tgz",
-      "integrity": "sha512-7en2XwH2MEqOsrK0xaKhbWibBoZqy+f1RSUoIeF1BLcnf+pyQdDsljWMfmOh+QKJwuvDIiKx38GtPh5wFdGGjg==",
-      "requires": {
-        "@sindresorhus/is": "^3.1.1",
-        "@szmarczak/http-timer": "^4.0.5",
-        "@types/cacheable-request": "^6.0.1",
-        "@types/responselike": "^1.0.0",
-        "cacheable-lookup": "^5.0.3",
-        "cacheable-request": "^7.0.1",
-        "decompress-response": "^6.0.0",
-        "http2-wrapper": "^1.0.0-beta.5.2",
-        "lowercase-keys": "^2.0.0",
-        "p-cancelable": "^2.0.0",
-        "responselike": "^2.0.0"
+      "version": "9.6.0",
+      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+      "dev": true,
+      "requires": {
+        "@sindresorhus/is": "^0.14.0",
+        "@szmarczak/http-timer": "^1.1.2",
+        "cacheable-request": "^6.0.0",
+        "decompress-response": "^3.3.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^4.1.0",
+        "lowercase-keys": "^1.0.1",
+        "mimic-response": "^1.0.1",
+        "p-cancelable": "^1.0.0",
+        "to-readable-stream": "^1.0.0",
+        "url-parse-lax": "^3.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=="
+      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+      "dev": true
     },
     "has": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
       "requires": {
         "function-bind": "^1.1.1"
       }
@@ -2604,68 +1592,57 @@
     "has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true
     },
     "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
     },
     "has-yarn": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
-      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
+      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
+      "dev": true
     },
     "hosted-git-info": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
-      "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
-      "requires": {
-        "lru-cache": "^6.0.0"
-      }
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+      "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+      "dev": true
     },
     "http-cache-semantics": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+      "dev": true
     },
     "http-errors": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz",
-      "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==",
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
       "requires": {
         "depd": "~1.1.2",
-        "inherits": "2.0.4",
-        "setprototypeof": "1.2.0",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.1",
         "statuses": ">= 1.5.0 < 2",
         "toidentifier": "1.0.0"
       },
       "dependencies": {
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
         }
       }
     },
-    "http2-wrapper": {
-      "version": "1.0.0-beta.5.2",
-      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz",
-      "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==",
-      "requires": {
-        "quick-lru": "^5.1.1",
-        "resolve-alpn": "^1.0.0"
-      }
-    },
     "human-signals": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "dev": true
     },
     "husky": {
       "version": "4.3.0",
@@ -2795,32 +1772,30 @@
       }
     },
     "iconv-lite": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
-      "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "requires": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
+        "safer-buffer": ">= 2.1.2 < 3"
       }
     },
-    "ieee754": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
-      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
-    },
     "ignore": {
-      "version": "5.1.8",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+      "dev": true
     },
     "ignore-by-default": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.0.0.tgz",
-      "integrity": "sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA=="
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+      "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
+      "dev": true
     },
     "import-fresh": {
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
       "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+      "dev": true,
       "requires": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
@@ -2830,6 +1805,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
           "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+          "dev": true,
           "requires": {
             "callsites": "^3.0.0"
           }
@@ -2837,29 +1813,34 @@
         "resolve-from": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+          "dev": true
         }
       }
     },
     "import-lazy": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
-      "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+      "dev": true
     },
     "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",
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true
     },
     "inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -2873,72 +1854,19 @@
     "ini": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
-    },
-    "inquirer": {
-      "version": "7.3.3",
-      "resolved": "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz",
-      "integrity": "sha1-BNF2sq8Er8FXqD/XwQDpjuCq0AM= sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
-      "requires": {
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-width": "^3.0.0",
-        "external-editor": "^3.0.3",
-        "figures": "^3.0.0",
-        "lodash": "^4.17.19",
-        "mute-stream": "0.0.8",
-        "run-async": "^2.4.0",
-        "rxjs": "^6.6.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "through": "^2.3.6"
-      }
-    },
-    "internal-slot": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz",
-      "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==",
-      "requires": {
-        "es-abstract": "^1.17.0-next.1",
-        "has": "^1.0.3",
-        "side-channel": "^1.0.2"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
-      }
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+      "dev": true
     },
     "ipaddr.js": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.0.tgz",
-      "integrity": "sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w=="
-    },
-    "is-arrayish": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
-      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
     },
     "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"
       }
@@ -2946,12 +1874,14 @@
     "is-callable": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
-      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
+      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+      "dev": true
     },
     "is-ci": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
       "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "dev": true,
       "requires": {
         "ci-info": "^2.0.0"
       }
@@ -2960,6 +1890,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz",
       "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==",
+      "dev": true,
       "requires": {
         "has": "^1.0.3"
       }
@@ -2967,22 +1898,26 @@
     "is-date-object": {
       "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=="
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+      "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": "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=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "dev": true
     },
     "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"
       }
@@ -2991,6 +1926,7 @@
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
       "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
+      "dev": true,
       "requires": {
         "global-dirs": "^2.0.1",
         "is-path-inside": "^3.0.1"
@@ -2999,55 +1935,65 @@
     "is-negative-zero": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
-      "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
+      "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
+      "dev": true
     },
     "is-npm": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
-      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
+      "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
+      "dev": true
     },
     "is-number": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true
     },
     "is-obj": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+      "dev": true
     },
     "is-path-inside": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
-      "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg=="
+      "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
+      "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-regexp": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
-      "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA=="
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
+      "dev": true
     },
     "is-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
-      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+      "dev": true
     },
     "is-string": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
-      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
+      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+      "dev": true
     },
     "is-symbol": {
       "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.1"
       }
@@ -3055,95 +2001,79 @@
     "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-yarn-global": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
-      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
+      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
+      "dev": true
     },
     "isarray": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
-      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
     },
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
     },
     "joi": {
-      "version": "17.2.1",
-      "resolved": "https://registry.npmjs.org/joi/-/joi-17.2.1.tgz",
-      "integrity": "sha512-YT3/4Ln+5YRpacdmfEfrrKh50/kkgX3LgBltjqnlMPIYiZ4hxXZuVJcxmsvxsdeHg9soZfE3qXxHC2tMpCCBOA==",
+      "version": "17.3.0",
+      "resolved": "https://registry.npmjs.org/joi/-/joi-17.3.0.tgz",
+      "integrity": "sha512-Qh5gdU6niuYbUIUV5ejbsMiiFmBdw8Kcp8Buj2JntszCkCfxJ9Cz76OtHxOZMPXrt5810iDIXs+n1nNVoquHgg==",
       "requires": {
-        "@hapi/address": "^4.1.0",
-        "@hapi/formula": "^2.0.0",
         "@hapi/hoek": "^9.0.0",
-        "@hapi/pinpoint": "^2.0.0",
-        "@hapi/topo": "^5.0.0"
+        "@hapi/topo": "^5.0.0",
+        "@sideway/address": "^4.1.0",
+        "@sideway/formula": "^3.0.0",
+        "@sideway/pinpoint": "^2.0.0"
       }
     },
-    "js-tokens": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-6.0.0.tgz",
-      "integrity": "sha512-QJUTLeNZNFl/w4MmhHztb1I1UzV42KV/L/zNwNVGlCNc+zl8g01Nve0hPDGU+j2N7ctFZdLot49lUSi78L7WGg=="
-    },
     "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"
-      },
-      "dependencies": {
-        "argparse": {
-          "version": "1.0.10",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
-        },
-        "sprintf-js": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-          "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
-        }
       }
     },
-    "jsesc": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.1.tgz",
-      "integrity": "sha512-w+MMxnByppM4jwskitZotEtvtO3a2C7WOz31NxJToGisHuysCAQQU7umb/pA/6soPFe8LGjXFEFbuPuLEPm7Ag=="
-    },
     "json-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+      "dev": true
     },
     "json-parse-even-better-errors": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
     },
     "json-schema-traverse": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.5.0.tgz",
-      "integrity": "sha512-x+TRJIQFskrNnFKE2Viz9FCSjK1vIh+H/uaBiOYszh/IcZmAFneQ35H4osWDJp1NPXccuV2I0RMXmi2ZS6Kqcg=="
+      "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
     },
     "json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "dev": true
     },
     "json5": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
-      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+      "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.5"
+        "minimist": "^1.2.0"
       }
     },
     "jsonwebtoken": {
@@ -3163,30 +2093,6 @@
         "semver": "^5.6.0"
       },
       "dependencies": {
-        "jwa": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
-          "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
-          "requires": {
-            "buffer-equal-constant-time": "1.0.1",
-            "ecdsa-sig-formatter": "1.0.11",
-            "safe-buffer": "^5.0.1"
-          }
-        },
-        "jws": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
-          "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
-          "requires": {
-            "jwa": "^1.4.1",
-            "safe-buffer": "^5.0.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": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -3194,19 +2100,10 @@
         }
       }
     },
-    "jsx-ast-utils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz",
-      "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==",
-      "requires": {
-        "array-includes": "^3.1.1",
-        "object.assign": "^4.1.1"
-      }
-    },
     "jwa": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
-      "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+      "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
       "requires": {
         "buffer-equal-constant-time": "1.0.1",
         "ecdsa-sig-formatter": "1.0.11",
@@ -3214,11 +2111,11 @@
       }
     },
     "jws": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
-      "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
       "requires": {
-        "jwa": "^2.0.0",
+        "jwa": "^1.4.1",
         "safe-buffer": "^5.0.1"
       }
     },
@@ -3228,30 +2125,19 @@
       "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
     },
     "keyv": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz",
-      "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==",
-      "requires": {
-        "json-buffer": "3.0.1"
-      }
-    },
-    "language-subtag-registry": {
-      "version": "0.3.20",
-      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz",
-      "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg=="
-    },
-    "language-tags": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
-      "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+      "dev": true,
       "requires": {
-        "language-subtag-registry": "~0.3.2"
+        "json-buffer": "3.0.0"
       }
     },
     "latest-version": {
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
       "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+      "dev": true,
       "requires": {
         "package-json": "^6.3.0"
       }
@@ -3260,6 +2146,7 @@
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
       "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
       "requires": {
         "prelude-ls": "^1.2.1",
         "type-check": "~0.4.0"
@@ -3268,117 +2155,37 @@
     "lines-and-columns": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
-      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
     },
     "lint-staged": {
-      "version": "10.4.2",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.4.2.tgz",
-      "integrity": "sha512-OLCA9K1hS+Sl179SO6kX0JtnsaKj/MZalEhUj5yAgXsb63qPI/Gfn6Ua1KuZdbfkZNEu3/n5C/obYCu70IMt9g==",
+      "version": "10.5.1",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.1.tgz",
+      "integrity": "sha512-fTkTGFtwFIJJzn/PbUO3RXyEBHIhbfYBE7+rJyLcOXabViaO/h6OslgeK6zpeUtzkDrzkgyAYDTLAwx6JzDTHw==",
       "dev": true,
       "requires": {
         "chalk": "^4.1.0",
         "cli-truncate": "^2.1.0",
-        "commander": "^6.0.0",
+        "commander": "^6.2.0",
         "cosmiconfig": "^7.0.0",
-        "debug": "^4.1.1",
+        "debug": "^4.2.0",
         "dedent": "^0.7.0",
         "enquirer": "^2.3.6",
-        "execa": "^4.0.3",
-        "listr2": "^2.6.0",
+        "execa": "^4.1.0",
+        "listr2": "^3.2.2",
         "log-symbols": "^4.0.0",
         "micromatch": "^4.0.2",
         "normalize-path": "^3.0.0",
         "please-upgrade-node": "^3.2.0",
         "string-argv": "0.3.1",
         "stringify-object": "^3.3.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "debug": {
-          "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.2"
-          }
-        },
-        "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
-        },
-        "listr2": {
-          "version": "2.6.2",
-          "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz",
-          "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==",
-          "dev": true,
-          "requires": {
-            "chalk": "^4.1.0",
-            "cli-truncate": "^2.1.0",
-            "figures": "^3.2.0",
-            "indent-string": "^4.0.0",
-            "log-update": "^4.0.0",
-            "p-map": "^4.0.0",
-            "rxjs": "^6.6.2",
-            "through": "^2.3.8"
-          }
-        },
-        "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
-        },
-        "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"
-          }
-        }
       }
     },
     "listr2": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.1.1.tgz",
-      "integrity": "sha512-5HjYFP0FpG2dOuSAth2vQ172rWqI78746itLIvgg0KjHMAyW8CVNc9wzBzEo4/5UYfNbmT28u0J29NoA3W0z+Q==",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.2.tgz",
+      "integrity": "sha512-AajqcZEUikF2ioph6PfH3dIuxJclhr3i3kHgTOP0xeXdWQohrvJAAmqVcV43/GI987HFY/vzT73jYXoa4esDHg==",
+      "dev": true,
       "requires": {
         "chalk": "^4.1.0",
         "cli-truncate": "^2.1.0",
@@ -3391,35 +2198,32 @@
       }
     },
     "load-json-file": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz",
-      "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "dev": true,
       "requires": {
-        "graceful-fs": "^4.1.15",
-        "parse-json": "^5.0.0",
-        "strip-bom": "^4.0.0",
-        "type-fest": "^0.6.0"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
-        }
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "strip-bom": "^3.0.0"
       }
     },
     "locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "dev": true,
       "requires": {
-        "p-locate": "^5.0.0"
+        "p-locate": "^2.0.0",
+        "path-exists": "^3.0.0"
       }
     },
     "lodash": {
       "version": "4.17.20",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+      "dev": true
     },
     "lodash.includes": {
       "version": "4.3.0",
@@ -3460,59 +2264,16 @@
       "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": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "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==",
-          "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==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
-        },
-        "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==",
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
       }
     },
     "log-update": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
       "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+      "dev": true,
       "requires": {
         "ansi-escapes": "^4.3.0",
         "cli-cursor": "^3.1.0",
@@ -3520,91 +2281,42 @@
         "wrap-ansi": "^6.2.0"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
         "astral-regex": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
-        },
-        "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==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+          "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=="
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
         },
         "slice-ansi": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
           "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+          "dev": true,
           "requires": {
             "ansi-styles": "^4.0.0",
             "astral-regex": "^2.0.0",
             "is-fullwidth-code-point": "^3.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==",
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0"
-          }
-        }
-      }
-    },
-    "loose-envify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
-      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-      "requires": {
-        "js-tokens": "^3.0.0 || ^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=="
         }
       }
     },
     "lowercase-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
-    },
-    "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==",
-      "requires": {
-        "yallist": "^4.0.0"
-      }
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+      "dev": true
     },
     "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"
       },
@@ -3612,19 +2324,21 @@
         "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
         }
       }
     },
     "media-typer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
-      "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
     },
     "memory-pager": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
-      "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
+      "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+      "optional": true
     },
     "merge-descriptors": {
       "version": "1.0.1",
@@ -3634,7 +2348,8 @@
     "merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
     },
     "methods": {
       "version": "1.1.2",
@@ -3645,20 +2360,21 @@
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
       "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+      "dev": true,
       "requires": {
         "braces": "^3.0.1",
         "picomatch": "^2.0.5"
       }
     },
     "mime": {
-      "version": "2.4.6",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
-      "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
     },
     "mime-db": {
-      "version": "1.45.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
-      "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
+      "version": "1.44.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
     },
     "mime-types": {
       "version": "2.1.27",
@@ -3666,53 +2382,43 @@
       "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
       "requires": {
         "mime-db": "1.44.0"
-      },
-      "dependencies": {
-        "mime-db": {
-          "version": "1.44.0",
-          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-          "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
-        }
       }
     },
     "mimic-fn": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz",
-      "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true
     },
     "mimic-response": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+      "dev": true
     },
     "minimatch": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "1.1.11",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        }
       }
     },
     "minimist": {
       "version": "1.2.5",
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
     },
     "mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+      "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"
+      }
     },
     "mongodb": {
       "version": "3.6.2",
@@ -3725,74 +2431,12 @@
         "require_optional": "^1.0.1",
         "safe-buffer": "^5.1.2",
         "saslprep": "^1.0.0"
-      },
-      "dependencies": {
-        "bl": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
-          "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
-          "requires": {
-            "readable-stream": "^2.3.5",
-            "safe-buffer": "^5.1.1"
-          }
-        },
-        "bson": {
-          "version": "1.1.5",
-          "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
-          "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          },
-          "dependencies": {
-            "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=="
-            }
-          }
-        },
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          },
-          "dependencies": {
-            "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=="
-            }
-          }
-        }
       }
     },
     "mongoose": {
-      "version": "5.10.9",
-      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.9.tgz",
-      "integrity": "sha512-7dkr1d6Uyk87hELzoc6B7Zo7kkPTx8rKummk51Y0je2V2Ttsw0KFPwTp1G8JIbBta7Wpw8j15PJi0d33Ode2nw==",
+      "version": "5.10.11",
+      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.11.tgz",
+      "integrity": "sha512-R5BFitKW94/S/Z48w+X+qi/eto66jWBcVEVA8nYVkBoBAPFGq7JSYP/0uso+ZHs+7XjSzTuui+SUllzxIrf9yA==",
       "requires": {
         "bson": "^1.1.4",
         "kareem": "2.3.1",
@@ -3807,15 +2451,10 @@
         "sliced": "1.0.1"
       },
       "dependencies": {
-        "bson": {
-          "version": "1.1.5",
-          "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
-          "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
-        },
-        "sift": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
-          "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
+        "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=="
         }
       }
     },
@@ -3873,11 +2512,6 @@
         "sliced": "1.0.1"
       },
       "dependencies": {
-        "bluebird": {
-          "version": "3.5.1",
-          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
-          "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
-        },
         "debug": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
@@ -3888,13 +2522,8 @@
         },
         "ms": {
           "version": "2.0.0",
-          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        },
-        "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=="
         }
       }
     },
@@ -3903,15 +2532,11 @@
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
-    "mute-stream": {
-      "version": "0.0.8",
-      "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz",
-      "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
-    },
     "natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "dev": true
     },
     "negotiator": {
       "version": "0.6.2",
@@ -3936,33 +2561,6 @@
         "update-notifier": "^4.1.0"
       },
       "dependencies": {
-        "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"
-          },
-          "dependencies": {
-            "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"
-              }
-            }
-          }
-        },
         "debug": {
           "version": "3.2.6",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
@@ -3978,24 +2576,6 @@
           "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
           "dev": true
         },
-        "ignore-by-default": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
-          "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
-          "dev": true
-        },
-        "import-lazy": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-          "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
-          "dev": true
-        },
-        "is-npm": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
-          "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
-          "dev": true
-        },
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -4010,204 +2590,104 @@
           "requires": {
             "has-flag": "^3.0.0"
           }
-        },
-        "update-notifier": {
-          "version": "4.1.3",
-          "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
-          "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
-          "dev": true,
-          "requires": {
-            "boxen": "^4.2.0",
-            "chalk": "^3.0.0",
-            "configstore": "^5.0.1",
-            "has-yarn": "^2.1.0",
-            "import-lazy": "^2.1.0",
-            "is-ci": "^2.0.0",
-            "is-installed-globally": "^0.3.1",
-            "is-npm": "^4.0.0",
-            "is-yarn-global": "^0.3.0",
-            "latest-version": "^5.0.0",
-            "pupa": "^2.0.1",
-            "semver-diff": "^3.1.1",
-            "xdg-basedir": "^4.0.0"
-          }
         }
       }
     },
     "nopt": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
-      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+      "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+      "dev": true,
       "requires": {
         "abbrev": "1"
       }
     },
     "normalize-package-data": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz",
-      "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "dev": true,
       "requires": {
-        "hosted-git-info": "^3.0.6",
-        "resolve": "^1.17.0",
-        "semver": "^7.3.2",
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
         "validate-npm-package-license": "^3.0.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "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=="
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
     },
     "normalize-url": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.3.0.tgz",
-      "integrity": "sha512-9/nOVLYYe/dO/eJeQUNaGUF4m4Z5E7cb9oNTKabH+bNf19mqj60txTcveQxL0GlcWLXCxkOu2/LwL8oW0idIDA=="
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
+      "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
+      "dev": true
     },
     "npm-run-path": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
       "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
       "requires": {
         "path-key": "^3.0.0"
       }
     },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-    },
     "object-inspect": {
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-      "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
+      "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=="
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true
     },
     "object.assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
-      "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+      "dev": true,
       "requires": {
+        "call-bind": "^1.0.0",
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.0",
         "has-symbols": "^1.0.1",
         "object-keys": "^1.1.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.18.0-next.1",
-          "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-          "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg= sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
-          "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.2",
-            "is-negative-zero": "^2.0.0",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "object.entries": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz",
       "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==",
+      "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5",
         "has": "^1.0.3"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
-      }
-    },
-    "object.fromentries": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz",
-      "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==",
-      "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.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.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.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
       }
     },
     "on-finished": {
@@ -4227,6 +2707,7 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
       "requires": {
         "wrappy": "1"
       }
@@ -4235,26 +2716,22 @@
       "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"
-      },
-      "dependencies": {
-        "mimic-fn": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
-        }
       }
     },
     "opencollective-postinstall": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
-      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q=="
+      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
+      "dev": true
     },
     "optionator": {
       "version": "0.9.1",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
       "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+      "dev": true,
       "requires": {
         "deep-is": "^0.1.3",
         "fast-levenshtein": "^2.0.6",
@@ -4262,229 +2739,74 @@
         "prelude-ls": "^1.2.1",
         "type-check": "^0.4.0",
         "word-wrap": "^1.2.3"
-      },
-      "dependencies": {
-        "fast-levenshtein": {
-          "version": "2.0.6",
-          "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-          "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
-        }
       }
     },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
-    },
     "p-cancelable": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz",
-      "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg=="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
+      "dev": true
     },
     "p-limit": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
-      "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+      "dev": true,
       "requires": {
-        "p-try": "^2.0.0"
+        "p-try": "^1.0.0"
       }
     },
     "p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "dev": true,
       "requires": {
-        "p-limit": "^3.0.2"
+        "p-limit": "^1.1.0"
       }
     },
     "p-map": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
       "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "dev": true,
       "requires": {
         "aggregate-error": "^3.0.0"
       }
     },
     "p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "dev": true
     },
     "package-json": {
       "version": "6.5.0",
       "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
       "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+      "dev": true,
       "requires": {
         "got": "^9.6.0",
-        "registry-auth-token": "^4.0.0",
-        "registry-url": "^5.0.0",
-        "semver": "^6.2.0"
-      },
-      "dependencies": {
-        "@sindresorhus/is": {
-          "version": "0.14.0",
-          "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
-          "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
-        },
-        "@szmarczak/http-timer": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
-          "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
-          "requires": {
-            "defer-to-connect": "^1.0.1"
-          }
-        },
-        "cacheable-request": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
-          "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
-          "requires": {
-            "clone-response": "^1.0.2",
-            "get-stream": "^5.1.0",
-            "http-cache-semantics": "^4.0.0",
-            "keyv": "^3.0.0",
-            "lowercase-keys": "^2.0.0",
-            "normalize-url": "^4.1.0",
-            "responselike": "^1.0.2"
-          },
-          "dependencies": {
-            "get-stream": {
-              "version": "5.2.0",
-              "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-              "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-              "requires": {
-                "pump": "^3.0.0"
-              }
-            },
-            "lowercase-keys": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-              "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
-            }
-          }
-        },
-        "decompress-response": {
-          "version": "3.3.0",
-          "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-          "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
-          "requires": {
-            "mimic-response": "^1.0.0"
-          }
-        },
-        "defer-to-connect": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
-          "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
-        },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "got": {
-          "version": "9.6.0",
-          "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
-          "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
-          "requires": {
-            "@sindresorhus/is": "^0.14.0",
-            "@szmarczak/http-timer": "^1.1.2",
-            "cacheable-request": "^6.0.0",
-            "decompress-response": "^3.3.0",
-            "duplexer3": "^0.1.4",
-            "get-stream": "^4.1.0",
-            "lowercase-keys": "^1.0.1",
-            "mimic-response": "^1.0.1",
-            "p-cancelable": "^1.0.0",
-            "to-readable-stream": "^1.0.0",
-            "url-parse-lax": "^3.0.0"
-          }
-        },
-        "json-buffer": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-          "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
-        },
-        "keyv": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
-          "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
-          "requires": {
-            "json-buffer": "3.0.0"
-          }
-        },
-        "lowercase-keys": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-          "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
-        },
-        "mimic-response": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-          "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
-        },
-        "normalize-url": {
-          "version": "4.5.0",
-          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
-          "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
-        },
-        "p-cancelable": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
-          "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
-        },
-        "prepend-http": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-          "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
-        },
-        "responselike": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-          "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
-          "requires": {
-            "lowercase-keys": "^1.0.0"
-          }
-        },
+        "registry-auth-token": "^4.0.0",
+        "registry-url": "^5.0.0",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
-        },
-        "to-readable-stream": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
-          "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
-        },
-        "url-parse-lax": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-          "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
-          "requires": {
-            "prepend-http": "^2.0.0"
-          }
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
         }
       }
     },
-    "parent-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz",
-      "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==",
-      "requires": {
-        "callsites": "^3.1.0"
-      }
-    },
     "parse-json": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-      "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
+        "error-ex": "^1.2.0"
       }
     },
     "parseurl": {
@@ -4493,75 +2815,69 @@
       "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
     },
     "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=="
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
     },
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
     },
     "path-key": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true
     },
     "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=="
-    },
-    "path-starts-with": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/path-starts-with/-/path-starts-with-1.0.0.tgz",
-      "integrity": "sha1-soJDAV6LE43lcmgqxS2kLmRq2E4=",
-      "requires": {
-        "normalize-path": "^2.1.1"
-      },
-      "dependencies": {
-        "normalize-path": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-          "requires": {
-            "remove-trailing-separator": "^1.0.1"
-          }
-        }
-      }
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
     },
     "path-to-regexp": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz",
-      "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg=="
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
     },
     "path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+      "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+      "dev": true,
+      "requires": {
+        "pify": "^2.0.0"
+      }
     },
     "picomatch": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+      "dev": true
     },
     "pify": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
-      "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA=="
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
     },
     "pkg-dir": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
-      "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "dev": true,
       "requires": {
-        "find-up": "^5.0.0"
+        "find-up": "^2.1.0"
       }
     },
     "please-upgrade-node": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
       "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+      "dev": true,
       "requires": {
         "semver-compare": "^1.0.0"
       }
@@ -4569,28 +2885,15 @@
     "prelude-ls": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true
     },
     "prepend-http": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-3.0.1.tgz",
-      "integrity": "sha512-BLxfZh+m6UiAiCPZFJ4+vYoL7NrRs5XgCTRrjseATAggXhdZKKxn+JUNmuVYWY23bDHgaEHodxw8mnmtVEDtHw=="
-    },
-    "prettier": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
-      "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
       "dev": true
     },
-    "prettier-linter-helpers": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
-      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
-      "dev": true,
-      "requires": {
-        "fast-diff": "^1.1.2"
-      }
-    },
     "process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -4599,17 +2902,8 @@
     "progress": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
-    },
-    "prop-types": {
-      "version": "15.7.2",
-      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
-      "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
-      "requires": {
-        "loose-envify": "^1.4.0",
-        "object-assign": "^4.1.1",
-        "react-is": "^16.8.1"
-      }
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
     },
     "proxy-addr": {
       "version": "2.0.6",
@@ -4618,24 +2912,19 @@
       "requires": {
         "forwarded": "~0.1.2",
         "ipaddr.js": "1.9.1"
-      },
-      "dependencies": {
-        "ipaddr.js": {
-          "version": "1.9.1",
-          "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-          "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
-        }
       }
     },
     "pstree.remy": {
       "version": "1.1.8",
       "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
-      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
+      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
+      "dev": true
     },
     "pump": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
       "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dev": true,
       "requires": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.1"
@@ -4644,32 +2933,22 @@
     "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",
-      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
-      "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
+      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
+      "dev": true,
       "requires": {
         "escape-goat": "^2.0.0"
-      },
-      "dependencies": {
-        "escape-goat": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
-          "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
-        }
       }
     },
     "qs": {
-      "version": "6.9.4",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
-      "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="
-    },
-    "quick-lru": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
     },
     "range-parser": {
       "version": "1.2.1",
@@ -4677,57 +2956,21 @@
       "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
     },
     "raw-body": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz",
-      "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
       "requires": {
         "bytes": "3.1.0",
-        "http-errors": "1.7.3",
+        "http-errors": "1.7.2",
         "iconv-lite": "0.4.24",
         "unpipe": "1.0.0"
-      },
-      "dependencies": {
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
-        },
-        "http-errors": {
-          "version": "1.7.3",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
-          "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.4",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
-          }
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
-        }
       }
     },
     "rc": {
       "version": "1.2.8",
       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "dev": true,
       "requires": {
         "deep-extend": "^0.6.0",
         "ini": "~1.3.0",
@@ -4737,171 +2980,72 @@
       "dependencies": {
         "strip-json-comments": {
           "version": "2.0.1",
-          "resolved": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+          "dev": true
         }
       }
     },
-    "react-is": {
-      "version": "16.13.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
-      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
-    },
     "read-pkg": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+      "dev": true,
       "requires": {
-        "@types/normalize-package-data": "^2.4.0",
-        "normalize-package-data": "^2.5.0",
-        "parse-json": "^5.0.0",
-        "type-fest": "^0.6.0"
-      },
-      "dependencies": {
-        "hosted-git-info": {
-          "version": "2.8.8",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
-        },
-        "normalize-package-data": {
-          "version": "2.5.0",
-          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-          "requires": {
-            "hosted-git-info": "^2.1.4",
-            "resolve": "^1.10.0",
-            "semver": "2 || 3 || 4 || 5",
-            "validate-npm-package-license": "^3.0.1"
-          }
-        },
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
-        },
-        "type-fest": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
-        }
+        "load-json-file": "^2.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^2.0.0"
       }
     },
     "read-pkg-up": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
-      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+      "dev": true,
       "requires": {
-        "find-up": "^4.1.0",
-        "read-pkg": "^5.2.0",
-        "type-fest": "^0.8.1"
-      },
-      "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==",
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "requires": {
-            "p-try": "^2.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==",
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
-        }
+        "find-up": "^2.0.0",
+        "read-pkg": "^2.0.0"
       }
     },
     "readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
       "requires": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
       }
     },
     "readdirp": {
       "version": "3.5.0",
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
       "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+      "dev": true,
       "requires": {
         "picomatch": "^2.2.1"
       }
     },
-    "regenerator-runtime": {
-      "version": "0.13.7",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
-      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
-    },
     "regexp-clone": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
       "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
     },
-    "regexp.prototype.flags": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
-      "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0-next.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-          "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.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
-      }
-    },
     "regexpp": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
+      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+      "dev": true
     },
     "registry-auth-token": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
       "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
+      "dev": true,
       "requires": {
         "rc": "^1.2.8"
       }
@@ -4910,15 +3054,11 @@
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
       "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+      "dev": true,
       "requires": {
         "rc": "^1.2.8"
       }
     },
-    "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="
-    },
     "require_optional": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
@@ -4928,11 +3068,6 @@
         "semver": "^5.1.0"
       },
       "dependencies": {
-        "resolve-from": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
-          "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
-        },
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -4944,70 +3079,58 @@
       "version": "1.18.1",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
       "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
+      "dev": true,
       "requires": {
         "is-core-module": "^2.0.0",
         "path-parse": "^1.0.6"
       }
     },
-    "resolve-alpn": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz",
-      "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA=="
-    },
     "resolve-from": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
+      "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
     },
     "responselike": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
-      "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "dev": true,
       "requires": {
-        "lowercase-keys": "^2.0.0"
+        "lowercase-keys": "^1.0.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==",
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "dev": true,
       "requires": {
         "glob": "^7.1.3"
       }
     },
-    "run-async": {
-      "version": "2.4.1",
-      "resolved": "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz",
-      "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU= sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
-    },
     "rxjs": {
       "version": "6.6.3",
       "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
       "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
+      "dev": true,
       "requires": {
         "tslib": "^1.9.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
       }
     },
     "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=="
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
     },
     "safer-buffer": {
       "version": "2.1.2",
@@ -5018,6 +3141,7 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
       "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+      "optional": true,
       "requires": {
         "sparse-bitfield": "^3.0.3"
       }
@@ -5025,17 +3149,20 @@
     "semver": {
       "version": "7.3.2",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-      "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+      "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+      "dev": true
     },
     "semver-compare": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
+      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+      "dev": true
     },
     "semver-diff": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
       "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+      "dev": true,
       "requires": {
         "semver": "^6.3.0"
       },
@@ -5043,15 +3170,11 @@
         "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
         }
       }
     },
-    "semver-regex": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.1.tgz",
-      "integrity": "sha512-3dPcmFqxblWB/cppQ2qXWqlp9b6GLgAS032+Ec5E0waDVHTkwYIL+7BFI9UqEe0tkoHle2f3pBgvT/Xl95+Dig=="
-    },
     "send": {
       "version": "0.17.1",
       "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -5087,44 +3210,10 @@
             }
           }
         },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
-        },
-        "http-errors": {
-          "version": "1.7.3",
-          "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz",
-          "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.4",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
-          },
-          "dependencies": {
-            "setprototypeof": {
-              "version": "1.1.1",
-              "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-              "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
-            }
-          }
-        },
-        "mime": {
-          "version": "1.6.0",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-          "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
-        },
         "ms": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
           "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
         }
       }
     },
@@ -5140,76 +3229,77 @@
       }
     },
     "setprototypeof": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
-      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
-    },
-    "shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "requires": {
-        "shebang-regex": "^3.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
-    },
-    "side-channel": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz",
-      "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==",
-      "requires": {
-        "es-abstract": "^1.18.0-next.0",
-        "object-inspect": "^1.8.0"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.18.0-next.1",
-          "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-          "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg= sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
-          "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.2",
-            "is-negative-zero": "^2.0.0",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^3.0.0"
       }
     },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true
+    },
     "sift": {
-      "version": "13.3.5",
-      "resolved": "https://registry.npmjs.org/sift/-/sift-13.3.5.tgz",
-      "integrity": "sha512-apSwBXO0Xpl7zGb26xwq7KGre9/WwyzMxUv0zmI6mLpDJQGOX+CynBgKDaSrn+AXuAuiS4orQo1ty6bU+OEN/Q=="
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
+      "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
     },
     "signal-exit": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "dev": true
     },
     "slash": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true
     },
     "slice-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+      "dev": true,
       "requires": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
+        "ansi-styles": "^3.2.0",
+        "astral-regex": "^1.0.0",
+        "is-fullwidth-code-point": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "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"
+          }
+        },
+        "color-convert": {
+          "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"
+          }
+        },
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+          "dev": true
+        }
       }
     },
     "sliced": {
@@ -5217,15 +3307,11 @@
       "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
       "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
     },
-    "source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
-    },
     "sparse-bitfield": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
       "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
+      "optional": true,
       "requires": {
         "memory-pager": "^1.0.2"
       }
@@ -5234,6 +3320,7 @@
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
       "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "dev": true,
       "requires": {
         "spdx-expression-parse": "^3.0.0",
         "spdx-license-ids": "^3.0.0"
@@ -5242,12 +3329,14 @@
     "spdx-exceptions": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
     },
     "spdx-expression-parse": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
       "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "dev": true,
       "requires": {
         "spdx-exceptions": "^2.1.0",
         "spdx-license-ids": "^3.0.0"
@@ -5256,110 +3345,76 @@
     "spdx-license-ids": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
-      "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw=="
+      "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
+      "dev": true
     },
     "sprintf-js": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
-      "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
     },
     "statuses": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.0.tgz",
-      "integrity": "sha512-w9jNUUQdpuVoYqXxnyOakhckBbOxRaoYqJscyIBYCS5ixyCnO7nQn7zBZvP9zf5QOPZcz2DLUpE3KsNPbJBOFA=="
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
     },
     "string-argv": {
       "version": "0.3.1",
       "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
-      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg=="
+      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+      "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==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+      "dev": true,
       "requires": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
+        "emoji-regex": "^7.0.1",
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^5.1.0"
       },
       "dependencies": {
         "ansi-regex": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
-        },
-        "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=="
-        },
-        "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=="
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
         },
         "strip-ansi": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-          "requires": {
-            "ansi-regex": "^5.0.0"
-          }
-        }
-      }
-    },
-    "string.prototype.matchall": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz",
-      "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==",
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0",
-        "has-symbols": "^1.0.1",
-        "internal-slot": "^1.0.2",
-        "regexp.prototype.flags": "^1.3.0",
-        "side-channel": "^1.0.2"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "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": {
-            "es-to-primitive": "^1.2.1",
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1",
-            "is-callable": "^1.2.2",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
+            "ansi-regex": "^4.1.0"
           }
         }
       }
     },
     "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==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz",
+      "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==",
+      "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5"
+        "es-abstract": "^1.18.0-next.1"
       },
       "dependencies": {
         "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "version": "1.18.0-next.1",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+          "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.2",
+            "is-negative-zero": "^2.0.0",
             "is-regex": "^1.1.1",
             "object-inspect": "^1.8.0",
             "object-keys": "^1.1.1",
@@ -5371,24 +3426,27 @@
       }
     },
     "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==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz",
+      "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==",
+      "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5"
+        "es-abstract": "^1.18.0-next.1"
       },
       "dependencies": {
         "es-abstract": {
-          "version": "1.17.7",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "version": "1.18.0-next.1",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+          "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.2",
+            "is-negative-zero": "^2.0.0",
             "is-regex": "^1.1.1",
             "object-inspect": "^1.8.0",
             "object-keys": "^1.1.1",
@@ -5400,17 +3458,18 @@
       }
     },
     "string_decoder": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "requires": {
-        "safe-buffer": "~5.2.0"
+        "safe-buffer": "~5.1.0"
       }
     },
     "stringify-object": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
       "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+      "dev": true,
       "requires": {
         "get-own-enumerable-property-symbols": "^3.0.0",
         "is-obj": "^1.0.1",
@@ -5420,12 +3479,8 @@
         "is-obj": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
-        },
-        "is-regexp": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-          "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
+          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+          "dev": true
         }
       }
     },
@@ -5433,86 +3488,79 @@
       "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"
       }
     },
     "strip-bom": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
-    },
-    "strip-filename-increment": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-filename-increment/-/strip-filename-increment-2.0.1.tgz",
-      "integrity": "sha512-+v5xsiTTsdYqkPj7qz1zlngIsjZedhHDi3xp/9bMurV8kXe9DAr732gNVqtt4X8sI3hOqS3nlFfps5gyVcux6w=="
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "dev": true
     },
     "strip-final-newline": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
     },
     "strip-json-comments": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "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"
       }
     },
     "table": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/table/-/table-6.0.3.tgz",
-      "integrity": "sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==",
+      "version": "5.4.6",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+      "dev": true,
       "requires": {
-        "ajv": "^6.12.4",
-        "lodash": "^4.17.20",
-        "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.0"
+        "ajv": "^6.10.2",
+        "lodash": "^4.17.14",
+        "slice-ansi": "^2.1.0",
+        "string-width": "^3.0.0"
       }
     },
     "term-size": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
-      "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw=="
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
+      "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
+      "dev": true
     },
     "text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "dev": true
     },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
-    },
-    "tmp": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
-      "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
-      "requires": {
-        "rimraf": "^3.0.0"
-      }
-    },
-    "to-fast-properties": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-3.0.1.tgz",
-      "integrity": "sha512-/wtNi1tW1F3nf0OL6AqVxGw9Tr1ET70InMhJuVxPwFdGqparF0nQ4UWGLf2DsoI2bFDtthlBnALncZpUzOnsUw=="
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
     },
     "to-readable-stream": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz",
-      "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w=="
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
+      "dev": true
     },
     "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"
       }
@@ -5526,63 +3574,43 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
       "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
+      "dev": true,
       "requires": {
         "nopt": "~1.0.10"
-      },
-      "dependencies": {
-        "nopt": {
-          "version": "1.0.10",
-          "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
-          "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
-          "requires": {
-            "abbrev": "1"
-          }
-        }
       }
     },
     "tsconfig-paths": {
       "version": "3.9.0",
       "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
       "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
+      "dev": true,
       "requires": {
         "@types/json5": "^0.0.29",
         "json5": "^1.0.1",
         "minimist": "^1.2.0",
         "strip-bom": "^3.0.0"
-      },
-      "dependencies": {
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "strip-bom": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
-        }
       }
     },
     "tslib": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
-      "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "dev": true
     },
     "type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
       "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
       "requires": {
         "prelude-ls": "^1.2.1"
       }
     },
     "type-fest": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.0.tgz",
-      "integrity": "sha512-fbDukFPnJBdn2eZ3RR+5mK2slHLFd6gYHY7jna1KWWy4Yr4XysHuCdXRzy+RiG/HwG4WJat00vdC2UHky5eKiQ=="
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+      "dev": true
     },
     "type-is": {
       "version": "1.6.18",
@@ -5591,19 +3619,13 @@
       "requires": {
         "media-typer": "0.3.0",
         "mime-types": "~2.1.24"
-      },
-      "dependencies": {
-        "media-typer": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-          "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
-        }
       }
     },
     "typedarray-to-buffer": {
       "version": "3.1.5",
       "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
       "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "dev": true,
       "requires": {
         "is-typedarray": "^1.0.0"
       }
@@ -5612,6 +3634,7 @@
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
       "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
+      "dev": true,
       "requires": {
         "debug": "^2.2.0"
       },
@@ -5620,6 +3643,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"
           }
@@ -5627,7 +3651,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
         }
       }
     },
@@ -5635,15 +3660,9 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
       "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+      "dev": true,
       "requires": {
         "crypto-random-string": "^2.0.0"
-      },
-      "dependencies": {
-        "crypto-random-string": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
-          "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
-        }
       }
     },
     "unpipe": {
@@ -5652,30 +3671,35 @@
       "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
     },
     "update-notifier": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.0.tgz",
-      "integrity": "sha512-8tqsiVrMv7aZsKNSjqA6DdBLKJpZG1hRpkj1RbOJu1PgyP69OX+EInAnP1EK/ShX5YdPFgwWdk19oquZ0HTM8g==",
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
+      "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
+      "dev": true,
       "requires": {
         "boxen": "^4.2.0",
-        "chalk": "^4.1.0",
+        "chalk": "^3.0.0",
         "configstore": "^5.0.1",
         "has-yarn": "^2.1.0",
         "import-lazy": "^2.1.0",
         "is-ci": "^2.0.0",
         "is-installed-globally": "^0.3.1",
-        "is-npm": "^5.0.0",
+        "is-npm": "^4.0.0",
         "is-yarn-global": "^0.3.0",
         "latest-version": "^5.0.0",
         "pupa": "^2.0.1",
-        "semver": "^7.3.2",
         "semver-diff": "^3.1.1",
         "xdg-basedir": "^4.0.0"
       },
       "dependencies": {
-        "import-lazy": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-          "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+        "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"
+          }
         }
       }
     },
@@ -5683,16 +3707,18 @@
       "version": "4.4.0",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
       "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
+      "dev": true,
       "requires": {
         "punycode": "^2.1.0"
       }
     },
     "url-parse-lax": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-4.0.0.tgz",
-      "integrity": "sha512-CazaJJZUPr1EWmHjcntgS1F1q6YOpQROD6Z+aTb9obxgOFsRydnqYkRCh5xDJ3LhqTID46JrWaT7PsF7Oms0PA==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "dev": true,
       "requires": {
-        "prepend-http": "^3.0.1"
+        "prepend-http": "^2.0.0"
       }
     },
     "util-deprecate": {
@@ -5706,14 +3732,16 @@
       "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
     },
     "v8-compile-cache": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
-      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ=="
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+      "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
+      "dev": true
     },
     "validate-npm-package-license": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
       "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
       "requires": {
         "spdx-correct": "^3.0.0",
         "spdx-expression-parse": "^3.0.0"
@@ -5728,6 +3756,7 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
       "requires": {
         "isexe": "^2.0.0"
       }
@@ -5735,48 +3764,105 @@
     "which-pm-runs": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
-      "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
+      "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
+      "dev": true
     },
     "widest-line": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
       "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+      "dev": true,
       "requires": {
         "string-width": "^4.0.0"
+      },
+      "dependencies": {
+        "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
+        },
+        "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
+        },
+        "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"
+          }
+        }
       }
     },
     "word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true
     },
     "wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "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": {
+        "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
+        },
+        "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
+        },
+        "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"
+          }
+        }
       }
     },
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
     },
     "write": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/write/-/write-2.0.0.tgz",
-      "integrity": "sha512-yam9TAqN8sAZokECAejo9HpT2j2s39OgK8i8yxadrFBVo+iSWLfnipRVFulfAw1d2dz5vSuGmlMHYRKG4fysOA==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "dev": true,
       "requires": {
-        "add-filename-increment": "^1.0.0"
+        "mkdirp": "^0.5.1"
       }
     },
     "write-file-atomic": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
       "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "dev": true,
       "requires": {
         "imurmurhash": "^0.1.4",
         "is-typedarray": "^1.0.0",
@@ -5787,17 +3873,14 @@
     "xdg-basedir": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
-      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
-    },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+      "dev": true
     },
     "yaml": {
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
-      "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg=="
+      "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+      "dev": true
     }
   }
 }
diff --git a/package.json b/package.json
index 4dcaec5..71c2b06 100644
--- a/package.json
+++ b/package.json
@@ -10,11 +10,11 @@
     "lint:js:fix": "npm run lint:js -- --fix"
   },
   "lint-staged": {
-    "src/**/*.{js,jsx}": [
-      "npx eslint . --fix", "git add"
+    "src/**/\\*.js": [
+      "eslint --fix"
     ],
-    "src/*.{js,jsx}": [
-      "npx eslint . --fix", "git add"
+    "!(src/**/\\*.js)": [
+      "git add"
     ]
   },
   "husky": {
@@ -34,401 +34,20 @@
   },
   "homepage": "https://github.com/fga-eps-mds/2020.1-GaiaDex-backend#readme",
   "dependencies": {
-    "abbrev": "^1.1.1",
-    "accepts": "^1.3.7",
-    "acorn": "^8.0.4",
-    "acorn-jsx": "^5.3.1",
-    "aggregate-error": "^3.1.0",
-    "ajv": "^6.12.6",
-    "ansi-align": "^3.0.0",
-    "ansi-colors": "^4.1.1",
-    "ansi-escapes": "^4.3.1",
-    "ansi-regex": "^5.0.0",
-    "ansi-styles": "^4.3.0",
-    "anymatch": "^3.1.1",
-    "argparse": "^2.0.1",
-    "aria-query": "^4.2.2",
-    "array-flatten": "^3.0.0",
-    "array-includes": "^3.1.1",
-    "array.prototype.flat": "^1.2.3",
-    "array.prototype.flatmap": "^1.2.3",
-    "ast-types-flow": "^0.0.7",
-    "astral-regex": "^2.0.0",
-    "axe-core": "^4.0.2",
-    "axobject-query": "^2.2.0",
-    "balanced-match": "^1.0.0",
-    "basic-auth": "^2.0.1",
-    "binary-extensions": "^2.1.0",
-    "bl": "^4.0.3",
-    "bluebird": "^3.7.2",
-    "body-parser": "^1.19.0",
-    "boxen": "^4.2.0",
-    "brace-expansion": "^2.0.0",
-    "braces": "^3.0.2",
-    "bson": "^4.2.0",
-    "buffer-equal-constant-time": "^1.0.1",
-    "bytes": "^3.1.0",
-    "cacheable-request": "^7.0.1",
-    "callsites": "^3.1.0",
-    "camelcase": "^6.1.0",
-    "chalk": "^4.1.0",
-    "chardet": "^1.3.0",
-    "chokidar": "^3.4.3",
-    "ci-info": "^2.0.0",
-    "clean-stack": "^3.0.0",
-    "cli-boxes": "^2.2.1",
-    "cli-cursor": "^3.1.0",
-    "cli-truncate": "^2.1.0",
-    "cli-width": "^3.0.0",
-    "clone-response": "^1.0.2",
-    "color-convert": "^2.0.1",
-    "color-name": "^1.1.4",
-    "commander": "^6.1.0",
-    "compare-versions": "^3.6.0",
-    "concat-map": "^0.0.1",
-    "configstore": "^5.0.1",
-    "confusing-browser-globals": "^1.0.9",
-    "contains-path": "^1.0.0",
-    "content-disposition": "^0.5.3",
-    "content-type": "^1.0.4",
-    "cookie": "^0.4.1",
-    "cookie-signature": "^1.1.0",
-    "core-js-pure": "^3.6.5",
-    "cosmiconfig": "^7.0.0",
-    "core-util-is": "^1.0.2",
-    "cross-spawn": "^7.0.3",
-    "crypto-random-string": "^3.3.0",
-    "damerau-levenshtein": "^1.0.6",
-    "debug": "^4.2.0",
-    "decompress-response": "^6.0.0",
-    "dedent": "^0.7.0",
-    "deep-extend": "^0.6.0",
-    "deep-is": "^0.1.3",
-    "defer-to-connect": "^2.0.0",
-    "define-properties": "^1.1.3",
-    "denque": "^1.4.1",
-    "depd": "^2.0.0",
-    "destroy": "^1.0.4",
-    "doctrine": "^3.0.0",
-    "dot-prop": "^6.0.0",
+    "axios": "^0.21.0",
     "dotenv": "^8.2.0",
-    "duplexer3": "^0.1.4",
-    "ecdsa-sig-formatter": "^1.0.11",
-    "ee-first": "^1.1.1",
-    "emoji-regex": "^9.1.1",
-    "encodeurl": "^1.0.2",
-    "end-of-stream": "^1.4.4",
-    "enquirer": "^2.3.6",
-    "error-ex": "^1.3.2",
-    "es-abstract": "^1.17.7",
-    "es-to-primitive": "^1.2.1",
-    "escape-goat": "^3.0.0",
-    "escape-html": "^1.0.3",
-    "escape-string-regexp": "^4.0.0",
-    "espree": "^7.3.0",
-    "esprima": "^4.0.1",
-    "esquery": "^1.3.1",
-    "esrecurse": "^4.3.0",
-    "estraverse": "^5.2.0",
-    "esutils": "^2.0.3",
-    "etag": "^1.8.1",
-    "execa": "^4.0.3",
     "express": "^4.17.1",
-    "external-editor": "^3.1.0",
-    "fast-deep-equal": "^3.1.3",
-    "fast-json-stable-stringify": "^2.1.0",
-    "fast-levenshtein": "^3.0.0",
-    "figures": "^3.2.0",
-    "file-entry-cache": "^5.0.1",
-    "fill-range": "^7.0.1",
-    "finalhandler": "^1.1.2",
-    "find-up": "^5.0.0",
-    "find-versions": "^3.2.0",
-    "flat-cache": "^2.0.1",
-    "flatted": "^3.1.0",
-    "forwarded": "^0.1.2",
-    "fresh": "^0.5.2",
-    "fs.realpath": "^1.0.0",
-    "function-bind": "^1.1.1",
-    "functional-red-black-tree": "^1.0.1",
-    "get-own-enumerable-property-symbols": "^3.0.2",
-    "get-stream": "^6.0.0",
-    "glob": "^7.1.6",
-    "glob-parent": "^5.1.1",
-    "global-dirs": "^2.0.1",
-    "globals": "^13.2.0",
-    "got": "^11.7.0",
-    "graceful-fs": "^4.2.4",
-    "has": "^1.0.3",
-    "has-flag": "^4.0.0",
-    "has-yarn": "^2.1.0",
-    "has-symbols": "^1.0.1",
-    "hosted-git-info": "^3.0.7",
-    "http-cache-semantics": "^4.1.0",
-    "http-errors": "^1.8.0",
-    "human-signals": "^2.1.0",
-    "iconv-lite": "^0.6.2",
-    "ignore": "^5.1.8",
-    "ignore-by-default": "^2.0.0",
-    "import-fresh": "^3.2.1",
-    "import-lazy": "^4.0.0",
-    "imurmurhash": "^0.1.4",
-    "indent-string": "^4.0.0",
-    "inflight": "^1.0.6",
-    "inherits": "^2.0.4",
-    "ini": "^1.3.5",
-    "inquirer": "^7.3.3",
-    "internal-slot": "^1.0.2",
-    "ipaddr.js": "^2.0.0",
-    "is-arrayish": "^0.3.2",
-    "is-binary-path": "^2.1.0",
-    "is-callable": "^1.2.2",
-    "is-ci": "^2.0.0",
-    "is-core-module": "^2.0.0",
-    "is-date-object": "^1.0.2",
-    "is-extglob": "^2.1.1",
-    "is-fullwidth-code-point": "^3.0.0",
-    "is-glob": "^4.0.1",
-    "is-installed-globally": "^0.3.2",
-    "is-negative-zero": "^2.0.0",
-    "is-npm": "^5.0.0",
-    "is-number": "^7.0.0",
-    "is-obj": "^2.0.0",
-    "is-path-inside": "^3.0.2",
-    "is-regex": "^1.1.1",
-    "is-regexp": "^2.1.0",
-    "is-stream": "^2.0.0",
-    "is-string": "^1.0.5",
-    "is-symbol": "^1.0.3",
-    "is-typedarray": "^1.0.0",
-    "is-yarn-global": "^0.3.0",
-    "isarray": "^2.0.5",
-    "isexe": "^2.0.0",
-    "joi": "^17.2.1",
-    "js-tokens": "^6.0.0",
-    "js-yaml": "^3.14.0",
-    "jsesc": "^3.0.1",
-    "json-buffer": "^3.0.1",
-    "json-parse-even-better-errors": "^2.3.1",
-    "json-schema-traverse": "^0.5.0",
-    "json-stable-stringify-without-jsonify": "^1.0.1",
-    "json5": "^2.1.3",
+    "joi": "^17.3.0",
     "jsonwebtoken": "^8.5.1",
-    "jsx-ast-utils": "^3.1.0",
-    "jwa": "^2.0.0",
-    "jws": "^4.0.0",
-    "kareem": "^2.3.1",
-    "keyv": "^4.0.3",
-    "language-subtag-registry": "^0.3.20",
-    "language-tags": "^1.0.5",
-    "latest-version": "^5.1.0",
-    "levn": "^0.4.1",
-    "lines-and-columns": "^1.1.6",
-    "listr2": "^3.1.1",
-    "load-json-file": "^6.2.0",
-    "locate-path": "^6.0.0",
-    "lodash": "^4.17.20",
-    "lodash.includes": "^4.3.0",
-    "lodash.isboolean": "^3.0.3",
-    "lodash.isinteger": "^4.0.4",
-    "lodash.isnumber": "^3.0.3",
-    "lodash.isplainobject": "^4.0.6",
-    "lodash.isstring": "^4.0.1",
-    "lodash.once": "^4.1.1",
-    "log-update": "^4.0.0",
-    "loose-envify": "^1.4.0",
-    "log-symbols": "^4.0.0",
-    "lowercase-keys": "^2.0.0",
-    "make-dir": "^3.1.0",
-    "media-typer": "^1.1.0",
-    "memory-pager": "^1.5.0",
-    "merge-descriptors": "^1.0.1",
-    "merge-stream": "^2.0.0",
-    "methods": "^1.1.2",
-    "micromatch": "^4.0.2",
-    "mime": "^2.4.6",
-    "mime-db": "^1.45.0",
-    "mime-types": "^2.1.27",
-    "mimic-fn": "^3.1.0",
-    "mimic-response": "^3.1.0",
-    "minimatch": "^3.0.4",
-    "minimist": "^1.2.5",
-    "mkdirp": "^1.0.4",
-    "mongodb": "^3.6.2",
-    "morgan": "^1.10.0",
-    "mongoose": "^5.10.9",
-    "mongoose-legacy-pluralize": "^1.0.2",
-    "mpath": "^0.7.0",
-    "mquery": "^3.2.2",
-    "ms": "^2.1.2",
-    "mute-stream": "^0.0.8",
-    "natural-compare": "^1.4.0",
-    "negotiator": "^0.6.2",
-    "nopt": "^5.0.0",
-    "normalize-package-data": "^3.0.0",
-    "normalize-path": "^3.0.0",
-    "normalize-url": "^5.3.0",
-    "npm-run-path": "^4.0.1",
-    "object-assign": "^4.1.1",
-    "object-inspect": "^1.8.0",
-    "object-keys": "^1.1.1",
-    "object.assign": "^4.1.1",
-    "object.entries": "^1.1.2",
-    "object.fromentries": "^2.0.2",
-    "object.values": "^1.1.1",
-    "on-finished": "^2.3.0",
-    "on-headers": "^1.0.2",
-    "once": "^1.4.0",
-    "onetime": "^5.1.2",
-    "opencollective-postinstall": "^2.0.3",
-    "optionator": "^0.9.1",
-    "os-tmpdir": "^1.0.2",
-    "p-cancelable": "^2.0.0",
-    "p-limit": "^3.0.2",
-    "p-locate": "^5.0.0",
-    "p-map": "^4.0.0",
-    "p-try": "^2.2.0",
-    "package-json": "^6.5.0",
-    "parent-module": "^2.0.0",
-    "parse-json": "^5.1.0",
-    "parseurl": "^1.3.3",
-    "path-exists": "^4.0.0",
-    "path-is-absolute": "^1.0.1",
-    "path-key": "^3.1.1",
-    "path-parse": "^1.0.6",
-    "path-to-regexp": "^6.2.0",
-    "path-type": "^4.0.0",
-    "picomatch": "^2.2.2",
-    "pify": "^5.0.0",
-    "pkg-dir": "^5.0.0",
-    "please-upgrade-node": "^3.2.0",
-    "prelude-ls": "^1.2.1",
-    "prepend-http": "^3.0.1",
-    "process-nextick-args": "^2.0.1",
-    "progress": "^2.0.3",
-    "prop-types": "^15.7.2",
-    "proxy-addr": "^2.0.6",
-    "pstree.remy": "^1.1.8",
-    "pump": "^3.0.0",
-    "punycode": "^2.1.1",
-    "pupa": "^2.0.1",
-    "qs": "^6.9.4",
-    "range-parser": "^1.2.1",
-    "raw-body": "^2.4.1",
-    "rc": "^1.2.8",
-    "react-is": "^16.13.1",
-    "read-pkg": "^5.2.0",
-    "read-pkg-up": "^7.0.1",
-    "readable-stream": "^3.6.0",
-    "readdirp": "^3.5.0",
-    "regenerator-runtime": "^0.13.7",
-    "regexp-clone": "^1.0.0",
-    "regexp.prototype.flags": "^1.3.0",
-    "regexpp": "^3.1.0",
-    "registry-auth-token": "^4.2.0",
-    "registry-url": "^5.1.0",
-    "require_optional": "^1.0.1",
-    "resolve": "^1.18.1",
-    "resolve-from": "^5.0.0",
-    "responselike": "^2.0.0",
-    "restore-cursor": "^3.1.0",
-    "rimraf": "^3.0.2",
-    "run-async": "^2.4.1",
-    "rxjs": "^6.6.3",
-    "safe-buffer": "^5.2.1",
-    "safer-buffer": "^2.1.2",
-    "saslprep": "^1.0.3",
-    "semver": "^7.3.2",
-    "semver-compare": "^1.0.0",
-    "semver-diff": "^3.1.1",
-    "semver-regex": "^3.1.1",
-    "send": "^0.17.1",
-    "serve-static": "^1.14.1",
-    "setprototypeof": "^1.2.0",
-    "shebang-command": "^2.0.0",
-    "shebang-regex": "^3.0.0",
-    "side-channel": "^1.0.3",
-    "sift": "^13.3.5",
-    "signal-exit": "^3.0.3",
-    "slash": "^3.0.0",
-    "slice-ansi": "^4.0.0",
-    "sliced": "^1.0.1",
-    "source-map": "^0.7.3",
-    "sparse-bitfield": "^3.0.3",
-    "spdx-correct": "^3.1.1",
-    "spdx-exceptions": "^2.3.0",
-    "spdx-expression-parse": "^3.0.1",
-    "spdx-license-ids": "^3.0.6",
-    "sprintf-js": "^1.1.2",
-    "statuses": "^2.0.0",
-    "string-argv": "^0.3.1",
-    "string-width": "^4.2.0",
-    "string.prototype.matchall": "^4.0.2",
-    "string.prototype.trimend": "^1.0.1",
-    "string.prototype.trimstart": "^1.0.1",
-    "string_decoder": "^1.3.0",
-    "stringify-object": "^3.3.0",
-    "strip-ansi": "^6.0.0",
-    "strip-bom": "^4.0.0",
-    "strip-final-newline": "^2.0.0",
-    "strip-json-comments": "^3.1.1",
-    "supports-color": "^7.2.0",
-    "table": "^6.0.3",
-    "term-size": "^2.2.0",
-    "text-table": "^0.2.0",
-    "through": "^2.3.8",
-    "tmp": "^0.2.1",
-    "to-fast-properties": "^3.0.1",
-    "to-readable-stream": "^2.1.0",
-    "to-regex-range": "^5.0.1",
-    "toidentifier": "^1.0.0",
-    "touch": "^3.1.0",
-    "tsconfig-paths": "^3.9.0",
-    "tslib": "^2.0.3",
-    "type-check": "^0.4.0",
-    "type-fest": "^0.18.0",
-    "type-is": "^1.6.18",
-    "typedarray-to-buffer": "^3.1.5",
-    "undefsafe": "^2.0.3",
-    "unique-string": "^2.0.0",
-    "unpipe": "^1.0.0",
-    "update-notifier": "^5.0.0",
-    "uri-js": "^4.4.0",
-    "url-parse-lax": "^4.0.0",
-    "util-deprecate": "^1.0.2",
-    "utils-merge": "^1.0.1",
-    "v8-compile-cache": "^2.1.1",
-    "validate-npm-package-license": "^3.0.4",
-    "vary": "^1.1.2",
-    "which": "^2.0.2",
-    "which-pm-runs": "^1.0.0",
-    "widest-line": "^3.1.0",
-    "word-wrap": "^1.2.3",
-    "wrap-ansi": "^7.0.0",
-    "wrappy": "^1.0.2",
-    "write": "^2.0.0",
-    "write-file-atomic": "^3.0.3",
-    "xdg-basedir": "^4.0.0",
-    "yaml": "^1.10.0"
+    "mongoose": "^5.10.11",
+    "morgan": "^1.10.0"
   },
   "devDependencies": {
-    "babel-eslint": "^10.1.0",
-    "eslint": "^7.11.0",
-    "eslint-config-airbnb": "^18.2.0",
-    "eslint-config-prettier": "^6.13.0",
-    "eslint-import-resolver-node": "^0.3.4",
-    "eslint-module-utils": "^2.6.0",
+    "eslint": "^7.12.1",
+    "eslint-config-airbnb-base": "^14.2.0",
     "eslint-plugin-import": "^2.22.1",
-    "eslint-plugin-jsx-a11y": "^6.3.1",
-    "eslint-plugin-prettier": "^3.1.4",
-    "eslint-plugin-react": "^7.21.5",
-    "eslint-plugin-react-hooks": "^4.1.2",
-    "eslint-scope": "^5.1.1",
-    "eslint-utils": "^2.1.0",
-    "eslint-visitor-keys": "^2.0.0",
     "husky": "^4.3.0",
-    "lint-staged": "^10.4.2",
-    "nodemon": "^2.0.6",
-    "prettier": "^2.1.2"
+    "lint-staged": "^10.5.1",
+    "nodemon": "^2.0.6"
   }
 }

From 18f2b1ac5ea49830014a3a372c6aacffecf808a4 Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Tue, 3 Nov 2020 17:22:21 -0300
Subject: [PATCH 081/147] Renew eslint

Co-authored-by: Marcos Filipe <marofelipe@live.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 .eslintrc.json | 61 +++++++++++++++++++++++++-------------------------
 package.json   |  3 ++-
 2 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/.eslintrc.json b/.eslintrc.json
index 5d9f147..539135f 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,33 +1,34 @@
 {
-  "extends": [
-    "airbnb",
-    "plugin:prettier/recommended",
-    "prettier/react"
-  ],
-  "parser": "babel-eslint",
-  "env": {
-    "browser": true,
-    "commonjs": true,
-    "es6": true,
-    "jest": true,
-    "node": true
-  },
-  "rules": {
-    "no-console": "off",
-    "no-underscore-dangle": "off",
-    "max-len": [
-      "warn",
-      {
-        "code": 80,
-        "tabWidth": 2,
-        "comments": 80,
-        "ignoreComments": false,
-        "ignoreTrailingComments": true,
-        "ignoreUrls": true,
-        "ignoreStrings": true,
-        "ignoreTemplateLiterals": true,
-        "ignoreRegExpLiterals": true
+    "env": {
+        "browser": true,
+        "commonjs": true,
+        "es6": true,
+        "jest": true,
+        "node": true
+    },
+    "extends": [
+        "airbnb-base",
+        "plugin:prettier/recommended"
+    ],
+    "parserOptions": {
+        "ecmaVersion": 12
+    },
+    "rules": {
+        "no-console": "off",
+        "no-underscore-dangle": "off",
+        "max-len": [
+          "warn",
+          {
+            "code": 80,
+            "tabWidth": 2,
+            "comments": 80,
+            "ignoreComments": false,
+            "ignoreTrailingComments": true,
+            "ignoreUrls": true,
+            "ignoreStrings": true,
+            "ignoreTemplateLiterals": true,
+            "ignoreRegExpLiterals": true
+          }
+        ]
       }
-    ]
-  }
 }
diff --git a/package.json b/package.json
index 71c2b06..586445c 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,8 @@
   },
   "lint-staged": {
     "src/**/\\*.js": [
-      "eslint --fix"
+      "npx eslint . --fix",
+      "git add"
     ],
     "!(src/**/\\*.js)": [
       "git add"

From f8cf96b5b32d13d267ded14d52313d5ae2e28784 Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Tue, 3 Nov 2020 17:22:39 -0300
Subject: [PATCH 082/147] Fix ES-lint errors

Co-authored-by: Marcos Filipe <marofelipe@live.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/authRoutes.js    |  3 ++-
 src/routes/commentRoutes.js | 10 ++++------
 src/routes/plantRoutes.js   |  4 ++--
 src/routes/topicRoutes.js   | 10 ++++++----
 src/schemas/userSchema.js   |  3 ++-
 5 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index c29b72c..3ba1303 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -39,10 +39,11 @@ router.post('/signup', async (req, res) => {
 
     await User.findOne({ username: newUserData.username });
 
-    if (result.error)
+    if (result.error) {
       return res
         .status(400)
         .send({ error: `Error while signing up. ${result.error}` });
+    }
 
     const user = new User(newUserData);
     await user.save();
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index f3bfcc2..bc6c881 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -7,8 +7,7 @@ const Comment = require('../models/Comment');
 
 router.post('/create/:topicId/:userId', async (req, res) => {
   try {
-    if (!req.body.text)
-      return res.status(400).send({ error: 'Comment should not be empty' });
+    if (!req.body.text) return res.status(400).send({ error: 'Comment should not be empty' });
 
     const comment = await Comment.create({
       ...req.body,
@@ -33,8 +32,7 @@ router.put('/update/:commentId', async (req, res) => {
     await Comment.findById(req.params.commentId);
     const newData = req.body;
 
-    if (!newData.text)
-      return res.status(400).send({ error: 'Comment should not be empty' });
+    if (!newData.text) return res.status(400).send({ error: 'Comment should not be empty' });
 
     await Comment.findOneAndUpdate({ _id: req.params.commentId }, req.body, {
       useFindAndModify: false,
@@ -75,7 +73,7 @@ router.post('/like/:commentId', async (req, res) => {
     await Comment.findOneAndUpdate(
       { _id: req.params.commentId },
       { $inc: { likes: 1 } },
-      { useFindAndModify: false }
+      { useFindAndModify: false },
     );
     return res.send({ message: 'Liked!' });
   } catch (err) {
@@ -88,7 +86,7 @@ router.post('/dislike/:commentId', async (req, res) => {
     await Comment.findOneAndUpdate(
       { _id: req.params.commentId },
       { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
+      { useFindAndModify: false },
     );
     return res.send({ message: 'Disliked!' });
   } catch (err) {
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 3985c29..4b3e297 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -124,7 +124,7 @@ router.put('/:plantId', async (req, res) => {
         gbifID,
         stateProvince,
       },
-      { new: true }
+      { new: true },
     );
 
     plant.topics = [];
@@ -137,7 +137,7 @@ router.put('/:plantId', async (req, res) => {
         await plantTopic.save();
 
         plant.topics.push(plantTopic);
-      })
+      }),
     );
 
     await plant.save();
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 878f1dd..4f2c570 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -14,10 +14,11 @@ router.post('/create/:plantId/:userId', async (req, res) => {
 
     const result = topicSchema.validate(req.body);
 
-    if (result.error)
+    if (result.error) {
       return res
         .status(400)
         .send({ error: `Error while creating topic. ${result.error}` });
+    }
 
     const topic = await Topic.create({
       ...req.body,
@@ -49,10 +50,11 @@ router.put('/update/:topicId', async (req, res) => {
     if (!newData.description) newData.description = topic.description;
 
     const result = topicSchema.validate(newData);
-    if (result.error)
+    if (result.error) {
       return res
         .status(400)
         .send({ error: `Error while creating topic. ${result.error}` });
+    }
 
     await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
       useFindAndModify: false,
@@ -109,7 +111,7 @@ router.post('/like/:topicId', async (req, res) => {
     await Topic.findOneAndUpdate(
       { _id: req.params.topicId },
       { $inc: { likes: 1 } },
-      { useFindAndModify: false }
+      { useFindAndModify: false },
     );
     return res.send({ message: 'Liked!' });
   } catch (err) {
@@ -122,7 +124,7 @@ router.post('/dislike/:topicId', async (req, res) => {
     await Topic.findOneAndUpdate(
       { _id: req.params.topicId },
       { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
+      { useFindAndModify: false },
     );
     return res.send({ message: 'Disliked!' });
   } catch (err) {
diff --git a/src/schemas/userSchema.js b/src/schemas/userSchema.js
index 20101d6..49f72f3 100644
--- a/src/schemas/userSchema.js
+++ b/src/schemas/userSchema.js
@@ -1,7 +1,8 @@
 const Joi = require('joi');
 
 const userSchema = Joi.object({
-  username: Joi.string().alphanum().min(4).max(30).required(),
+  username: Joi.string().alphanum().min(4).max(30)
+    .required(),
   password: Joi.string().min(8).required(),
   passwordConfirmation: Joi.string()
     .min(8)

From cdb336bac807485c0bce6f21a7aaec3bd4a5f0c7 Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Tue, 3 Nov 2020 17:30:05 -0300
Subject: [PATCH 083/147] Change husky script call

Co-authored-by: Marcos Filipe <marofelipe@live.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 package.json | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 586445c..abdfbd3 100644
--- a/package.json
+++ b/package.json
@@ -10,11 +10,12 @@
     "lint:js:fix": "npm run lint:js -- --fix"
   },
   "lint-staged": {
-    "src/**/\\*.js": [
+    "src/**/*.js": [
       "npx eslint . --fix",
       "git add"
     ],
-    "!(src/**/\\*.js)": [
+    "src/*.js": [
+      "npx eslint . --fix",
       "git add"
     ]
   },

From 30b77d64fbc6bf56ee9c40221e1655643f0be895 Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Tue, 3 Nov 2020 17:37:23 -0300
Subject: [PATCH 084/147] Add prettier module to package.json

Co-authored-by: Marcos Filipe <marofelipe@live.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 package-lock.json | 42 ++++++++++++++++++++++++++++++++++++++++++
 package.json      |  5 ++++-
 2 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/package-lock.json b/package-lock.json
index afc7a4d..266fd0e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1040,6 +1040,15 @@
         "object.entries": "^1.1.2"
       }
     },
+    "eslint-config-prettier": {
+      "version": "6.15.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz",
+      "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^6.0.0"
+      }
+    },
     "eslint-import-resolver-node": {
       "version": "0.3.4",
       "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
@@ -1142,6 +1151,14 @@
         }
       }
     },
+    "eslint-plugin-prettier": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz",
+      "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==",
+      "requires": {
+        "prettier-linter-helpers": "^1.0.0"
+      }
+    },
     "eslint-scope": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -1337,6 +1354,11 @@
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
       "dev": true
     },
+    "fast-diff": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w=="
+    },
     "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",
@@ -1505,6 +1527,12 @@
       "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
       "dev": true
     },
+    "get-stdin": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+      "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+      "dev": true
+    },
     "get-stream": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
@@ -2894,6 +2922,20 @@
       "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
       "dev": true
     },
+    "prettier": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
+      "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==",
+      "dev": true
+    },
+    "prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "requires": {
+        "fast-diff": "^1.1.2"
+      }
+    },
     "process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
diff --git a/package.json b/package.json
index abdfbd3..6da81b9 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
   "dependencies": {
     "axios": "^0.21.0",
     "dotenv": "^8.2.0",
+    "eslint-plugin-prettier": "^3.1.4",
     "express": "^4.17.1",
     "joi": "^17.3.0",
     "jsonwebtoken": "^8.5.1",
@@ -47,9 +48,11 @@
   "devDependencies": {
     "eslint": "^7.12.1",
     "eslint-config-airbnb-base": "^14.2.0",
+    "eslint-config-prettier": "^6.15.0",
     "eslint-plugin-import": "^2.22.1",
     "husky": "^4.3.0",
     "lint-staged": "^10.5.1",
-    "nodemon": "^2.0.6"
+    "nodemon": "^2.0.6",
+    "prettier": "^2.1.2"
   }
 }

From b7d6c626f145fe231ee420e030a612faf3a0ee9f Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Tue, 3 Nov 2020 18:40:12 -0300
Subject: [PATCH 085/147] Fix eslint errors

Co-authored-by: Marcos Filipe <marofelipe@live.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/commentRoutes.js | 10 ++++++----
 src/routes/plantRoutes.js   |  4 ++--
 src/routes/topicRoutes.js   |  4 ++--
 src/schemas/userSchema.js   |  3 +--
 4 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index bc6c881..f3bfcc2 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -7,7 +7,8 @@ const Comment = require('../models/Comment');
 
 router.post('/create/:topicId/:userId', async (req, res) => {
   try {
-    if (!req.body.text) return res.status(400).send({ error: 'Comment should not be empty' });
+    if (!req.body.text)
+      return res.status(400).send({ error: 'Comment should not be empty' });
 
     const comment = await Comment.create({
       ...req.body,
@@ -32,7 +33,8 @@ router.put('/update/:commentId', async (req, res) => {
     await Comment.findById(req.params.commentId);
     const newData = req.body;
 
-    if (!newData.text) return res.status(400).send({ error: 'Comment should not be empty' });
+    if (!newData.text)
+      return res.status(400).send({ error: 'Comment should not be empty' });
 
     await Comment.findOneAndUpdate({ _id: req.params.commentId }, req.body, {
       useFindAndModify: false,
@@ -73,7 +75,7 @@ router.post('/like/:commentId', async (req, res) => {
     await Comment.findOneAndUpdate(
       { _id: req.params.commentId },
       { $inc: { likes: 1 } },
-      { useFindAndModify: false },
+      { useFindAndModify: false }
     );
     return res.send({ message: 'Liked!' });
   } catch (err) {
@@ -86,7 +88,7 @@ router.post('/dislike/:commentId', async (req, res) => {
     await Comment.findOneAndUpdate(
       { _id: req.params.commentId },
       { $inc: { dislikes: 1 } },
-      { useFindAndModify: false },
+      { useFindAndModify: false }
     );
     return res.send({ message: 'Disliked!' });
   } catch (err) {
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 4b3e297..3985c29 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -124,7 +124,7 @@ router.put('/:plantId', async (req, res) => {
         gbifID,
         stateProvince,
       },
-      { new: true },
+      { new: true }
     );
 
     plant.topics = [];
@@ -137,7 +137,7 @@ router.put('/:plantId', async (req, res) => {
         await plantTopic.save();
 
         plant.topics.push(plantTopic);
-      }),
+      })
     );
 
     await plant.save();
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 4f2c570..d03c9c6 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -111,7 +111,7 @@ router.post('/like/:topicId', async (req, res) => {
     await Topic.findOneAndUpdate(
       { _id: req.params.topicId },
       { $inc: { likes: 1 } },
-      { useFindAndModify: false },
+      { useFindAndModify: false }
     );
     return res.send({ message: 'Liked!' });
   } catch (err) {
@@ -124,7 +124,7 @@ router.post('/dislike/:topicId', async (req, res) => {
     await Topic.findOneAndUpdate(
       { _id: req.params.topicId },
       { $inc: { dislikes: 1 } },
-      { useFindAndModify: false },
+      { useFindAndModify: false }
     );
     return res.send({ message: 'Disliked!' });
   } catch (err) {
diff --git a/src/schemas/userSchema.js b/src/schemas/userSchema.js
index 49f72f3..20101d6 100644
--- a/src/schemas/userSchema.js
+++ b/src/schemas/userSchema.js
@@ -1,8 +1,7 @@
 const Joi = require('joi');
 
 const userSchema = Joi.object({
-  username: Joi.string().alphanum().min(4).max(30)
-    .required(),
+  username: Joi.string().alphanum().min(4).max(30).required(),
   password: Joi.string().min(8).required(),
   passwordConfirmation: Joi.string()
     .min(8)

From 9b293a4e267921d4329e7f48e2206ae849098d67 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Fri, 6 Nov 2020 15:19:40 -0300
Subject: [PATCH 086/147] change the response of routes to be a topic, to
 upgrade the refresh page

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/commentRoutes.js | 4 ++--
 src/routes/scanner.js       | 2 +-
 src/routes/topicRoutes.js   | 6 ++++--
 3 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index f3bfcc2..05fb60b 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -15,14 +15,14 @@ router.post('/create/:topicId/:userId', async (req, res) => {
       user: req.params.userId,
       topic: req.params.topicId,
     });
-    const topic = await Topic.findById(req.params.topicId);
+    const topic = await Topic.findById(req.params.topicId).populate([{path:'comments',populate:{path:'user'}},{path:'user'},{path:'plant'}]);;
 
     await comment.save();
 
     topic.comments.push(comment);
     await topic.save();
 
-    return res.send({ message: 'Comment successfully registered.' });
+    return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
diff --git a/src/routes/scanner.js b/src/routes/scanner.js
index a8deaf5..d855945 100644
--- a/src/routes/scanner.js
+++ b/src/routes/scanner.js
@@ -37,7 +37,7 @@ router.post('/',async(req,res,next) => {
         const response = await axios.post(`https://my-api.plantnet.org/v2/identify/all?api-key=${apiKey}`,form, {headers: form.getHeaders()});
         fs.unlinkSync(filePath);
         
-        res.send(response.data.results);
+        res.send(response.data);
     }catch(err){
         if(Array.isArray(err)) res.status(400).send({errors : err});
         next(err);
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 8b988fe..e584fcd 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -107,8 +107,8 @@ router.get('/list', async (req, res) => {
 router.get('/find/:topicId', async (req, res) => {
     try {
 
-        const topic = await Topic.findById(req.params.topicId).populate(['user']);
-
+        const topic = await Topic.findById(req.params.topicId)
+          .populate([{path:'comments',populate:{path:'user'}},{path:'user'},{path:'plant'}]);
         return res.send({ topic });
 
     } catch (err) {
@@ -120,6 +120,7 @@ router.post('/like/:topicId', async (req, res) => {
     try {
 
         const topic = await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
+        .populate([{path:'comments',populate:{path:'user'}},{path:'user'},{path:'plant'}]);
         res.send(topic)
         
     } catch (err) {
@@ -131,6 +132,7 @@ router.post('/dislike/:topicId', async (req, res) => {
     try {
 
         const topic = await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
+        .populate([{path:'comments',populate:{path:'user'}},{path:'user'},{path:'plant'}]);
         res.send(topic)
         
         

From 9ee9b96e35532d15391c5b4c829b6e813fed9c66 Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Mon, 9 Nov 2020 18:14:00 -0300
Subject: [PATCH 087/147] Fix dev dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: João Vítor Morandi <joao.lemos4000@gmail.com>
---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 6da81b9..bee26a5 100644
--- a/package.json
+++ b/package.json
@@ -38,7 +38,6 @@
   "dependencies": {
     "axios": "^0.21.0",
     "dotenv": "^8.2.0",
-    "eslint-plugin-prettier": "^3.1.4",
     "express": "^4.17.1",
     "joi": "^17.3.0",
     "jsonwebtoken": "^8.5.1",
@@ -50,6 +49,7 @@
     "eslint-config-airbnb-base": "^14.2.0",
     "eslint-config-prettier": "^6.15.0",
     "eslint-plugin-import": "^2.22.1",
+    "eslint-plugin-prettier": "^3.1.4",
     "husky": "^4.3.0",
     "lint-staged": "^10.5.1",
     "nodemon": "^2.0.6",

From 0b991fd9e6102874bf5d2b3f8c3019403140c3f6 Mon Sep 17 00:00:00 2001
From: Antonio Ruan Moura Barreto <ruanmoura13@outlook.com>
Date: Tue, 10 Nov 2020 19:22:24 -0300
Subject: [PATCH 088/147] Modified response of Comment create, and add topic
 find by id router

Co-authored-by: Marcos Filipe <marofelipe@live.com>
---
 package.json                |  6 ++++--
 src/index.js                |  2 +-
 src/routes/commentRoutes.js | 14 +++++++++++---
 src/routes/topicRoutes.js   | 14 ++++++++++++++
 4 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/package.json b/package.json
index 4dcaec5..c6b3acf 100644
--- a/package.json
+++ b/package.json
@@ -11,10 +11,12 @@
   },
   "lint-staged": {
     "src/**/*.{js,jsx}": [
-      "npx eslint . --fix", "git add"
+      "npx eslint . --fix",
+      "git add"
     ],
     "src/*.{js,jsx}": [
-      "npx eslint . --fix", "git add"
+      "npx eslint . --fix",
+      "git add"
     ]
   },
   "husky": {
diff --git a/src/index.js b/src/index.js
index d4d2616..19cf9c0 100644
--- a/src/index.js
+++ b/src/index.js
@@ -13,7 +13,7 @@ const commentRoutes = require('./routes/commentRoutes');
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
 // mongodb://mongo:27017/backend => banco de dados da develop
 mongoose
-  .connect('mongodb://localhost:27017/noderest', { useNewUrlParser: true })
+  .connect('mongodb://mongo:27017/backend', { useNewUrlParser: true })
   .then(() => console.log('MongoDB Connected'))
   .catch((err) => console.log(err));
 
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index f3bfcc2..79f12dd 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -15,14 +15,22 @@ router.post('/create/:topicId/:userId', async (req, res) => {
       user: req.params.userId,
       topic: req.params.topicId,
     });
-    const topic = await Topic.findById(req.params.topicId);
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
 
     await comment.save();
 
     topic.comments.push(comment);
     await topic.save();
-
-    return res.send({ message: 'Comment successfully registered.' });
+    const topicCorrect = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
+    return res.send(topicCorrect);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 878f1dd..a1e9acb 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -132,4 +132,18 @@ router.post('/dislike/:topicId', async (req, res) => {
   }
 });
 
+router.get('/find/:topicId', async (req, res) => {
+  try {
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
+
+    return res.send({ topic });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while find topic id.${err}` });
+  }
+});
+
 module.exports = router;

From 552a5846644b3ee5b32a51915f6269eb3141d13c Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 00:14:44 -0300
Subject: [PATCH 089/147] Adding Likes's model and commentLike route and this
 route check if the user liked the post previously

---
 src/models/Comment.js       | 12 +++----
 src/models/Likes.js         | 25 +++++++++++++++
 src/models/Topic.js         | 12 +++----
 src/routes/auth.js          |  2 +-
 src/routes/commentRoutes.js | 64 +++++++++++++++++++++++++------------
 src/routes/topicRoutes.js   |  6 ++--
 6 files changed, 81 insertions(+), 40 deletions(-)
 create mode 100644 src/models/Likes.js

diff --git a/src/models/Comment.js b/src/models/Comment.js
index 79ff587..f6afa51 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -17,14 +17,10 @@ const CommentSchema = new mongoose.Schema({
     ref: 'Topic',
     require: true,
   },
-  likes: {
-    type: Number,
-    default: 0,
-  },
-  dislikes: {
-    type: Number,
-    default: 0,
-  },
+  likes: [{
+    type: Schema.Types.ObjectId,
+    ref: 'Like',
+  }],
 });
 
 const Comment = mongoose.model('Comment', CommentSchema);
diff --git a/src/models/Likes.js b/src/models/Likes.js
new file mode 100644
index 0000000..b8ed582
--- /dev/null
+++ b/src/models/Likes.js
@@ -0,0 +1,25 @@
+const mongoose = require('mongoose');
+
+const { Schema } = mongoose;
+
+const likeSchema = new Schema({
+    user: {
+        type: mongoose.Schema.Types.ObjectId,
+        ref: 'User',
+        require: true,
+    },
+    topic: {
+        type: Schema.Types.ObjectId,
+        ref: 'Topic',
+        
+    },
+    comment: {
+        type: Schema.Types.ObjectId,
+        ref: 'Comment',
+        
+    },
+});
+
+const Like = mongoose.model('Like', likeSchema);
+
+module.exports = Like;
diff --git a/src/models/Topic.js b/src/models/Topic.js
index 9b41e3c..f8f541a 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -20,14 +20,10 @@ const topicSchema = new Schema({
     ref: 'User',
     require: true,
   },
-  likes: {
-    type: Number,
-    default: 0,
-  },
-  dislikes: {
-    type: Number,
-    default: 0,
-  },
+  likes: [{
+    type: Schema.Types.ObjectId,
+    ref: 'Like',
+  }],
   comments: [
     {
       type: Schema.Types.ObjectId,
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 2b6ba85..6811563 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -3,7 +3,7 @@ require('dotenv').config();
 const jwt = require('jsonwebtoken');
 
 const authConfig = {
-  secret: process.env.SECRET,
+  secret: 'd41d8cd98f00b204e9800998ecf8427e',
 };
 function auth(req, res, next) {
   const sessiontoken = req.headers.authtoken;
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 79f12dd..1cd1f0c 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,11 +1,13 @@
 const express = require('express');
 
 const router = express.Router();
-
+const User = require('../models/User');
+const Like = require('../models/Likes');
 const Topic = require('../models/Topic');
 const Comment = require('../models/Comment');
+const { auth, authConfig } = require('./auth');
 
-router.post('/create/:topicId/:userId', async (req, res) => {
+router.post('/create/:topicId/:userId',auth, async (req, res) => {
   try {
     if (!req.body.text)
       return res.status(400).send({ error: 'Comment should not be empty' });
@@ -78,32 +80,52 @@ router.delete('/delete/:commentId', async (req, res) => {
   }
 });
 
-router.post('/like/:commentId', async (req, res) => {
+router.post('/like/:commentId/:userId', async (req, res) => {
   try {
-    await Comment.findOneAndUpdate(
-      { _id: req.params.commentId },
-      { $inc: { likes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Liked!' });
+    const user = await User.findById(req.params.userId);
+    const comment = await Comment.findById(req.params.commentId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    const isLiked = await Like.findOne({user:req.params.userId})
+    console.log(isLiked == null)
+    if(isLiked == null){
+    const like = await Like.create({
+      user: user,
+      comment: comment,
+    });
+    await like.save();
+    comment.likes.push(like);
+    await comment.save();
+    const commenttrue = await Comment.findById(req.params.commentId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    return res.send(commenttrue);
+  }
+  else{
+    return res.send(comment);
+  }
   } catch (err) {
-    return res.status(400).send({ error: `Error while liking comment.${err}` });
+    return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.post('/dislike/:commentId', async (req, res) => {
+router.post('/dislike/:commentId/:userId', async (req, res) => {
   try {
-    await Comment.findOneAndUpdate(
-      { _id: req.params.commentId },
-      { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Disliked!' });
+    const like = Like.findOne({user:req.params.userId})
+    // await Like.findByIdAndRemove({user:req.params.userId});
+    const commenttrue = await Comment.findById(req.params.commentId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    return res.send(like);
+  
   } catch (err) {
-    return res
-      .status(400)
-      .send({ error: `Error while linking comment.${err}` });
+    return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
-
 module.exports = router;
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index a1e9acb..43effc9 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -96,8 +96,10 @@ router.delete('/delete/:topicId', async (req, res) => {
 
 router.get('/list', async (req, res) => {
   try {
-    const topic = await Topic.find().populate(['user']);
-
+    const topic = await Topic.find().populate([
+      { path: 'likes'},
+      { path: 'comments' },
+    ]);
     return res.send({ topic });
   } catch (err) {
     return res.status(400).send({ error: `Error while listing topics.${err}` });

From 2afa3cccc95dfbb93a4f0caf5040099a7832258d Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 01:44:11 -0300
Subject: [PATCH 090/147] Adding topicLike route and this route check if the
 user is auth

---
 src/routes/auth.js          |  2 +-
 src/routes/commentRoutes.js |  5 ++---
 src/routes/topicRoutes.js   | 39 +++++++++++++++++++++++++++----------
 3 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/src/routes/auth.js b/src/routes/auth.js
index 6811563..b0951f8 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -26,7 +26,7 @@ function auth(req, res, next) {
 
   try {
     const { userId } = jwt.verify(token, authConfig.secret);
-    req.userId = userId;
+    res.userId = userId;
     return next();
   } catch (err) {
     req.redirect('/login_page');
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 1cd1f0c..bbd9cdb 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -80,7 +80,7 @@ router.delete('/delete/:commentId', async (req, res) => {
   }
 });
 
-router.post('/like/:commentId/:userId', async (req, res) => {
+router.post('/like/:commentId/:userId',auth, async (req, res) => {
   try {
     const user = await User.findById(req.params.userId);
     const comment = await Comment.findById(req.params.commentId).populate([
@@ -88,8 +88,7 @@ router.post('/like/:commentId/:userId', async (req, res) => {
       { path: 'user' },
       { path: 'toppic' },
     ]);
-    const isLiked = await Like.findOne({user:req.params.userId})
-    console.log(isLiked == null)
+    const isLiked = await Like.findOne({user:req.params.userId,comment:req.params.commentId})
     if(isLiked == null){
     const like = await Like.create({
       user: user,
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 43effc9..62a6ef0 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -1,12 +1,12 @@
 const express = require('express');
 
 const router = express.Router();
-
+const Like = require('../models/Likes');
 const Topic = require('../models/Topic');
 const User = require('../models/User');
 const Plant = require('../models/Plant');
 const topicSchema = require('../schemas/topicSchema');
-
+const { auth, authConfig } = require('./auth');
 router.post('/create/:plantId/:userId', async (req, res) => {
   try {
     const user = await User.findById(req.params.userId);
@@ -106,16 +106,35 @@ router.get('/list', async (req, res) => {
   }
 });
 
-router.post('/like/:topicId', async (req, res) => {
+router.post('/like/:topicId/:userId',auth, async (req, res) => {
   try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { likes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Liked!' });
+    const user = await User.findById(req.params.userId);
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    const isLiked = await Like.findOne({user:req.params.userId,topic:req.params.topicId})
+    if(isLiked == null){
+    const like = await Like.create({
+      user: user,
+      topic: topic,
+    });
+    await like.save();
+    topic.likes.push(like);
+    await topic.save();
+    const topictrue = await Topic.findById(req.params.topicId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    return res.send(topictrue);
+  }
+  else{
+    return res.send(topic);
+  }
   } catch (err) {
-    return res.status(400).send({ error: `Error while liking topic.${err}` });
+    return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 

From 0faa6d26050862ff3d107ed6dd34f84e3e83bf3b Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 13:43:16 -0300
Subject: [PATCH 091/147] Adding dislike toppic and comment routes

Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/commentRoutes.js | 23 +++++++++++++----------
 src/routes/topicRoutes.js   | 22 +++++++++++-----------
 2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index bbd9cdb..8e2c338 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -112,19 +112,22 @@ router.post('/like/:commentId/:userId',auth, async (req, res) => {
   }
 });
 
-router.post('/dislike/:commentId/:userId', async (req, res) => {
+router.post('/dislike/:commentId/:userId',auth, async (req, res) => {
   try {
-    const like = Like.findOne({user:req.params.userId})
-    // await Like.findByIdAndRemove({user:req.params.userId});
-    const commenttrue = await Comment.findById(req.params.commentId).populate([
-      { path: 'likes'},
-      { path: 'user' },
-      { path: 'toppic' },
-    ]);
-    return res.send(like);
-  
+    const comment = await Comment.findById(req.params.commentId);
+    const like = await Like.findOne({user:req.params.userId,comment:req.params.commentId});
+    const index = comment.likes.indexOf(like._id);
+    if (index > -1) {
+      comment.likes.splice(index, 1);
+    }
+
+    comment.save();
+
+    await Like.findByIdAndRemove(like._id).populate('user');
+    return res.send(comment);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
+
 module.exports = router;
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 62a6ef0..6d39415 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -138,21 +138,21 @@ router.post('/like/:topicId/:userId',auth, async (req, res) => {
   }
 });
 
-router.post('/dislike/:topicId', async (req, res) => {
+router.post('/dislike/:topicId/:userId',auth, async (req, res) => {
   try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Disliked!' });
+    const topic = await Topic.findById(req.params.topicId);
+    const like = await Like.findOne({user:req.params.userId,topic:req.params.topicId});
+    const index = topic.likes.indexOf(like._id);
+    if (index > -1) {
+      topic.likes.splice(index, 1);
+    }
+    topic.save();
+    await Like.findByIdAndRemove(like._id).populate('user');
+    return res.send(topic);
   } catch (err) {
-    return res
-      .status(400)
-      .send({ error: `Error while dislikinng topic.${err}` });
+    return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
-
 router.get('/find/:topicId', async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId).populate([

From 1d40bb7bdd76e3e90f1f2dcfaf930680494db8b8 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 16:21:19 -0300
Subject: [PATCH 092/147] userId now came from authtoken, not url more

Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/auth.js          | 15 ++++++++++-----
 src/routes/commentRoutes.js | 36 +++++++++++++++++++++++++-----------
 src/routes/topicRoutes.js   |  7 +++++--
 3 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/src/routes/auth.js b/src/routes/auth.js
index b0951f8..1017bf9 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -24,13 +24,18 @@ function auth(req, res, next) {
     return res.status(401).send({ Error: 'Token malformated' });
   }
 
+  
+  jwt.verify(token, authConfig.secret, function(err ,decoded){
   try {
-    const { userId } = jwt.verify(token, authConfig.secret);
-    res.userId = userId;
-    return next();
-  } catch (err) {
-    req.redirect('/login_page');
+    req.userId = decoded.id;
+    console.log(decoded.id)
+    next();
+  } 
+  catch (err) {
     return res.status(400);
   }
+  });
+    
+ 
 }
 module.exports = { authConfig, auth };
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 8e2c338..30395a4 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,5 +1,5 @@
 const express = require('express');
-
+const jwt = require('jsonwebtoken');
 const router = express.Router();
 const User = require('../models/User');
 const Like = require('../models/Likes');
@@ -80,15 +80,20 @@ router.delete('/delete/:commentId', async (req, res) => {
   }
 });
 
-router.post('/like/:commentId/:userId',auth, async (req, res) => {
+router.post('/like/:commentId',auth, async (req, res) => {
   try {
-    const user = await User.findById(req.params.userId);
+    const user = await User.findById(req.userId);
     const comment = await Comment.findById(req.params.commentId).populate([
       { path: 'likes'},
       { path: 'user' },
       { path: 'toppic' },
     ]);
-    const isLiked = await Like.findOne({user:req.params.userId,comment:req.params.commentId})
+    const topic = await Topic.findById(comment.topic).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    const isLiked = await Like.findOne({user:req.userId,comment:req.params.commentId})
     if(isLiked == null){
     const like = await Like.create({
       user: user,
@@ -97,25 +102,27 @@ router.post('/like/:commentId/:userId',auth, async (req, res) => {
     await like.save();
     comment.likes.push(like);
     await comment.save();
-    const commenttrue = await Comment.findById(req.params.commentId).populate([
+    const topicTrue = await Topic.findById(comment.topic).populate([
       { path: 'likes'},
       { path: 'user' },
-      { path: 'toppic' },
+      { path: 'comments' },
     ]);
-    return res.send(commenttrue);
+    return res.send(topicTrue);
   }
   else{
-    return res.send(comment);
+    return res.send(topic);
   }
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.post('/dislike/:commentId/:userId',auth, async (req, res) => {
+router.post('/dislike/:commentId',auth, async (req, res) => {
   try {
     const comment = await Comment.findById(req.params.commentId);
-    const like = await Like.findOne({user:req.params.userId,comment:req.params.commentId});
+    const topic = await Topic.findById(comment.topic);
+    const like = await Like.findOne({user:req.userId,comment:req.params.commentId});
+    if(like != null){
     const index = comment.likes.indexOf(like._id);
     if (index > -1) {
       comment.likes.splice(index, 1);
@@ -124,7 +131,14 @@ router.post('/dislike/:commentId/:userId',auth, async (req, res) => {
     comment.save();
 
     await Like.findByIdAndRemove(like._id).populate('user');
-    return res.send(comment);
+    const topicTrue = await Topic.findById(comment.topic).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'comments' },
+    ]);
+    return res.send(topicTrue);
+    }
+    return res.send(topic);  
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 6d39415..3c4ef47 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -118,7 +118,7 @@ router.post('/like/:topicId/:userId',auth, async (req, res) => {
     if(isLiked == null){
     const like = await Like.create({
       user: user,
-      topic: topic,
+      topic: topic
     });
     await like.save();
     topic.likes.push(like);
@@ -128,9 +128,11 @@ router.post('/like/:topicId/:userId',auth, async (req, res) => {
       { path: 'user' },
       { path: 'toppic' },
     ]);
+    console.log(topictrue.likes.length)
     return res.send(topictrue);
   }
   else{
+    console.log(topic.likes.length)
     return res.send(topic);
   }
   } catch (err) {
@@ -146,6 +148,7 @@ router.post('/dislike/:topicId/:userId',auth, async (req, res) => {
     if (index > -1) {
       topic.likes.splice(index, 1);
     }
+    console.log(topic.likes.length)
     topic.save();
     await Like.findByIdAndRemove(like._id).populate('user');
     return res.send(topic);
@@ -161,7 +164,7 @@ router.get('/find/:topicId', async (req, res) => {
       { path: 'plant' },
     ]);
 
-    return res.send({ topic });
+    return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while find topic id.${err}` });
   }

From 1f0e2e3372422286ddffe43f40f7f1cacd9bba00 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 18:23:57 -0300
Subject: [PATCH 093/147] adding eslint on my pages

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/models/Comment.js       | 10 +++--
 src/models/Likes.js         | 28 ++++++------
 src/models/Topic.js         | 10 +++--
 src/routes/auth.js          | 17 +++-----
 src/routes/commentRoutes.js | 85 +++++++++++++++++++------------------
 src/routes/topicRoutes.js   | 60 ++++++++++++++------------
 6 files changed, 107 insertions(+), 103 deletions(-)

diff --git a/src/models/Comment.js b/src/models/Comment.js
index f6afa51..4388c13 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -17,10 +17,12 @@ const CommentSchema = new mongoose.Schema({
     ref: 'Topic',
     require: true,
   },
-  likes: [{
-    type: Schema.Types.ObjectId,
-    ref: 'Like',
-  }],
+  likes: [
+    {
+      type: Schema.Types.ObjectId,
+      ref: 'Like',
+    },
+  ],
 });
 
 const Comment = mongoose.model('Comment', CommentSchema);
diff --git a/src/models/Likes.js b/src/models/Likes.js
index b8ed582..b1527f3 100644
--- a/src/models/Likes.js
+++ b/src/models/Likes.js
@@ -3,21 +3,19 @@ const mongoose = require('mongoose');
 const { Schema } = mongoose;
 
 const likeSchema = new Schema({
-    user: {
-        type: mongoose.Schema.Types.ObjectId,
-        ref: 'User',
-        require: true,
-    },
-    topic: {
-        type: Schema.Types.ObjectId,
-        ref: 'Topic',
-        
-    },
-    comment: {
-        type: Schema.Types.ObjectId,
-        ref: 'Comment',
-        
-    },
+  user: {
+    type: mongoose.Schema.Types.ObjectId,
+    ref: 'User',
+    require: true,
+  },
+  topic: {
+    type: Schema.Types.ObjectId,
+    ref: 'Topic',
+  },
+  comment: {
+    type: Schema.Types.ObjectId,
+    ref: 'Comment',
+  },
 });
 
 const Like = mongoose.model('Like', likeSchema);
diff --git a/src/models/Topic.js b/src/models/Topic.js
index f8f541a..68daa6c 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -20,10 +20,12 @@ const topicSchema = new Schema({
     ref: 'User',
     require: true,
   },
-  likes: [{
-    type: Schema.Types.ObjectId,
-    ref: 'Like',
-  }],
+  likes: [
+    {
+      type: Schema.Types.ObjectId,
+      ref: 'Like',
+    },
+  ],
   comments: [
     {
       type: Schema.Types.ObjectId,
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 1017bf9..4d7e317 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -3,7 +3,7 @@ require('dotenv').config();
 const jwt = require('jsonwebtoken');
 
 const authConfig = {
-  secret: 'd41d8cd98f00b204e9800998ecf8427e',
+  secret: process.env.SECRET,
 };
 function auth(req, res, next) {
   const sessiontoken = req.headers.authtoken;
@@ -24,18 +24,13 @@ function auth(req, res, next) {
     return res.status(401).send({ Error: 'Token malformated' });
   }
 
-  
-  jwt.verify(token, authConfig.secret, function(err ,decoded){
   try {
-    req.userId = decoded.id;
-    console.log(decoded.id)
-    next();
-  } 
-  catch (err) {
+    jwt.verify(token, authConfig.secret, (err, decoded) => {
+      req.userId = decoded.id;
+    });
+    return next();
+  } catch (err) {
     return res.status(400);
   }
-  });
-    
- 
 }
 module.exports = { authConfig, auth };
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 30395a4..538a1ca 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,13 +1,13 @@
 const express = require('express');
-const jwt = require('jsonwebtoken');
+
 const router = express.Router();
 const User = require('../models/User');
 const Like = require('../models/Likes');
 const Topic = require('../models/Topic');
 const Comment = require('../models/Comment');
-const { auth, authConfig } = require('./auth');
+const { auth } = require('./auth');
 
-router.post('/create/:topicId/:userId',auth, async (req, res) => {
+router.post('/create/:topicId/:userId', auth, async (req, res) => {
   try {
     if (!req.body.text)
       return res.status(400).send({ error: 'Comment should not be empty' });
@@ -80,65 +80,68 @@ router.delete('/delete/:commentId', async (req, res) => {
   }
 });
 
-router.post('/like/:commentId',auth, async (req, res) => {
+router.post('/like/:commentId', auth, async (req, res) => {
   try {
     const user = await User.findById(req.userId);
     const comment = await Comment.findById(req.params.commentId).populate([
-      { path: 'likes'},
+      { path: 'likes' },
       { path: 'user' },
       { path: 'toppic' },
     ]);
     const topic = await Topic.findById(comment.topic).populate([
-      { path: 'likes'},
+      { path: 'likes' },
       { path: 'user' },
       { path: 'toppic' },
     ]);
-    const isLiked = await Like.findOne({user:req.userId,comment:req.params.commentId})
-    if(isLiked == null){
-    const like = await Like.create({
-      user: user,
-      comment: comment,
+    const isLiked = await Like.findOne({
+      user: req.userId,
+      comment: req.params.commentId,
     });
-    await like.save();
-    comment.likes.push(like);
-    await comment.save();
-    const topicTrue = await Topic.findById(comment.topic).populate([
-      { path: 'likes'},
-      { path: 'user' },
-      { path: 'comments' },
-    ]);
-    return res.send(topicTrue);
-  }
-  else{
+    if (isLiked == null) {
+      const like = await Like.create({
+        user,
+        comment,
+      });
+      await like.save();
+      comment.likes.push(like);
+      await comment.save();
+      const topicTrue = await Topic.findById(comment.topic).populate([
+        { path: 'likes' },
+        { path: 'user' },
+        { path: 'comments' },
+      ]);
+      return res.send(topicTrue);
+    }
     return res.send(topic);
-  }
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.post('/dislike/:commentId',auth, async (req, res) => {
+router.post('/dislike/:commentId', auth, async (req, res) => {
   try {
     const comment = await Comment.findById(req.params.commentId);
     const topic = await Topic.findById(comment.topic);
-    const like = await Like.findOne({user:req.userId,comment:req.params.commentId});
-    if(like != null){
-    const index = comment.likes.indexOf(like._id);
-    if (index > -1) {
-      comment.likes.splice(index, 1);
-    }
-
-    comment.save();
-
-    await Like.findByIdAndRemove(like._id).populate('user');
-    const topicTrue = await Topic.findById(comment.topic).populate([
-      { path: 'likes'},
-      { path: 'user' },
-      { path: 'comments' },
-    ]);
-    return res.send(topicTrue);
+    const like = await Like.findOne({
+      user: req.userId,
+      comment: req.params.commentId,
+    });
+    if (like != null) {
+      const index = comment.likes.indexOf(like._id);
+      if (index > -1) {
+        comment.likes.splice(index, 1);
+      }
+
+      comment.save();
+      await Like.findByIdAndRemove(like._id).populate('user');
+      const topicTrue = await Topic.findById(comment.topic).populate([
+        { path: 'likes' },
+        { path: 'user' },
+        { path: 'comments' },
+      ]);
+      return res.send(topicTrue);
     }
-    return res.send(topic);  
+    return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 3c4ef47..e0bf057 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -6,7 +6,8 @@ const Topic = require('../models/Topic');
 const User = require('../models/User');
 const Plant = require('../models/Plant');
 const topicSchema = require('../schemas/topicSchema');
-const { auth, authConfig } = require('./auth');
+const { auth } = require('./auth');
+
 router.post('/create/:plantId/:userId', async (req, res) => {
   try {
     const user = await User.findById(req.params.userId);
@@ -97,8 +98,9 @@ router.delete('/delete/:topicId', async (req, res) => {
 router.get('/list', async (req, res) => {
   try {
     const topic = await Topic.find().populate([
-      { path: 'likes'},
-      { path: 'comments' },
+      { path: 'likes' },
+      { path: 'comments', populate: { path: 'likes' } },
+      { path: 'user' },
     ]);
     return res.send({ topic });
   } catch (err) {
@@ -106,49 +108,51 @@ router.get('/list', async (req, res) => {
   }
 });
 
-router.post('/like/:topicId/:userId',auth, async (req, res) => {
+router.post('/like/:topicId', auth, async (req, res) => {
   try {
-    const user = await User.findById(req.params.userId);
+    const user = await User.findById(req.userId);
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'likes'},
+      { path: 'likes' },
       { path: 'user' },
       { path: 'toppic' },
     ]);
-    const isLiked = await Like.findOne({user:req.params.userId,topic:req.params.topicId})
-    if(isLiked == null){
-    const like = await Like.create({
-      user: user,
-      topic: topic
+    const isLiked = await Like.findOne({
+      user: req.params.userId,
+      topic: req.params.topicId,
     });
-    await like.save();
-    topic.likes.push(like);
-    await topic.save();
-    const topictrue = await Topic.findById(req.params.topicId).populate([
-      { path: 'likes'},
-      { path: 'user' },
-      { path: 'toppic' },
-    ]);
-    console.log(topictrue.likes.length)
-    return res.send(topictrue);
-  }
-  else{
-    console.log(topic.likes.length)
+    if (isLiked == null) {
+      const like = await Like.create({
+        user,
+        topic,
+      });
+      await like.save();
+      topic.likes.push(like);
+      await topic.save();
+      const topictrue = await Topic.findById(req.params.topicId).populate([
+        { path: 'likes' },
+        { path: 'user' },
+        { path: 'toppic' },
+      ]);
+      return res.send(topictrue);
+    }
+    console.log(topic.likes.length);
     return res.send(topic);
-  }
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.post('/dislike/:topicId/:userId',auth, async (req, res) => {
+router.post('/dislike/:topicId', auth, async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId);
-    const like = await Like.findOne({user:req.params.userId,topic:req.params.topicId});
+    const like = await Like.findOne({
+      user: req.userId,
+      topic: req.params.topicId,
+    });
     const index = topic.likes.indexOf(like._id);
     if (index > -1) {
       topic.likes.splice(index, 1);
     }
-    console.log(topic.likes.length)
     topic.save();
     await Like.findByIdAndRemove(like._id).populate('user');
     return res.send(topic);

From 3b530e4155616ea2f60804382551d03e78dbd1e3 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Fri, 16 Oct 2020 16:32:17 -0300
Subject: [PATCH 094/147] Create myPlant model, router and schema.

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/index.js                 |  11 ++++
 src/models/MyPlant.js        |  28 +++++++++
 src/models/User.js           |   5 ++
 src/routes/myPlantRoutes.js  | 109 +++++++++++++++++++++++++++++++++++
 src/schemas/myPlantSchema.js |   7 +++
 5 files changed, 160 insertions(+)
 create mode 100644 src/models/MyPlant.js
 create mode 100644 src/routes/myPlantRoutes.js
 create mode 100644 src/schemas/myPlantSchema.js

diff --git a/src/index.js b/src/index.js
index 19cf9c0..318b569 100644
--- a/src/index.js
+++ b/src/index.js
@@ -8,6 +8,9 @@ const authRoutes = require('./routes/authRoutes');
 const plantRoutes = require('./routes/plantRoutes');
 const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
+const authRoutes = require('./routes/authRoutes');
+const myPlantRoutes = require('./routes/myPlantRoutes');
+// MongoDB connection
 
 // MongoDB connection
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
@@ -23,11 +26,19 @@ app.use(express.urlencoded({ extended: false }));
 app.use(express.json());
 
 // routes
+<<<<<<< b56a03cde05eb469a13aa434806770292356f8cd
 
 app.use('/auth', authRoutes);
 app.use('/plant', plantRoutes);
 app.use('/topic', topicRoutes);
 app.use('/comment', commentRoutes);
+=======
+app.use('/plant',plantRoutes);
+app.use('/topic',topicRoutes);
+app.use('/comment',commentRoutes);
+app.use('/auth',authRoutes);
+app.use('/myplants',myPlantRoutes);
+>>>>>>> Create myPlant model, router and schema.
 
 // starting the server
 app.set('port', process.env.PORT || 3000);
diff --git a/src/models/MyPlant.js b/src/models/MyPlant.js
new file mode 100644
index 0000000..5d50ecf
--- /dev/null
+++ b/src/models/MyPlant.js
@@ -0,0 +1,28 @@
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+
+const myPlantSchema = new mongoose.Schema({
+    nickname: {
+        type: String,
+        required: true
+    },
+    user: {
+        type: Schema.Types.ObjectId,
+        ref: 'User',
+        require: true,
+    },
+    plant:{
+        type:mongoose.Schema.Types.ObjectId,
+        ref:'Plant',
+        require:true
+    },
+    createdAt: {
+        type: Date,
+        default: Date.now,
+    }
+});
+
+
+const myPlant = mongoose.model('MyPlants', myPlantSchema);
+
+module.exports = myPlant;
diff --git a/src/models/User.js b/src/models/User.js
index a88a9a2..5b0cb16 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -24,6 +24,11 @@ const userSchema = new Schema({
       require: true,
     },
   ],
+  myPlants: [{
+      type: mongoose.Schema.Types.ObjectId,
+      ref: 'MyPlants',
+      require: true,
+  }]
 });
 
 const User = mongoose.model('User', userSchema);
diff --git a/src/routes/myPlantRoutes.js b/src/routes/myPlantRoutes.js
new file mode 100644
index 0000000..edea84f
--- /dev/null
+++ b/src/routes/myPlantRoutes.js
@@ -0,0 +1,109 @@
+const express = require('express');
+const router = express.Router();
+
+const User = require('../models/User');
+const Plant = require('../models/Plant');
+const MyPlant = require('../models/MyPlant');
+
+const myPlantSchema = require('../schemas/myPlantSchema');
+
+router.get('/', async (req, res) => {
+    res.send({ message: 'User Backyard.'});
+});
+
+router.post('/add/:userId/:plantId', async (req, res) => {
+
+    try {
+        
+        const user = await User.findById(req.params.userId);
+        const plant = await Plant.findById(req.params.plantId);
+
+        const result = myPlantSchema.validate({ nickname: req.body.nickname});
+        if ( result.error ) return res.status(400).send({ error: 'Error while adding plant to backyard. ' + result.error});
+        
+        const myPlant = await MyPlant.create({user: user, nickname: req.body.nickname, plant: plant});
+
+        await user.myPlants.push(myPlant);
+        await user.save()
+            .then( () => {
+                return res.send(user);
+            });
+
+    } catch(err) {
+        console.log(err);
+        return res.status(400).send({ error: 'Error while adding plant to backyard.' + err});
+    }
+
+});
+
+router.get('/:userId/:myPlantId', async (req, res) => {
+
+    try {
+
+        const user = await User.findById(req.params.userId);
+        const index = user.myPlants.indexOf(req.params.myPlantId);
+
+        if (index > -1) {
+            const myPlant = await MyPlant.findById(req.params.myPlantId);
+            return res.send({
+                nickname: myPlant.nickname,
+                plant: myPlant.plant,
+                creation: myPlant.createdAt
+            });
+        } else {
+            return res.send({
+                message: "Backyard plant not found."
+            });
+        }
+
+    } catch(err) {
+        console.log(err);
+        return res.status(400).send({ error: 'Error while searching for plant.' + err});
+    }
+});
+
+router.put('/edit/:myPlantId', async (req, res) => {
+
+    try {
+        
+        const newNick = req.body;
+
+        const result = myPlantSchema.validate(newNick);
+        if ( result.error ) return res.status(400).send({ error: 'Error while editing plant. ' + result.error});
+
+        await MyPlant.findOneAndUpdate({_id: req.params.myPlantId}, newNick, { useFindAndModify: false});
+
+        return res.send({ message: 'Backyard plant updated successfully.'});
+
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while updating backyard plant.' + err });
+    }
+});
+
+router.delete('/delete/:myPlantId', async (req, res) => {
+
+    try {
+
+        const myPlant = await MyPlant.findById(req.params.myPlantId);
+        const user = await User.findById(myPlant.user);
+
+        const index = user.myPlants.indexOf(req.params.myPlantId);
+
+        if (index > -1) {
+            user.myPlants.splice(index, 1);
+        }
+
+        await user.save();
+
+        await MyPlant.findByIdAndRemove(req.params.myPlantId, { useFindAndModify: false });
+
+        return res.send({
+            message: 'Plant successfully removed from backyard.'
+        });
+
+    } catch(err) {
+        return res.status(400).send({ error: 'Error while deleting plant from backyard.' + err });
+    }
+});
+
+module.exports = router;
diff --git a/src/schemas/myPlantSchema.js b/src/schemas/myPlantSchema.js
new file mode 100644
index 0000000..77645ed
--- /dev/null
+++ b/src/schemas/myPlantSchema.js
@@ -0,0 +1,7 @@
+const Joi = require('joi');
+
+const myPlantSchema = Joi.object({
+    nickname: Joi.string().alphanum().min(2).max(20).required(),
+});
+
+module.exports = myPlantSchema;

From 252f72180cb878c1784452bcd4d7b07e3cf24ab9 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Tue, 27 Oct 2020 20:49:43 -0300
Subject: [PATCH 095/147] Update PR to follow codacy patterns

---
 src/index.js                 |  45 ++++++---
 src/models/Comment.js        |  52 +++++------
 src/models/MyPlant.js        |   8 +-
 src/models/Plant.js          | 113 ++++++++++++-----------
 src/models/Topic.js          |  73 +++++++--------
 src/models/User.js           |  17 ++--
 src/routes/auth.js           |  57 +++++++-----
 src/routes/authRoutes.js     |  92 +++++++++----------
 src/routes/commentRoutes.js  | 144 ++++++++++++++---------------
 src/routes/myPlantRoutes.js  |  52 ++++++-----
 src/routes/plantRoutes.js    | 172 +++++++++++++----------------------
 src/routes/topicRoutes.js    | 154 +++++++++++++++----------------
 src/schemas/myPlantSchema.js |   2 +-
 src/schemas/topicSchema.js   |   2 +-
 src/schemas/userSchema.js    |   2 +-
 15 files changed, 476 insertions(+), 509 deletions(-)

diff --git a/src/index.js b/src/index.js
index 318b569..4ba936e 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,33 +1,38 @@
 const express = require('express');
 
 const app = express();
-const morgan = require('morgan');
-const mongoose = require('mongoose');
-
-const authRoutes = require('./routes/authRoutes');
-const plantRoutes = require('./routes/plantRoutes');
-const topicRoutes = require('./routes/topicRoutes');
-const commentRoutes = require('./routes/commentRoutes');
-const authRoutes = require('./routes/authRoutes');
-const myPlantRoutes = require('./routes/myPlantRoutes');
+const morgan = require("morgan");
+const mongoose = require("mongoose");
+
+
+const authRoutes = require("./routes/authRoutes");
+const plantRoutes = require("./routes/plantRoutes");
+const topicRoutes = require("./routes/topicRoutes");
+const commentRoutes = require("./routes/commentRoutes");
+const myPlantRoutes = require("./routes/myPlantRoutes");
 // MongoDB connection
 
 // MongoDB connection
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
 // mongodb://mongo:27017/backend => banco de dados da develop
 mongoose
-  .connect('mongodb://mongo:27017/backend', { useNewUrlParser: true })
-  .then(() => console.log('MongoDB Connected'))
-  .catch((err) => console.log(err));
+    .connect(
+        "mongodb://mongo:27017/backend",
+        { useNewUrlParser: true }
+    )
+    .then(() => console.log("MongoDB Connected"))
+    .catch(err => console.log(err));
+
 
 // middlewares
-app.use(morgan('dev'));
-app.use(express.urlencoded({ extended: false }));
+app.use(morgan("dev"));
+app.use(express.urlencoded({extended: false}));
 app.use(express.json());
 
 // routes
 <<<<<<< b56a03cde05eb469a13aa434806770292356f8cd
 
+<<<<<<< 3b530e4155616ea2f60804382551d03e78dbd1e3
 app.use('/auth', authRoutes);
 app.use('/plant', plantRoutes);
 app.use('/topic', topicRoutes);
@@ -44,4 +49,16 @@ app.use('/myplants',myPlantRoutes);
 app.set('port', process.env.PORT || 3000);
 app.listen(app.get('port'), () => {
   console.log(`Server on port ${app.get('port')}`);
+=======
+app.use("/auth",authRoutes);
+app.use("/plant",plantRoutes);
+app.use("/topic",topicRoutes);
+app.use("/comment",commentRoutes);
+app.use("/myplants",myPlantRoutes);
+
+// starting the server
+app.set("port", process.env.PORT || 3000);
+app.listen(app.get("port"), () => {
+    console.log(`Server on port ${app.get("port")}`);
+>>>>>>> Update PR to follow codacy patterns
 });
diff --git a/src/models/Comment.js b/src/models/Comment.js
index 79ff587..1546fef 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -1,32 +1,32 @@
-const mongoose = require('mongoose');
-
-const { Schema } = mongoose;
+const mongoose = require("mongoose");
+const Schema = mongoose.Schema;
 
 const CommentSchema = new mongoose.Schema({
-  text: {
-    type: String,
-    require: true,
-  },
-  user: {
-    type: Schema.Types.ObjectId,
-    ref: 'User',
-    require: true,
-  },
-  topic: {
-    type: Schema.Types.ObjectId,
-    ref: 'Topic',
-    require: true,
-  },
-  likes: {
-    type: Number,
-    default: 0,
-  },
-  dislikes: {
-    type: Number,
-    default: 0,
-  },
+    text: {
+        type: String,
+        require: true,
+    },
+    user: {
+        type: Schema.Types.ObjectId,
+        ref: "User",
+        require: true,
+    },
+    topic: {
+        type: Schema.Types.ObjectId,
+        ref: "Topic",
+        require: true,
+    },
+    likes: {
+        type: Number,
+        default: 0
+    },
+    dislikes: {
+        type: Number,
+        default: 0
+    },
 });
 
-const Comment = mongoose.model('Comment', CommentSchema);
+
+const Comment = mongoose.model("Comment",CommentSchema);
 
 module.exports = Comment;
diff --git a/src/models/MyPlant.js b/src/models/MyPlant.js
index 5d50ecf..9a31369 100644
--- a/src/models/MyPlant.js
+++ b/src/models/MyPlant.js
@@ -1,4 +1,4 @@
-const mongoose = require('mongoose');
+const mongoose = require("mongoose");
 const Schema = mongoose.Schema;
 
 const myPlantSchema = new mongoose.Schema({
@@ -8,12 +8,12 @@ const myPlantSchema = new mongoose.Schema({
     },
     user: {
         type: Schema.Types.ObjectId,
-        ref: 'User',
+        ref: "User",
         require: true,
     },
     plant:{
         type:mongoose.Schema.Types.ObjectId,
-        ref:'Plant',
+        ref:"Plant",
         require:true
     },
     createdAt: {
@@ -23,6 +23,6 @@ const myPlantSchema = new mongoose.Schema({
 });
 
 
-const myPlant = mongoose.model('MyPlants', myPlantSchema);
+const myPlant = mongoose.model("MyPlants", myPlantSchema);
 
 module.exports = myPlant;
diff --git a/src/models/Plant.js b/src/models/Plant.js
index 3294204..72a8d20 100644
--- a/src/models/Plant.js
+++ b/src/models/Plant.js
@@ -1,63 +1,62 @@
-const mongoose = require('mongoose');
+const mongoose = require("mongoose");
 
 const PlantSchema = new mongoose.Schema({
-  scientificName: {
-    type: String,
-    require: true,
-    unique: true,
-  },
-  family_name: {
-    type: String,
-    require: true,
-  },
-  gender_name: {
-    type: String,
-    require: true,
-  },
-  specie_name: {
-    type: String,
-    require: true,
-  },
-  common_name: {
-    type: String,
-    require: true,
-  },
-  usage: {
-    type: String,
-    require: true,
-  },
-  first_User: {
-    type: String,
-    require: true,
-  },
-  collection_count: {
-    type: Number,
-    require: true,
-  },
-  extinction: {
-    type: Boolean,
-    require: true,
-  },
-  profile_picture: {
-    type: String,
-    require: true,
-  },
-  gbifID: {
-    type: Number,
-    require: true,
-  },
-  stateProvince: {
-    type: String,
-    require: true,
-  },
-  topics: [
-    {
-      type: mongoose.Schema.Types.ObjectId,
-      ref: 'Topic',
-    },
-  ],
+    scientificName: {
+        type: String,
+        require: true,
+        unique: true
+    },
+    family_name: {
+        type: String,
+        require: true
+    },
+    gender_name: {
+        type: String,
+        require: true
+    },
+    specie_name: {
+        type: String,
+        require: true
+    },
+    common_name: {
+        type: String,
+        require: true
+    },
+    usage: {
+        type: String,
+        require: true
+    },
+    first_User: {
+        type: String,
+        require: true
+    },
+    collection_count: {
+        type: Number,
+        require: true
+    },
+    extinction: {
+        type: Boolean,
+        require: true
+    },
+    profile_picture: {
+        type: String,
+        require : true
+    },   
+    gbifID: {
+        type: Number,
+        require: true,    
+    },
+    stateProvince: {
+        type: String,
+        require : true
+    },
+    topics: [{
+        type: mongoose.Schema.Types.ObjectId,
+        ref: "Topic",
+    }],
 });
 
-const Plant = mongoose.model('Plant', PlantSchema);
+
+const Plant = mongoose.model("Plant",PlantSchema);
 
 module.exports = Plant;
diff --git a/src/models/Topic.js b/src/models/Topic.js
index 9b41e3c..c995914 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -1,45 +1,42 @@
-const mongoose = require('mongoose');
-
-const { Schema } = mongoose;
+const mongoose = require("mongoose");
+const Schema = mongoose.Schema;
 
 const topicSchema = new Schema({
-  title: {
-    type: String,
-    require: true,
-  },
-  description: {
-    type: String,
-  },
-  plant: {
-    type: mongoose.Schema.Types.ObjectId,
-    ref: 'Plant',
-    require: true,
-  },
-  user: {
-    type: Schema.Types.ObjectId,
-    ref: 'User',
-    require: true,
-  },
-  likes: {
-    type: Number,
-    default: 0,
-  },
-  dislikes: {
-    type: Number,
-    default: 0,
-  },
-  comments: [
-    {
-      type: Schema.Types.ObjectId,
-      ref: 'Comment',
+    title: {
+        type: String,
+        require: true,
+    },
+    description: {
+        type: String,
+    },
+    plant:{
+        type:mongoose.Schema.Types.ObjectId,
+        ref:"Plant",
+        require:true
+    },
+    user: {
+        type: Schema.Types.ObjectId,
+        ref: "User",
+        require: true,
+    },
+    likes: {
+        type: Number,
+        default: 0
+    },
+    dislikes: {
+        type: Number,
+        default: 0
+    },
+    comments: [{
+        type: Schema.Types.ObjectId,
+        ref: "Comment"
+    }],
+    createdAt: {
+        type: Date,
+        default: Date.now,
     },
-  ],
-  createdAt: {
-    type: Date,
-    default: Date.now,
-  },
 });
 
-const Topic = mongoose.model('Topic', topicSchema);
+const Topic = mongoose.model("Topic", topicSchema);
 
 module.exports = Topic;
diff --git a/src/models/User.js b/src/models/User.js
index 5b0cb16..6558f8f 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -1,6 +1,5 @@
-const mongoose = require('mongoose');
-
-const { Schema } = mongoose;
+const mongoose = require("mongoose");
+const Schema = mongoose.Schema;
 
 const userSchema = new Schema({
   username: {
@@ -24,13 +23,13 @@ const userSchema = new Schema({
       require: true,
     },
   ],
-  myPlants: [{
-      type: mongoose.Schema.Types.ObjectId,
-      ref: 'MyPlants',
-      require: true,
-  }]
+    myPlants: [{
+        type: mongoose.Schema.Types.ObjectId,
+        ref: "MyPlants",
+        require: true,
+    }]
 });
 
-const User = mongoose.model('User', userSchema);
+const User = mongoose.model("User", userSchema);
 
 module.exports = User;
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 2b6ba85..b480137 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -1,36 +1,47 @@
-// confere se o token é valido
-require('dotenv').config();
-const jwt = require('jsonwebtoken');
+
+//confere se o token é valido
+require("dotenv").config();
+const jsonwebtoken = require("jsonwebtoken");
 
 const authConfig = {
   secret: process.env.SECRET,
 };
 function auth(req, res, next) {
-  const sessiontoken = req.headers.authtoken;
+    const sessiontoken = req.headers.authtoken;
 
-  if (!sessiontoken) {
-    return res.status(401).send({ Error: 'Token not provided' });
-  }
+    if (!sessiontoken) {
+      return res.status(401).send({ Error: 'Token not provided' });
+    }
 
-  const parts = sessiontoken.split(' ');
+    const parts = sessiontoken.split(' ');
 
-  if (!parts.length === 2) {
-    return res.status(401).send({ Error: 'Token error' });
-  }
+    if (!parts.length === 2) {
+      return res.status(401).send({ Error: 'Token error' });
+    }
 
-  const [scheme, token] = parts;
+    if(!sessiontoken){
+        return res.status(401).send({Error: "Token not provided"});
+    }
+   
+    const parts = sessiontoken.split(" ");
 
-  if (!/^Bearer$/i.test(scheme)) {
-    return res.status(401).send({ Error: 'Token malformated' });
-  }
+    if (!parts.length === 2){
+        return res.status(401).send({Error: "Token error"});
+    }
+    
+    const [scheme, token] = parts;
+     
+    if(!/^Bearer$/i.test(scheme)){
+        return res.status(401).send({Error: "Token malformated"});
+    }
 
-  try {
-    const { userId } = jwt.verify(token, authConfig.secret);
-    req.userId = userId;
-    return next();
-  } catch (err) {
-    req.redirect('/login_page');
-    return res.status(400);
-  }
+    jsonwebtoken.verify(token, authConfig.secret, (err, decoded) => {
+        if(err){
+            return res.status(401).send({Error: "Token invalid"});
+        }
+    req.userId = decoded.id;
+    return next()
+        
+    });
 }
 module.exports = { authConfig, auth };
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 3ba1303..bca008b 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -1,63 +1,58 @@
-const express = require('express');
-
+const express = require("express");
 const router = express.Router();
-const jsonwebtoken = require('jsonwebtoken');
-const User = require('../models/User');
-const userSchema = require('../schemas/userSchema');
-const { auth, authConfig } = require('./auth');
+const jsonwebtoken = require("jsonwebtoken");
+const User = require("../models/User");
+const userSchema = require("../schemas/userSchema");
+const {auth,authConfig} = require("./auth");
 
-router.post('/login', async (req, res, next) => {
-  try {
-    const { email, password } = req.body;
+
+router.post("/login", async(req, res ,next) => {
+  try{
+    const {email, password} = req.body;
     const user = await User.findOne({ email, password });
-    if (!user) {
-      return res.status(400).send({ Error: 'User not found' });
+    if(!user){
+        return res.status(400).send({Error: "User not found"});
     }
-    if (password !== user.password) {
-      return res.status(400).send({ Error: 'Incorrect password' });
+    if(password != user.password){
+        return res.status(400).send({ Error: "Incorrect password"});
     }
     user.password = undefined;
     const token = jsonwebtoken.sign({ id: user.id }, authConfig.secret, {
       expiresIn: 86400,
     });
-    const aToken = `Bearer ${token}`;
-    res.header('authtoken', aToken);
-    return res
-      .json({
-        message: 'Auth token generated',
-      })
-      .redirect('/main');
-  } catch (err) {
-    return next(err);
+    const aToken = "Bearer "+token;
+    res.header("authtoken", aToken);
+    res.json({
+        message: "Auth token generated"
+    }).redirect("/main");
+  }catch(err){
+    next(err);
   }
 });
 
-router.post('/signup', async (req, res) => {
+router.post("/signup", async(req, res) => {
   try {
     const newUserData = req.body;
     const result = userSchema.validate(req.body);
 
     await User.findOne({ username: newUserData.username });
 
-    if (result.error) {
-      return res
-        .status(400)
-        .send({ error: `Error while signing up. ${result.error}` });
-    }
+      if ( result.error ) return res.status(400).send({ error: "Error while signing up. " + result.error});
 
     const user = new User(newUserData);
     await user.save();
 
-    return res.send(user);
-  } catch (err) {
-    return res.status(400).send({ error: `Error while signing up.${err}` });
+      return res.send(user);
+      
+  } catch(err) {
+      return res.status(400).send({ error: "Error while signing up." + err });
   }
 });
 
-router.put('/update/:id', auth, async (req, res) => {
-  try {
-    const user = await User.findById(req.params.id);
-    const newData = req.body;
+router.put("/update/:id",auth, async(req, res) => {
+    try {
+      const user = await User.findById(req.params.id);
+      const newData = req.body;
 
     if (!newData.username) newData.username = user.username;
     if (!newData.password) newData.password = user.password;
@@ -67,23 +62,22 @@ router.put('/update/:id', auth, async (req, res) => {
 
     if (result.error) return res.status(400).send(result.error);
 
-    await User.findOneAndUpdate({ _id: req.params.id }, req.body, {
-      useFindAndModify: false,
-    });
+      await User.findOneAndUpdate({_id: req.params.id}, req.body, { useFindAndModify: false})
+        
+      res.send({ message: "User updated successfully."});
 
-    return res.send({ message: 'User updated successfully.' });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while updating user.${err}` });
-  }
+    } catch(err) {
+      return res.status(400).send({ error: "Error while updating user." + err});
+    }
 });
 
-router.delete('/delete/:id', auth, async (req, res) => {
-  try {
-    await User.findByIdAndDelete(req.params.id);
-    return res.send({ message: 'User successfully deleted.' });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while deleting user. ${err}` });
-  }
+router.delete("/delete/:id",auth, async(req, res) => {
+    try {
+        await User.findByIdAndDelete(req.params.id);
+        return res.send({ message: "User successfully deleted." });
+    } catch(err) {
+        return res.status(400).send({ error: "Error while deleting user. " + err });
+    }
 });
 
 module.exports = router;
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index f3bfcc2..3a1a670 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,101 +1,91 @@
-const express = require('express');
-
+const express = require("express");
 const router = express.Router();
 
-const Topic = require('../models/Topic');
-const Comment = require('../models/Comment');
+const Topic = require("../models/Topic");
+const User = require("../models/User");
+const Comment = require("../models/Comment");
 
-router.post('/create/:topicId/:userId', async (req, res) => {
-  try {
-    if (!req.body.text)
-      return res.status(400).send({ error: 'Comment should not be empty' });
+router.post("/create/:topicId/:userId", async (req, res) => {
+    try {
+
+        if ( !req.body.text ) return res.status(400).send({ error: "Comment should not be empty"});
 
-    const comment = await Comment.create({
-      ...req.body,
-      user: req.params.userId,
-      topic: req.params.topicId,
-    });
-    const topic = await Topic.findById(req.params.topicId);
+        const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
+        const topic = await Topic.findById(req.params.topicId);
 
-    await comment.save();
+        await comment.save();
 
-    topic.comments.push(comment);
-    await topic.save();
+        topic.comments.push(comment);
+        await topic.save();
+    
+        return res.send({ message: "Comment successfully registered." });
 
-    return res.send({ message: 'Comment successfully registered.' });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while commenting.${err}` });
-  }
+    } catch (err) {
+        return res.status(400).send({ error: "Error while commenting." + err});
+    }
 });
 
-router.put('/update/:commentId', async (req, res) => {
-  try {
-    await Comment.findById(req.params.commentId);
-    const newData = req.body;
-
-    if (!newData.text)
-      return res.status(400).send({ error: 'Comment should not be empty' });
-
-    await Comment.findOneAndUpdate({ _id: req.params.commentId }, req.body, {
-      useFindAndModify: false,
-    });
-    return res.send({ message: 'Comment updated successfully.' });
-  } catch (err) {
-    return res
-      .status(400)
-      .send({ error: `Error while updating comment.${err}` });
-  }
+router.put("/update/:commentId", async (req, res) => {
+
+    try {
+
+        await Comment.findById(req.params.commentId);
+        const newData = req.body;
+
+        if ( !newData.text ) return res.status(400).send({ error: "Comment should not be empty"});
+    
+        await Comment.findOneAndUpdate({_id: req.params.commentId}, req.body, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: "Comment updated successfully."});
+        });
+
+    } catch (err) {
+        return res.status(400).send({ error: "Error while updating comment." + err });
+    }
+
 });
 
-router.delete('/delete/:commentId', async (req, res) => {
+router.delete("/delete/:commentId", async (req, res) => {
   try {
-    const comment = await Comment.findById(req.params.commentId);
-    const topic = await Topic.findById(comment.topic);
-
     const index = topic.comments.indexOf(req.params.commentId);
 
-    if (index > -1) {
-      topic.comments.splice(index, 1);
-    }
+        topic.save();
 
-    topic.save();
+        await Comment.findByIdAndRemove(req.params.commentId).populate("user");
 
-    await Comment.findByIdAndRemove(req.params.commentId).populate('user');
+        return res.send({
+            message: "Comment successfully removed."
+        });
 
-    return res.send({
-      message: 'Comment successfully removed.',
-    });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while deleting topic.${err}` });
-  }
+    } catch (err) {
+        return res.status(400).send({ error: "Error while deleting topic." + err });
+    }
 });
 
-router.post('/like/:commentId', async (req, res) => {
-  try {
-    await Comment.findOneAndUpdate(
-      { _id: req.params.commentId },
-      { $inc: { likes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Liked!' });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while liking comment.${err}` });
-  }
+router.post("/like/:commentId", async (req, res) => {
+    try {
+
+        await Comment.findOneAndUpdate({_id: req.params.commentId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: "Liked!"});
+        });
+        
+    } catch (err) {
+        return res.status(400).send({ error: "Error while liking comment." + err });
+    }
 });
 
-router.post('/dislike/:commentId', async (req, res) => {
-  try {
-    await Comment.findOneAndUpdate(
-      { _id: req.params.commentId },
-      { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Disliked!' });
-  } catch (err) {
-    return res
-      .status(400)
-      .send({ error: `Error while linking comment.${err}` });
-  }
+router.post("/dislike/:commentId", async (req, res) => {
+    try {
+
+        await Comment.findOneAndUpdate({_id: req.params.commentId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: "Disliked!"});
+        });
+        
+    } catch (err) {
+        return res.status(400).send({ error: "Error while linking comment." + err });
+    }
 });
 
 module.exports = router;
diff --git a/src/routes/myPlantRoutes.js b/src/routes/myPlantRoutes.js
index edea84f..fd5ef3a 100644
--- a/src/routes/myPlantRoutes.js
+++ b/src/routes/myPlantRoutes.js
@@ -1,17 +1,17 @@
-const express = require('express');
+const express = require("express");
 const router = express.Router();
 
-const User = require('../models/User');
-const Plant = require('../models/Plant');
-const MyPlant = require('../models/MyPlant');
+const User = require("../models/User");
+const Plant = require("../models/Plant");
+const MyPlant = require("../models/MyPlant");
 
-const myPlantSchema = require('../schemas/myPlantSchema');
+const myPlantSchema = require("../schemas/myPlantSchema");
 
-router.get('/', async (req, res) => {
-    res.send({ message: 'User Backyard.'});
+router.get("/", async (req, res) => {
+    res.send({ message: "User Backyard."});
 });
 
-router.post('/add/:userId/:plantId', async (req, res) => {
+router.post("/add/:userId/:plantId", async (req, res) => {
 
     try {
         
@@ -19,9 +19,17 @@ router.post('/add/:userId/:plantId', async (req, res) => {
         const plant = await Plant.findById(req.params.plantId);
 
         const result = myPlantSchema.validate({ nickname: req.body.nickname});
-        if ( result.error ) return res.status(400).send({ error: 'Error while adding plant to backyard. ' + result.error});
+        if ( result.error ) {
+            return res.status(400).send({ error: "Error while adding plant to backyard. " + result.error});
+        }
+        
+        const myPlant = {
+            user: user, 
+            nickname: req.body.nickname, 
+            plant: plant
+        };
         
-        const myPlant = await MyPlant.create({user: user, nickname: req.body.nickname, plant: plant});
+        await MyPlant.create(myPlant);
 
         await user.myPlants.push(myPlant);
         await user.save()
@@ -30,13 +38,12 @@ router.post('/add/:userId/:plantId', async (req, res) => {
             });
 
     } catch(err) {
-        console.log(err);
-        return res.status(400).send({ error: 'Error while adding plant to backyard.' + err});
+        return res.status(400).send({ error: "Error while adding plant to backyard." + err});
     }
 
 });
 
-router.get('/:userId/:myPlantId', async (req, res) => {
+router.get("/:userId/:myPlantId", async (req, res) => {
 
     try {
 
@@ -57,30 +64,31 @@ router.get('/:userId/:myPlantId', async (req, res) => {
         }
 
     } catch(err) {
-        console.log(err);
-        return res.status(400).send({ error: 'Error while searching for plant.' + err});
+        return res.status(400).send({ error: "Error while searching for plant." + err});
     }
 });
 
-router.put('/edit/:myPlantId', async (req, res) => {
+router.put("/edit/:myPlantId", async (req, res) => {
 
     try {
         
         const newNick = req.body;
 
         const result = myPlantSchema.validate(newNick);
-        if ( result.error ) return res.status(400).send({ error: 'Error while editing plant. ' + result.error});
+        if ( result.error ) {
+            return res.status(400).send({ error: "Error while editing plant. " + result.error});
+        }
 
         await MyPlant.findOneAndUpdate({_id: req.params.myPlantId}, newNick, { useFindAndModify: false});
 
-        return res.send({ message: 'Backyard plant updated successfully.'});
+        return res.send({ message: "Backyard plant updated successfully."});
 
     } catch (err) {
-        return res.status(400).send({ error: 'Error while updating backyard plant.' + err });
+        return res.status(400).send({ error: "Error while updating backyard plant." + err });
     }
 });
 
-router.delete('/delete/:myPlantId', async (req, res) => {
+router.delete("/delete/:myPlantId", async (req, res) => {
 
     try {
 
@@ -98,11 +106,11 @@ router.delete('/delete/:myPlantId', async (req, res) => {
         await MyPlant.findByIdAndRemove(req.params.myPlantId, { useFindAndModify: false });
 
         return res.send({
-            message: 'Plant successfully removed from backyard.'
+            message: "Plant successfully removed from backyard."
         });
 
     } catch(err) {
-        return res.status(400).send({ error: 'Error while deleting plant from backyard.' + err });
+        return res.status(400).send({ error: "Error while deleting plant from backyard." + err });
     }
 });
 
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 3985c29..3eefa95 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -1,27 +1,14 @@
-const express = require('express');
+const express = require("express");
 
-const Plant = require('../models/Plant');
-const Topic = require('../models/Topic');
+const Plant = require("../models/Plant");
+const Topic = require("../models/Topic");
 
 const router = express.Router();
 
-// registro de uma nova planta
-router.post('/register', async (req, res) => {
-  try {
-    const {
-      scientificName,
-      familyName,
-      genderName,
-      specieName,
-      commonName,
-      usage,
-      firstUser,
-      collectionCount,
-      extinction,
-      profilePicture,
-      gbifID,
-      stateProvince,
-    } = req.body;
+//registro de uma nova planta
+router.post("/register", async (req , res) => {
+    try{
+        const { scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince,topicos} = req.body;
 
     const plant = await Plant.create({
       scientificName,
@@ -53,99 +40,64 @@ router.post('/register', async (req, res) => {
     return res.send(err);
   }
 });
-
-// Listagem de Todas as plantas
-router.get('/', async (req, res) => {
-  try {
-    const plants = await Plant.find().populate('topics');
-
-    return res.send({ plants });
-  } catch (err) {
-    return res.status(400).send({ error: 'Loading plants failed' });
-  }
+//Listagem de Todas as plantas
+router.get("/", async (req , res) => {
+    try{
+        const plants = await Plant.find().populate("topics");
+
+        return res.send({ plants });
+    }catch (err){
+        return res.status(400).send({ error: "Loading plants failed"});
+    }
 });
-
-// Procurando planta por id
-router.get('/:plantId', async (req, res) => {
-  try {
-    const plant = await Plant.findById(req.params.plantId).populate('topics');
-
-    return res.send({ plant });
-  } catch (err) {
-    return res
-      .status(400)
-      .send({ error: 'error when searching for this plant ' });
-  }
+//Procurando planta por id
+router.get("/:plantId", async (req , res) => {
+    try{
+        const plant = await Plant.findById(req.params.plantId).populate("topics");
+
+        return res.send({ plant });
+    }catch (err){
+        return res.status(400).send({ error: "error when searching for this plant "});
+    }
 });
-
-// Deletando planta por id
-router.delete('/:plantId', async (req, res) => {
-  try {
-    const deleted = await Plant.findByIdAndRemove(req.params.plantId);
-
-    return res.send(deleted);
-  } catch (err) {
-    return res.status(400).send({ error: 'Error when Delete this plant' });
-  }
+//Deletando planta por id
+router.delete("/:plantId", async (req , res) => {
+    try{
+        const deleted = await Plant.findByIdAndRemove(req.params.plantId);
+
+        return res.send(deleted);
+    }catch (err){
+        return res.status(400).send({ error: "Error when Delete this plant"});
+    }
 });
-
-// Dando upgrade planta por id
-router.put('/:plantId', async (req, res) => {
-  try {
-    const {
-      scientificName,
-      familyName,
-      genderName,
-      specieName,
-      commonName,
-      usage,
-      firstUser,
-      collectionCount,
-      extinction,
-      profilePicture,
-      gbifID,
-      stateProvince,
-      topics,
-    } = req.body;
-
-    const plant = await Plant.findByIdAndUpdate(
-      req.params.plantId,
-      {
-        scientificName,
-        familyName,
-        genderName,
-        specieName,
-        commonName,
-        usage,
-        firstUser,
-        collectionCount,
-        extinction,
-        profilePicture,
-        gbifID,
-        stateProvince,
-      },
-      { new: true }
-    );
-
-    plant.topics = [];
-    await Topic.remove({ plant: plant._id });
-
-    await Promise.all(
-      topics.map(async (topic) => {
-        const plantTopic = new Topic({ ...topic, plant: plant._id });
-
-        await plantTopic.save();
-
-        plant.topics.push(plantTopic);
-      })
-    );
-
-    await plant.save();
-
-    return res.send({ plant });
-  } catch (err) {
-    return res.status(400).send({ error: 'Registration failed' });
-  }
+//Dando upgrade planta por id
+router.put("/:plantId", async (req , res) => {
+    
+        try{
+            const { scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince,topicos} = req.body;
+    
+            const plant = await Plant.findByIdAndUpdate(req.params.plantId,
+                {scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince},{ new: true});
+            
+            plant.topics = [];
+            await Topic.remove({plant: plant._id});
+
+            await Promise.all(topics.map(async topic =>{
+                const plantTopic = new Topic({...topic,plant : plant._id});
+    
+                await plantTopic.save();
+    
+                plant.topics.push(plantTopic);
+            }));
+    
+            await plant.save();
+    
+    
+            return res.send({ plant });
+        }catch (err){
+            return res.status(400).send({ error: "Registration failed"});
+        }
+   
 });
 
 module.exports = router;
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index d03c9c6..54b44f8 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -1,18 +1,21 @@
-const express = require('express');
-
+const express = require("express");
 const router = express.Router();
 
-const Topic = require('../models/Topic');
-const User = require('../models/User');
-const Plant = require('../models/Plant');
-const topicSchema = require('../schemas/topicSchema');
+const Topic = require("../models/Topic");
+const User = require("../models/User");
+const Plant = require("../models/Plant");
+const topicSchema = require("../schemas/topicSchema");
 
-router.post('/create/:plantId/:userId', async (req, res) => {
-  try {
-    const user = await User.findById(req.params.userId);
-    const plant = await Plant.findById(req.params.plantId);
+router.post("/create/:plantId/:userId", async (req, res) => {
+    
+    try {
+
+        const user = await User.findById(req.params.userId);
+        const plant = await Plant.findById(req.params.plantId);
+
+        const result = topicSchema.validate(req.body);
 
-    const result = topicSchema.validate(req.body);
+        if ( result.error ) return res.status(400).send({ error: "Error while creating topic. " + result.error});
 
     if (result.error) {
       return res
@@ -31,45 +34,45 @@ router.post('/create/:plantId/:userId', async (req, res) => {
     user.topics.push(topic);
     await user.save();
 
-    plant.topics.push(topic);
-    await plant.save();
+    } catch (err) {
+        return res.status(400).send({ error: "Error while creating topic." + err });
+    }
 
     return res.send({ topic });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while creating topic.${err}` });
-  }
 });
 
-router.put('/update/:topicId', async (req, res) => {
-  try {
-    const topic = await Topic.findById(req.params.topicId);
+router.put("/update/:topicId", async (req, res) => {
 
+  try {
     const newData = req.body;
 
     if (!newData.title) newData.title = topic.title;
     if (!newData.description) newData.description = topic.description;
 
-    const result = topicSchema.validate(newData);
-    if (result.error) {
-      return res
-        .status(400)
-        .send({ error: `Error while creating topic. ${result.error}` });
-    }
+        const newData = req.body;
 
-    await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
-      useFindAndModify: false,
-    });
-    return res.send({ message: 'Topic updated successfully.' });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while updating topic.${err}` });
-  }
+        if (!newData.title) newData.title = topic.title;
+        if (!newData.description) newData.description = topic.description;
+
+        const result = topicSchema.validate(newData);
+        if ( result.error ) return res.status(400).send({ error: "Error while creating topic. " + result.error});
+    
+        await Topic.findOneAndUpdate({_id: req.params.topicId}, newData, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: "Topic updated successfully."});
+        });
+
+    } catch (err) {
+        return res.status(400).send({ error: "Error while updating topic." + err });
+    }
 });
 
-router.delete('/delete/:topicId', async (req, res) => {
-  try {
-    const topic = await Topic.findById(req.params.topicId);
-    const user = await User.findById(topic.user);
-    const plant = await Plant.findById(topic.plant);
+router.delete("/delete/:topicId", async (req, res) => {
+    try {
+
+        const topic = await Topic.findById(req.params.topicId);
+        const user = await User.findById(topic.user);
+        const plant = await Plant.findById(topic.plant);
 
     const indexAtUser = user.topics.indexOf(req.params.topicId);
     const indexAtPlant = plant.topics.indexOf(req.params.topicId);
@@ -84,54 +87,51 @@ router.delete('/delete/:topicId', async (req, res) => {
     user.save();
     plant.save();
 
-    await Topic.findByIdAndRemove(req.params.topicId, {
-      useFindAndModify: false,
-    });
+        return res.send({
+            message: "Topic successfully removed."
+        });
 
-    return res.send({
-      message: 'Topic successfully removed.',
-    });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while deleting topic.${err}` });
-  }
+    } catch (err) {
+        return res.status(400).send({ error: "Error while deleting topic." + err });
+    }
 });
 
-router.get('/list', async (req, res) => {
-  try {
-    const topic = await Topic.find().populate(['user']);
+router.get("/list", async (req, res) => {
+    try {
 
-    return res.send({ topic });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while listing topics.${err}` });
-  }
+        const topic = await Topic.find().populate(["user"]);
+
+        return res.send({ topic });
+
+    } catch (err) {
+        return res.status(400).send({ error: "Error while listing topics." + err });
+    }
 });
 
-router.post('/like/:topicId', async (req, res) => {
-  try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { likes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Liked!' });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while liking topic.${err}` });
-  }
+router.post("/like/:topicId", async (req, res) => {
+    try {
+
+        await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: "Liked!"});
+        });
+        
+    } catch (err) {
+        return res.status(400).send({ error: "Error while liking topic." + err });
+    }
 });
 
-router.post('/dislike/:topicId', async (req, res) => {
-  try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Disliked!' });
-  } catch (err) {
-    return res
-      .status(400)
-      .send({ error: `Error while dislikinng topic.${err}` });
-  }
+router.post("/dislike/:topicId", async (req, res) => {
+    try {
+
+        await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
+        .then( () => {
+            res.send({ message: "Disliked!"});
+        });
+        
+    } catch (err) {
+        return res.status(400).send({ error: "Error while dislikinng topic." + err });
+    }
 });
 
 module.exports = router;
diff --git a/src/schemas/myPlantSchema.js b/src/schemas/myPlantSchema.js
index 77645ed..484265d 100644
--- a/src/schemas/myPlantSchema.js
+++ b/src/schemas/myPlantSchema.js
@@ -1,4 +1,4 @@
-const Joi = require('joi');
+const Joi = require("joi");
 
 const myPlantSchema = Joi.object({
     nickname: Joi.string().alphanum().min(2).max(20).required(),
diff --git a/src/schemas/topicSchema.js b/src/schemas/topicSchema.js
index 9a0379e..e4cd441 100644
--- a/src/schemas/topicSchema.js
+++ b/src/schemas/topicSchema.js
@@ -1,4 +1,4 @@
-const Joi = require('joi');
+const Joi = require("joi");
 
 const topicSchema = Joi.object({
   title: Joi.string().min(4).max(30).required(),
diff --git a/src/schemas/userSchema.js b/src/schemas/userSchema.js
index 20101d6..0e4620e 100644
--- a/src/schemas/userSchema.js
+++ b/src/schemas/userSchema.js
@@ -1,4 +1,4 @@
-const Joi = require('joi');
+const Joi = require("joi");
 
 const userSchema = Joi.object({
   username: Joi.string().alphanum().min(4).max(30).required(),

From b81344db108ef6c101199916a09409909e9970c5 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Fri, 16 Oct 2020 16:32:17 -0300
Subject: [PATCH 096/147] Create myPlant model, router and schema.

Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/index.js                 | 17 ++++++++++------
 src/models/MyPlant.js        |  8 ++++----
 src/models/User.js           | 13 ++++++------
 src/routes/myPlantRoutes.js  | 39 ++++++++++++++++++------------------
 src/schemas/myPlantSchema.js |  2 +-
 5 files changed, 41 insertions(+), 38 deletions(-)

diff --git a/src/index.js b/src/index.js
index 4ba936e..9bd96cd 100644
--- a/src/index.js
+++ b/src/index.js
@@ -4,12 +4,11 @@ const app = express();
 const morgan = require("morgan");
 const mongoose = require("mongoose");
 
-
-const authRoutes = require("./routes/authRoutes");
-const plantRoutes = require("./routes/plantRoutes");
-const topicRoutes = require("./routes/topicRoutes");
-const commentRoutes = require("./routes/commentRoutes");
-const myPlantRoutes = require("./routes/myPlantRoutes");
+const authRoutes = require('./routes/authRoutes');
+const plantRoutes = require('./routes/plantRoutes');
+const topicRoutes = require('./routes/topicRoutes');
+const commentRoutes = require('./routes/commentRoutes');
+const myPlantRoutes = require('./routes/myPlantRoutes');
 // MongoDB connection
 
 // MongoDB connection
@@ -30,6 +29,7 @@ app.use(express.urlencoded({extended: false}));
 app.use(express.json());
 
 // routes
+<<<<<<< 252f72180cb878c1784452bcd4d7b07e3cf24ab9
 <<<<<<< b56a03cde05eb469a13aa434806770292356f8cd
 
 <<<<<<< 3b530e4155616ea2f60804382551d03e78dbd1e3
@@ -38,11 +38,16 @@ app.use('/plant', plantRoutes);
 app.use('/topic', topicRoutes);
 app.use('/comment', commentRoutes);
 =======
+=======
+>>>>>>> Create myPlant model, router and schema.
 app.use('/plant',plantRoutes);
 app.use('/topic',topicRoutes);
 app.use('/comment',commentRoutes);
 app.use('/auth',authRoutes);
 app.use('/myplants',myPlantRoutes);
+<<<<<<< 252f72180cb878c1784452bcd4d7b07e3cf24ab9
+>>>>>>> Create myPlant model, router and schema.
+=======
 >>>>>>> Create myPlant model, router and schema.
 
 // starting the server
diff --git a/src/models/MyPlant.js b/src/models/MyPlant.js
index 9a31369..5d50ecf 100644
--- a/src/models/MyPlant.js
+++ b/src/models/MyPlant.js
@@ -1,4 +1,4 @@
-const mongoose = require("mongoose");
+const mongoose = require('mongoose');
 const Schema = mongoose.Schema;
 
 const myPlantSchema = new mongoose.Schema({
@@ -8,12 +8,12 @@ const myPlantSchema = new mongoose.Schema({
     },
     user: {
         type: Schema.Types.ObjectId,
-        ref: "User",
+        ref: 'User',
         require: true,
     },
     plant:{
         type:mongoose.Schema.Types.ObjectId,
-        ref:"Plant",
+        ref:'Plant',
         require:true
     },
     createdAt: {
@@ -23,6 +23,6 @@ const myPlantSchema = new mongoose.Schema({
 });
 
 
-const myPlant = mongoose.model("MyPlants", myPlantSchema);
+const myPlant = mongoose.model('MyPlants', myPlantSchema);
 
 module.exports = myPlant;
diff --git a/src/models/User.js b/src/models/User.js
index 6558f8f..142c8f1 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -21,13 +21,12 @@ const userSchema = new Schema({
       type: mongoose.Schema.Types.ObjectId,
       ref: 'Topics',
       require: true,
-    },
-  ],
-    myPlants: [{
-        type: mongoose.Schema.Types.ObjectId,
-        ref: "MyPlants",
-        require: true,
-    }]
+    }],
+  myPlants: [{
+      type: mongoose.Schema.Types.ObjectId,
+      ref: 'MyPlants',
+      require: true,
+  }]
 });
 
 const User = mongoose.model("User", userSchema);
diff --git a/src/routes/myPlantRoutes.js b/src/routes/myPlantRoutes.js
index fd5ef3a..24302c3 100644
--- a/src/routes/myPlantRoutes.js
+++ b/src/routes/myPlantRoutes.js
@@ -1,17 +1,17 @@
-const express = require("express");
+const express = require('express');
 const router = express.Router();
 
-const User = require("../models/User");
-const Plant = require("../models/Plant");
-const MyPlant = require("../models/MyPlant");
+const User = require('../models/User');
+const Plant = require('../models/Plant');
+const MyPlant = require('../models/MyPlant');
 
-const myPlantSchema = require("../schemas/myPlantSchema");
+const myPlantSchema = require('../schemas/myPlantSchema');
 
-router.get("/", async (req, res) => {
-    res.send({ message: "User Backyard."});
+router.get('/', async (req, res) => {
+    res.send({ message: 'User Backyard.'});
 });
 
-router.post("/add/:userId/:plantId", async (req, res) => {
+router.post('/add/:userId/:plantId', async (req, res) => {
 
     try {
         
@@ -38,12 +38,12 @@ router.post("/add/:userId/:plantId", async (req, res) => {
             });
 
     } catch(err) {
-        return res.status(400).send({ error: "Error while adding plant to backyard." + err});
+        return res.status(400).send({ error: 'Error while adding plant to backyard.' + err});
     }
 
 });
 
-router.get("/:userId/:myPlantId", async (req, res) => {
+router.get('/:userId/:myPlantId', async (req, res) => {
 
     try {
 
@@ -64,31 +64,30 @@ router.get("/:userId/:myPlantId", async (req, res) => {
         }
 
     } catch(err) {
-        return res.status(400).send({ error: "Error while searching for plant." + err});
+        console.log(err);
+        return res.status(400).send({ error: 'Error while searching for plant.' + err});
     }
 });
 
-router.put("/edit/:myPlantId", async (req, res) => {
+router.put('/edit/:myPlantId', async (req, res) => {
 
     try {
         
         const newNick = req.body;
 
         const result = myPlantSchema.validate(newNick);
-        if ( result.error ) {
-            return res.status(400).send({ error: "Error while editing plant. " + result.error});
-        }
+        if ( result.error ) return res.status(400).send({ error: 'Error while editing plant. ' + result.error});
 
         await MyPlant.findOneAndUpdate({_id: req.params.myPlantId}, newNick, { useFindAndModify: false});
 
-        return res.send({ message: "Backyard plant updated successfully."});
+        return res.send({ message: 'Backyard plant updated successfully.'});
 
     } catch (err) {
-        return res.status(400).send({ error: "Error while updating backyard plant." + err });
+        return res.status(400).send({ error: 'Error while updating backyard plant.' + err });
     }
 });
 
-router.delete("/delete/:myPlantId", async (req, res) => {
+router.delete('/delete/:myPlantId', async (req, res) => {
 
     try {
 
@@ -106,11 +105,11 @@ router.delete("/delete/:myPlantId", async (req, res) => {
         await MyPlant.findByIdAndRemove(req.params.myPlantId, { useFindAndModify: false });
 
         return res.send({
-            message: "Plant successfully removed from backyard."
+            message: 'Plant successfully removed from backyard.'
         });
 
     } catch(err) {
-        return res.status(400).send({ error: "Error while deleting plant from backyard." + err });
+        return res.status(400).send({ error: 'Error while deleting plant from backyard.' + err });
     }
 });
 
diff --git a/src/schemas/myPlantSchema.js b/src/schemas/myPlantSchema.js
index 484265d..77645ed 100644
--- a/src/schemas/myPlantSchema.js
+++ b/src/schemas/myPlantSchema.js
@@ -1,4 +1,4 @@
-const Joi = require("joi");
+const Joi = require('joi');
 
 const myPlantSchema = Joi.object({
     nickname: Joi.string().alphanum().min(2).max(20).required(),

From 2b16aefe6ce455af4ae543577ab3d03ceacd602d Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Tue, 27 Oct 2020 20:49:43 -0300
Subject: [PATCH 097/147] Update PR to follow codacy patterns

---
 src/index.js                 |  40 ++-------
 src/models/MyPlant.js        |   8 +-
 src/models/Topic.js          |  66 +++++++-------
 src/models/User.js           |  47 +++++-----
 src/routes/auth.js           |  32 +++----
 src/routes/myPlantRoutes.js  |  37 ++++----
 src/routes/plantRoutes.js    | 166 ++++++++++++++++++++++-------------
 src/routes/topicRoutes.js    |  95 +++++++++++---------
 src/schemas/myPlantSchema.js |   2 +-
 src/schemas/userSchema.js    |   4 +-
 10 files changed, 260 insertions(+), 237 deletions(-)

diff --git a/src/index.js b/src/index.js
index 9bd96cd..6e52e25 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,14 +1,13 @@
-const express = require('express');
-
+const express = require("express");
 const app = express();
 const morgan = require("morgan");
 const mongoose = require("mongoose");
 
-const authRoutes = require('./routes/authRoutes');
-const plantRoutes = require('./routes/plantRoutes');
-const topicRoutes = require('./routes/topicRoutes');
-const commentRoutes = require('./routes/commentRoutes');
-const myPlantRoutes = require('./routes/myPlantRoutes');
+const authRoutes = require("./routes/authRoutes");
+const plantRoutes = require("./routes/plantRoutes");
+const topicRoutes = require("./routes/topicRoutes");
+const commentRoutes = require("./routes/commentRoutes");
+const myPlantRoutes = require("./routes/myPlantRoutes");
 // MongoDB connection
 
 // MongoDB connection
@@ -29,41 +28,14 @@ app.use(express.urlencoded({extended: false}));
 app.use(express.json());
 
 // routes
-<<<<<<< 252f72180cb878c1784452bcd4d7b07e3cf24ab9
-<<<<<<< b56a03cde05eb469a13aa434806770292356f8cd
-
-<<<<<<< 3b530e4155616ea2f60804382551d03e78dbd1e3
-app.use('/auth', authRoutes);
-app.use('/plant', plantRoutes);
-app.use('/topic', topicRoutes);
-app.use('/comment', commentRoutes);
-=======
-=======
->>>>>>> Create myPlant model, router and schema.
 app.use('/plant',plantRoutes);
 app.use('/topic',topicRoutes);
 app.use('/comment',commentRoutes);
 app.use('/auth',authRoutes);
 app.use('/myplants',myPlantRoutes);
-<<<<<<< 252f72180cb878c1784452bcd4d7b07e3cf24ab9
->>>>>>> Create myPlant model, router and schema.
-=======
->>>>>>> Create myPlant model, router and schema.
 
 // starting the server
 app.set('port', process.env.PORT || 3000);
 app.listen(app.get('port'), () => {
   console.log(`Server on port ${app.get('port')}`);
-=======
-app.use("/auth",authRoutes);
-app.use("/plant",plantRoutes);
-app.use("/topic",topicRoutes);
-app.use("/comment",commentRoutes);
-app.use("/myplants",myPlantRoutes);
-
-// starting the server
-app.set("port", process.env.PORT || 3000);
-app.listen(app.get("port"), () => {
-    console.log(`Server on port ${app.get("port")}`);
->>>>>>> Update PR to follow codacy patterns
 });
diff --git a/src/models/MyPlant.js b/src/models/MyPlant.js
index 5d50ecf..9a31369 100644
--- a/src/models/MyPlant.js
+++ b/src/models/MyPlant.js
@@ -1,4 +1,4 @@
-const mongoose = require('mongoose');
+const mongoose = require("mongoose");
 const Schema = mongoose.Schema;
 
 const myPlantSchema = new mongoose.Schema({
@@ -8,12 +8,12 @@ const myPlantSchema = new mongoose.Schema({
     },
     user: {
         type: Schema.Types.ObjectId,
-        ref: 'User',
+        ref: "User",
         require: true,
     },
     plant:{
         type:mongoose.Schema.Types.ObjectId,
-        ref:'Plant',
+        ref:"Plant",
         require:true
     },
     createdAt: {
@@ -23,6 +23,6 @@ const myPlantSchema = new mongoose.Schema({
 });
 
 
-const myPlant = mongoose.model('MyPlants', myPlantSchema);
+const myPlant = mongoose.model("MyPlants", myPlantSchema);
 
 module.exports = myPlant;
diff --git a/src/models/Topic.js b/src/models/Topic.js
index c995914..7c20f95 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -2,39 +2,39 @@ const mongoose = require("mongoose");
 const Schema = mongoose.Schema;
 
 const topicSchema = new Schema({
-    title: {
-        type: String,
-        require: true,
-    },
-    description: {
-        type: String,
-    },
-    plant:{
-        type:mongoose.Schema.Types.ObjectId,
-        ref:"Plant",
-        require:true
-    },
-    user: {
-        type: Schema.Types.ObjectId,
-        ref: "User",
-        require: true,
-    },
-    likes: {
-        type: Number,
-        default: 0
-    },
-    dislikes: {
-        type: Number,
-        default: 0
-    },
-    comments: [{
-        type: Schema.Types.ObjectId,
-        ref: "Comment"
-    }],
-    createdAt: {
-        type: Date,
-        default: Date.now,
-    },
+  title: {
+      type: String,
+      require: true,
+  },
+  description: {
+      type: String,
+  },
+  plant:{
+      type:mongoose.Schema.Types.ObjectId,
+      ref:"Plant",
+      require:true
+  },
+  user: {
+      type: Schema.Types.ObjectId,
+      ref: "User",
+      require: true,
+  },
+  likes: {
+      type: Number,
+      default: 0
+  },
+  dislikes: {
+      type: Number,
+      default: 0
+  },
+  comments: [{
+      type: Schema.Types.ObjectId,
+      ref: "Comment"
+  }],
+  createdAt: {
+      type: Date,
+      default: Date.now,
+  },
 });
 
 const Topic = mongoose.model("Topic", topicSchema);
diff --git a/src/models/User.js b/src/models/User.js
index 142c8f1..cedff95 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -2,31 +2,30 @@ const mongoose = require("mongoose");
 const Schema = mongoose.Schema;
 
 const userSchema = new Schema({
-  username: {
-    type: String,
-    required: true,
-    unique: true,
-  },
-  password: {
-    type: String,
-    required: true,
-  },
-  email: {
-    type: String,
-    required: true,
-    unique: true,
-  },
-  topics: [
-    {
-      type: mongoose.Schema.Types.ObjectId,
-      ref: 'Topics',
-      require: true,
+    username: {
+        type: String,
+        required: true,
+        unique:true
+    },
+    password: {
+        type: String,
+        required: true
+    },
+    email: {
+        type: String,
+        required: true,
+        unique:true
+    },
+    topics: [{
+        type: mongoose.Schema.Types.ObjectId,
+        ref: "Topics",
+        require: true,
     }],
-  myPlants: [{
-      type: mongoose.Schema.Types.ObjectId,
-      ref: 'MyPlants',
-      require: true,
-  }]
+    myPlants: [{
+        type: mongoose.Schema.Types.ObjectId,
+        ref: "MyPlants",
+        require: true,
+    }]
 });
 
 const User = mongoose.model("User", userSchema);
diff --git a/src/routes/auth.js b/src/routes/auth.js
index b480137..a1b49a8 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -1,7 +1,7 @@
 
 //confere se o token é valido
 require("dotenv").config();
-const jsonwebtoken = require("jsonwebtoken");
+const jwt = require("jsonwebtoken");
 
 const authConfig = {
   secret: process.env.SECRET,
@@ -25,23 +25,17 @@ function auth(req, res, next) {
    
     const parts = sessiontoken.split(" ");
 
-    if (!parts.length === 2){
-        return res.status(401).send({Error: "Token error"});
-    }
-    
-    const [scheme, token] = parts;
-     
-    if(!/^Bearer$/i.test(scheme)){
-        return res.status(401).send({Error: "Token malformated"});
-    }
-
-    jsonwebtoken.verify(token, authConfig.secret, (err, decoded) => {
-        if(err){
-            return res.status(401).send({Error: "Token invalid"});
-        }
-    req.userId = decoded.id;
-    return next()
-        
-    });
+  if (!/^Bearer$/i.test(scheme)) {
+    return res.status(401).send({ Error: "Token malformated" });
+  }
+
+  try {
+    const { userId } = jwt.verify(token, authConfig.secret);
+    req.userId = userId;
+    return next();
+  } catch (err) {
+    req.redirect("/login_page");
+    return res.status(400);
+  }
 }
 module.exports = { authConfig, auth };
diff --git a/src/routes/myPlantRoutes.js b/src/routes/myPlantRoutes.js
index 24302c3..27b22bf 100644
--- a/src/routes/myPlantRoutes.js
+++ b/src/routes/myPlantRoutes.js
@@ -1,17 +1,17 @@
-const express = require('express');
+const express = require("express");
 const router = express.Router();
 
-const User = require('../models/User');
-const Plant = require('../models/Plant');
-const MyPlant = require('../models/MyPlant');
+const User = require("../models/User");
+const Plant = require("../models/Plant");
+const MyPlant = require("../models/MyPlant");
 
-const myPlantSchema = require('../schemas/myPlantSchema');
+const myPlantSchema = require("../schemas/myPlantSchema");
 
-router.get('/', async (req, res) => {
-    res.send({ message: 'User Backyard.'});
+router.get("/", async (req, res) => {
+    res.send({ message: "User Backyard."});
 });
 
-router.post('/add/:userId/:plantId', async (req, res) => {
+router.post("/add/:userId/:plantId", async (req, res) => {
 
     try {
         
@@ -43,7 +43,7 @@ router.post('/add/:userId/:plantId', async (req, res) => {
 
 });
 
-router.get('/:userId/:myPlantId', async (req, res) => {
+router.get("/:userId/:myPlantId", async (req, res) => {
 
     try {
 
@@ -64,30 +64,31 @@ router.get('/:userId/:myPlantId', async (req, res) => {
         }
 
     } catch(err) {
-        console.log(err);
-        return res.status(400).send({ error: 'Error while searching for plant.' + err});
+        return res.status(400).send({ error: "Error while searching for plant." + err});
     }
 });
 
-router.put('/edit/:myPlantId', async (req, res) => {
+router.put("/edit/:myPlantId", async (req, res) => {
 
     try {
         
         const newNick = req.body;
 
         const result = myPlantSchema.validate(newNick);
-        if ( result.error ) return res.status(400).send({ error: 'Error while editing plant. ' + result.error});
+        if ( result.error ) {
+            return res.status(400).send({ error: "Error while editing plant. " + result.error});
+        }
 
         await MyPlant.findOneAndUpdate({_id: req.params.myPlantId}, newNick, { useFindAndModify: false});
 
-        return res.send({ message: 'Backyard plant updated successfully.'});
+        return res.send({ message: "Backyard plant updated successfully."});
 
     } catch (err) {
-        return res.status(400).send({ error: 'Error while updating backyard plant.' + err });
+        return res.status(400).send({ error: "Error while updating backyard plant." + err });
     }
 });
 
-router.delete('/delete/:myPlantId', async (req, res) => {
+router.delete("/delete/:myPlantId", async (req, res) => {
 
     try {
 
@@ -105,11 +106,11 @@ router.delete('/delete/:myPlantId', async (req, res) => {
         await MyPlant.findByIdAndRemove(req.params.myPlantId, { useFindAndModify: false });
 
         return res.send({
-            message: 'Plant successfully removed from backyard.'
+            message: "Plant successfully removed from backyard."
         });
 
     } catch(err) {
-        return res.status(400).send({ error: 'Error while deleting plant from backyard.' + err });
+        return res.status(400).send({ error: "Error while deleting plant from backyard." + err });
     }
 });
 
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 3eefa95..e830628 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -5,10 +5,23 @@ const Topic = require("../models/Topic");
 
 const router = express.Router();
 
-//registro de uma nova planta
-router.post("/register", async (req , res) => {
-    try{
-        const { scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince,topicos} = req.body;
+// registro de uma nova planta
+router.post("/register", async (req, res) => {
+  try {
+    const {
+      scientificName,
+      familyName,
+      genderName,
+      specieName,
+      commonName,
+      usage,
+      firstUser,
+      collectionCount,
+      extinction,
+      profilePicture,
+      gbifID,
+      stateProvince,
+    } = req.body;
 
     const plant = await Plant.create({
       scientificName,
@@ -40,64 +53,99 @@ router.post("/register", async (req , res) => {
     return res.send(err);
   }
 });
-//Listagem de Todas as plantas
-router.get("/", async (req , res) => {
-    try{
-        const plants = await Plant.find().populate("topics");
-
-        return res.send({ plants });
-    }catch (err){
-        return res.status(400).send({ error: "Loading plants failed"});
-    }
+
+// Listagem de Todas as plantas
+router.get("/", async (req, res) => {
+  try {
+    const plants = await Plant.find().populate("topics");
+
+    return res.send({ plants });
+  } catch (err) {
+    return res.status(400).send({ error: "Loading plants failed" });
+  }
 });
-//Procurando planta por id
-router.get("/:plantId", async (req , res) => {
-    try{
-        const plant = await Plant.findById(req.params.plantId).populate("topics");
-
-        return res.send({ plant });
-    }catch (err){
-        return res.status(400).send({ error: "error when searching for this plant "});
-    }
+
+// Procurando planta por id
+router.get("/:plantId", async (req, res) => {
+  try {
+    const plant = await Plant.findById(req.params.plantId).populate("topics");
+
+    return res.send({ plant });
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: "error when searching for this plant " });
+  }
 });
-//Deletando planta por id
-router.delete("/:plantId", async (req , res) => {
-    try{
-        const deleted = await Plant.findByIdAndRemove(req.params.plantId);
-
-        return res.send(deleted);
-    }catch (err){
-        return res.status(400).send({ error: "Error when Delete this plant"});
-    }
+
+// Deletando planta por id
+router.delete("/:plantId", async (req, res) => {
+  try {
+    const deleted = await Plant.findByIdAndRemove(req.params.plantId);
+
+    return res.send(deleted);
+  } catch (err) {
+    return res.status(400).send({ error: "Error when Delete this plant" });
+  }
 });
-//Dando upgrade planta por id
-router.put("/:plantId", async (req , res) => {
-    
-        try{
-            const { scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince,topicos} = req.body;
-    
-            const plant = await Plant.findByIdAndUpdate(req.params.plantId,
-                {scientificName,family_name,gender_name,specie_name,common_name,usage,first_User,collection_count,extinction,profile_picture, gbifID,stateProvince},{ new: true});
-            
-            plant.topics = [];
-            await Topic.remove({plant: plant._id});
-
-            await Promise.all(topics.map(async topic =>{
-                const plantTopic = new Topic({...topic,plant : plant._id});
-    
-                await plantTopic.save();
-    
-                plant.topics.push(plantTopic);
-            }));
-    
-            await plant.save();
-    
-    
-            return res.send({ plant });
-        }catch (err){
-            return res.status(400).send({ error: "Registration failed"});
-        }
-   
+
+// Dando upgrade planta por id
+router.put("/:plantId", async (req, res) => {
+  try {
+    const {
+      scientificName,
+      familyName,
+      genderName,
+      specieName,
+      commonName,
+      usage,
+      firstUser,
+      collectionCount,
+      extinction,
+      profilePicture,
+      gbifID,
+      stateProvince,
+      topics,
+    } = req.body;
+
+    const plant = await Plant.findByIdAndUpdate(
+      req.params.plantId,
+      {
+        scientificName,
+        familyName,
+        genderName,
+        specieName,
+        commonName,
+        usage,
+        firstUser,
+        collectionCount,
+        extinction,
+        profilePicture,
+        gbifID,
+        stateProvince,
+      },
+      { new: true }
+    );
+
+    plant.topics = [];
+    await Topic.remove({ plant: plant._id });
+
+    await Promise.all(
+      topics.map(async (topic) => {
+        const plantTopic = new Topic({ ...topic, plant: plant._id });
+
+        await plantTopic.save();
+
+        plant.topics.push(plantTopic);
+      })
+    );
+
+    await plant.save();
+
+    return res.send({ plant });
+  } catch (err) {
+    return res.status(400).send({ error: "Registration failed" });
+  }
 });
 
 module.exports = router;
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 54b44f8..c4466bc 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -7,6 +7,7 @@ const Plant = require("../models/Plant");
 const topicSchema = require("../schemas/topicSchema");
 
 router.post("/create/:plantId/:userId", async (req, res) => {
+<<<<<<< b81344db108ef6c101199916a09409909e9970c5
     
     try {
 
@@ -14,6 +15,11 @@ router.post("/create/:plantId/:userId", async (req, res) => {
         const plant = await Plant.findById(req.params.plantId);
 
         const result = topicSchema.validate(req.body);
+=======
+  try {
+    const user = await User.findById(req.params.userId);
+    const plant = await Plant.findById(req.params.plantId);
+>>>>>>> Update PR to follow codacy patterns
 
         if ( result.error ) return res.status(400).send({ error: "Error while creating topic. " + result.error});
 
@@ -42,6 +48,11 @@ router.post("/create/:plantId/:userId", async (req, res) => {
 });
 
 router.put("/update/:topicId", async (req, res) => {
+<<<<<<< b81344db108ef6c101199916a09409909e9970c5
+=======
+  try {
+    const topic = await Topic.findById(req.params.topicId);
+>>>>>>> Update PR to follow codacy patterns
 
   try {
     const newData = req.body;
@@ -51,28 +62,20 @@ router.put("/update/:topicId", async (req, res) => {
 
         const newData = req.body;
 
-        if (!newData.title) newData.title = topic.title;
-        if (!newData.description) newData.description = topic.description;
-
-        const result = topicSchema.validate(newData);
-        if ( result.error ) return res.status(400).send({ error: "Error while creating topic. " + result.error});
-    
-        await Topic.findOneAndUpdate({_id: req.params.topicId}, newData, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: "Topic updated successfully."});
-        });
-
-    } catch (err) {
-        return res.status(400).send({ error: "Error while updating topic." + err });
-    }
+    await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
+      useFindAndModify: false,
+    });
+    return res.send({ message: "Topic updated successfully." });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while updating topic.${err}` });
+  }
 });
 
 router.delete("/delete/:topicId", async (req, res) => {
-    try {
-
-        const topic = await Topic.findById(req.params.topicId);
-        const user = await User.findById(topic.user);
-        const plant = await Plant.findById(topic.plant);
+  try {
+    const topic = await Topic.findById(req.params.topicId);
+    const user = await User.findById(topic.user);
+    const plant = await Plant.findById(topic.plant);
 
     const indexAtUser = user.topics.indexOf(req.params.topicId);
     const indexAtPlant = plant.topics.indexOf(req.params.topicId);
@@ -91,13 +94,17 @@ router.delete("/delete/:topicId", async (req, res) => {
             message: "Topic successfully removed."
         });
 
-    } catch (err) {
-        return res.status(400).send({ error: "Error while deleting topic." + err });
-    }
+    return res.send({
+      message: "Topic successfully removed.",
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while deleting topic.${err}` });
+  }
 });
 
 router.get("/list", async (req, res) => {
-    try {
+  try {
+    const topic = await Topic.find().populate(["user"]);
 
         const topic = await Topic.find().populate(["user"]);
 
@@ -109,29 +116,31 @@ router.get("/list", async (req, res) => {
 });
 
 router.post("/like/:topicId", async (req, res) => {
-    try {
-
-        await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: "Liked!"});
-        });
-        
-    } catch (err) {
-        return res.status(400).send({ error: "Error while liking topic." + err });
-    }
+  try {
+    await Topic.findOneAndUpdate(
+      { _id: req.params.topicId },
+      { $inc: { likes: 1 } },
+      { useFindAndModify: false }
+    );
+    return res.send({ message: "Liked!" });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while liking topic.${err}` });
+  }
 });
 
 router.post("/dislike/:topicId", async (req, res) => {
-    try {
-
-        await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: "Disliked!"});
-        });
-        
-    } catch (err) {
-        return res.status(400).send({ error: "Error while dislikinng topic." + err });
-    }
+  try {
+    await Topic.findOneAndUpdate(
+      { _id: req.params.topicId },
+      { $inc: { dislikes: 1 } },
+      { useFindAndModify: false }
+    );
+    return res.send({ message: "Disliked!" });
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: `Error while dislikinng topic.${err}` });
+  }
 });
 
 module.exports = router;
diff --git a/src/schemas/myPlantSchema.js b/src/schemas/myPlantSchema.js
index 77645ed..484265d 100644
--- a/src/schemas/myPlantSchema.js
+++ b/src/schemas/myPlantSchema.js
@@ -1,4 +1,4 @@
-const Joi = require('joi');
+const Joi = require("joi");
 
 const myPlantSchema = Joi.object({
     nickname: Joi.string().alphanum().min(2).max(20).required(),
diff --git a/src/schemas/userSchema.js b/src/schemas/userSchema.js
index 0e4620e..f36f84d 100644
--- a/src/schemas/userSchema.js
+++ b/src/schemas/userSchema.js
@@ -6,8 +6,8 @@ const userSchema = Joi.object({
   passwordConfirmation: Joi.string()
     .min(8)
     .required()
-    .valid(Joi.ref('password'))
-    .error(new Error('Password confirmation does not match.')),
+    .valid(Joi.ref("password"))
+    .error(new Error("Password confirmation does not match.")),
   email: Joi.string().email().required(),
 });
 

From a47fc113ff596fc5aafa25ce73f5ca26f358dcb3 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Tue, 3 Nov 2020 18:29:42 -0300
Subject: [PATCH 098/147] Fix lint errors

---
 src/index.js                 |  42 ++++-----
 src/models/Comment.js        |  52 +++++------
 src/models/MyPlant.js        |  44 ++++-----
 src/models/Plant.js          | 113 +++++++++++-----------
 src/models/Topic.js          |  47 +++++-----
 src/models/User.js           |  55 ++++++-----
 src/routes/auth.js           |  33 +++----
 src/routes/authRoutes.js     |  91 +++++++++---------
 src/routes/commentRoutes.js  | 144 +++++++++++++++-------------
 src/routes/myPlantRoutes.js  | 176 +++++++++++++++++------------------
 src/routes/plantRoutes.js    |  32 +++----
 src/routes/topicRoutes.js    |  83 ++++++++---------
 src/schemas/myPlantSchema.js |   4 +-
 src/schemas/topicSchema.js   |   2 +-
 src/schemas/userSchema.js    |   6 +-
 15 files changed, 463 insertions(+), 461 deletions(-)

diff --git a/src/index.js b/src/index.js
index 6e52e25..c979282 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,38 +1,36 @@
-const express = require("express");
+const express = require('express');
+
 const app = express();
-const morgan = require("morgan");
-const mongoose = require("mongoose");
+const morgan = require('morgan');
+const mongoose = require('mongoose');
 
-const authRoutes = require("./routes/authRoutes");
-const plantRoutes = require("./routes/plantRoutes");
-const topicRoutes = require("./routes/topicRoutes");
-const commentRoutes = require("./routes/commentRoutes");
-const myPlantRoutes = require("./routes/myPlantRoutes");
+const authRoutes = require('./routes/authRoutes');
+const plantRoutes = require('./routes/plantRoutes');
+const topicRoutes = require('./routes/topicRoutes');
+const commentRoutes = require('./routes/commentRoutes');
+const myPlantRoutes = require('./routes/myPlantRoutes');
 // MongoDB connection
 
 // MongoDB connection
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
 // mongodb://mongo:27017/backend => banco de dados da develop
 mongoose
-    .connect(
-        "mongodb://mongo:27017/backend",
-        { useNewUrlParser: true }
-    )
-    .then(() => console.log("MongoDB Connected"))
-    .catch(err => console.log(err));
-
+  .connect('mongodb://mongo:27017/backend', { useNewUrlParser: true })
+  .then(() => console.log('MongoDB Connected'))
+  .catch((err) => console.log(err));
 
 // middlewares
-app.use(morgan("dev"));
-app.use(express.urlencoded({extended: false}));
+app.use(morgan('dev'));
+app.use(express.urlencoded({ extended: false }));
 app.use(express.json());
 
 // routes
-app.use('/plant',plantRoutes);
-app.use('/topic',topicRoutes);
-app.use('/comment',commentRoutes);
-app.use('/auth',authRoutes);
-app.use('/myplants',myPlantRoutes);
+
+app.use('/auth', authRoutes);
+app.use('/plant', plantRoutes);
+app.use('/topic', topicRoutes);
+app.use('/comment', commentRoutes);
+app.use('/myplants', myPlantRoutes);
 
 // starting the server
 app.set('port', process.env.PORT || 3000);
diff --git a/src/models/Comment.js b/src/models/Comment.js
index 1546fef..79ff587 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -1,32 +1,32 @@
-const mongoose = require("mongoose");
-const Schema = mongoose.Schema;
+const mongoose = require('mongoose');
+
+const { Schema } = mongoose;
 
 const CommentSchema = new mongoose.Schema({
-    text: {
-        type: String,
-        require: true,
-    },
-    user: {
-        type: Schema.Types.ObjectId,
-        ref: "User",
-        require: true,
-    },
-    topic: {
-        type: Schema.Types.ObjectId,
-        ref: "Topic",
-        require: true,
-    },
-    likes: {
-        type: Number,
-        default: 0
-    },
-    dislikes: {
-        type: Number,
-        default: 0
-    },
+  text: {
+    type: String,
+    require: true,
+  },
+  user: {
+    type: Schema.Types.ObjectId,
+    ref: 'User',
+    require: true,
+  },
+  topic: {
+    type: Schema.Types.ObjectId,
+    ref: 'Topic',
+    require: true,
+  },
+  likes: {
+    type: Number,
+    default: 0,
+  },
+  dislikes: {
+    type: Number,
+    default: 0,
+  },
 });
 
-
-const Comment = mongoose.model("Comment",CommentSchema);
+const Comment = mongoose.model('Comment', CommentSchema);
 
 module.exports = Comment;
diff --git a/src/models/MyPlant.js b/src/models/MyPlant.js
index 9a31369..6d11ee7 100644
--- a/src/models/MyPlant.js
+++ b/src/models/MyPlant.js
@@ -1,28 +1,28 @@
-const mongoose = require("mongoose");
-const Schema = mongoose.Schema;
+const mongoose = require('mongoose');
+
+const { Schema } = mongoose;
 
 const myPlantSchema = new mongoose.Schema({
-    nickname: {
-        type: String,
-        required: true
-    },
-    user: {
-        type: Schema.Types.ObjectId,
-        ref: "User",
-        require: true,
-    },
-    plant:{
-        type:mongoose.Schema.Types.ObjectId,
-        ref:"Plant",
-        require:true
-    },
-    createdAt: {
-        type: Date,
-        default: Date.now,
-    }
+  nickname: {
+    type: String,
+    required: true,
+  },
+  user: {
+    type: Schema.Types.ObjectId,
+    ref: 'User',
+    require: true,
+  },
+  plant: {
+    type: mongoose.Schema.Types.ObjectId,
+    ref: 'Plant',
+    require: true,
+  },
+  createdAt: {
+    type: Date,
+    default: Date.now,
+  },
 });
 
-
-const myPlant = mongoose.model("MyPlants", myPlantSchema);
+const myPlant = mongoose.model('MyPlants', myPlantSchema);
 
 module.exports = myPlant;
diff --git a/src/models/Plant.js b/src/models/Plant.js
index 72a8d20..3294204 100644
--- a/src/models/Plant.js
+++ b/src/models/Plant.js
@@ -1,62 +1,63 @@
-const mongoose = require("mongoose");
+const mongoose = require('mongoose');
 
 const PlantSchema = new mongoose.Schema({
-    scientificName: {
-        type: String,
-        require: true,
-        unique: true
-    },
-    family_name: {
-        type: String,
-        require: true
-    },
-    gender_name: {
-        type: String,
-        require: true
-    },
-    specie_name: {
-        type: String,
-        require: true
-    },
-    common_name: {
-        type: String,
-        require: true
-    },
-    usage: {
-        type: String,
-        require: true
-    },
-    first_User: {
-        type: String,
-        require: true
-    },
-    collection_count: {
-        type: Number,
-        require: true
-    },
-    extinction: {
-        type: Boolean,
-        require: true
-    },
-    profile_picture: {
-        type: String,
-        require : true
-    },   
-    gbifID: {
-        type: Number,
-        require: true,    
-    },
-    stateProvince: {
-        type: String,
-        require : true
-    },
-    topics: [{
-        type: mongoose.Schema.Types.ObjectId,
-        ref: "Topic",
-    }],
+  scientificName: {
+    type: String,
+    require: true,
+    unique: true,
+  },
+  family_name: {
+    type: String,
+    require: true,
+  },
+  gender_name: {
+    type: String,
+    require: true,
+  },
+  specie_name: {
+    type: String,
+    require: true,
+  },
+  common_name: {
+    type: String,
+    require: true,
+  },
+  usage: {
+    type: String,
+    require: true,
+  },
+  first_User: {
+    type: String,
+    require: true,
+  },
+  collection_count: {
+    type: Number,
+    require: true,
+  },
+  extinction: {
+    type: Boolean,
+    require: true,
+  },
+  profile_picture: {
+    type: String,
+    require: true,
+  },
+  gbifID: {
+    type: Number,
+    require: true,
+  },
+  stateProvince: {
+    type: String,
+    require: true,
+  },
+  topics: [
+    {
+      type: mongoose.Schema.Types.ObjectId,
+      ref: 'Topic',
+    },
+  ],
 });
 
-
-const Plant = mongoose.model("Plant",PlantSchema);
+const Plant = mongoose.model('Plant', PlantSchema);
 
 module.exports = Plant;
diff --git a/src/models/Topic.js b/src/models/Topic.js
index 7c20f95..9b41e3c 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -1,42 +1,45 @@
-const mongoose = require("mongoose");
-const Schema = mongoose.Schema;
+const mongoose = require('mongoose');
+
+const { Schema } = mongoose;
 
 const topicSchema = new Schema({
   title: {
-      type: String,
-      require: true,
+    type: String,
+    require: true,
   },
   description: {
-      type: String,
+    type: String,
   },
-  plant:{
-      type:mongoose.Schema.Types.ObjectId,
-      ref:"Plant",
-      require:true
+  plant: {
+    type: mongoose.Schema.Types.ObjectId,
+    ref: 'Plant',
+    require: true,
   },
   user: {
-      type: Schema.Types.ObjectId,
-      ref: "User",
-      require: true,
+    type: Schema.Types.ObjectId,
+    ref: 'User',
+    require: true,
   },
   likes: {
-      type: Number,
-      default: 0
+    type: Number,
+    default: 0,
   },
   dislikes: {
-      type: Number,
-      default: 0
+    type: Number,
+    default: 0,
   },
-  comments: [{
+  comments: [
+    {
       type: Schema.Types.ObjectId,
-      ref: "Comment"
-  }],
+      ref: 'Comment',
+    },
+  ],
   createdAt: {
-      type: Date,
-      default: Date.now,
+    type: Date,
+    default: Date.now,
   },
 });
 
-const Topic = mongoose.model("Topic", topicSchema);
+const Topic = mongoose.model('Topic', topicSchema);
 
 module.exports = Topic;
diff --git a/src/models/User.js b/src/models/User.js
index cedff95..bbed348 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -1,33 +1,38 @@
-const mongoose = require("mongoose");
-const Schema = mongoose.Schema;
+const mongoose = require('mongoose');
+
+const { Schema } = mongoose;
 
 const userSchema = new Schema({
-    username: {
-        type: String,
-        required: true,
-        unique:true
-    },
-    password: {
-        type: String,
-        required: true
+  username: {
+    type: String,
+    required: true,
+    unique: true,
+  },
+  password: {
+    type: String,
+    required: true,
+  },
+  email: {
+    type: String,
+    required: true,
+    unique: true,
+  },
+  topics: [
+    {
+      type: mongoose.Schema.Types.ObjectId,
+      ref: 'Topics',
+      require: true,
     },
-    email: {
-        type: String,
-        required: true,
-        unique:true
+  ],
+  myPlants: [
+    {
+      type: mongoose.Schema.Types.ObjectId,
+      ref: 'MyPlants',
+      require: true,
     },
-    topics: [{
-        type: mongoose.Schema.Types.ObjectId,
-        ref: "Topics",
-        require: true,
-    }],
-    myPlants: [{
-        type: mongoose.Schema.Types.ObjectId,
-        ref: "MyPlants",
-        require: true,
-    }]
+  ],
 });
 
-const User = mongoose.model("User", userSchema);
+const User = mongoose.model('User', userSchema);
 
 module.exports = User;
diff --git a/src/routes/auth.js b/src/routes/auth.js
index a1b49a8..2b6ba85 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -1,32 +1,27 @@
-
-//confere se o token é valido
-require("dotenv").config();
-const jwt = require("jsonwebtoken");
+// confere se o token é valido
+require('dotenv').config();
+const jwt = require('jsonwebtoken');
 
 const authConfig = {
   secret: process.env.SECRET,
 };
 function auth(req, res, next) {
-    const sessiontoken = req.headers.authtoken;
+  const sessiontoken = req.headers.authtoken;
 
-    if (!sessiontoken) {
-      return res.status(401).send({ Error: 'Token not provided' });
-    }
+  if (!sessiontoken) {
+    return res.status(401).send({ Error: 'Token not provided' });
+  }
 
-    const parts = sessiontoken.split(' ');
+  const parts = sessiontoken.split(' ');
 
-    if (!parts.length === 2) {
-      return res.status(401).send({ Error: 'Token error' });
-    }
+  if (!parts.length === 2) {
+    return res.status(401).send({ Error: 'Token error' });
+  }
 
-    if(!sessiontoken){
-        return res.status(401).send({Error: "Token not provided"});
-    }
-   
-    const parts = sessiontoken.split(" ");
+  const [scheme, token] = parts;
 
   if (!/^Bearer$/i.test(scheme)) {
-    return res.status(401).send({ Error: "Token malformated" });
+    return res.status(401).send({ Error: 'Token malformated' });
   }
 
   try {
@@ -34,7 +29,7 @@ function auth(req, res, next) {
     req.userId = userId;
     return next();
   } catch (err) {
-    req.redirect("/login_page");
+    req.redirect('/login_page');
     return res.status(400);
   }
 }
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index bca008b..c29b72c 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -1,58 +1,62 @@
-const express = require("express");
-const router = express.Router();
-const jsonwebtoken = require("jsonwebtoken");
-const User = require("../models/User");
-const userSchema = require("../schemas/userSchema");
-const {auth,authConfig} = require("./auth");
+const express = require('express');
 
+const router = express.Router();
+const jsonwebtoken = require('jsonwebtoken');
+const User = require('../models/User');
+const userSchema = require('../schemas/userSchema');
+const { auth, authConfig } = require('./auth');
 
-router.post("/login", async(req, res ,next) => {
-  try{
-    const {email, password} = req.body;
+router.post('/login', async (req, res, next) => {
+  try {
+    const { email, password } = req.body;
     const user = await User.findOne({ email, password });
-    if(!user){
-        return res.status(400).send({Error: "User not found"});
+    if (!user) {
+      return res.status(400).send({ Error: 'User not found' });
     }
-    if(password != user.password){
-        return res.status(400).send({ Error: "Incorrect password"});
+    if (password !== user.password) {
+      return res.status(400).send({ Error: 'Incorrect password' });
     }
     user.password = undefined;
     const token = jsonwebtoken.sign({ id: user.id }, authConfig.secret, {
       expiresIn: 86400,
     });
-    const aToken = "Bearer "+token;
-    res.header("authtoken", aToken);
-    res.json({
-        message: "Auth token generated"
-    }).redirect("/main");
-  }catch(err){
-    next(err);
+    const aToken = `Bearer ${token}`;
+    res.header('authtoken', aToken);
+    return res
+      .json({
+        message: 'Auth token generated',
+      })
+      .redirect('/main');
+  } catch (err) {
+    return next(err);
   }
 });
 
-router.post("/signup", async(req, res) => {
+router.post('/signup', async (req, res) => {
   try {
     const newUserData = req.body;
     const result = userSchema.validate(req.body);
 
     await User.findOne({ username: newUserData.username });
 
-      if ( result.error ) return res.status(400).send({ error: "Error while signing up. " + result.error});
+    if (result.error)
+      return res
+        .status(400)
+        .send({ error: `Error while signing up. ${result.error}` });
 
     const user = new User(newUserData);
     await user.save();
 
-      return res.send(user);
-      
-  } catch(err) {
-      return res.status(400).send({ error: "Error while signing up." + err });
+    return res.send(user);
+  } catch (err) {
+    return res.status(400).send({ error: `Error while signing up.${err}` });
   }
 });
 
-router.put("/update/:id",auth, async(req, res) => {
-    try {
-      const user = await User.findById(req.params.id);
-      const newData = req.body;
+router.put('/update/:id', auth, async (req, res) => {
+  try {
+    const user = await User.findById(req.params.id);
+    const newData = req.body;
 
     if (!newData.username) newData.username = user.username;
     if (!newData.password) newData.password = user.password;
@@ -62,22 +66,23 @@ router.put("/update/:id",auth, async(req, res) => {
 
     if (result.error) return res.status(400).send(result.error);
 
-      await User.findOneAndUpdate({_id: req.params.id}, req.body, { useFindAndModify: false})
-        
-      res.send({ message: "User updated successfully."});
+    await User.findOneAndUpdate({ _id: req.params.id }, req.body, {
+      useFindAndModify: false,
+    });
 
-    } catch(err) {
-      return res.status(400).send({ error: "Error while updating user." + err});
-    }
+    return res.send({ message: 'User updated successfully.' });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while updating user.${err}` });
+  }
 });
 
-router.delete("/delete/:id",auth, async(req, res) => {
-    try {
-        await User.findByIdAndDelete(req.params.id);
-        return res.send({ message: "User successfully deleted." });
-    } catch(err) {
-        return res.status(400).send({ error: "Error while deleting user. " + err });
-    }
+router.delete('/delete/:id', auth, async (req, res) => {
+  try {
+    await User.findByIdAndDelete(req.params.id);
+    return res.send({ message: 'User successfully deleted.' });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while deleting user. ${err}` });
+  }
 });
 
 module.exports = router;
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 3a1a670..b670585 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,91 +1,101 @@
-const express = require("express");
-const router = express.Router();
+const express = require('express');
 
-const Topic = require("../models/Topic");
-const User = require("../models/User");
-const Comment = require("../models/Comment");
+const router = express.Router();
 
-router.post("/create/:topicId/:userId", async (req, res) => {
-    try {
+const Topic = require('../models/Topic');
+const Comment = require('../models/Comment');
 
-        if ( !req.body.text ) return res.status(400).send({ error: "Comment should not be empty"});
+router.post('/create/:topicId/:userId', async (req, res) => {
+  try {
+    if (!req.body.text)
+      return res.status(400).send({ error: 'Comment should not be empty' });
 
-        const comment = await Comment.create({...req.body, user: req.params.userId, topic: req.params.topicId});
-        const topic = await Topic.findById(req.params.topicId);
+    const comment = await Comment.create({
+      ...req.body,
+      user: req.params.userId,
+      topic: req.params.topicId,
+    });
+    const topic = await Topic.findById(req.params.topicId);
 
-        await comment.save();
+    await comment.save();
 
-        topic.comments.push(comment);
-        await topic.save();
-    
-        return res.send({ message: "Comment successfully registered." });
+    topic.comments.push(comment);
+    await topic.save();
 
-    } catch (err) {
-        return res.status(400).send({ error: "Error while commenting." + err});
-    }
+    return res.send({ message: 'Comment successfully registered.' });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while commenting.${err}` });
+  }
 });
 
-router.put("/update/:commentId", async (req, res) => {
-
-    try {
-
-        await Comment.findById(req.params.commentId);
-        const newData = req.body;
-
-        if ( !newData.text ) return res.status(400).send({ error: "Comment should not be empty"});
-    
-        await Comment.findOneAndUpdate({_id: req.params.commentId}, req.body, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: "Comment updated successfully."});
-        });
-
-    } catch (err) {
-        return res.status(400).send({ error: "Error while updating comment." + err });
-    }
-
+router.put('/update/:commentId', async (req, res) => {
+  try {
+    await Comment.findById(req.params.commentId);
+    const newData = req.body;
+
+    if (!newData.text)
+      return res.status(400).send({ error: 'Comment should not be empty' });
+
+    await Comment.findOneAndUpdate({ _id: req.params.commentId }, req.body, {
+      useFindAndModify: false,
+    });
+    return res.send({ message: 'Comment updated successfully.' });
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: `Error while updating comment.${err}` });
+  }
 });
 
-router.delete("/delete/:commentId", async (req, res) => {
+router.delete('/delete/:commentId', async (req, res) => {
   try {
+    const topic = Topic.findById(req.body.topicId);
     const index = topic.comments.indexOf(req.params.commentId);
 
-        topic.save();
+    if (index > -1) {
+      topic.comments.splice(index, 1);
+    }
 
-        await Comment.findByIdAndRemove(req.params.commentId).populate("user");
+    topic.save();
 
-        return res.send({
-            message: "Comment successfully removed."
-        });
+    await Comment.findByIdAndRemove(req.params.commentId).populate('user');
 
-    } catch (err) {
-        return res.status(400).send({ error: "Error while deleting topic." + err });
-    }
+    return res.send({
+      message: 'Comment successfully removed.',
+    });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while deleting topic.${err}` });
+  }
 });
 
-router.post("/like/:commentId", async (req, res) => {
-    try {
-
-        await Comment.findOneAndUpdate({_id: req.params.commentId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: "Liked!"});
-        });
-        
-    } catch (err) {
-        return res.status(400).send({ error: "Error while liking comment." + err });
-    }
+router.post('/like/:commentId', async (req, res) => {
+  try {
+    await Comment.findOneAndUpdate(
+      { _id: req.params.commentId },
+      { $inc: { likes: 1 } },
+      { useFindAndModify: false }
+    );
+
+    return res.send({ message: 'Liked!' });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while liking comment.${err}` });
+  }
 });
 
-router.post("/dislike/:commentId", async (req, res) => {
-    try {
-
-        await Comment.findOneAndUpdate({_id: req.params.commentId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
-        .then( () => {
-            res.send({ message: "Disliked!"});
-        });
-        
-    } catch (err) {
-        return res.status(400).send({ error: "Error while linking comment." + err });
-    }
+router.post('/dislike/:commentId', async (req, res) => {
+  try {
+    await Comment.findOneAndUpdate(
+      { _id: req.params.commentId },
+      { $inc: { dislikes: 1 } },
+      { useFindAndModify: false }
+    );
+
+    return res.send({ message: 'Disliked!' });
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: `Error while linking comment.${err}` });
+  }
 });
 
 module.exports = router;
diff --git a/src/routes/myPlantRoutes.js b/src/routes/myPlantRoutes.js
index 27b22bf..18242fa 100644
--- a/src/routes/myPlantRoutes.js
+++ b/src/routes/myPlantRoutes.js
@@ -1,117 +1,115 @@
-const express = require("express");
+const express = require('express');
+
 const router = express.Router();
 
-const User = require("../models/User");
-const Plant = require("../models/Plant");
-const MyPlant = require("../models/MyPlant");
+const User = require('../models/User');
+const Plant = require('../models/Plant');
+const MyPlant = require('../models/MyPlant');
 
-const myPlantSchema = require("../schemas/myPlantSchema");
+const myPlantSchema = require('../schemas/myPlantSchema');
 
-router.get("/", async (req, res) => {
-    res.send({ message: "User Backyard."});
+router.get('/', async (req, res) => {
+  res.send({ message: 'User Backyard.' });
 });
 
-router.post("/add/:userId/:plantId", async (req, res) => {
-
-    try {
-        
-        const user = await User.findById(req.params.userId);
-        const plant = await Plant.findById(req.params.plantId);
-
-        const result = myPlantSchema.validate({ nickname: req.body.nickname});
-        if ( result.error ) {
-            return res.status(400).send({ error: "Error while adding plant to backyard. " + result.error});
-        }
-        
-        const myPlant = {
-            user: user, 
-            nickname: req.body.nickname, 
-            plant: plant
-        };
-        
-        await MyPlant.create(myPlant);
-
-        await user.myPlants.push(myPlant);
-        await user.save()
-            .then( () => {
-                return res.send(user);
-            });
-
-    } catch(err) {
-        return res.status(400).send({ error: 'Error while adding plant to backyard.' + err});
-    }
+router.post('/add/:userId/:plantId', async (req, res) => {
+  try {
+    const user = await User.findById(req.params.userId);
+    const plant = await Plant.findById(req.params.plantId);
 
-});
+    const result = myPlantSchema.validate({ nickname: req.body.nickname });
+    if (result.error) return res.status(400).send(result.error);
 
-router.get("/:userId/:myPlantId", async (req, res) => {
+    const myPlant = {
+      user,
+      nickname: req.body.nickname,
+      plant,
+    };
 
-    try {
+    await MyPlant.create(myPlant);
 
-        const user = await User.findById(req.params.userId);
-        const index = user.myPlants.indexOf(req.params.myPlantId);
+    await user.myPlants.push(myPlant);
+    await user.save();
 
-        if (index > -1) {
-            const myPlant = await MyPlant.findById(req.params.myPlantId);
-            return res.send({
-                nickname: myPlant.nickname,
-                plant: myPlant.plant,
-                creation: myPlant.createdAt
-            });
-        } else {
-            return res.send({
-                message: "Backyard plant not found."
-            });
-        }
+    return res.send(user);
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: `Error while adding plant to backyard.${err}` });
+  }
+});
 
-    } catch(err) {
-        return res.status(400).send({ error: "Error while searching for plant." + err});
+router.get('/:userId/:myPlantId', async (req, res) => {
+  try {
+    const user = await User.findById(req.params.userId);
+    const index = user.myPlants.indexOf(req.params.myPlantId);
+
+    if (index > -1) {
+      const myPlant = await MyPlant.findById(req.params.myPlantId);
+      return res.send({
+        nickname: myPlant.nickname,
+        plant: myPlant.plant,
+        creation: myPlant.createdAt,
+      });
     }
+    return res.send({
+      message: 'Backyard plant not found.',
+    });
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: `Error while searching for plant.${err}` });
+  }
 });
 
-router.put("/edit/:myPlantId", async (req, res) => {
-
-    try {
-        
-        const newNick = req.body;
-
-        const result = myPlantSchema.validate(newNick);
-        if ( result.error ) {
-            return res.status(400).send({ error: "Error while editing plant. " + result.error});
-        }
-
-        await MyPlant.findOneAndUpdate({_id: req.params.myPlantId}, newNick, { useFindAndModify: false});
+router.put('/edit/:myPlantId', async (req, res) => {
+  try {
+    const newNick = req.body;
 
-        return res.send({ message: "Backyard plant updated successfully."});
-
-    } catch (err) {
-        return res.status(400).send({ error: "Error while updating backyard plant." + err });
+    const result = myPlantSchema.validate(newNick);
+    if (result.error) {
+      return res
+        .status(400)
+        .send({ error: `Error while editing plant. ${result.error}` });
     }
-});
-
-router.delete("/delete/:myPlantId", async (req, res) => {
 
-    try {
+    await MyPlant.findOneAndUpdate({ _id: req.params.myPlantId }, newNick, {
+      useFindAndModify: false,
+    });
 
-        const myPlant = await MyPlant.findById(req.params.myPlantId);
-        const user = await User.findById(myPlant.user);
+    return res.send({ message: 'Backyard plant updated successfully.' });
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: `Error while updating backyard plant.${err}` });
+  }
+});
 
-        const index = user.myPlants.indexOf(req.params.myPlantId);
+router.delete('/delete/:myPlantId', async (req, res) => {
+  try {
+    const myPlant = await MyPlant.findById(req.params.myPlantId);
+    const user = await User.findById(myPlant.user);
 
-        if (index > -1) {
-            user.myPlants.splice(index, 1);
-        }
+    const index = user.myPlants.indexOf(req.params.myPlantId);
 
-        await user.save();
+    if (index > -1) {
+      user.myPlants.splice(index, 1);
+    }
 
-        await MyPlant.findByIdAndRemove(req.params.myPlantId, { useFindAndModify: false });
+    await user.save();
 
-        return res.send({
-            message: "Plant successfully removed from backyard."
-        });
+    await MyPlant.findByIdAndRemove(req.params.myPlantId, {
+      useFindAndModify: false,
+    });
 
-    } catch(err) {
-        return res.status(400).send({ error: "Error while deleting plant from backyard." + err });
-    }
+    return res.send({
+      message: 'Plant successfully removed from backyard.',
+    });
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: `Error while deleting plant from backyard.${err}` });
+  }
 });
 
 module.exports = router;
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index e830628..86b8c00 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -1,12 +1,12 @@
-const express = require("express");
+const express = require('express');
 
-const Plant = require("../models/Plant");
-const Topic = require("../models/Topic");
+const Plant = require('../models/Plant');
+const Topic = require('../models/Topic');
 
 const router = express.Router();
 
 // registro de uma nova planta
-router.post("/register", async (req, res) => {
+router.post('/register', async (req, res) => {
   try {
     const {
       scientificName,
@@ -53,44 +53,40 @@ router.post("/register", async (req, res) => {
     return res.send(err);
   }
 });
-
 // Listagem de Todas as plantas
-router.get("/", async (req, res) => {
+router.get('/', async (req, res) => {
   try {
-    const plants = await Plant.find().populate("topics");
+    const plants = await Plant.find().populate('topics');
 
     return res.send({ plants });
   } catch (err) {
-    return res.status(400).send({ error: "Loading plants failed" });
+    return res.status(400).send({ error: 'Loading plants failed' });
   }
 });
-
 // Procurando planta por id
-router.get("/:plantId", async (req, res) => {
+router.get('/:plantId', async (req, res) => {
   try {
-    const plant = await Plant.findById(req.params.plantId).populate("topics");
+    const plant = await Plant.findById(req.params.plantId).populate('topics');
 
     return res.send({ plant });
   } catch (err) {
     return res
       .status(400)
-      .send({ error: "error when searching for this plant " });
+      .send({ error: 'error when searching for this plant ' });
   }
 });
-
 // Deletando planta por id
-router.delete("/:plantId", async (req, res) => {
+router.delete('/:plantId', async (req, res) => {
   try {
     const deleted = await Plant.findByIdAndRemove(req.params.plantId);
 
     return res.send(deleted);
   } catch (err) {
-    return res.status(400).send({ error: "Error when Delete this plant" });
+    return res.status(400).send({ error: 'Error when Delete this plant' });
   }
 });
-
 // Dando upgrade planta por id
-router.put("/:plantId", async (req, res) => {
+router.put('/:plantId', async (req, res) => {
   try {
     const {
       scientificName,
@@ -144,7 +140,7 @@ router.put("/:plantId", async (req, res) => {
 
     return res.send({ plant });
   } catch (err) {
-    return res.status(400).send({ error: "Registration failed" });
+    return res.status(400).send({ error: 'Registration failed' });
   }
 });
 
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index c4466bc..24704da 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -1,27 +1,18 @@
-const express = require("express");
-const router = express.Router();
-
-const Topic = require("../models/Topic");
-const User = require("../models/User");
-const Plant = require("../models/Plant");
-const topicSchema = require("../schemas/topicSchema");
+const express = require('express');
 
-router.post("/create/:plantId/:userId", async (req, res) => {
-<<<<<<< b81344db108ef6c101199916a09409909e9970c5
-    
-    try {
+const router = express.Router();
 
-        const user = await User.findById(req.params.userId);
-        const plant = await Plant.findById(req.params.plantId);
+const Topic = require('../models/Topic');
+const User = require('../models/User');
+const Plant = require('../models/Plant');
+const topicSchema = require('../schemas/topicSchema');
 
-        const result = topicSchema.validate(req.body);
-=======
+router.post('/create/:plantId/:userId', async (req, res) => {
   try {
     const user = await User.findById(req.params.userId);
     const plant = await Plant.findById(req.params.plantId);
->>>>>>> Update PR to follow codacy patterns
 
-        if ( result.error ) return res.status(400).send({ error: "Error while creating topic. " + result.error});
+    const result = topicSchema.validate(req.body);
 
     if (result.error) {
       return res
@@ -40,38 +31,41 @@ router.post("/create/:plantId/:userId", async (req, res) => {
     user.topics.push(topic);
     await user.save();
 
-    } catch (err) {
-        return res.status(400).send({ error: "Error while creating topic." + err });
-    }
+    plant.topics.push(topic);
+    await plant.save();
 
     return res.send({ topic });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while creating topic.${err}` });
+  }
 });
 
-router.put("/update/:topicId", async (req, res) => {
-<<<<<<< b81344db108ef6c101199916a09409909e9970c5
-=======
+router.put('/update/:topicId', async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId);
->>>>>>> Update PR to follow codacy patterns
 
-  try {
     const newData = req.body;
 
     if (!newData.title) newData.title = topic.title;
     if (!newData.description) newData.description = topic.description;
 
-        const newData = req.body;
+    const result = topicSchema.validate(newData);
+    if (result.error) {
+      return res
+        .status(400)
+        .send({ error: `Error while creating topic. ${result.error}` });
+    }
 
     await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
       useFindAndModify: false,
     });
-    return res.send({ message: "Topic updated successfully." });
+    return res.send({ message: 'Topic updated successfully.' });
   } catch (err) {
     return res.status(400).send({ error: `Error while updating topic.${err}` });
   }
 });
 
-router.delete("/delete/:topicId", async (req, res) => {
+router.delete('/delete/:topicId', async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId);
     const user = await User.findById(topic.user);
@@ -90,52 +84,49 @@ router.delete("/delete/:topicId", async (req, res) => {
     user.save();
     plant.save();
 
-        return res.send({
-            message: "Topic successfully removed."
-        });
+    await Topic.findByIdAndRemove(req.params.topicId, {
+      useFindAndModify: false,
+    });
 
     return res.send({
-      message: "Topic successfully removed.",
+      message: 'Topic successfully removed.',
     });
   } catch (err) {
     return res.status(400).send({ error: `Error while deleting topic.${err}` });
   }
 });
 
-router.get("/list", async (req, res) => {
+router.get('/list', async (req, res) => {
   try {
-    const topic = await Topic.find().populate(["user"]);
-
-        const topic = await Topic.find().populate(["user"]);
+    const topic = await Topic.find().populate(['user']);
 
-        return res.send({ topic });
-
-    } catch (err) {
-        return res.status(400).send({ error: "Error while listing topics." + err });
-    }
+    return res.send({ topic });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while listing topics.${err}` });
+  }
 });
 
-router.post("/like/:topicId", async (req, res) => {
+router.post('/like/:topicId', async (req, res) => {
   try {
     await Topic.findOneAndUpdate(
       { _id: req.params.topicId },
       { $inc: { likes: 1 } },
       { useFindAndModify: false }
     );
-    return res.send({ message: "Liked!" });
+    return res.send({ message: 'Liked!' });
   } catch (err) {
     return res.status(400).send({ error: `Error while liking topic.${err}` });
   }
 });
 
-router.post("/dislike/:topicId", async (req, res) => {
+router.post('/dislike/:topicId', async (req, res) => {
   try {
     await Topic.findOneAndUpdate(
       { _id: req.params.topicId },
       { $inc: { dislikes: 1 } },
       { useFindAndModify: false }
     );
-    return res.send({ message: "Disliked!" });
+    return res.send({ message: 'Disliked!' });
   } catch (err) {
     return res
       .status(400)
@@ -143,4 +134,4 @@ router.post("/dislike/:topicId", async (req, res) => {
   }
 });
 
-module.exports = router;
+module.exports = router;
\ No newline at end of file
diff --git a/src/schemas/myPlantSchema.js b/src/schemas/myPlantSchema.js
index 484265d..5a9553e 100644
--- a/src/schemas/myPlantSchema.js
+++ b/src/schemas/myPlantSchema.js
@@ -1,7 +1,7 @@
-const Joi = require("joi");
+const Joi = require('joi');
 
 const myPlantSchema = Joi.object({
-    nickname: Joi.string().alphanum().min(2).max(20).required(),
+  nickname: Joi.string().alphanum().min(2).max(20).required(),
 });
 
 module.exports = myPlantSchema;
diff --git a/src/schemas/topicSchema.js b/src/schemas/topicSchema.js
index e4cd441..9a0379e 100644
--- a/src/schemas/topicSchema.js
+++ b/src/schemas/topicSchema.js
@@ -1,4 +1,4 @@
-const Joi = require("joi");
+const Joi = require('joi');
 
 const topicSchema = Joi.object({
   title: Joi.string().min(4).max(30).required(),
diff --git a/src/schemas/userSchema.js b/src/schemas/userSchema.js
index f36f84d..20101d6 100644
--- a/src/schemas/userSchema.js
+++ b/src/schemas/userSchema.js
@@ -1,4 +1,4 @@
-const Joi = require("joi");
+const Joi = require('joi');
 
 const userSchema = Joi.object({
   username: Joi.string().alphanum().min(4).max(30).required(),
@@ -6,8 +6,8 @@ const userSchema = Joi.object({
   passwordConfirmation: Joi.string()
     .min(8)
     .required()
-    .valid(Joi.ref("password"))
-    .error(new Error("Password confirmation does not match.")),
+    .valid(Joi.ref('password'))
+    .error(new Error('Password confirmation does not match.')),
   email: Joi.string().email().required(),
 });
 

From 6e31723e12e4520a9ce0ba2188cf672954ce9be8 Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Sat, 14 Nov 2020 15:57:30 -0300
Subject: [PATCH 099/147] Fix creation of a myPlant bug

---
 src/routes/myPlantRoutes.js | 10 +++++-----
 src/routes/topicRoutes.js   |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/routes/myPlantRoutes.js b/src/routes/myPlantRoutes.js
index 18242fa..d35d976 100644
--- a/src/routes/myPlantRoutes.js
+++ b/src/routes/myPlantRoutes.js
@@ -20,18 +20,18 @@ router.post('/add/:userId/:plantId', async (req, res) => {
     const result = myPlantSchema.validate({ nickname: req.body.nickname });
     if (result.error) return res.status(400).send(result.error);
 
-    const myPlant = {
+    const myPlant = await MyPlant.create({
       user,
       nickname: req.body.nickname,
       plant,
-    };
-
-    await MyPlant.create(myPlant);
+    });
 
     await user.myPlants.push(myPlant);
     await user.save();
 
-    return res.send(user);
+    return res.status(200).send({
+      message: 'Plant successfuly addded to backyard.',
+    });
   } catch (err) {
     return res
       .status(400)
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 24704da..d03c9c6 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -134,4 +134,4 @@ router.post('/dislike/:topicId', async (req, res) => {
   }
 });
 
-module.exports = router;
\ No newline at end of file
+module.exports = router;

From 7914a74734dd36effbbff8d234401dd3e9e8be81 Mon Sep 17 00:00:00 2001
From: joaovitorml <joao.lemos4000@gmail.com>
Date: Sun, 15 Nov 2020 14:29:05 -0300
Subject: [PATCH 100/147] Post myPlant now returns myPlant body instead of
 success message

---
 src/routes/myPlantRoutes.js | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/routes/myPlantRoutes.js b/src/routes/myPlantRoutes.js
index d35d976..fa4864a 100644
--- a/src/routes/myPlantRoutes.js
+++ b/src/routes/myPlantRoutes.js
@@ -29,9 +29,10 @@ router.post('/add/:userId/:plantId', async (req, res) => {
     await user.myPlants.push(myPlant);
     await user.save();
 
-    return res.status(200).send({
-      message: 'Plant successfuly addded to backyard.',
-    });
+    return res.status(200).send({myPlant});
+    // return res.status(200).send({
+    //   message: 'Plant successfuly addded to backyard.',
+    // });
   } catch (err) {
     return res
       .status(400)

From 854d1f6ccdc36ec10ba630b8b338e8436324987a Mon Sep 17 00:00:00 2001
From: senaarth <senaarth@gmail.com>
Date: Fri, 13 Nov 2020 17:52:24 -0300
Subject: [PATCH 101/147] Create add favorite plant feature
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Vinícius Vieira de Souza <vd.souza1999@gmail.com>
Co-authored-by: Victor Santos <victor.samuelsantoss@gmail.com>
---
 src/index.js                 |  3 ++-
 src/models/User.js           |  7 +++++++
 src/routes/favoriteRoutes.js | 26 ++++++++++++++++++++++++++
 3 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 src/routes/favoriteRoutes.js

diff --git a/src/index.js b/src/index.js
index c979282..47af98a 100644
--- a/src/index.js
+++ b/src/index.js
@@ -9,7 +9,7 @@ const plantRoutes = require('./routes/plantRoutes');
 const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
 const myPlantRoutes = require('./routes/myPlantRoutes');
-// MongoDB connection
+const favoriteRoutes = require('./routes/favoriteRoutes');
 
 // MongoDB connection
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
@@ -31,6 +31,7 @@ app.use('/plant', plantRoutes);
 app.use('/topic', topicRoutes);
 app.use('/comment', commentRoutes);
 app.use('/myplants', myPlantRoutes);
+app.use('/favorite', favoriteRoutes);
 
 // starting the server
 app.set('port', process.env.PORT || 3000);
diff --git a/src/models/User.js b/src/models/User.js
index bbed348..fd314ee 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -31,6 +31,13 @@ const userSchema = new Schema({
       require: true,
     },
   ],
+  favorites: [
+    {
+      type: mongoose.Schema.Types.ObjectId,
+      ref: 'Plants',
+      require: true,
+    },
+  ],
 });
 
 const User = mongoose.model('User', userSchema);
diff --git a/src/routes/favoriteRoutes.js b/src/routes/favoriteRoutes.js
new file mode 100644
index 0000000..f97ee33
--- /dev/null
+++ b/src/routes/favoriteRoutes.js
@@ -0,0 +1,26 @@
+const express = require('express');
+
+const router = express.Router();
+
+const User = require('../models/User');
+const Plant = require('../models/Plant');
+
+router.post('/add/:userId/:plantId', async (req, res) => {
+  try {
+    const user = await User.findById(req.params.userId);
+    const plant = await Plant.findById(req.params.plantId);
+
+    if (user.favorites.indexOf(plant) === -1) {
+      user.favorites.push(plant);
+      await user.save();
+    }
+
+    return res.status(200).send({ plant });
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: `Error while adding new favorite plant. ${err}` });
+  }
+});
+
+module.exports = router;

From 5814de3ea3220c9d7cc01611073c3975f78fee85 Mon Sep 17 00:00:00 2001
From: Victor Samuel <victor.samuelsantoss@gmail.com>
Date: Fri, 13 Nov 2020 18:32:44 -0300
Subject: [PATCH 102/147] Create favorite listing feature
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Arthur Sena <senaarth@gmail.com>
Co-authored-by: Vinícius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/index.js                 |  2 +-
 src/routes/favoriteRoutes.js | 14 ++++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/index.js b/src/index.js
index 47af98a..5ed88c2 100644
--- a/src/index.js
+++ b/src/index.js
@@ -31,7 +31,7 @@ app.use('/plant', plantRoutes);
 app.use('/topic', topicRoutes);
 app.use('/comment', commentRoutes);
 app.use('/myplants', myPlantRoutes);
-app.use('/favorite', favoriteRoutes);
+app.use('/favorites', favoriteRoutes);
 
 // starting the server
 app.set('port', process.env.PORT || 3000);
diff --git a/src/routes/favoriteRoutes.js b/src/routes/favoriteRoutes.js
index f97ee33..7e6eff6 100644
--- a/src/routes/favoriteRoutes.js
+++ b/src/routes/favoriteRoutes.js
@@ -23,4 +23,18 @@ router.post('/add/:userId/:plantId', async (req, res) => {
   }
 });
 
+router.get('/list/:userId', async (req, res) => {
+  try{
+    const user = await User.findById(req.params.userId);
+    const favorites = user.favorites;
+
+    return res.status(200).send({ favorites });
+
+  }catch (err){
+    return res
+      .status(400)
+      .send({ error: `Error loading favorites. ${err}` });
+  }
+});
+
 module.exports = router;

From 88a721faee7c26b283561a588c0389b6d4877faa Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Fri, 13 Nov 2020 19:14:05 -0300
Subject: [PATCH 103/147] Create deleting favorite plant feature

Co-authored-by: Arthur Sena <senaarth@gmail.com>
Co-authored-by: Victor Samuel dos Santos Lucas <victor.samuelsantoss@gmail.com>
---
 src/routes/favoriteRoutes.js | 29 ++++++++++++++++++++++-------
 src/routes/myPlantRoutes.js  |  2 +-
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/src/routes/favoriteRoutes.js b/src/routes/favoriteRoutes.js
index 7e6eff6..40e826c 100644
--- a/src/routes/favoriteRoutes.js
+++ b/src/routes/favoriteRoutes.js
@@ -15,7 +15,9 @@ router.post('/add/:userId/:plantId', async (req, res) => {
       await user.save();
     }
 
-    return res.status(200).send({ plant });
+    return res
+      .status(200)
+      .send({ message: 'Plant successfuly added to user favorites.' });
   } catch (err) {
     return res
       .status(400)
@@ -24,16 +26,29 @@ router.post('/add/:userId/:plantId', async (req, res) => {
 });
 
 router.get('/list/:userId', async (req, res) => {
-  try{
+  try {
     const user = await User.findById(req.params.userId);
-    const favorites = user.favorites;
+    const { favorites } = user;
 
     return res.status(200).send({ favorites });
+  } catch (err) {
+    return res.status(400).send({ error: `Error loading favorites. ${err}` });
+  }
+});
 
-  }catch (err){
-    return res
-      .status(400)
-      .send({ error: `Error loading favorites. ${err}` });
+router.delete('/delete/:userId/:plantId', async (req, res) => {
+  try {
+    const user = await User.findById(req.params.userId);
+    const index = user.favorites.indexOf(req.params.plantId);
+
+    if (index > -1) {
+      user.favorites.splice(index, 1);
+      await user.save();
+    }
+
+    return res.status(200).send({ message: 'Favorite deleted successfuly' });
+  } catch (err) {
+    return res.status(400).send({ error: `Error deleting favorite. ${err}` });
   }
 });
 
diff --git a/src/routes/myPlantRoutes.js b/src/routes/myPlantRoutes.js
index fa4864a..f7f461a 100644
--- a/src/routes/myPlantRoutes.js
+++ b/src/routes/myPlantRoutes.js
@@ -29,7 +29,7 @@ router.post('/add/:userId/:plantId', async (req, res) => {
     await user.myPlants.push(myPlant);
     await user.save();
 
-    return res.status(200).send({myPlant});
+    return res.status(200).send({ myPlant });
     // return res.status(200).send({
     //   message: 'Plant successfuly addded to backyard.',
     // });

From 8140bcd0cffe534810ecd2b31c642444d10f4ac6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20V=C3=ADtor=20Lemos?= <joao.lemos4000@gmail.com>
Date: Sun, 15 Nov 2020 19:06:44 -0300
Subject: [PATCH 104/147] Update linters.yml

---
 .github/workflows/linters.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml
index be4aebc..7794778 100644
--- a/.github/workflows/linters.yml
+++ b/.github/workflows/linters.yml
@@ -17,6 +17,6 @@ jobs:
       - name: Setup ESLint
         run: |
           npm install --save-dev babel-eslint@10.1.x eslint@7.11.x eslint-config-airbnb@18.2.x eslint-config-prettier@6.13.x eslint-import-resolver-node@0.3.x eslint-module-utils@2.6.x eslint-plugin-import@2.22.x eslint-plugin-jsx-a11y@6.3.x eslint-plugin-prettier@3.1.x eslint-plugin-react@7.21.x eslint-plugin-react-hooks@4.1.x eslint-scope@5.1.x eslint-utils@2.1.x eslint-visitor-keys@2.0.x
-          [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/fga-eps-mds/2020.1-GaiaDex-BackEnd/adding_eslint/.eslintrc.json
+          [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/fga-eps-mds/2020.1-GaiaDex-BackEnd/develop/.eslintrc.json
       - name: ESLint Report
         run: npx eslint .

From b8b7e897c1f37cb7d68652c70764d3de9724247f Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Wed, 21 Oct 2020 20:52:02 -0300
Subject: [PATCH 105/147] Create collection route and model

Co-authored-by: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
---
 src/index.js                   |  7 ++++++-
 src/models/Collection.js       | 19 +++++++++++++++++++
 src/routes/auth.js             |  3 ++-
 src/routes/authRoutes.js       | 11 +++++++++++
 src/routes/collectionRoutes.js | 21 +++++++++++++++++++++
 5 files changed, 59 insertions(+), 2 deletions(-)
 create mode 100644 src/models/Collection.js
 create mode 100644 src/routes/collectionRoutes.js

diff --git a/src/index.js b/src/index.js
index 5ed88c2..c3d2e13 100644
--- a/src/index.js
+++ b/src/index.js
@@ -10,12 +10,16 @@ const topicRoutes = require('./routes/topicRoutes');
 const commentRoutes = require('./routes/commentRoutes');
 const myPlantRoutes = require('./routes/myPlantRoutes');
 const favoriteRoutes = require('./routes/favoriteRoutes');
+const collectionRoutes = require('./routes/collectionRoutes');
 
 // MongoDB connection
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
 // mongodb://mongo:27017/backend => banco de dados da develop
 mongoose
-  .connect('mongodb://mongo:27017/backend', { useNewUrlParser: true })
+  .connect('mongodb://mongo:27017/backend', {
+    useNewUrlParser: true,
+    useUnifiedTopology: true,
+  })
   .then(() => console.log('MongoDB Connected'))
   .catch((err) => console.log(err));
 
@@ -32,6 +36,7 @@ app.use('/topic', topicRoutes);
 app.use('/comment', commentRoutes);
 app.use('/myplants', myPlantRoutes);
 app.use('/favorites', favoriteRoutes);
+app.use('/collection', collectionRoutes);
 
 // starting the server
 app.set('port', process.env.PORT || 3000);
diff --git a/src/models/Collection.js b/src/models/Collection.js
new file mode 100644
index 0000000..4a4bbfd
--- /dev/null
+++ b/src/models/Collection.js
@@ -0,0 +1,19 @@
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+
+const CollectionSchema = new mongoose.Schema({
+    user: {
+        type: Schema.Types.ObjectId,
+        ref: 'User',
+        require: true,
+    },
+    myPlants: [{
+        type: Schema.Types.ObjectId,
+        ref: 'MyPlants',
+        require: true,
+    }],
+});
+
+const Collection = mongoose.model('Collection', CollectionSchema);
+
+module.exports = Collection;
\ No newline at end of file
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 2b6ba85..cf10e66 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -3,7 +3,8 @@ require('dotenv').config();
 const jwt = require('jsonwebtoken');
 
 const authConfig = {
-  secret: process.env.SECRET,
+    "secret": "59b2ee8d99ffea68cecc48a56f303d65" 
+    
 };
 function auth(req, res, next) {
   const sessiontoken = req.headers.authtoken;
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index c29b72c..0ff0cde 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -85,4 +85,15 @@ router.delete('/delete/:id', auth, async (req, res) => {
   }
 });
 
+// //REMOVER ESSA ROTA POIS ELA EU CRIEI PARA APRENDIZADO
+// router.get('/list/:UserID', async(req, res) =>{
+//   try{
+//       //id do faco400: 5f8e17bbc1222a0028041272
+//       //const {username} = "faco400"
+//       //const teste = await User.find().populate('username');
+//   }catch(err){
+//       return res.status(400).send({error: 'Error visualizing collection' + err});
+//   }
+// })
+
 module.exports = router;
diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
new file mode 100644
index 0000000..5f36adb
--- /dev/null
+++ b/src/routes/collectionRoutes.js
@@ -0,0 +1,21 @@
+const express = require('express');
+const router = express.Router();
+
+const Collection = require('../models/Collection');
+const User = require('../models/User');
+
+router.get('/', async(req, res) => {
+    res.send({message: "collection"});
+});
+
+router.get('/:userId', async(req, res) =>{
+    try{
+
+        const user = await User.findById(req.params.UserID);
+        return res.send(user.myPlants);
+    }catch(err){
+        return res.status(400).send({error: 'Error visualizing collection' + err});
+    }
+})
+
+module.exports = router;
\ No newline at end of file

From 4bbf4c950a73df4dccebaafc21925276f07fd430 Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Tue, 27 Oct 2020 20:15:50 -0300
Subject: [PATCH 106/147] Fix visualize_my_collection

---
 src/routes/auth.js             |  2 +-
 src/routes/collectionRoutes.js | 28 ++++++++++++++++++++++++++--
 src/routes/plantRoutes.js      |  2 ++
 3 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/src/routes/auth.js b/src/routes/auth.js
index cf10e66..d9e92a9 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -3,7 +3,7 @@ require('dotenv').config();
 const jwt = require('jsonwebtoken');
 
 const authConfig = {
-    "secret": "59b2ee8d99ffea68cecc48a56f303d65" 
+    "secret": process.env.SECRET
     
 };
 function auth(req, res, next) {
diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index 5f36adb..b4e1912 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -1,8 +1,11 @@
 const express = require('express');
 const router = express.Router();
 
+
 const Collection = require('../models/Collection');
 const User = require('../models/User');
+const MyPlant = require('../models/myPlant');
+const Plant = require('../models/Plant');
 
 router.get('/', async(req, res) => {
     res.send({message: "collection"});
@@ -10,9 +13,30 @@ router.get('/', async(req, res) => {
 
 router.get('/:userId', async(req, res) =>{
     try{
+        const user = await User.findById(req.params.userId);
+        const length = user.myPlants.length;
+        console.log(user.myPlants.length);
+        if(length > 0) {
+            //mostra todas as plantas
+            for(var index = 0; index < user.myPlants.length; index++) {
+                var myplant = await MyPlant.findById(user.myPlants[index]);
+                var typePlant = await Plant.findById(myplant.plant);
+                res.send(myplant.nickname);
+                //res.send(Object.values());
+            }
+            //return res.send(user.myPlants[0]);
+            //return res.send({message: "collection!!"})
+
+            // const data = new Date();
+            // const tempo = {
+            //     "dia": data.getDate(),
+            //     "mes": data.getMonth()+1,
+            //     "ano": data.getFullYear(),
+            // }
 
-        const user = await User.findById(req.params.UserID);
-        return res.send(user.myPlants);
+        }else{
+            return res.send({message: "No plants in my collection"});
+        }
     }catch(err){
         return res.status(400).send({error: 'Error visualizing collection' + err});
     }
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 86b8c00..a218020 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -2,6 +2,8 @@ const express = require('express');
 
 const Plant = require('../models/Plant');
 const Topic = require('../models/Topic');
+const myPlant = require('../models/myPlant');
+const User = require('../models/User');
 
 const router = express.Router();
 

From df53210e0d3671868d5232cca726c480fcb7514c Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 27 Oct 2020 19:35:27 -0400
Subject: [PATCH 107/147] Fix collections
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Vinícius Vieira de Souza <vd.souza1999@gmail.com>
---
 .dockerignore                  | 3 ++-
 src/routes/collectionRoutes.js | 6 +++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/.dockerignore b/.dockerignore
index edd83c0..87dcaf7 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,4 +1,5 @@
 node_modules
 npm-debug.log
 Dockerfile
-.dockerignore
\ No newline at end of file
+.dockerignore
+.env
\ No newline at end of file
diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index b4e1912..216e782 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -17,13 +17,17 @@ router.get('/:userId', async(req, res) =>{
         const length = user.myPlants.length;
         console.log(user.myPlants.length);
         if(length > 0) {
+            var plantArray=[];
             //mostra todas as plantas
             for(var index = 0; index < user.myPlants.length; index++) {
                 var myplant = await MyPlant.findById(user.myPlants[index]);
                 var typePlant = await Plant.findById(myplant.plant);
-                res.send(myplant.nickname);
+                var objplant = "{\"nickname\" : \"" + myplant.nickname + "\", \"common_name\" : \"" + typePlant.common_name + "\"}"
+                var objplant = JSON.parse(objplant);
+                plantArray.push(objplant);
                 //res.send(Object.values());
             }
+            res.send(plantArray);
             //return res.send(user.myPlants[0]);
             //return res.send({message: "collection!!"})
 

From 08ba10e1ae7f624558b9f129407097616ebcf902 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 27 Oct 2020 20:41:45 -0400
Subject: [PATCH 108/147] New model plantNotifications
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Vinícius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/models/myPlant.js            | 28 +++++++++++++++++++++++++++
 src/models/plantNotifications.js | 33 ++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+)
 create mode 100644 src/models/myPlant.js
 create mode 100644 src/models/plantNotifications.js

diff --git a/src/models/myPlant.js b/src/models/myPlant.js
new file mode 100644
index 0000000..6d11ee7
--- /dev/null
+++ b/src/models/myPlant.js
@@ -0,0 +1,28 @@
+const mongoose = require('mongoose');
+
+const { Schema } = mongoose;
+
+const myPlantSchema = new mongoose.Schema({
+  nickname: {
+    type: String,
+    required: true,
+  },
+  user: {
+    type: Schema.Types.ObjectId,
+    ref: 'User',
+    require: true,
+  },
+  plant: {
+    type: mongoose.Schema.Types.ObjectId,
+    ref: 'Plant',
+    require: true,
+  },
+  createdAt: {
+    type: Date,
+    default: Date.now,
+  },
+});
+
+const myPlant = mongoose.model('MyPlants', myPlantSchema);
+
+module.exports = myPlant;
diff --git a/src/models/plantNotifications.js b/src/models/plantNotifications.js
new file mode 100644
index 0000000..36155f6
--- /dev/null
+++ b/src/models/plantNotifications.js
@@ -0,0 +1,33 @@
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+
+const notificationsSchema = new mongoose.Schema({
+    nickname: {
+        type: String,
+        required: true
+    },
+    user: {
+        type: Schema.Types.ObjectId,
+        ref: 'User',
+        require: true,
+    },
+    plant:{
+        type:mongoose.Schema.Types.ObjectId,
+        ref:'Plant',
+        require:true
+    },
+    createdAt: {
+        type: Date,
+        default: Date.now,
+    },
+
+    notifications: {
+        type:mongoose.Schema.Types.ObjectId,
+        ref:'plantNotifications',
+    }
+});
+
+
+const plantNotifications = mongoose.model('plantNotifications', notificationsSchema);
+
+module.exports = plantNotifications;
\ No newline at end of file

From e82d5a4dd0f53f18007a62978415d21de5e8a7db Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Tue, 27 Oct 2020 22:52:52 -0300
Subject: [PATCH 109/147] Create plantNotification model and added to
 collectionRoute

Co-authored-by: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
---
 src/models/plantNotification.js  | 16 ++++++++++++++++
 src/models/plantNotifications.js | 33 --------------------------------
 src/routes/collectionRoutes.js   | 26 ++++++++++++++++++++-----
 src/routes/plantRoutes.js        |  2 --
 4 files changed, 37 insertions(+), 40 deletions(-)
 create mode 100644 src/models/plantNotification.js
 delete mode 100644 src/models/plantNotifications.js

diff --git a/src/models/plantNotification.js b/src/models/plantNotification.js
new file mode 100644
index 0000000..7063129
--- /dev/null
+++ b/src/models/plantNotification.js
@@ -0,0 +1,16 @@
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+
+const notificationsSchema = new mongoose.Schema({
+    water: {
+        type: String,
+    },
+    fertilize: {
+        type: String,
+    },
+});
+
+
+const plantNotification = mongoose.model('plantNotification', notificationsSchema);
+
+module.exports = plantNotification;
\ No newline at end of file
diff --git a/src/models/plantNotifications.js b/src/models/plantNotifications.js
deleted file mode 100644
index 36155f6..0000000
--- a/src/models/plantNotifications.js
+++ /dev/null
@@ -1,33 +0,0 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
-
-const notificationsSchema = new mongoose.Schema({
-    nickname: {
-        type: String,
-        required: true
-    },
-    user: {
-        type: Schema.Types.ObjectId,
-        ref: 'User',
-        require: true,
-    },
-    plant:{
-        type:mongoose.Schema.Types.ObjectId,
-        ref:'Plant',
-        require:true
-    },
-    createdAt: {
-        type: Date,
-        default: Date.now,
-    },
-
-    notifications: {
-        type:mongoose.Schema.Types.ObjectId,
-        ref:'plantNotifications',
-    }
-});
-
-
-const plantNotifications = mongoose.model('plantNotifications', notificationsSchema);
-
-module.exports = plantNotifications;
\ No newline at end of file
diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index 216e782..af12689 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -1,11 +1,10 @@
 const express = require('express');
 const router = express.Router();
 
-
-const Collection = require('../models/Collection');
 const User = require('../models/User');
 const MyPlant = require('../models/myPlant');
 const Plant = require('../models/Plant');
+const plantNotification = require('../models/plantNotification');
 
 router.get('/', async(req, res) => {
     res.send({message: "collection"});
@@ -18,15 +17,14 @@ router.get('/:userId', async(req, res) =>{
         console.log(user.myPlants.length);
         if(length > 0) {
             var plantArray=[];
-            //mostra todas as plantas
             for(var index = 0; index < user.myPlants.length; index++) {
                 var myplant = await MyPlant.findById(user.myPlants[index]);
                 var typePlant = await Plant.findById(myplant.plant);
-                var objplant = "{\"nickname\" : \"" + myplant.nickname + "\", \"common_name\" : \"" + typePlant.common_name + "\"}"
+                var objplant = "{\"nickname\" : \"" + myplant.nickname + "\", \"common_name\" : \"" + typePlant.common_name + "\", \"profile_picture\" : \"" + typePlant.profile_picture + "\"}";
                 var objplant = JSON.parse(objplant);
                 plantArray.push(objplant);
-                //res.send(Object.values());
             }
+
             res.send(plantArray);
             //return res.send(user.myPlants[0]);
             //return res.send({message: "collection!!"})
@@ -45,5 +43,23 @@ router.get('/:userId', async(req, res) =>{
         return res.status(400).send({error: 'Error visualizing collection' + err});
     }
 })
+router.post('/:myPlantID', async(req,res) =>{
+    try{
+        const {water, fertilize} = req.body
+        const notification = await plantNotification.create(water, fertilize);
+        const myplant = await MyPlant.findById(req.params.myPlantID);
+
+        await notification.save();
+
+        myplant.notifications.push(notification);
+
+        await myplant.save();
+
+        return res.send({ message: 'Notification successfully registered.' });
+
+    }catch(err){
+        return res.status(400).send({error: 'Error adding notification' + err});
+    }
+})
 
 module.exports = router;
\ No newline at end of file
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index a218020..86b8c00 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -2,8 +2,6 @@ const express = require('express');
 
 const Plant = require('../models/Plant');
 const Topic = require('../models/Topic');
-const myPlant = require('../models/myPlant');
-const User = require('../models/User');
 
 const router = express.Router();
 

From f7df17a874db7fe18a29b9bf5e6466707de1abd4 Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Wed, 28 Oct 2020 08:59:12 -0300
Subject: [PATCH 110/147] fix spelling on collectionRoutes and Plant model

---
 src/routes/collectionRoutes.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index af12689..7416c72 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -20,7 +20,7 @@ router.get('/:userId', async(req, res) =>{
             for(var index = 0; index < user.myPlants.length; index++) {
                 var myplant = await MyPlant.findById(user.myPlants[index]);
                 var typePlant = await Plant.findById(myplant.plant);
-                var objplant = "{\"nickname\" : \"" + myplant.nickname + "\", \"common_name\" : \"" + typePlant.common_name + "\", \"profile_picture\" : \"" + typePlant.profile_picture + "\"}";
+                var objplant = "{\"nickname\" : \"" + myplant.nickname + "\", \"commonName\" : \"" + typePlant.commonName + "\", \"profilePicture\" : \"" + typePlant.profilePicture + "\"}";
                 var objplant = JSON.parse(objplant);
                 plantArray.push(objplant);
             }

From a0f09919d2ca97cbc8ab30c5bfde4444adab6bce Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Tue, 17 Nov 2020 15:26:09 -0300
Subject: [PATCH 111/147] Adding new likes request
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: João Vítor Morandi <joao.lemos4000@gmail.com>
---
 src/routes/commentRoutes.js |  8 +++-----
 src/routes/topicRoutes.js   | 28 +++++++++++++++-------------
 2 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 538a1ca..b4eb088 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -7,7 +7,7 @@ const Topic = require('../models/Topic');
 const Comment = require('../models/Comment');
 const { auth } = require('./auth');
 
-router.post('/create/:topicId/:userId', auth, async (req, res) => {
+router.post('/create/:topicId/:userId', async (req, res) => {
   try {
     if (!req.body.text)
       return res.status(400).send({ error: 'Comment should not be empty' });
@@ -19,8 +19,7 @@ router.post('/create/:topicId/:userId', auth, async (req, res) => {
     });
     const topic = await Topic.findById(req.params.topicId).populate([
       { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' },
-      { path: 'plant' },
+      { path: 'user' }
     ]);
 
     await comment.save();
@@ -29,8 +28,7 @@ router.post('/create/:topicId/:userId', auth, async (req, res) => {
     await topic.save();
     const topicCorrect = await Topic.findById(req.params.topicId).populate([
       { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' },
-      { path: 'plant' },
+      { path: 'user' }
     ]);
     return res.send(topicCorrect);
   } catch (err) {
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index e0bf057..a276c7b 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -24,7 +24,7 @@ router.post('/create/:plantId/:userId', async (req, res) => {
       ...req.body,
       user: req.params.userId,
       plant: req.params.plantId,
-    });
+    })
 
     await topic.save();
 
@@ -55,10 +55,13 @@ router.put('/update/:topicId', async (req, res) => {
         .status(400)
         .send({ error: `Error while creating topic. ${result.error}` });
 
-    await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
-      useFindAndModify: false,
-    });
-    return res.send({ message: 'Topic updated successfully.' });
+    topicNew = await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
+      useFindAndModify: true,
+    }).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' }
+    ]);
+    return res.send(topicNew);
   } catch (err) {
     return res.status(400).send({ error: `Error while updating topic.${err}` });
   }
@@ -86,10 +89,7 @@ router.delete('/delete/:topicId', async (req, res) => {
     await Topic.findByIdAndRemove(req.params.topicId, {
       useFindAndModify: false,
     });
-
-    return res.send({
-      message: 'Topic successfully removed.',
-    });
+    return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while deleting topic.${err}` });
   }
@@ -129,9 +129,8 @@ router.post('/like/:topicId', auth, async (req, res) => {
       topic.likes.push(like);
       await topic.save();
       const topictrue = await Topic.findById(req.params.topicId).populate([
-        { path: 'likes' },
-        { path: 'user' },
-        { path: 'toppic' },
+        { path: 'comments', populate: { path: 'user' } },
+        { path: 'user' }
       ]);
       return res.send(topictrue);
     }
@@ -154,7 +153,10 @@ router.post('/dislike/:topicId', auth, async (req, res) => {
       topic.likes.splice(index, 1);
     }
     topic.save();
-    await Like.findByIdAndRemove(like._id).populate('user');
+    await Like.findByIdAndRemove(like._id).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' }
+    ]);
     return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });

From d5ea5cae31f6a54027f7e62c808ad6dfe1a9c4b2 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 18 Nov 2020 16:39:00 -0300
Subject: [PATCH 112/147] Adding user finOne routerand changing the schema
 reference at user model

Co-authored-by: V100K <vitao.hugo@hotmail.com
---
 src/models/User.js       |  4 ++--
 src/routes/authRoutes.js | 13 +++++++++++++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/models/User.js b/src/models/User.js
index fd314ee..eded55d 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -20,7 +20,7 @@ const userSchema = new Schema({
   topics: [
     {
       type: mongoose.Schema.Types.ObjectId,
-      ref: 'Topics',
+      ref: 'Topic',
       require: true,
     },
   ],
@@ -34,7 +34,7 @@ const userSchema = new Schema({
   favorites: [
     {
       type: mongoose.Schema.Types.ObjectId,
-      ref: 'Plants',
+      ref: 'Plant',
       require: true,
     },
   ],
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index c29b72c..3abcfcc 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -53,6 +53,19 @@ router.post('/signup', async (req, res) => {
   }
 });
 
+router.get('/user/:id', async (req, res) => {
+  try {
+    const user = await User.findById(req.params.id).populate([
+      { path: 'topics' },
+      { path: 'myPlants' },
+      { path: 'favorites' },
+    ]);
+    return res.send(user);
+  } catch (err) {
+    return res.status(400).send({ error: `Error while finding user.${err}` });
+  }
+});
+
 router.put('/update/:id', auth, async (req, res) => {
   try {
     const user = await User.findById(req.params.id);

From 181d5da2ce762f3294e87330b2362559d453e253 Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Wed, 21 Oct 2020 20:52:02 -0300
Subject: [PATCH 113/147] Create collection route and model

Co-authored-by: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
---
 src/routes/collectionRoutes.js | 95 +++++++++++++++++-----------------
 1 file changed, 48 insertions(+), 47 deletions(-)

diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index 7416c72..a3bbd10 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -1,4 +1,5 @@
 const express = require('express');
+
 const router = express.Router();
 
 const User = require('../models/User');
@@ -6,60 +7,60 @@ const MyPlant = require('../models/myPlant');
 const Plant = require('../models/Plant');
 const plantNotification = require('../models/plantNotification');
 
-router.get('/', async(req, res) => {
-    res.send({message: "collection"});
+router.get('/', async (req, res) => {
+  res.send({ message: 'collection' });
 });
 
-router.get('/:userId', async(req, res) =>{
-    try{
-        const user = await User.findById(req.params.userId);
-        const length = user.myPlants.length;
-        console.log(user.myPlants.length);
-        if(length > 0) {
-            var plantArray=[];
-            for(var index = 0; index < user.myPlants.length; index++) {
-                var myplant = await MyPlant.findById(user.myPlants[index]);
-                var typePlant = await Plant.findById(myplant.plant);
-                var objplant = "{\"nickname\" : \"" + myplant.nickname + "\", \"commonName\" : \"" + typePlant.commonName + "\", \"profilePicture\" : \"" + typePlant.profilePicture + "\"}";
-                var objplant = JSON.parse(objplant);
-                plantArray.push(objplant);
-            }
-
-            res.send(plantArray);
-            //return res.send(user.myPlants[0]);
-            //return res.send({message: "collection!!"})
+router.get('/:userId', async (req, res) => {
+  try {
+    const user = await User.findById(req.params.userId);
+    const { length } = user.myPlants;
+    console.log(user.myPlants.length);
+    if (length > 0) {
+      const plantArray = [];
+      for (let index = 0; index < user.myPlants.length; index++) {
+        const myplant = await MyPlant.findById(user.myPlants[index]);
+        const typePlant = await Plant.findById(myplant.plant);
+        var objplant = `{"nickname" : "${myplant.nickname}", "commonName" : "${typePlant.commonName}", "profilePicture" : "${typePlant.profilePicture}"}`;
+        var objplant = JSON.parse(objplant);
+        plantArray.push(objplant);
+      }
 
-            // const data = new Date();
-            // const tempo = {
-            //     "dia": data.getDate(),
-            //     "mes": data.getMonth()+1,
-            //     "ano": data.getFullYear(),
-            // }
+      res.send(plantArray);
+      // return res.send(user.myPlants[0]);
+      // return res.send({message: "collection!!"})
 
-        }else{
-            return res.send({message: "No plants in my collection"});
-        }
-    }catch(err){
-        return res.status(400).send({error: 'Error visualizing collection' + err});
+      // const data = new Date();
+      // const tempo = {
+      //     "dia": data.getDate(),
+      //     "mes": data.getMonth()+1,
+      //     "ano": data.getFullYear(),
+      // }
+    } else {
+      return res.send({ message: 'No plants in my collection' });
     }
-})
-router.post('/:myPlantID', async(req,res) =>{
-    try{
-        const {water, fertilize} = req.body
-        const notification = await plantNotification.create(water, fertilize);
-        const myplant = await MyPlant.findById(req.params.myPlantID);
-
-        await notification.save();
+  } catch (err) {
+    return res
+      .status(400)
+      .send({ error: `Error visualizing collection${err}` });
+  }
+});
+router.post('/:myPlantID', async (req, res) => {
+  try {
+    const { water, fertilize } = req.body;
+    const notification = await plantNotification.create(water, fertilize);
+    const myplant = await MyPlant.findById(req.params.myPlantID);
 
-        myplant.notifications.push(notification);
+    await notification.save();
 
-        await myplant.save();
+    myplant.notifications.push(notification);
 
-        return res.send({ message: 'Notification successfully registered.' });
+    await myplant.save();
 
-    }catch(err){
-        return res.status(400).send({error: 'Error adding notification' + err});
-    }
-})
+    return res.send({ message: 'Notification successfully registered.' });
+  } catch (err) {
+    return res.status(400).send({ error: `Error adding notification${err}` });
+  }
+});
 
-module.exports = router;
\ No newline at end of file
+module.exports = router;

From 17a693e93bf9393d1c1261b274552c5a3df48573 Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Tue, 27 Oct 2020 20:15:50 -0300
Subject: [PATCH 114/147] Fix visualize_my_collection

---
 src/routes/collectionRoutes.js | 3 ++-
 src/routes/plantRoutes.js      | 2 ++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index a3bbd10..600aa0c 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -2,10 +2,11 @@ const express = require('express');
 
 const router = express.Router();
 
+
+const Collection = require('../models/Collection');
 const User = require('../models/User');
 const MyPlant = require('../models/myPlant');
 const Plant = require('../models/Plant');
-const plantNotification = require('../models/plantNotification');
 
 router.get('/', async (req, res) => {
   res.send({ message: 'collection' });
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 86b8c00..a218020 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -2,6 +2,8 @@ const express = require('express');
 
 const Plant = require('../models/Plant');
 const Topic = require('../models/Topic');
+const myPlant = require('../models/myPlant');
+const User = require('../models/User');
 
 const router = express.Router();
 

From a40d571ac0aea3889013a3707976751857844007 Mon Sep 17 00:00:00 2001
From: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
Date: Tue, 27 Oct 2020 20:41:45 -0400
Subject: [PATCH 115/147] New model plantNotifications
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Vinícius Vieira de Souza <vd.souza1999@gmail.com>
---
 src/models/plantNotifications.js | 33 ++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 src/models/plantNotifications.js

diff --git a/src/models/plantNotifications.js b/src/models/plantNotifications.js
new file mode 100644
index 0000000..36155f6
--- /dev/null
+++ b/src/models/plantNotifications.js
@@ -0,0 +1,33 @@
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+
+const notificationsSchema = new mongoose.Schema({
+    nickname: {
+        type: String,
+        required: true
+    },
+    user: {
+        type: Schema.Types.ObjectId,
+        ref: 'User',
+        require: true,
+    },
+    plant:{
+        type:mongoose.Schema.Types.ObjectId,
+        ref:'Plant',
+        require:true
+    },
+    createdAt: {
+        type: Date,
+        default: Date.now,
+    },
+
+    notifications: {
+        type:mongoose.Schema.Types.ObjectId,
+        ref:'plantNotifications',
+    }
+});
+
+
+const plantNotifications = mongoose.model('plantNotifications', notificationsSchema);
+
+module.exports = plantNotifications;
\ No newline at end of file

From af05962b7b130ade21775fa938121bfe32215cd9 Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Tue, 27 Oct 2020 22:52:52 -0300
Subject: [PATCH 116/147] Create plantNotification model and added to
 collectionRoute

Co-authored-by: Marcos Gabriel Tavares <marcosgabriel.ro@hotmail.com>
---
 src/models/plantNotifications.js | 33 --------------------------------
 src/routes/collectionRoutes.js   |  3 +--
 src/routes/plantRoutes.js        |  2 --
 3 files changed, 1 insertion(+), 37 deletions(-)
 delete mode 100644 src/models/plantNotifications.js

diff --git a/src/models/plantNotifications.js b/src/models/plantNotifications.js
deleted file mode 100644
index 36155f6..0000000
--- a/src/models/plantNotifications.js
+++ /dev/null
@@ -1,33 +0,0 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
-
-const notificationsSchema = new mongoose.Schema({
-    nickname: {
-        type: String,
-        required: true
-    },
-    user: {
-        type: Schema.Types.ObjectId,
-        ref: 'User',
-        require: true,
-    },
-    plant:{
-        type:mongoose.Schema.Types.ObjectId,
-        ref:'Plant',
-        require:true
-    },
-    createdAt: {
-        type: Date,
-        default: Date.now,
-    },
-
-    notifications: {
-        type:mongoose.Schema.Types.ObjectId,
-        ref:'plantNotifications',
-    }
-});
-
-
-const plantNotifications = mongoose.model('plantNotifications', notificationsSchema);
-
-module.exports = plantNotifications;
\ No newline at end of file
diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index 600aa0c..a3bbd10 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -2,11 +2,10 @@ const express = require('express');
 
 const router = express.Router();
 
-
-const Collection = require('../models/Collection');
 const User = require('../models/User');
 const MyPlant = require('../models/myPlant');
 const Plant = require('../models/Plant');
+const plantNotification = require('../models/plantNotification');
 
 router.get('/', async (req, res) => {
   res.send({ message: 'collection' });
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index a218020..86b8c00 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -2,8 +2,6 @@ const express = require('express');
 
 const Plant = require('../models/Plant');
 const Topic = require('../models/Topic');
-const myPlant = require('../models/myPlant');
-const User = require('../models/User');
 
 const router = express.Router();
 

From e692e1eb54a11f118b1cb976c9fd33ab3a08dc46 Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Sun, 1 Nov 2020 09:53:06 -0300
Subject: [PATCH 117/147] Configure eslint, remove plantNotifications model,
 add water and fertilize props in myPlant model, refactor 'for' loop in
 collectionRoutes due to eslint

---
 src/models/Collection.js        | 25 ++++++------
 src/models/Plant.js             | 14 +++----
 src/models/plantNotification.js | 16 --------
 src/routes/auth.js              |  3 +-
 src/routes/authRoutes.js        | 12 ------
 src/routes/collectionRoutes.js  | 67 ++++++++++++++++++++++-----------
 6 files changed, 66 insertions(+), 71 deletions(-)
 delete mode 100644 src/models/plantNotification.js

diff --git a/src/models/Collection.js b/src/models/Collection.js
index 4a4bbfd..449d21c 100644
--- a/src/models/Collection.js
+++ b/src/models/Collection.js
@@ -1,19 +1,22 @@
 const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
+
+const { Schema } = mongoose;
 
 const CollectionSchema = new mongoose.Schema({
-    user: {
-        type: Schema.Types.ObjectId,
-        ref: 'User',
-        require: true,
+  user: {
+    type: Schema.Types.ObjectId,
+    ref: 'User',
+    require: true,
+  },
+  myPlants: [
+    {
+      type: Schema.Types.ObjectId,
+      ref: 'MyPlants',
+      require: true,
     },
-    myPlants: [{
-        type: Schema.Types.ObjectId,
-        ref: 'MyPlants',
-        require: true,
-    }],
+  ],
 });
 
 const Collection = mongoose.model('Collection', CollectionSchema);
 
-module.exports = Collection;
\ No newline at end of file
+module.exports = Collection;
diff --git a/src/models/Plant.js b/src/models/Plant.js
index 3294204..21d4eed 100644
--- a/src/models/Plant.js
+++ b/src/models/Plant.js
@@ -6,19 +6,19 @@ const PlantSchema = new mongoose.Schema({
     require: true,
     unique: true,
   },
-  family_name: {
+  familyName: {
     type: String,
     require: true,
   },
-  gender_name: {
+  genderName: {
     type: String,
     require: true,
   },
-  specie_name: {
+  specieName: {
     type: String,
     require: true,
   },
-  common_name: {
+  commonName: {
     type: String,
     require: true,
   },
@@ -26,11 +26,11 @@ const PlantSchema = new mongoose.Schema({
     type: String,
     require: true,
   },
-  first_User: {
+  firstUser: {
     type: String,
     require: true,
   },
-  collection_count: {
+  collectionCount: {
     type: Number,
     require: true,
   },
@@ -38,7 +38,7 @@ const PlantSchema = new mongoose.Schema({
     type: Boolean,
     require: true,
   },
-  profile_picture: {
+  profilePicture: {
     type: String,
     require: true,
   },
diff --git a/src/models/plantNotification.js b/src/models/plantNotification.js
deleted file mode 100644
index 7063129..0000000
--- a/src/models/plantNotification.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
-
-const notificationsSchema = new mongoose.Schema({
-    water: {
-        type: String,
-    },
-    fertilize: {
-        type: String,
-    },
-});
-
-
-const plantNotification = mongoose.model('plantNotification', notificationsSchema);
-
-module.exports = plantNotification;
\ No newline at end of file
diff --git a/src/routes/auth.js b/src/routes/auth.js
index d9e92a9..2b6ba85 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -3,8 +3,7 @@ require('dotenv').config();
 const jwt = require('jsonwebtoken');
 
 const authConfig = {
-    "secret": process.env.SECRET
-    
+  secret: process.env.SECRET,
 };
 function auth(req, res, next) {
   const sessiontoken = req.headers.authtoken;
diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js
index 0ff0cde..bb8e134 100644
--- a/src/routes/authRoutes.js
+++ b/src/routes/authRoutes.js
@@ -84,16 +84,4 @@ router.delete('/delete/:id', auth, async (req, res) => {
     return res.status(400).send({ error: `Error while deleting user. ${err}` });
   }
 });
-
-// //REMOVER ESSA ROTA POIS ELA EU CRIEI PARA APRENDIZADO
-// router.get('/list/:UserID', async(req, res) =>{
-//   try{
-//       //id do faco400: 5f8e17bbc1222a0028041272
-//       //const {username} = "faco400"
-//       //const teste = await User.find().populate('username');
-//   }catch(err){
-//       return res.status(400).send({error: 'Error visualizing collection' + err});
-//   }
-// })
-
 module.exports = router;
diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index a3bbd10..a3bbef6 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -5,7 +5,6 @@ const router = express.Router();
 const User = require('../models/User');
 const MyPlant = require('../models/myPlant');
 const Plant = require('../models/Plant');
-const plantNotification = require('../models/plantNotification');
 
 router.get('/', async (req, res) => {
   res.send({ message: 'collection' });
@@ -15,27 +14,44 @@ router.get('/:userId', async (req, res) => {
   try {
     const user = await User.findById(req.params.userId);
     const { length } = user.myPlants;
-    console.log(user.myPlants.length);
+    // console.log(user.myPlants.length);
     if (length > 0) {
       const plantArray = [];
-      for (let index = 0; index < user.myPlants.length; index++) {
-        const myplant = await MyPlant.findById(user.myPlants[index]);
+      // ESlint reclamou do await dentro do for
+      // for (let index = 0; index < user.myPlants.length; index += 1) {
+      //   const myplant = await MyPlant.findById(user.myPlants[index]);
+      //   const typePlant = await Plant.findById(myplant.plant);
+      //   let objplant = `{
+      //   "nickname" : "${myplant.nickname}",
+      //   "commonName" : "${typePlant.commonName}",
+      //   "profilePicture" : "${typePlant.profilePicture}"
+      // }`;
+      //   objplant = JSON.parse(objplant);
+      //   plantArray.push(objplant);
+      // }
+
+      const promises = user.myPlants.map(async (elem, idx) => {
+        const myplant = await MyPlant.findById(user.myPlants[idx]);
         const typePlant = await Plant.findById(myplant.plant);
-        var objplant = `{"nickname" : "${myplant.nickname}", "commonName" : "${typePlant.commonName}", "profilePicture" : "${typePlant.profilePicture}"}`;
-        var objplant = JSON.parse(objplant);
+        // Calculo para ver quantos dias para regar e fertilizar
+        // OBS: POR CAUSA DO ARREDONDAMENDO VALORES TEM UM ERRO
+        // DEPENDENDO DA HORA
+        // const water = Math.round(
+        //   (Date.parse(myplant.water) - Date.now()) / (1000 * 60 * 60 * 24)
+        // );
+        // const fertilize = Math.round(
+        //  (Date.parse(myplant.fertilize) - Date.now()) / (1000 * 60 * 60 * 24)
+        // );
+        let objplant = `{
+        "nickname" : "${myplant.nickname}", 
+        "commonName" : "${typePlant.commonName}", 
+        "profilePicture" : "${typePlant.profilePicture}"}`;
+        objplant = JSON.parse(objplant);
         plantArray.push(objplant);
-      }
+      });
 
+      await Promise.all(promises);
       res.send(plantArray);
-      // return res.send(user.myPlants[0]);
-      // return res.send({message: "collection!!"})
-
-      // const data = new Date();
-      // const tempo = {
-      //     "dia": data.getDate(),
-      //     "mes": data.getMonth()+1,
-      //     "ano": data.getFullYear(),
-      // }
     } else {
       return res.send({ message: 'No plants in my collection' });
     }
@@ -44,18 +60,23 @@ router.get('/:userId', async (req, res) => {
       .status(400)
       .send({ error: `Error visualizing collection${err}` });
   }
+  return undefined;
 });
-router.post('/:myPlantID', async (req, res) => {
+
+//  Estrutura que setar visualiar necessidade de regar ou não
+router.put('/:myPlantID', async (req, res) => {
   try {
     const { water, fertilize } = req.body;
-    const notification = await plantNotification.create(water, fertilize);
+    // const notification = await plantNotification.create({water, fertilize});
     const myplant = await MyPlant.findById(req.params.myPlantID);
+    // const myplant = await MyPlant.findById(req.params.myPlantID);
+    // await notification.save();
+    // myplant.notifications.push(notification);
+    myplant.water = water;
+    myplant.fertilize = fertilize;
+    myplant.save();
 
-    await notification.save();
-
-    myplant.notifications.push(notification);
-
-    await myplant.save();
+    console.log({ myplant });
 
     return res.send({ message: 'Notification successfully registered.' });
   } catch (err) {

From b6e691fb4ce5da70d059f7aa3ed681d00a6c7a16 Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Wed, 18 Nov 2020 18:44:35 -0300
Subject: [PATCH 118/147] Fix collectionRoutes and delete Collection model

---
 src/models/Collection.js       | 22 --------------
 src/routes/collectionRoutes.js | 52 ++--------------------------------
 2 files changed, 2 insertions(+), 72 deletions(-)
 delete mode 100644 src/models/Collection.js

diff --git a/src/models/Collection.js b/src/models/Collection.js
deleted file mode 100644
index 449d21c..0000000
--- a/src/models/Collection.js
+++ /dev/null
@@ -1,22 +0,0 @@
-const mongoose = require('mongoose');
-
-const { Schema } = mongoose;
-
-const CollectionSchema = new mongoose.Schema({
-  user: {
-    type: Schema.Types.ObjectId,
-    ref: 'User',
-    require: true,
-  },
-  myPlants: [
-    {
-      type: Schema.Types.ObjectId,
-      ref: 'MyPlants',
-      require: true,
-    },
-  ],
-});
-
-const Collection = mongoose.model('Collection', CollectionSchema);
-
-module.exports = Collection;
diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index a3bbef6..7cc0da1 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -3,46 +3,20 @@ const express = require('express');
 const router = express.Router();
 
 const User = require('../models/User');
-const MyPlant = require('../models/myPlant');
+const MyPlant = require('../models/MyPlant');
 const Plant = require('../models/Plant');
 
-router.get('/', async (req, res) => {
-  res.send({ message: 'collection' });
-});
-
 router.get('/:userId', async (req, res) => {
   try {
     const user = await User.findById(req.params.userId);
     const { length } = user.myPlants;
-    // console.log(user.myPlants.length);
     if (length > 0) {
       const plantArray = [];
-      // ESlint reclamou do await dentro do for
-      // for (let index = 0; index < user.myPlants.length; index += 1) {
-      //   const myplant = await MyPlant.findById(user.myPlants[index]);
-      //   const typePlant = await Plant.findById(myplant.plant);
-      //   let objplant = `{
-      //   "nickname" : "${myplant.nickname}",
-      //   "commonName" : "${typePlant.commonName}",
-      //   "profilePicture" : "${typePlant.profilePicture}"
-      // }`;
-      //   objplant = JSON.parse(objplant);
-      //   plantArray.push(objplant);
-      // }
-
       const promises = user.myPlants.map(async (elem, idx) => {
         const myplant = await MyPlant.findById(user.myPlants[idx]);
         const typePlant = await Plant.findById(myplant.plant);
-        // Calculo para ver quantos dias para regar e fertilizar
-        // OBS: POR CAUSA DO ARREDONDAMENDO VALORES TEM UM ERRO
-        // DEPENDENDO DA HORA
-        // const water = Math.round(
-        //   (Date.parse(myplant.water) - Date.now()) / (1000 * 60 * 60 * 24)
-        // );
-        // const fertilize = Math.round(
-        //  (Date.parse(myplant.fertilize) - Date.now()) / (1000 * 60 * 60 * 24)
-        // );
         let objplant = `{
+        "_id" : "${myplant._id}",
         "nickname" : "${myplant.nickname}", 
         "commonName" : "${typePlant.commonName}", 
         "profilePicture" : "${typePlant.profilePicture}"}`;
@@ -60,28 +34,6 @@ router.get('/:userId', async (req, res) => {
       .status(400)
       .send({ error: `Error visualizing collection${err}` });
   }
-  return undefined;
-});
-
-//  Estrutura que setar visualiar necessidade de regar ou não
-router.put('/:myPlantID', async (req, res) => {
-  try {
-    const { water, fertilize } = req.body;
-    // const notification = await plantNotification.create({water, fertilize});
-    const myplant = await MyPlant.findById(req.params.myPlantID);
-    // const myplant = await MyPlant.findById(req.params.myPlantID);
-    // await notification.save();
-    // myplant.notifications.push(notification);
-    myplant.water = water;
-    myplant.fertilize = fertilize;
-    myplant.save();
-
-    console.log({ myplant });
-
-    return res.send({ message: 'Notification successfully registered.' });
-  } catch (err) {
-    return res.status(400).send({ error: `Error adding notification${err}` });
-  }
 });
 
 module.exports = router;

From baa5b2c0eb8ad94cd6fb0663580984a63e093ceb Mon Sep 17 00:00:00 2001
From: faco400 <vd.souza1999@gmail.com>
Date: Wed, 18 Nov 2020 18:59:54 -0300
Subject: [PATCH 119/147] run lint to fix errors

---
 src/routes/collectionRoutes.js | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/routes/collectionRoutes.js b/src/routes/collectionRoutes.js
index 7cc0da1..95aa87b 100644
--- a/src/routes/collectionRoutes.js
+++ b/src/routes/collectionRoutes.js
@@ -25,10 +25,9 @@ router.get('/:userId', async (req, res) => {
       });
 
       await Promise.all(promises);
-      res.send(plantArray);
-    } else {
-      return res.send({ message: 'No plants in my collection' });
+      return res.send(plantArray);
     }
+    return res.send({ message: 'No plants in my collection' });
   } catch (err) {
     return res
       .status(400)

From e88fbe3a746e63862ca3e96916e5d17f76bbe87c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20V=C3=ADtor=20Lemos?= <joao.lemos4000@gmail.com>
Date: Wed, 18 Nov 2020 19:07:19 -0300
Subject: [PATCH 120/147] Delete myPlant.js
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Vinícius Vieira de Souza <vd.souza1999@gmail.com>
Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
---
 src/models/myPlant.js | 28 ----------------------------
 1 file changed, 28 deletions(-)
 delete mode 100644 src/models/myPlant.js

diff --git a/src/models/myPlant.js b/src/models/myPlant.js
deleted file mode 100644
index 6d11ee7..0000000
--- a/src/models/myPlant.js
+++ /dev/null
@@ -1,28 +0,0 @@
-const mongoose = require('mongoose');
-
-const { Schema } = mongoose;
-
-const myPlantSchema = new mongoose.Schema({
-  nickname: {
-    type: String,
-    required: true,
-  },
-  user: {
-    type: Schema.Types.ObjectId,
-    ref: 'User',
-    require: true,
-  },
-  plant: {
-    type: mongoose.Schema.Types.ObjectId,
-    ref: 'Plant',
-    require: true,
-  },
-  createdAt: {
-    type: Date,
-    default: Date.now,
-  },
-});
-
-const myPlant = mongoose.model('MyPlants', myPlantSchema);
-
-module.exports = myPlant;

From e592044e2f56ed41e717b58491de388bfbe7b9f6 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 25 Nov 2020 03:37:50 -0300
Subject: [PATCH 121/147] resolved bug on like dislike

---
 src/routes/plantRoutes.js |  4 ++--
 src/routes/topicRoutes.js | 34 +++++++++++++++++++++-------------
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 3985c29..69768cb 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -18,7 +18,7 @@ router.post('/register', async (req, res) => {
       firstUser,
       collectionCount,
       extinction,
-      profilePicture,
+      profile_picture,
       gbifID,
       stateProvince,
     } = req.body;
@@ -33,7 +33,7 @@ router.post('/register', async (req, res) => {
       firstUser,
       collectionCount,
       extinction,
-      profilePicture,
+      profile_picture,
       gbifID,
       stateProvince,
     });
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index a276c7b..1ebd30f 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -112,12 +112,12 @@ router.post('/like/:topicId', auth, async (req, res) => {
   try {
     const user = await User.findById(req.userId);
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'likes' },
+      { path: 'comments', populate: { path: 'user' } },
       { path: 'user' },
-      { path: 'toppic' },
+      { path: 'plant' },
     ]);
     const isLiked = await Like.findOne({
-      user: req.params.userId,
+      user: req.userId,
       topic: req.params.topicId,
     });
     if (isLiked == null) {
@@ -130,7 +130,8 @@ router.post('/like/:topicId', auth, async (req, res) => {
       await topic.save();
       const topictrue = await Topic.findById(req.params.topicId).populate([
         { path: 'comments', populate: { path: 'user' } },
-        { path: 'user' }
+        { path: 'user' },
+        { path: 'plant' },
       ]);
       return res.send(topictrue);
     }
@@ -143,20 +144,27 @@ router.post('/like/:topicId', auth, async (req, res) => {
 
 router.post('/dislike/:topicId', auth, async (req, res) => {
   try {
-    const topic = await Topic.findById(req.params.topicId);
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
     const like = await Like.findOne({
       user: req.userId,
       topic: req.params.topicId,
     });
-    const index = topic.likes.indexOf(like._id);
-    if (index > -1) {
-      topic.likes.splice(index, 1);
+    if(like != null){
+      const index = topic.likes.indexOf(like._id);
+      if (index > -1) {
+        topic.likes.splice(index, 1);
+      }
+      topic.save();
+      await Like.findByIdAndRemove(like._id).populate([
+        { path: 'comments', populate: { path: 'user' } },
+        { path: 'user' },
+        { path: 'plant' },
+      ]);
     }
-    topic.save();
-    await Like.findByIdAndRemove(like._id).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' }
-    ]);
     return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });

From b9f259f5d0850a6d267b9c873fa76af9a22c6838 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 25 Nov 2020 18:58:46 -0300
Subject: [PATCH 122/147] adding comment and topic correct response

---
 src/routes/commentRoutes.js | 69 +++++++++++++++++++------------------
 src/routes/topicRoutes.js   | 43 +++++++++++++----------
 2 files changed, 59 insertions(+), 53 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index b4eb088..7e0136c 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -7,38 +7,32 @@ const Topic = require('../models/Topic');
 const Comment = require('../models/Comment');
 const { auth } = require('./auth');
 
-router.post('/create/:topicId/:userId', async (req, res) => {
+router.post('/create/:topicId', auth, async (req, res) => {
   try {
     if (!req.body.text)
       return res.status(400).send({ error: 'Comment should not be empty' });
 
     const comment = await Comment.create({
-      ...req.body,
-      user: req.params.userId,
+      text: req.body.text,
+      user: req.userId,
       topic: req.params.topicId,
     });
-    const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' }
-    ]);
+    const topic = await Topic.findById(req.params.topicId);
 
     await comment.save();
-
     topic.comments.push(comment);
     await topic.save();
-    const topicCorrect = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' }
-    ]);
+
+    const topicCorrect = await Topic.findById(req.params.topicId);
     return res.send(topicCorrect);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.put('/update/:commentId', async (req, res) => {
+router.put('/update/:commentId', auth, async (req, res) => {
   try {
-    await Comment.findById(req.params.commentId);
+    const comment = await Comment.findById(req.params.commentId);
     const newData = req.body;
 
     if (!newData.text)
@@ -47,7 +41,12 @@ router.put('/update/:commentId', async (req, res) => {
     await Comment.findOneAndUpdate({ _id: req.params.commentId }, req.body, {
       useFindAndModify: false,
     });
-    return res.send({ message: 'Comment updated successfully.' });
+    const newTopic = await Topic.findById(comment.topic).populate([
+      { path: 'comments', populate: 'user' },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
+    return res.send(newTopic);
   } catch (err) {
     return res
       .status(400)
@@ -55,7 +54,7 @@ router.put('/update/:commentId', async (req, res) => {
   }
 });
 
-router.delete('/delete/:commentId', async (req, res) => {
+router.delete('/delete/:commentId', auth, async (req, res) => {
   try {
     const comment = await Comment.findById(req.params.commentId);
     const topic = await Topic.findById(comment.topic);
@@ -68,11 +67,13 @@ router.delete('/delete/:commentId', async (req, res) => {
 
     topic.save();
 
-    await Comment.findByIdAndRemove(req.params.commentId).populate('user');
-
-    return res.send({
-      message: 'Comment successfully removed.',
-    });
+    await Comment.findByIdAndRemove(req.params.commentId);
+    const newTopic = await Topic.findById(comment.topic).populate([
+      { path: 'comments', populate: 'user' },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
+    return res.send(newTopic);
   } catch (err) {
     return res.status(400).send({ error: `Error while deleting topic.${err}` });
   }
@@ -81,15 +82,11 @@ router.delete('/delete/:commentId', async (req, res) => {
 router.post('/like/:commentId', auth, async (req, res) => {
   try {
     const user = await User.findById(req.userId);
-    const comment = await Comment.findById(req.params.commentId).populate([
-      { path: 'likes' },
-      { path: 'user' },
-      { path: 'toppic' },
-    ]);
+    const comment = await Comment.findById(req.params.commentId);
     const topic = await Topic.findById(comment.topic).populate([
-      { path: 'likes' },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'toppic' },
+      { path: 'plant' },
     ]);
     const isLiked = await Like.findOne({
       user: req.userId,
@@ -104,9 +101,9 @@ router.post('/like/:commentId', auth, async (req, res) => {
       comment.likes.push(like);
       await comment.save();
       const topicTrue = await Topic.findById(comment.topic).populate([
-        { path: 'likes' },
+        { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'comments' },
+        { path: 'plant' },
       ]);
       return res.send(topicTrue);
     }
@@ -119,7 +116,11 @@ router.post('/like/:commentId', auth, async (req, res) => {
 router.post('/dislike/:commentId', auth, async (req, res) => {
   try {
     const comment = await Comment.findById(req.params.commentId);
-    const topic = await Topic.findById(comment.topic);
+    const topic = await Topic.findById(comment.topic).populate([
+      { path: 'comments', populate: 'user' },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
     const like = await Like.findOne({
       user: req.userId,
       comment: req.params.commentId,
@@ -131,11 +132,11 @@ router.post('/dislike/:commentId', auth, async (req, res) => {
       }
 
       comment.save();
-      await Like.findByIdAndRemove(like._id).populate('user');
+      await Like.findByIdAndRemove(like._id);
       const topicTrue = await Topic.findById(comment.topic).populate([
-        { path: 'likes' },
+        { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'comments' },
+        { path: 'plant' },
       ]);
       return res.send(topicTrue);
     }
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 1ebd30f..3aafcdf 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -24,7 +24,7 @@ router.post('/create/:plantId/:userId', async (req, res) => {
       ...req.body,
       user: req.params.userId,
       plant: req.params.plantId,
-    })
+    });
 
     await topic.save();
 
@@ -55,11 +55,16 @@ router.put('/update/:topicId', async (req, res) => {
         .status(400)
         .send({ error: `Error while creating topic. ${result.error}` });
 
-    topicNew = await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
-      useFindAndModify: true,
-    }).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' }
+    const topicNew = await Topic.findOneAndUpdate(
+      { _id: req.params.topicId },
+      newData,
+      {
+        useFindAndModify: true,
+      }
+    ).populate([
+      { path: 'comments', populate: 'user' },
+      { path: 'user' },
+      { path: 'plnt' },
     ]);
     return res.send(topicNew);
   } catch (err) {
@@ -98,9 +103,9 @@ router.delete('/delete/:topicId', async (req, res) => {
 router.get('/list', async (req, res) => {
   try {
     const topic = await Topic.find().populate([
-      { path: 'likes' },
-      { path: 'comments', populate: { path: 'likes' } },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
+      { path: 'plnt' },
     ]);
     return res.send({ topic });
   } catch (err) {
@@ -112,9 +117,9 @@ router.post('/like/:topicId', auth, async (req, res) => {
   try {
     const user = await User.findById(req.userId);
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plant' },
+      { path: 'plnt' },
     ]);
     const isLiked = await Like.findOne({
       user: req.userId,
@@ -129,9 +134,9 @@ router.post('/like/:topicId', auth, async (req, res) => {
       topic.likes.push(like);
       await topic.save();
       const topictrue = await Topic.findById(req.params.topicId).populate([
-        { path: 'comments', populate: { path: 'user' } },
+        { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'plant' },
+        { path: 'plnt' },
       ]);
       return res.send(topictrue);
     }
@@ -145,24 +150,24 @@ router.post('/like/:topicId', auth, async (req, res) => {
 router.post('/dislike/:topicId', auth, async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plant' },
+      { path: 'plnt' },
     ]);
     const like = await Like.findOne({
       user: req.userId,
       topic: req.params.topicId,
     });
-    if(like != null){
+    if (like != null) {
       const index = topic.likes.indexOf(like._id);
       if (index > -1) {
         topic.likes.splice(index, 1);
       }
       topic.save();
       await Like.findByIdAndRemove(like._id).populate([
-        { path: 'comments', populate: { path: 'user' } },
+        { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'plant' },
+        { path: 'plnt' },
       ]);
     }
     return res.send(topic);
@@ -173,9 +178,9 @@ router.post('/dislike/:topicId', auth, async (req, res) => {
 router.get('/find/:topicId', async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plant' },
+      { path: 'plnt' },
     ]);
 
     return res.send(topic);

From cff2d16c85fa8d411c683642dc27a8b73e881abc Mon Sep 17 00:00:00 2001
From: Antonio Ruan Moura Barreto <ruanmoura13@outlook.com>
Date: Tue, 10 Nov 2020 19:22:24 -0300
Subject: [PATCH 123/147] Modified response of Comment create, and add topic
 find by id router

Co-authored-by: Marcos Filipe <marofelipe@live.com>
---
 package.json                |  4 ++--
 src/routes/commentRoutes.js | 14 +++++++++++---
 src/routes/topicRoutes.js   | 14 ++++++++++++++
 3 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/package.json b/package.json
index bee26a5..47a8692 100644
--- a/package.json
+++ b/package.json
@@ -10,11 +10,11 @@
     "lint:js:fix": "npm run lint:js -- --fix"
   },
   "lint-staged": {
-    "src/**/*.js": [
+    "src/**/*.{js,jsx}": [
       "npx eslint . --fix",
       "git add"
     ],
-    "src/*.js": [
+    "src/*.{js,jsx}": [
       "npx eslint . --fix",
       "git add"
     ]
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index b670585..c8fb422 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -15,14 +15,22 @@ router.post('/create/:topicId/:userId', async (req, res) => {
       user: req.params.userId,
       topic: req.params.topicId,
     });
-    const topic = await Topic.findById(req.params.topicId);
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
 
     await comment.save();
 
     topic.comments.push(comment);
     await topic.save();
-
-    return res.send({ message: 'Comment successfully registered.' });
+    const topicCorrect = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
+    return res.send(topicCorrect);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index d03c9c6..b33e121 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -134,4 +134,18 @@ router.post('/dislike/:topicId', async (req, res) => {
   }
 });
 
+router.get('/find/:topicId', async (req, res) => {
+  try {
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
+
+    return res.send({ topic });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while find topic id.${err}` });
+  }
+});
+
 module.exports = router;

From 5ce919322f32e03c90384e53d3ff8bdb28e1b434 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 00:14:44 -0300
Subject: [PATCH 124/147] Adding Likes's model and commentLike route and this
 route check if the user liked the post previously

---
 src/models/Comment.js       | 12 +++----
 src/models/Likes.js         | 25 ++++++++++++++
 src/models/Topic.js         | 12 +++----
 src/routes/auth.js          |  2 +-
 src/routes/commentRoutes.js | 66 ++++++++++++++++++++++++-------------
 src/routes/topicRoutes.js   |  6 ++--
 6 files changed, 81 insertions(+), 42 deletions(-)
 create mode 100644 src/models/Likes.js

diff --git a/src/models/Comment.js b/src/models/Comment.js
index 79ff587..f6afa51 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -17,14 +17,10 @@ const CommentSchema = new mongoose.Schema({
     ref: 'Topic',
     require: true,
   },
-  likes: {
-    type: Number,
-    default: 0,
-  },
-  dislikes: {
-    type: Number,
-    default: 0,
-  },
+  likes: [{
+    type: Schema.Types.ObjectId,
+    ref: 'Like',
+  }],
 });
 
 const Comment = mongoose.model('Comment', CommentSchema);
diff --git a/src/models/Likes.js b/src/models/Likes.js
new file mode 100644
index 0000000..b8ed582
--- /dev/null
+++ b/src/models/Likes.js
@@ -0,0 +1,25 @@
+const mongoose = require('mongoose');
+
+const { Schema } = mongoose;
+
+const likeSchema = new Schema({
+    user: {
+        type: mongoose.Schema.Types.ObjectId,
+        ref: 'User',
+        require: true,
+    },
+    topic: {
+        type: Schema.Types.ObjectId,
+        ref: 'Topic',
+        
+    },
+    comment: {
+        type: Schema.Types.ObjectId,
+        ref: 'Comment',
+        
+    },
+});
+
+const Like = mongoose.model('Like', likeSchema);
+
+module.exports = Like;
diff --git a/src/models/Topic.js b/src/models/Topic.js
index 9b41e3c..f8f541a 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -20,14 +20,10 @@ const topicSchema = new Schema({
     ref: 'User',
     require: true,
   },
-  likes: {
-    type: Number,
-    default: 0,
-  },
-  dislikes: {
-    type: Number,
-    default: 0,
-  },
+  likes: [{
+    type: Schema.Types.ObjectId,
+    ref: 'Like',
+  }],
   comments: [
     {
       type: Schema.Types.ObjectId,
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 2b6ba85..6811563 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -3,7 +3,7 @@ require('dotenv').config();
 const jwt = require('jsonwebtoken');
 
 const authConfig = {
-  secret: process.env.SECRET,
+  secret: 'd41d8cd98f00b204e9800998ecf8427e',
 };
 function auth(req, res, next) {
   const sessiontoken = req.headers.authtoken;
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index c8fb422..919e33c 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,11 +1,13 @@
 const express = require('express');
 
 const router = express.Router();
-
+const User = require('../models/User');
+const Like = require('../models/Likes');
 const Topic = require('../models/Topic');
 const Comment = require('../models/Comment');
+const { auth, authConfig } = require('./auth');
 
-router.post('/create/:topicId/:userId', async (req, res) => {
+router.post('/create/:topicId/:userId',auth, async (req, res) => {
   try {
     if (!req.body.text)
       return res.status(400).send({ error: 'Comment should not be empty' });
@@ -76,34 +78,52 @@ router.delete('/delete/:commentId', async (req, res) => {
   }
 });
 
-router.post('/like/:commentId', async (req, res) => {
+router.post('/like/:commentId/:userId', async (req, res) => {
   try {
-    await Comment.findOneAndUpdate(
-      { _id: req.params.commentId },
-      { $inc: { likes: 1 } },
-      { useFindAndModify: false }
-    );
-
-    return res.send({ message: 'Liked!' });
+    const user = await User.findById(req.params.userId);
+    const comment = await Comment.findById(req.params.commentId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    const isLiked = await Like.findOne({user:req.params.userId})
+    console.log(isLiked == null)
+    if(isLiked == null){
+    const like = await Like.create({
+      user: user,
+      comment: comment,
+    });
+    await like.save();
+    comment.likes.push(like);
+    await comment.save();
+    const commenttrue = await Comment.findById(req.params.commentId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    return res.send(commenttrue);
+  }
+  else{
+    return res.send(comment);
+  }
   } catch (err) {
-    return res.status(400).send({ error: `Error while liking comment.${err}` });
+    return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.post('/dislike/:commentId', async (req, res) => {
+router.post('/dislike/:commentId/:userId', async (req, res) => {
   try {
-    await Comment.findOneAndUpdate(
-      { _id: req.params.commentId },
-      { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
-    );
-
-    return res.send({ message: 'Disliked!' });
+    const like = Like.findOne({user:req.params.userId})
+    // await Like.findByIdAndRemove({user:req.params.userId});
+    const commenttrue = await Comment.findById(req.params.commentId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    return res.send(like);
+  
   } catch (err) {
-    return res
-      .status(400)
-      .send({ error: `Error while linking comment.${err}` });
+    return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
-
 module.exports = router;
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index b33e121..2cfdd9a 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -98,8 +98,10 @@ router.delete('/delete/:topicId', async (req, res) => {
 
 router.get('/list', async (req, res) => {
   try {
-    const topic = await Topic.find().populate(['user']);
-
+    const topic = await Topic.find().populate([
+      { path: 'likes'},
+      { path: 'comments' },
+    ]);
     return res.send({ topic });
   } catch (err) {
     return res.status(400).send({ error: `Error while listing topics.${err}` });

From 4fb71c19df69f5b542a5997739fa39f8f53fe7d7 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 01:44:11 -0300
Subject: [PATCH 125/147] Adding topicLike route and this route check if the
 user is auth

---
 src/routes/auth.js          |  2 +-
 src/routes/commentRoutes.js |  5 ++---
 src/routes/topicRoutes.js   | 39 +++++++++++++++++++++++++++----------
 3 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/src/routes/auth.js b/src/routes/auth.js
index 6811563..b0951f8 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -26,7 +26,7 @@ function auth(req, res, next) {
 
   try {
     const { userId } = jwt.verify(token, authConfig.secret);
-    req.userId = userId;
+    res.userId = userId;
     return next();
   } catch (err) {
     req.redirect('/login_page');
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 919e33c..8cbf6a8 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -78,7 +78,7 @@ router.delete('/delete/:commentId', async (req, res) => {
   }
 });
 
-router.post('/like/:commentId/:userId', async (req, res) => {
+router.post('/like/:commentId/:userId',auth, async (req, res) => {
   try {
     const user = await User.findById(req.params.userId);
     const comment = await Comment.findById(req.params.commentId).populate([
@@ -86,8 +86,7 @@ router.post('/like/:commentId/:userId', async (req, res) => {
       { path: 'user' },
       { path: 'toppic' },
     ]);
-    const isLiked = await Like.findOne({user:req.params.userId})
-    console.log(isLiked == null)
+    const isLiked = await Like.findOne({user:req.params.userId,comment:req.params.commentId})
     if(isLiked == null){
     const like = await Like.create({
       user: user,
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 2cfdd9a..0212b6c 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -1,12 +1,12 @@
 const express = require('express');
 
 const router = express.Router();
-
+const Like = require('../models/Likes');
 const Topic = require('../models/Topic');
 const User = require('../models/User');
 const Plant = require('../models/Plant');
 const topicSchema = require('../schemas/topicSchema');
-
+const { auth, authConfig } = require('./auth');
 router.post('/create/:plantId/:userId', async (req, res) => {
   try {
     const user = await User.findById(req.params.userId);
@@ -108,16 +108,35 @@ router.get('/list', async (req, res) => {
   }
 });
 
-router.post('/like/:topicId', async (req, res) => {
+router.post('/like/:topicId/:userId',auth, async (req, res) => {
   try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { likes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Liked!' });
+    const user = await User.findById(req.params.userId);
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    const isLiked = await Like.findOne({user:req.params.userId,topic:req.params.topicId})
+    if(isLiked == null){
+    const like = await Like.create({
+      user: user,
+      topic: topic,
+    });
+    await like.save();
+    topic.likes.push(like);
+    await topic.save();
+    const topictrue = await Topic.findById(req.params.topicId).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    return res.send(topictrue);
+  }
+  else{
+    return res.send(topic);
+  }
   } catch (err) {
-    return res.status(400).send({ error: `Error while liking topic.${err}` });
+    return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 

From c3c50d9965e214d548dae40897ef9e7264bf5a34 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 13:43:16 -0300
Subject: [PATCH 126/147] Adding dislike toppic and comment routes

Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/commentRoutes.js | 23 +++++++++++++----------
 src/routes/topicRoutes.js   | 22 +++++++++++-----------
 2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 8cbf6a8..61cf7b0 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -110,19 +110,22 @@ router.post('/like/:commentId/:userId',auth, async (req, res) => {
   }
 });
 
-router.post('/dislike/:commentId/:userId', async (req, res) => {
+router.post('/dislike/:commentId/:userId',auth, async (req, res) => {
   try {
-    const like = Like.findOne({user:req.params.userId})
-    // await Like.findByIdAndRemove({user:req.params.userId});
-    const commenttrue = await Comment.findById(req.params.commentId).populate([
-      { path: 'likes'},
-      { path: 'user' },
-      { path: 'toppic' },
-    ]);
-    return res.send(like);
-  
+    const comment = await Comment.findById(req.params.commentId);
+    const like = await Like.findOne({user:req.params.userId,comment:req.params.commentId});
+    const index = comment.likes.indexOf(like._id);
+    if (index > -1) {
+      comment.likes.splice(index, 1);
+    }
+
+    comment.save();
+
+    await Like.findByIdAndRemove(like._id).populate('user');
+    return res.send(comment);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
+
 module.exports = router;
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 0212b6c..338ac38 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -140,21 +140,21 @@ router.post('/like/:topicId/:userId',auth, async (req, res) => {
   }
 });
 
-router.post('/dislike/:topicId', async (req, res) => {
+router.post('/dislike/:topicId/:userId',auth, async (req, res) => {
   try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Disliked!' });
+    const topic = await Topic.findById(req.params.topicId);
+    const like = await Like.findOne({user:req.params.userId,topic:req.params.topicId});
+    const index = topic.likes.indexOf(like._id);
+    if (index > -1) {
+      topic.likes.splice(index, 1);
+    }
+    topic.save();
+    await Like.findByIdAndRemove(like._id).populate('user');
+    return res.send(topic);
   } catch (err) {
-    return res
-      .status(400)
-      .send({ error: `Error while dislikinng topic.${err}` });
+    return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
-
 router.get('/find/:topicId', async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId).populate([

From b09af198f73eaab918463828953f5407519a60d1 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 16:21:19 -0300
Subject: [PATCH 127/147] userId now came from authtoken, not url more

Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/auth.js          | 15 ++++++++++-----
 src/routes/commentRoutes.js | 36 +++++++++++++++++++++++++-----------
 src/routes/topicRoutes.js   |  7 +++++--
 3 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/src/routes/auth.js b/src/routes/auth.js
index b0951f8..1017bf9 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -24,13 +24,18 @@ function auth(req, res, next) {
     return res.status(401).send({ Error: 'Token malformated' });
   }
 
+  
+  jwt.verify(token, authConfig.secret, function(err ,decoded){
   try {
-    const { userId } = jwt.verify(token, authConfig.secret);
-    res.userId = userId;
-    return next();
-  } catch (err) {
-    req.redirect('/login_page');
+    req.userId = decoded.id;
+    console.log(decoded.id)
+    next();
+  } 
+  catch (err) {
     return res.status(400);
   }
+  });
+    
+ 
 }
 module.exports = { authConfig, auth };
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 61cf7b0..2bd2ec0 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,5 +1,5 @@
 const express = require('express');
-
+const jwt = require('jsonwebtoken');
 const router = express.Router();
 const User = require('../models/User');
 const Like = require('../models/Likes');
@@ -78,15 +78,20 @@ router.delete('/delete/:commentId', async (req, res) => {
   }
 });
 
-router.post('/like/:commentId/:userId',auth, async (req, res) => {
+router.post('/like/:commentId',auth, async (req, res) => {
   try {
-    const user = await User.findById(req.params.userId);
+    const user = await User.findById(req.userId);
     const comment = await Comment.findById(req.params.commentId).populate([
       { path: 'likes'},
       { path: 'user' },
       { path: 'toppic' },
     ]);
-    const isLiked = await Like.findOne({user:req.params.userId,comment:req.params.commentId})
+    const topic = await Topic.findById(comment.topic).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'toppic' },
+    ]);
+    const isLiked = await Like.findOne({user:req.userId,comment:req.params.commentId})
     if(isLiked == null){
     const like = await Like.create({
       user: user,
@@ -95,25 +100,27 @@ router.post('/like/:commentId/:userId',auth, async (req, res) => {
     await like.save();
     comment.likes.push(like);
     await comment.save();
-    const commenttrue = await Comment.findById(req.params.commentId).populate([
+    const topicTrue = await Topic.findById(comment.topic).populate([
       { path: 'likes'},
       { path: 'user' },
-      { path: 'toppic' },
+      { path: 'comments' },
     ]);
-    return res.send(commenttrue);
+    return res.send(topicTrue);
   }
   else{
-    return res.send(comment);
+    return res.send(topic);
   }
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.post('/dislike/:commentId/:userId',auth, async (req, res) => {
+router.post('/dislike/:commentId',auth, async (req, res) => {
   try {
     const comment = await Comment.findById(req.params.commentId);
-    const like = await Like.findOne({user:req.params.userId,comment:req.params.commentId});
+    const topic = await Topic.findById(comment.topic);
+    const like = await Like.findOne({user:req.userId,comment:req.params.commentId});
+    if(like != null){
     const index = comment.likes.indexOf(like._id);
     if (index > -1) {
       comment.likes.splice(index, 1);
@@ -122,7 +129,14 @@ router.post('/dislike/:commentId/:userId',auth, async (req, res) => {
     comment.save();
 
     await Like.findByIdAndRemove(like._id).populate('user');
-    return res.send(comment);
+    const topicTrue = await Topic.findById(comment.topic).populate([
+      { path: 'likes'},
+      { path: 'user' },
+      { path: 'comments' },
+    ]);
+    return res.send(topicTrue);
+    }
+    return res.send(topic);  
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 338ac38..c1b0c5d 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -120,7 +120,7 @@ router.post('/like/:topicId/:userId',auth, async (req, res) => {
     if(isLiked == null){
     const like = await Like.create({
       user: user,
-      topic: topic,
+      topic: topic
     });
     await like.save();
     topic.likes.push(like);
@@ -130,9 +130,11 @@ router.post('/like/:topicId/:userId',auth, async (req, res) => {
       { path: 'user' },
       { path: 'toppic' },
     ]);
+    console.log(topictrue.likes.length)
     return res.send(topictrue);
   }
   else{
+    console.log(topic.likes.length)
     return res.send(topic);
   }
   } catch (err) {
@@ -148,6 +150,7 @@ router.post('/dislike/:topicId/:userId',auth, async (req, res) => {
     if (index > -1) {
       topic.likes.splice(index, 1);
     }
+    console.log(topic.likes.length)
     topic.save();
     await Like.findByIdAndRemove(like._id).populate('user');
     return res.send(topic);
@@ -163,7 +166,7 @@ router.get('/find/:topicId', async (req, res) => {
       { path: 'plant' },
     ]);
 
-    return res.send({ topic });
+    return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while find topic id.${err}` });
   }

From 3bac912f13987b4f118519f4cf45e0bf4318bdc7 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 18:23:57 -0300
Subject: [PATCH 128/147] adding eslint on my pages

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/models/Comment.js       | 10 +++--
 src/models/Likes.js         | 28 ++++++------
 src/models/Topic.js         | 10 +++--
 src/routes/auth.js          | 17 +++-----
 src/routes/commentRoutes.js | 85 +++++++++++++++++++------------------
 src/routes/topicRoutes.js   | 60 ++++++++++++++------------
 6 files changed, 107 insertions(+), 103 deletions(-)

diff --git a/src/models/Comment.js b/src/models/Comment.js
index f6afa51..4388c13 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -17,10 +17,12 @@ const CommentSchema = new mongoose.Schema({
     ref: 'Topic',
     require: true,
   },
-  likes: [{
-    type: Schema.Types.ObjectId,
-    ref: 'Like',
-  }],
+  likes: [
+    {
+      type: Schema.Types.ObjectId,
+      ref: 'Like',
+    },
+  ],
 });
 
 const Comment = mongoose.model('Comment', CommentSchema);
diff --git a/src/models/Likes.js b/src/models/Likes.js
index b8ed582..b1527f3 100644
--- a/src/models/Likes.js
+++ b/src/models/Likes.js
@@ -3,21 +3,19 @@ const mongoose = require('mongoose');
 const { Schema } = mongoose;
 
 const likeSchema = new Schema({
-    user: {
-        type: mongoose.Schema.Types.ObjectId,
-        ref: 'User',
-        require: true,
-    },
-    topic: {
-        type: Schema.Types.ObjectId,
-        ref: 'Topic',
-        
-    },
-    comment: {
-        type: Schema.Types.ObjectId,
-        ref: 'Comment',
-        
-    },
+  user: {
+    type: mongoose.Schema.Types.ObjectId,
+    ref: 'User',
+    require: true,
+  },
+  topic: {
+    type: Schema.Types.ObjectId,
+    ref: 'Topic',
+  },
+  comment: {
+    type: Schema.Types.ObjectId,
+    ref: 'Comment',
+  },
 });
 
 const Like = mongoose.model('Like', likeSchema);
diff --git a/src/models/Topic.js b/src/models/Topic.js
index f8f541a..68daa6c 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -20,10 +20,12 @@ const topicSchema = new Schema({
     ref: 'User',
     require: true,
   },
-  likes: [{
-    type: Schema.Types.ObjectId,
-    ref: 'Like',
-  }],
+  likes: [
+    {
+      type: Schema.Types.ObjectId,
+      ref: 'Like',
+    },
+  ],
   comments: [
     {
       type: Schema.Types.ObjectId,
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 1017bf9..4d7e317 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -3,7 +3,7 @@ require('dotenv').config();
 const jwt = require('jsonwebtoken');
 
 const authConfig = {
-  secret: 'd41d8cd98f00b204e9800998ecf8427e',
+  secret: process.env.SECRET,
 };
 function auth(req, res, next) {
   const sessiontoken = req.headers.authtoken;
@@ -24,18 +24,13 @@ function auth(req, res, next) {
     return res.status(401).send({ Error: 'Token malformated' });
   }
 
-  
-  jwt.verify(token, authConfig.secret, function(err ,decoded){
   try {
-    req.userId = decoded.id;
-    console.log(decoded.id)
-    next();
-  } 
-  catch (err) {
+    jwt.verify(token, authConfig.secret, (err, decoded) => {
+      req.userId = decoded.id;
+    });
+    return next();
+  } catch (err) {
     return res.status(400);
   }
-  });
-    
- 
 }
 module.exports = { authConfig, auth };
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 2bd2ec0..dfe82f6 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,13 +1,13 @@
 const express = require('express');
-const jwt = require('jsonwebtoken');
+
 const router = express.Router();
 const User = require('../models/User');
 const Like = require('../models/Likes');
 const Topic = require('../models/Topic');
 const Comment = require('../models/Comment');
-const { auth, authConfig } = require('./auth');
+const { auth } = require('./auth');
 
-router.post('/create/:topicId/:userId',auth, async (req, res) => {
+router.post('/create/:topicId/:userId', auth, async (req, res) => {
   try {
     if (!req.body.text)
       return res.status(400).send({ error: 'Comment should not be empty' });
@@ -78,65 +78,68 @@ router.delete('/delete/:commentId', async (req, res) => {
   }
 });
 
-router.post('/like/:commentId',auth, async (req, res) => {
+router.post('/like/:commentId', auth, async (req, res) => {
   try {
     const user = await User.findById(req.userId);
     const comment = await Comment.findById(req.params.commentId).populate([
-      { path: 'likes'},
+      { path: 'likes' },
       { path: 'user' },
       { path: 'toppic' },
     ]);
     const topic = await Topic.findById(comment.topic).populate([
-      { path: 'likes'},
+      { path: 'likes' },
       { path: 'user' },
       { path: 'toppic' },
     ]);
-    const isLiked = await Like.findOne({user:req.userId,comment:req.params.commentId})
-    if(isLiked == null){
-    const like = await Like.create({
-      user: user,
-      comment: comment,
+    const isLiked = await Like.findOne({
+      user: req.userId,
+      comment: req.params.commentId,
     });
-    await like.save();
-    comment.likes.push(like);
-    await comment.save();
-    const topicTrue = await Topic.findById(comment.topic).populate([
-      { path: 'likes'},
-      { path: 'user' },
-      { path: 'comments' },
-    ]);
-    return res.send(topicTrue);
-  }
-  else{
+    if (isLiked == null) {
+      const like = await Like.create({
+        user,
+        comment,
+      });
+      await like.save();
+      comment.likes.push(like);
+      await comment.save();
+      const topicTrue = await Topic.findById(comment.topic).populate([
+        { path: 'likes' },
+        { path: 'user' },
+        { path: 'comments' },
+      ]);
+      return res.send(topicTrue);
+    }
     return res.send(topic);
-  }
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.post('/dislike/:commentId',auth, async (req, res) => {
+router.post('/dislike/:commentId', auth, async (req, res) => {
   try {
     const comment = await Comment.findById(req.params.commentId);
     const topic = await Topic.findById(comment.topic);
-    const like = await Like.findOne({user:req.userId,comment:req.params.commentId});
-    if(like != null){
-    const index = comment.likes.indexOf(like._id);
-    if (index > -1) {
-      comment.likes.splice(index, 1);
-    }
-
-    comment.save();
-
-    await Like.findByIdAndRemove(like._id).populate('user');
-    const topicTrue = await Topic.findById(comment.topic).populate([
-      { path: 'likes'},
-      { path: 'user' },
-      { path: 'comments' },
-    ]);
-    return res.send(topicTrue);
+    const like = await Like.findOne({
+      user: req.userId,
+      comment: req.params.commentId,
+    });
+    if (like != null) {
+      const index = comment.likes.indexOf(like._id);
+      if (index > -1) {
+        comment.likes.splice(index, 1);
+      }
+
+      comment.save();
+      await Like.findByIdAndRemove(like._id).populate('user');
+      const topicTrue = await Topic.findById(comment.topic).populate([
+        { path: 'likes' },
+        { path: 'user' },
+        { path: 'comments' },
+      ]);
+      return res.send(topicTrue);
     }
-    return res.send(topic);  
+    return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index c1b0c5d..09c205c 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -6,7 +6,8 @@ const Topic = require('../models/Topic');
 const User = require('../models/User');
 const Plant = require('../models/Plant');
 const topicSchema = require('../schemas/topicSchema');
-const { auth, authConfig } = require('./auth');
+const { auth } = require('./auth');
+
 router.post('/create/:plantId/:userId', async (req, res) => {
   try {
     const user = await User.findById(req.params.userId);
@@ -99,8 +100,9 @@ router.delete('/delete/:topicId', async (req, res) => {
 router.get('/list', async (req, res) => {
   try {
     const topic = await Topic.find().populate([
-      { path: 'likes'},
-      { path: 'comments' },
+      { path: 'likes' },
+      { path: 'comments', populate: { path: 'likes' } },
+      { path: 'user' },
     ]);
     return res.send({ topic });
   } catch (err) {
@@ -108,49 +110,51 @@ router.get('/list', async (req, res) => {
   }
 });
 
-router.post('/like/:topicId/:userId',auth, async (req, res) => {
+router.post('/like/:topicId', auth, async (req, res) => {
   try {
-    const user = await User.findById(req.params.userId);
+    const user = await User.findById(req.userId);
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'likes'},
+      { path: 'likes' },
       { path: 'user' },
       { path: 'toppic' },
     ]);
-    const isLiked = await Like.findOne({user:req.params.userId,topic:req.params.topicId})
-    if(isLiked == null){
-    const like = await Like.create({
-      user: user,
-      topic: topic
+    const isLiked = await Like.findOne({
+      user: req.params.userId,
+      topic: req.params.topicId,
     });
-    await like.save();
-    topic.likes.push(like);
-    await topic.save();
-    const topictrue = await Topic.findById(req.params.topicId).populate([
-      { path: 'likes'},
-      { path: 'user' },
-      { path: 'toppic' },
-    ]);
-    console.log(topictrue.likes.length)
-    return res.send(topictrue);
-  }
-  else{
-    console.log(topic.likes.length)
+    if (isLiked == null) {
+      const like = await Like.create({
+        user,
+        topic,
+      });
+      await like.save();
+      topic.likes.push(like);
+      await topic.save();
+      const topictrue = await Topic.findById(req.params.topicId).populate([
+        { path: 'likes' },
+        { path: 'user' },
+        { path: 'toppic' },
+      ]);
+      return res.send(topictrue);
+    }
+    console.log(topic.likes.length);
     return res.send(topic);
-  }
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.post('/dislike/:topicId/:userId',auth, async (req, res) => {
+router.post('/dislike/:topicId', auth, async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId);
-    const like = await Like.findOne({user:req.params.userId,topic:req.params.topicId});
+    const like = await Like.findOne({
+      user: req.userId,
+      topic: req.params.topicId,
+    });
     const index = topic.likes.indexOf(like._id);
     if (index > -1) {
       topic.likes.splice(index, 1);
     }
-    console.log(topic.likes.length)
     topic.save();
     await Like.findByIdAndRemove(like._id).populate('user');
     return res.send(topic);

From 2870fed891f13e038053a87dda21614004eeec5a Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Tue, 17 Nov 2020 15:26:09 -0300
Subject: [PATCH 129/147] Adding new likes request
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: João Vítor Morandi <joao.lemos4000@gmail.com>
---
 src/routes/commentRoutes.js |  8 +++-----
 src/routes/topicRoutes.js   | 28 +++++++++++++++-------------
 2 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index dfe82f6..7ef8af0 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -7,7 +7,7 @@ const Topic = require('../models/Topic');
 const Comment = require('../models/Comment');
 const { auth } = require('./auth');
 
-router.post('/create/:topicId/:userId', auth, async (req, res) => {
+router.post('/create/:topicId/:userId', async (req, res) => {
   try {
     if (!req.body.text)
       return res.status(400).send({ error: 'Comment should not be empty' });
@@ -19,8 +19,7 @@ router.post('/create/:topicId/:userId', auth, async (req, res) => {
     });
     const topic = await Topic.findById(req.params.topicId).populate([
       { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' },
-      { path: 'plant' },
+      { path: 'user' }
     ]);
 
     await comment.save();
@@ -29,8 +28,7 @@ router.post('/create/:topicId/:userId', auth, async (req, res) => {
     await topic.save();
     const topicCorrect = await Topic.findById(req.params.topicId).populate([
       { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' },
-      { path: 'plant' },
+      { path: 'user' }
     ]);
     return res.send(topicCorrect);
   } catch (err) {
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 09c205c..6f066eb 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -25,7 +25,7 @@ router.post('/create/:plantId/:userId', async (req, res) => {
       ...req.body,
       user: req.params.userId,
       plant: req.params.plantId,
-    });
+    })
 
     await topic.save();
 
@@ -57,10 +57,13 @@ router.put('/update/:topicId', async (req, res) => {
         .send({ error: `Error while creating topic. ${result.error}` });
     }
 
-    await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
-      useFindAndModify: false,
-    });
-    return res.send({ message: 'Topic updated successfully.' });
+    topicNew = await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
+      useFindAndModify: true,
+    }).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' }
+    ]);
+    return res.send(topicNew);
   } catch (err) {
     return res.status(400).send({ error: `Error while updating topic.${err}` });
   }
@@ -88,10 +91,7 @@ router.delete('/delete/:topicId', async (req, res) => {
     await Topic.findByIdAndRemove(req.params.topicId, {
       useFindAndModify: false,
     });
-
-    return res.send({
-      message: 'Topic successfully removed.',
-    });
+    return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while deleting topic.${err}` });
   }
@@ -131,9 +131,8 @@ router.post('/like/:topicId', auth, async (req, res) => {
       topic.likes.push(like);
       await topic.save();
       const topictrue = await Topic.findById(req.params.topicId).populate([
-        { path: 'likes' },
-        { path: 'user' },
-        { path: 'toppic' },
+        { path: 'comments', populate: { path: 'user' } },
+        { path: 'user' }
       ]);
       return res.send(topictrue);
     }
@@ -156,7 +155,10 @@ router.post('/dislike/:topicId', auth, async (req, res) => {
       topic.likes.splice(index, 1);
     }
     topic.save();
-    await Like.findByIdAndRemove(like._id).populate('user');
+    await Like.findByIdAndRemove(like._id).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' }
+    ]);
     return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });

From 1de0aeb59556e15825b45f64b376564760f7ade6 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 25 Nov 2020 03:37:50 -0300
Subject: [PATCH 130/147] resolved bug on like dislike

---
 src/routes/plantRoutes.js |  4 ++--
 src/routes/topicRoutes.js | 34 +++++++++++++++++++++-------------
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 86b8c00..b89f456 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -18,7 +18,7 @@ router.post('/register', async (req, res) => {
       firstUser,
       collectionCount,
       extinction,
-      profilePicture,
+      profile_picture,
       gbifID,
       stateProvince,
     } = req.body;
@@ -33,7 +33,7 @@ router.post('/register', async (req, res) => {
       firstUser,
       collectionCount,
       extinction,
-      profilePicture,
+      profile_picture,
       gbifID,
       stateProvince,
     });
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 6f066eb..d176efd 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -114,12 +114,12 @@ router.post('/like/:topicId', auth, async (req, res) => {
   try {
     const user = await User.findById(req.userId);
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'likes' },
+      { path: 'comments', populate: { path: 'user' } },
       { path: 'user' },
-      { path: 'toppic' },
+      { path: 'plant' },
     ]);
     const isLiked = await Like.findOne({
-      user: req.params.userId,
+      user: req.userId,
       topic: req.params.topicId,
     });
     if (isLiked == null) {
@@ -132,7 +132,8 @@ router.post('/like/:topicId', auth, async (req, res) => {
       await topic.save();
       const topictrue = await Topic.findById(req.params.topicId).populate([
         { path: 'comments', populate: { path: 'user' } },
-        { path: 'user' }
+        { path: 'user' },
+        { path: 'plant' },
       ]);
       return res.send(topictrue);
     }
@@ -145,20 +146,27 @@ router.post('/like/:topicId', auth, async (req, res) => {
 
 router.post('/dislike/:topicId', auth, async (req, res) => {
   try {
-    const topic = await Topic.findById(req.params.topicId);
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
     const like = await Like.findOne({
       user: req.userId,
       topic: req.params.topicId,
     });
-    const index = topic.likes.indexOf(like._id);
-    if (index > -1) {
-      topic.likes.splice(index, 1);
+    if(like != null){
+      const index = topic.likes.indexOf(like._id);
+      if (index > -1) {
+        topic.likes.splice(index, 1);
+      }
+      topic.save();
+      await Like.findByIdAndRemove(like._id).populate([
+        { path: 'comments', populate: { path: 'user' } },
+        { path: 'user' },
+        { path: 'plant' },
+      ]);
     }
-    topic.save();
-    await Like.findByIdAndRemove(like._id).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' }
-    ]);
     return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });

From d8319d22a2bab66aab9f2ac33203cd8a2ca4df7e Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 25 Nov 2020 18:58:46 -0300
Subject: [PATCH 131/147] adding comment and topic correct response

---
 src/routes/commentRoutes.js | 69 +++++++++++++++++++------------------
 src/routes/topicRoutes.js   | 43 +++++++++++++----------
 2 files changed, 59 insertions(+), 53 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 7ef8af0..bb9c9f7 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -7,38 +7,32 @@ const Topic = require('../models/Topic');
 const Comment = require('../models/Comment');
 const { auth } = require('./auth');
 
-router.post('/create/:topicId/:userId', async (req, res) => {
+router.post('/create/:topicId', auth, async (req, res) => {
   try {
     if (!req.body.text)
       return res.status(400).send({ error: 'Comment should not be empty' });
 
     const comment = await Comment.create({
-      ...req.body,
-      user: req.params.userId,
+      text: req.body.text,
+      user: req.userId,
       topic: req.params.topicId,
     });
-    const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' }
-    ]);
+    const topic = await Topic.findById(req.params.topicId);
 
     await comment.save();
-
     topic.comments.push(comment);
     await topic.save();
-    const topicCorrect = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' }
-    ]);
+
+    const topicCorrect = await Topic.findById(req.params.topicId);
     return res.send(topicCorrect);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
 
-router.put('/update/:commentId', async (req, res) => {
+router.put('/update/:commentId', auth, async (req, res) => {
   try {
-    await Comment.findById(req.params.commentId);
+    const comment = await Comment.findById(req.params.commentId);
     const newData = req.body;
 
     if (!newData.text)
@@ -47,7 +41,12 @@ router.put('/update/:commentId', async (req, res) => {
     await Comment.findOneAndUpdate({ _id: req.params.commentId }, req.body, {
       useFindAndModify: false,
     });
-    return res.send({ message: 'Comment updated successfully.' });
+    const newTopic = await Topic.findById(comment.topic).populate([
+      { path: 'comments', populate: 'user' },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
+    return res.send(newTopic);
   } catch (err) {
     return res
       .status(400)
@@ -55,7 +54,7 @@ router.put('/update/:commentId', async (req, res) => {
   }
 });
 
-router.delete('/delete/:commentId', async (req, res) => {
+router.delete('/delete/:commentId', auth, async (req, res) => {
   try {
     const topic = Topic.findById(req.body.topicId);
     const index = topic.comments.indexOf(req.params.commentId);
@@ -66,11 +65,13 @@ router.delete('/delete/:commentId', async (req, res) => {
 
     topic.save();
 
-    await Comment.findByIdAndRemove(req.params.commentId).populate('user');
-
-    return res.send({
-      message: 'Comment successfully removed.',
-    });
+    await Comment.findByIdAndRemove(req.params.commentId);
+    const newTopic = await Topic.findById(comment.topic).populate([
+      { path: 'comments', populate: 'user' },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
+    return res.send(newTopic);
   } catch (err) {
     return res.status(400).send({ error: `Error while deleting topic.${err}` });
   }
@@ -79,15 +80,11 @@ router.delete('/delete/:commentId', async (req, res) => {
 router.post('/like/:commentId', auth, async (req, res) => {
   try {
     const user = await User.findById(req.userId);
-    const comment = await Comment.findById(req.params.commentId).populate([
-      { path: 'likes' },
-      { path: 'user' },
-      { path: 'toppic' },
-    ]);
+    const comment = await Comment.findById(req.params.commentId);
     const topic = await Topic.findById(comment.topic).populate([
-      { path: 'likes' },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'toppic' },
+      { path: 'plant' },
     ]);
     const isLiked = await Like.findOne({
       user: req.userId,
@@ -102,9 +99,9 @@ router.post('/like/:commentId', auth, async (req, res) => {
       comment.likes.push(like);
       await comment.save();
       const topicTrue = await Topic.findById(comment.topic).populate([
-        { path: 'likes' },
+        { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'comments' },
+        { path: 'plant' },
       ]);
       return res.send(topicTrue);
     }
@@ -117,7 +114,11 @@ router.post('/like/:commentId', auth, async (req, res) => {
 router.post('/dislike/:commentId', auth, async (req, res) => {
   try {
     const comment = await Comment.findById(req.params.commentId);
-    const topic = await Topic.findById(comment.topic);
+    const topic = await Topic.findById(comment.topic).populate([
+      { path: 'comments', populate: 'user' },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
     const like = await Like.findOne({
       user: req.userId,
       comment: req.params.commentId,
@@ -129,11 +130,11 @@ router.post('/dislike/:commentId', auth, async (req, res) => {
       }
 
       comment.save();
-      await Like.findByIdAndRemove(like._id).populate('user');
+      await Like.findByIdAndRemove(like._id);
       const topicTrue = await Topic.findById(comment.topic).populate([
-        { path: 'likes' },
+        { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'comments' },
+        { path: 'plant' },
       ]);
       return res.send(topicTrue);
     }
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index d176efd..6063ac2 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -25,7 +25,7 @@ router.post('/create/:plantId/:userId', async (req, res) => {
       ...req.body,
       user: req.params.userId,
       plant: req.params.plantId,
-    })
+    });
 
     await topic.save();
 
@@ -57,11 +57,16 @@ router.put('/update/:topicId', async (req, res) => {
         .send({ error: `Error while creating topic. ${result.error}` });
     }
 
-    topicNew = await Topic.findOneAndUpdate({ _id: req.params.topicId }, newData, {
-      useFindAndModify: true,
-    }).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' }
+    const topicNew = await Topic.findOneAndUpdate(
+      { _id: req.params.topicId },
+      newData,
+      {
+        useFindAndModify: true,
+      }
+    ).populate([
+      { path: 'comments', populate: 'user' },
+      { path: 'user' },
+      { path: 'plnt' },
     ]);
     return res.send(topicNew);
   } catch (err) {
@@ -100,9 +105,9 @@ router.delete('/delete/:topicId', async (req, res) => {
 router.get('/list', async (req, res) => {
   try {
     const topic = await Topic.find().populate([
-      { path: 'likes' },
-      { path: 'comments', populate: { path: 'likes' } },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
+      { path: 'plnt' },
     ]);
     return res.send({ topic });
   } catch (err) {
@@ -114,9 +119,9 @@ router.post('/like/:topicId', auth, async (req, res) => {
   try {
     const user = await User.findById(req.userId);
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plant' },
+      { path: 'plnt' },
     ]);
     const isLiked = await Like.findOne({
       user: req.userId,
@@ -131,9 +136,9 @@ router.post('/like/:topicId', auth, async (req, res) => {
       topic.likes.push(like);
       await topic.save();
       const topictrue = await Topic.findById(req.params.topicId).populate([
-        { path: 'comments', populate: { path: 'user' } },
+        { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'plant' },
+        { path: 'plnt' },
       ]);
       return res.send(topictrue);
     }
@@ -147,24 +152,24 @@ router.post('/like/:topicId', auth, async (req, res) => {
 router.post('/dislike/:topicId', auth, async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plant' },
+      { path: 'plnt' },
     ]);
     const like = await Like.findOne({
       user: req.userId,
       topic: req.params.topicId,
     });
-    if(like != null){
+    if (like != null) {
       const index = topic.likes.indexOf(like._id);
       if (index > -1) {
         topic.likes.splice(index, 1);
       }
       topic.save();
       await Like.findByIdAndRemove(like._id).populate([
-        { path: 'comments', populate: { path: 'user' } },
+        { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'plant' },
+        { path: 'plnt' },
       ]);
     }
     return res.send(topic);
@@ -175,9 +180,9 @@ router.post('/dislike/:topicId', auth, async (req, res) => {
 router.get('/find/:topicId', async (req, res) => {
   try {
     const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
+      { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plant' },
+      { path: 'plnt' },
     ]);
 
     return res.send(topic);

From ddb4190ef92010658e5ee546d37e482f29502ebe Mon Sep 17 00:00:00 2001
From: Antonio Ruan Moura Barreto <ruanmoura13@outlook.com>
Date: Tue, 20 Oct 2020 19:19:32 -0300
Subject: [PATCH 132/147] Adding scanner plant rounter

Co-authored-by: Marcos Felipe De Almeida Souza <marofelipe@live.com>
---
 package-lock.json     | 3928 -----------------------------------------
 package.json          |  160 +-
 src/index.js          |    5 +-
 src/routes/scanner.js |   47 +
 4 files changed, 209 insertions(+), 3931 deletions(-)
 delete mode 100644 package-lock.json
 create mode 100644 src/routes/scanner.js

diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 266fd0e..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,3928 +0,0 @@
-{
-  "name": "2020.1-gaiadex-backend",
-  "version": "1.0.0",
-  "lockfileVersion": 1,
-  "requires": true,
-  "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/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/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"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          },
-          "dependencies": {
-            "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
-            },
-            "supports-color": {
-              "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"
-              }
-            }
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "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
-        }
-      }
-    },
-    "@eslint/eslintrc": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz",
-      "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.12.4",
-        "debug": "^4.1.1",
-        "espree": "^7.3.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^3.13.1",
-        "lodash": "^4.17.19",
-        "minimatch": "^3.0.4",
-        "strip-json-comments": "^3.1.1"
-      }
-    },
-    "@hapi/hoek": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz",
-      "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw=="
-    },
-    "@hapi/topo": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
-      "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
-      "requires": {
-        "@hapi/hoek": "^9.0.0"
-      }
-    },
-    "@sideway/address": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.0.tgz",
-      "integrity": "sha512-wAH/JYRXeIFQRsxerIuLjgUu2Xszam+O5xKeatJ4oudShOOirfmsQ1D6LL54XOU2tizpCYku+s1wmU0SYdpoSA==",
-      "requires": {
-        "@hapi/hoek": "^9.0.0"
-      }
-    },
-    "@sideway/formula": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
-      "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg=="
-    },
-    "@sideway/pinpoint": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
-      "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
-    },
-    "@sindresorhus/is": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
-      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
-      "dev": true
-    },
-    "@szmarczak/http-timer": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
-      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
-      "dev": true,
-      "requires": {
-        "defer-to-connect": "^1.0.1"
-      }
-    },
-    "@types/json5": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
-      "dev": true
-    },
-    "@types/parse-json": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
-      "dev": true
-    },
-    "abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
-    },
-    "accepts": {
-      "version": "1.3.7",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
-      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
-      "requires": {
-        "mime-types": "~2.1.24",
-        "negotiator": "0.6.2"
-      }
-    },
-    "acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "dev": true
-    },
-    "acorn-jsx": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-      "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
-      "dev": true
-    },
-    "aggregate-error": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
-      "dev": true,
-      "requires": {
-        "clean-stack": "^2.0.0",
-        "indent-string": "^4.0.0"
-      }
-    },
-    "ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "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-align": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
-      "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
-      "dev": true,
-      "requires": {
-        "string-width": "^3.0.0"
-      }
-    },
-    "ansi-colors": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-      "dev": true
-    },
-    "ansi-escapes": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
-      "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
-      "dev": true,
-      "requires": {
-        "type-fest": "^0.11.0"
-      },
-      "dependencies": {
-        "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
-        }
-      }
-    },
-    "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.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^2.0.1"
-      }
-    },
-    "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"
-      }
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "array-flatten": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
-    },
-    "array-includes": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
-      "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0",
-        "is-string": "^1.0.5"
-      }
-    },
-    "array.prototype.flat": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
-      "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0-next.1"
-      }
-    },
-    "astral-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
-      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
-      "dev": true
-    },
-    "axios": {
-      "version": "0.21.0",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz",
-      "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==",
-      "requires": {
-        "follow-redirects": "^1.10.0"
-      }
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
-    },
-    "basic-auth": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
-      "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
-      "requires": {
-        "safe-buffer": "5.1.2"
-      }
-    },
-    "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
-    },
-    "bl": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
-      "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
-      "requires": {
-        "readable-stream": "^2.3.5",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "bluebird": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
-      "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
-    },
-    "body-parser": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
-      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
-      "requires": {
-        "bytes": "3.1.0",
-        "content-type": "~1.0.4",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "http-errors": "1.7.2",
-        "iconv-lite": "0.4.24",
-        "on-finished": "~2.3.0",
-        "qs": "6.7.0",
-        "raw-body": "2.4.0",
-        "type-is": "~1.6.17"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        }
-      }
-    },
-    "boxen": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
-      "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
-      "dev": true,
-      "requires": {
-        "ansi-align": "^3.0.0",
-        "camelcase": "^5.3.1",
-        "chalk": "^3.0.0",
-        "cli-boxes": "^2.2.0",
-        "string-width": "^4.1.0",
-        "term-size": "^2.1.0",
-        "type-fest": "^0.8.1",
-        "widest-line": "^3.1.0"
-      },
-      "dependencies": {
-        "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"
-          }
-        },
-        "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
-        },
-        "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
-        },
-        "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"
-          }
-        }
-      }
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
-      "requires": {
-        "fill-range": "^7.0.1"
-      }
-    },
-    "bson": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
-      "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
-    },
-    "buffer-equal-constant-time": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
-      "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
-    },
-    "bytes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
-      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
-    },
-    "cacheable-request": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
-      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
-      "dev": true,
-      "requires": {
-        "clone-response": "^1.0.2",
-        "get-stream": "^5.1.0",
-        "http-cache-semantics": "^4.0.0",
-        "keyv": "^3.0.0",
-        "lowercase-keys": "^2.0.0",
-        "normalize-url": "^4.1.0",
-        "responselike": "^1.0.2"
-      },
-      "dependencies": {
-        "get-stream": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "lowercase-keys": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
-          "dev": true
-        }
-      }
-    },
-    "call-bind": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz",
-      "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.0"
-      }
-    },
-    "callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true
-    },
-    "camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
-    },
-    "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"
-      }
-    },
-    "chokidar": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
-      "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.5.0"
-      }
-    },
-    "ci-info": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-      "dev": true
-    },
-    "clean-stack": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-      "dev": true
-    },
-    "cli-boxes": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
-      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
-      "dev": true
-    },
-    "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"
-      }
-    },
-    "cli-truncate": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
-      "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
-      "dev": true,
-      "requires": {
-        "slice-ansi": "^3.0.0",
-        "string-width": "^4.2.0"
-      },
-      "dependencies": {
-        "astral-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-          "dev": true
-        },
-        "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
-        },
-        "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
-        },
-        "slice-ansi": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
-          "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        },
-        "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"
-          }
-        }
-      }
-    },
-    "clone-response": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
-      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
-      "dev": true,
-      "requires": {
-        "mimic-response": "^1.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"
-      }
-    },
-    "color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "commander": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
-      "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==",
-      "dev": true
-    },
-    "compare-versions": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
-      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
-      "dev": true
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "configstore": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
-      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
-      "dev": true,
-      "requires": {
-        "dot-prop": "^5.2.0",
-        "graceful-fs": "^4.1.2",
-        "make-dir": "^3.0.0",
-        "unique-string": "^2.0.0",
-        "write-file-atomic": "^3.0.0",
-        "xdg-basedir": "^4.0.0"
-      }
-    },
-    "confusing-browser-globals": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz",
-      "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==",
-      "dev": true
-    },
-    "contains-path": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
-      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
-      "dev": true
-    },
-    "content-disposition": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
-      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
-      "requires": {
-        "safe-buffer": "5.1.2"
-      }
-    },
-    "content-type": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
-    },
-    "cookie": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
-      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
-    },
-    "cookie-signature": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
-    },
-    "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="
-    },
-    "cosmiconfig": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-      "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
-      "dev": true,
-      "requires": {
-        "@types/parse-json": "^4.0.0",
-        "import-fresh": "^3.2.1",
-        "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
-      },
-      "dependencies": {
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "error-ex": "^1.3.1",
-            "json-parse-even-better-errors": "^2.3.0",
-            "lines-and-columns": "^1.1.6"
-          }
-        },
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-          "dev": true
-        }
-      }
-    },
-    "cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      }
-    },
-    "crypto-random-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
-      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
-      "dev": true
-    },
-    "debug": {
-      "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.2"
-      }
-    },
-    "decompress-response": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
-      "dev": true,
-      "requires": {
-        "mimic-response": "^1.0.0"
-      }
-    },
-    "dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
-      "dev": true
-    },
-    "deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-      "dev": true
-    },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
-    "defer-to-connect": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
-      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
-      "dev": true
-    },
-    "define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "dev": true,
-      "requires": {
-        "object-keys": "^1.0.12"
-      }
-    },
-    "denque": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
-      "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
-    },
-    "depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
-    },
-    "destroy": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
-      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
-    },
-    "doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2"
-      }
-    },
-    "dot-prop": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
-      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
-      "dev": true,
-      "requires": {
-        "is-obj": "^2.0.0"
-      }
-    },
-    "dotenv": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
-      "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
-    },
-    "duplexer3": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
-      "dev": true
-    },
-    "ecdsa-sig-formatter": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
-      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
-      "requires": {
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
-    },
-    "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
-    },
-    "encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
-    },
-    "end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "enquirer": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
-      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^4.1.1"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      },
-      "dependencies": {
-        "is-arrayish": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-          "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-          "dev": true
-        }
-      }
-    },
-    "es-abstract": {
-      "version": "1.17.7",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-      "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-      "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.2",
-        "is-regex": "^1.1.1",
-        "object-inspect": "^1.8.0",
-        "object-keys": "^1.1.1",
-        "object.assign": "^4.1.1",
-        "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"
-      }
-    },
-    "escape-goat": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
-      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
-      "dev": true
-    },
-    "escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
-    },
-    "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
-    },
-    "eslint": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz",
-      "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@eslint/eslintrc": "^0.2.1",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^2.1.0",
-        "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.0",
-        "esquery": "^1.2.0",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^5.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash": "^4.17.19",
-        "minimatch": "^3.0.4",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.1.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.0",
-        "strip-json-comments": "^3.1.0",
-        "table": "^5.2.3",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      }
-    },
-    "eslint-config-airbnb-base": {
-      "version": "14.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz",
-      "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==",
-      "dev": true,
-      "requires": {
-        "confusing-browser-globals": "^1.0.9",
-        "object.assign": "^4.1.0",
-        "object.entries": "^1.1.2"
-      }
-    },
-    "eslint-config-prettier": {
-      "version": "6.15.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz",
-      "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==",
-      "dev": true,
-      "requires": {
-        "get-stdin": "^6.0.0"
-      }
-    },
-    "eslint-import-resolver-node": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
-      "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
-      "dev": true,
-      "requires": {
-        "debug": "^2.6.9",
-        "resolve": "^1.13.1"
-      },
-      "dependencies": {
-        "debug": {
-          "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"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "eslint-module-utils": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
-      "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
-      "dev": true,
-      "requires": {
-        "debug": "^2.6.9",
-        "pkg-dir": "^2.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "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"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "eslint-plugin-import": {
-      "version": "2.22.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
-      "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
-      "dev": true,
-      "requires": {
-        "array-includes": "^3.1.1",
-        "array.prototype.flat": "^1.2.3",
-        "contains-path": "^0.1.0",
-        "debug": "^2.6.9",
-        "doctrine": "1.5.0",
-        "eslint-import-resolver-node": "^0.3.4",
-        "eslint-module-utils": "^2.6.0",
-        "has": "^1.0.3",
-        "minimatch": "^3.0.4",
-        "object.values": "^1.1.1",
-        "read-pkg-up": "^2.0.0",
-        "resolve": "^1.17.0",
-        "tsconfig-paths": "^3.9.0"
-      },
-      "dependencies": {
-        "debug": {
-          "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"
-          }
-        },
-        "doctrine": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
-          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "isarray": "^1.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "eslint-plugin-prettier": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz",
-      "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==",
-      "requires": {
-        "prettier-linter-helpers": "^1.0.0"
-      }
-    },
-    "eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "dev": true,
-      "requires": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      }
-    },
-    "eslint-utils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
-      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
-      "dev": true,
-      "requires": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
-      }
-    },
-    "eslint-visitor-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-      "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
-      "dev": true
-    },
-    "espree": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
-      "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
-      "dev": true,
-      "requires": {
-        "acorn": "^7.4.0",
-        "acorn-jsx": "^5.2.0",
-        "eslint-visitor-keys": "^1.3.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
-      }
-    },
-    "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
-    },
-    "esquery": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
-      "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^5.1.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
-        }
-      }
-    },
-    "esrecurse": {
-      "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": "^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": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true
-    },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
-    },
-    "execa": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
-      "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
-      "dev": true,
-      "requires": {
-        "cross-spawn": "^7.0.0",
-        "get-stream": "^5.0.0",
-        "human-signals": "^1.1.1",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.0",
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2",
-        "strip-final-newline": "^2.0.0"
-      },
-      "dependencies": {
-        "get-stream": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        }
-      }
-    },
-    "express": {
-      "version": "4.17.1",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
-      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
-      "requires": {
-        "accepts": "~1.3.7",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.19.0",
-        "content-disposition": "0.5.3",
-        "content-type": "~1.0.4",
-        "cookie": "0.4.0",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "~1.1.2",
-        "fresh": "0.5.2",
-        "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.5",
-        "qs": "6.7.0",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.1.2",
-        "send": "0.17.1",
-        "serve-static": "1.14.1",
-        "setprototypeof": "1.1.1",
-        "statuses": "~1.5.0",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        }
-      }
-    },
-    "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-diff": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
-      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w=="
-    },
-    "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
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
-    "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"
-      }
-    },
-    "file-entry-cache": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
-      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
-      "dev": true,
-      "requires": {
-        "flat-cache": "^2.0.1"
-      }
-    },
-    "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": {
-        "to-regex-range": "^5.0.1"
-      }
-    },
-    "finalhandler": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
-      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
-      "requires": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "statuses": "~1.5.0",
-        "unpipe": "~1.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        }
-      }
-    },
-    "find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-      "dev": true,
-      "requires": {
-        "locate-path": "^2.0.0"
-      }
-    },
-    "find-versions": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
-      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
-      "dev": true,
-      "requires": {
-        "semver-regex": "^2.0.0"
-      },
-      "dependencies": {
-        "semver-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-          "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
-          "dev": true
-        }
-      }
-    },
-    "flat-cache": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
-      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
-      "dev": true,
-      "requires": {
-        "flatted": "^2.0.0",
-        "rimraf": "2.6.3",
-        "write": "1.0.3"
-      }
-    },
-    "flatted": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
-      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
-      "dev": true
-    },
-    "follow-redirects": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
-      "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA=="
-    },
-    "forwarded": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
-      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
-    },
-    "fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
-      "dev": true,
-      "optional": true
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "get-intrinsic": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz",
-      "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      }
-    },
-    "get-own-enumerable-property-symbols": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
-      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
-      "dev": true
-    },
-    "get-stdin": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
-      "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
-      "dev": true
-    },
-    "get-stream": {
-      "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"
-      }
-    },
-    "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",
-      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-      "dev": true,
-      "requires": {
-        "is-glob": "^4.0.1"
-      }
-    },
-    "global-dirs": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
-      "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
-      "dev": true,
-      "requires": {
-        "ini": "^1.3.5"
-      }
-    },
-    "globals": {
-      "version": "12.4.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-      "dev": true,
-      "requires": {
-        "type-fest": "^0.8.1"
-      }
-    },
-    "got": {
-      "version": "9.6.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
-      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
-      "dev": true,
-      "requires": {
-        "@sindresorhus/is": "^0.14.0",
-        "@szmarczak/http-timer": "^1.1.2",
-        "cacheable-request": "^6.0.0",
-        "decompress-response": "^3.3.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^4.1.0",
-        "lowercase-keys": "^1.0.1",
-        "mimic-response": "^1.0.1",
-        "p-cancelable": "^1.0.0",
-        "to-readable-stream": "^1.0.0",
-        "url-parse-lax": "^3.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": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "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
-    },
-    "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
-    },
-    "has-yarn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
-      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
-      "dev": true
-    },
-    "hosted-git-info": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-      "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
-      "dev": true
-    },
-    "http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-      "dev": true
-    },
-    "http-errors": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
-      "requires": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.1",
-        "statuses": ">= 1.5.0 < 2",
-        "toidentifier": "1.0.0"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-        }
-      }
-    },
-    "human-signals": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
-      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
-      "dev": true
-    },
-    "husky": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz",
-      "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0",
-        "ci-info": "^2.0.0",
-        "compare-versions": "^3.6.0",
-        "cosmiconfig": "^7.0.0",
-        "find-versions": "^3.2.0",
-        "opencollective-postinstall": "^2.0.2",
-        "pkg-dir": "^4.2.0",
-        "please-upgrade-node": "^3.2.0",
-        "slash": "^3.0.0",
-        "which-pm-runs": "^1.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "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"
-          }
-        },
-        "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==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.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": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "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
-        },
-        "pkg-dir": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-          "dev": true,
-          "requires": {
-            "find-up": "^4.0.0"
-          }
-        },
-        "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"
-          }
-        }
-      }
-    },
-    "iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      }
-    },
-    "ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-      "dev": true
-    },
-    "ignore-by-default": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
-      "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
-      "dev": true
-    },
-    "import-fresh": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-      "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
-      "dev": true,
-      "requires": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "dependencies": {
-        "parent-module": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-          "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-          "dev": true,
-          "requires": {
-            "callsites": "^3.0.0"
-          }
-        },
-        "resolve-from": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-          "dev": true
-        }
-      }
-    },
-    "import-lazy": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
-      "dev": true
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "indent-string": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-      "dev": true
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "ini": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
-      "dev": true
-    },
-    "ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
-    },
-    "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-callable": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
-      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
-      "dev": true
-    },
-    "is-ci": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
-      "dev": true,
-      "requires": {
-        "ci-info": "^2.0.0"
-      }
-    },
-    "is-core-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz",
-      "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.3"
-      }
-    },
-    "is-date-object": {
-      "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-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
-    },
-    "is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true
-    },
-    "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-installed-globally": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
-      "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
-      "dev": true,
-      "requires": {
-        "global-dirs": "^2.0.1",
-        "is-path-inside": "^3.0.1"
-      }
-    },
-    "is-negative-zero": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
-      "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
-      "dev": true
-    },
-    "is-npm": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
-      "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
-      "dev": true
-    },
-    "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
-    },
-    "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
-    },
-    "is-path-inside": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
-      "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
-      "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-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
-      "dev": true
-    },
-    "is-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
-      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
-      "dev": true
-    },
-    "is-string": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
-      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
-      "dev": true
-    },
-    "is-symbol": {
-      "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.1"
-      }
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "is-yarn-global": {
-      "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="
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "joi": {
-      "version": "17.3.0",
-      "resolved": "https://registry.npmjs.org/joi/-/joi-17.3.0.tgz",
-      "integrity": "sha512-Qh5gdU6niuYbUIUV5ejbsMiiFmBdw8Kcp8Buj2JntszCkCfxJ9Cz76OtHxOZMPXrt5810iDIXs+n1nNVoquHgg==",
-      "requires": {
-        "@hapi/hoek": "^9.0.0",
-        "@hapi/topo": "^5.0.0",
-        "@sideway/address": "^4.1.0",
-        "@sideway/formula": "^3.0.0",
-        "@sideway/pinpoint": "^2.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"
-      }
-    },
-    "json-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
-      "dev": true
-    },
-    "json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true
-    },
-    "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
-    },
-    "json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "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"
-      }
-    },
-    "jsonwebtoken": {
-      "version": "8.5.1",
-      "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
-      "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
-      "requires": {
-        "jws": "^3.2.2",
-        "lodash.includes": "^4.3.0",
-        "lodash.isboolean": "^3.0.3",
-        "lodash.isinteger": "^4.0.4",
-        "lodash.isnumber": "^3.0.3",
-        "lodash.isplainobject": "^4.0.6",
-        "lodash.isstring": "^4.0.1",
-        "lodash.once": "^4.0.0",
-        "ms": "^2.1.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=="
-        }
-      }
-    },
-    "jwa": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
-      "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
-      "requires": {
-        "buffer-equal-constant-time": "1.0.1",
-        "ecdsa-sig-formatter": "1.0.11",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "jws": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
-      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
-      "requires": {
-        "jwa": "^1.4.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "kareem": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz",
-      "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
-    },
-    "keyv": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
-      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
-      "dev": true,
-      "requires": {
-        "json-buffer": "3.0.0"
-      }
-    },
-    "latest-version": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
-      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
-      "dev": true,
-      "requires": {
-        "package-json": "^6.3.0"
-      }
-    },
-    "levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      }
-    },
-    "lines-and-columns": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
-      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
-      "dev": true
-    },
-    "lint-staged": {
-      "version": "10.5.1",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.1.tgz",
-      "integrity": "sha512-fTkTGFtwFIJJzn/PbUO3RXyEBHIhbfYBE7+rJyLcOXabViaO/h6OslgeK6zpeUtzkDrzkgyAYDTLAwx6JzDTHw==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "cli-truncate": "^2.1.0",
-        "commander": "^6.2.0",
-        "cosmiconfig": "^7.0.0",
-        "debug": "^4.2.0",
-        "dedent": "^0.7.0",
-        "enquirer": "^2.3.6",
-        "execa": "^4.1.0",
-        "listr2": "^3.2.2",
-        "log-symbols": "^4.0.0",
-        "micromatch": "^4.0.2",
-        "normalize-path": "^3.0.0",
-        "please-upgrade-node": "^3.2.0",
-        "string-argv": "0.3.1",
-        "stringify-object": "^3.3.0"
-      }
-    },
-    "listr2": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.2.tgz",
-      "integrity": "sha512-AajqcZEUikF2ioph6PfH3dIuxJclhr3i3kHgTOP0xeXdWQohrvJAAmqVcV43/GI987HFY/vzT73jYXoa4esDHg==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "cli-truncate": "^2.1.0",
-        "figures": "^3.2.0",
-        "indent-string": "^4.0.0",
-        "log-update": "^4.0.0",
-        "p-map": "^4.0.0",
-        "rxjs": "^6.6.3",
-        "through": "^2.3.8"
-      }
-    },
-    "load-json-file": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
-      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "strip-bom": "^3.0.0"
-      }
-    },
-    "locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-      "dev": true,
-      "requires": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.20",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-      "dev": true
-    },
-    "lodash.includes": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
-      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
-    },
-    "lodash.isboolean": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
-      "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
-    },
-    "lodash.isinteger": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
-      "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
-    },
-    "lodash.isnumber": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
-      "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
-    },
-    "lodash.isplainobject": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
-    },
-    "lodash.isstring": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
-      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
-    },
-    "lodash.once": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
-    },
-    "log-symbols": {
-      "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": "^4.0.0"
-      }
-    },
-    "log-update": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
-      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^4.3.0",
-        "cli-cursor": "^3.1.0",
-        "slice-ansi": "^4.0.0",
-        "wrap-ansi": "^6.2.0"
-      },
-      "dependencies": {
-        "astral-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-          "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==",
-          "dev": true
-        },
-        "slice-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        }
-      }
-    },
-    "lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
-      "dev": true
-    },
-    "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"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "media-typer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
-    },
-    "memory-pager": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
-      "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
-      "optional": true
-    },
-    "merge-descriptors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
-    },
-    "merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
-    },
-    "methods": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
-    },
-    "micromatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-      "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-      "dev": true,
-      "requires": {
-        "braces": "^3.0.1",
-        "picomatch": "^2.0.5"
-      }
-    },
-    "mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
-    },
-    "mime-db": {
-      "version": "1.44.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
-    },
-    "mime-types": {
-      "version": "2.1.27",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
-      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
-      "requires": {
-        "mime-db": "1.44.0"
-      }
-    },
-    "mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true
-    },
-    "mimic-response": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
-    },
-    "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,
-      "requires": {
-        "minimist": "^1.2.5"
-      }
-    },
-    "mongodb": {
-      "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz",
-      "integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==",
-      "requires": {
-        "bl": "^2.2.1",
-        "bson": "^1.1.4",
-        "denque": "^1.4.1",
-        "require_optional": "^1.0.1",
-        "safe-buffer": "^5.1.2",
-        "saslprep": "^1.0.0"
-      }
-    },
-    "mongoose": {
-      "version": "5.10.11",
-      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.11.tgz",
-      "integrity": "sha512-R5BFitKW94/S/Z48w+X+qi/eto66jWBcVEVA8nYVkBoBAPFGq7JSYP/0uso+ZHs+7XjSzTuui+SUllzxIrf9yA==",
-      "requires": {
-        "bson": "^1.1.4",
-        "kareem": "2.3.1",
-        "mongodb": "3.6.2",
-        "mongoose-legacy-pluralize": "1.0.2",
-        "mpath": "0.7.0",
-        "mquery": "3.2.2",
-        "ms": "2.1.2",
-        "regexp-clone": "1.0.0",
-        "safe-buffer": "5.2.1",
-        "sift": "7.0.1",
-        "sliced": "1.0.1"
-      },
-      "dependencies": {
-        "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=="
-        }
-      }
-    },
-    "mongoose-legacy-pluralize": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
-      "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
-    },
-    "morgan": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
-      "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
-      "requires": {
-        "basic-auth": "~2.0.1",
-        "debug": "2.6.9",
-        "depd": "~2.0.0",
-        "on-finished": "~2.3.0",
-        "on-headers": "~1.0.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "depd": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
-          "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        }
-      }
-    },
-    "mpath": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz",
-      "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg=="
-    },
-    "mquery": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz",
-      "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==",
-      "requires": {
-        "bluebird": "3.5.1",
-        "debug": "3.1.0",
-        "regexp-clone": "^1.0.0",
-        "safe-buffer": "5.1.2",
-        "sliced": "1.0.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        }
-      }
-    },
-    "ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
-    "natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
-      "dev": true
-    },
-    "negotiator": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
-      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
-    },
-    "nodemon": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz",
-      "integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==",
-      "dev": true,
-      "requires": {
-        "chokidar": "^3.2.2",
-        "debug": "^3.2.6",
-        "ignore-by-default": "^1.0.1",
-        "minimatch": "^3.0.4",
-        "pstree.remy": "^1.1.7",
-        "semver": "^5.7.1",
-        "supports-color": "^5.5.0",
-        "touch": "^3.1.0",
-        "undefsafe": "^2.0.3",
-        "update-notifier": "^4.1.0"
-      },
-      "dependencies": {
-        "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"
-          }
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "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"
-          }
-        }
-      }
-    },
-    "nopt": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
-      "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
-      "dev": true,
-      "requires": {
-        "abbrev": "1"
-      }
-    },
-    "normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "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
-    },
-    "normalize-url": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
-      "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
-      "dev": true
-    },
-    "npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.0.0"
-      }
-    },
-    "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.assign": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
-        "object-keys": "^1.1.1"
-      }
-    },
-    "object.entries": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz",
-      "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5",
-        "has": "^1.0.3"
-      }
-    },
-    "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"
-      }
-    },
-    "on-finished": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
-      "requires": {
-        "ee-first": "1.1.1"
-      }
-    },
-    "on-headers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
-      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "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"
-      }
-    },
-    "opencollective-postinstall": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
-      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
-      "dev": true
-    },
-    "optionator": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
-      "dev": true,
-      "requires": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
-      }
-    },
-    "p-cancelable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
-      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
-      "dev": true
-    },
-    "p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
-      "requires": {
-        "p-try": "^1.0.0"
-      }
-    },
-    "p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-      "dev": true,
-      "requires": {
-        "p-limit": "^1.1.0"
-      }
-    },
-    "p-map": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-      "dev": true,
-      "requires": {
-        "aggregate-error": "^3.0.0"
-      }
-    },
-    "p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-      "dev": true
-    },
-    "package-json": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
-      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
-      "dev": true,
-      "requires": {
-        "got": "^9.6.0",
-        "registry-auth-token": "^4.0.0",
-        "registry-url": "^5.0.0",
-        "semver": "^6.2.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "dev": true,
-      "requires": {
-        "error-ex": "^1.2.0"
-      }
-    },
-    "parseurl": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
-    },
-    "path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
-    },
-    "path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true
-    },
-    "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
-    },
-    "path-to-regexp": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
-    },
-    "path-type": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
-      "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
-      "dev": true,
-      "requires": {
-        "pify": "^2.0.0"
-      }
-    },
-    "picomatch": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true
-    },
-    "pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true
-    },
-    "pkg-dir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
-      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-      "dev": true,
-      "requires": {
-        "find-up": "^2.1.0"
-      }
-    },
-    "please-upgrade-node": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
-      "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
-      "dev": true,
-      "requires": {
-        "semver-compare": "^1.0.0"
-      }
-    },
-    "prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true
-    },
-    "prepend-http": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
-      "dev": true
-    },
-    "prettier": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
-      "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==",
-      "dev": true
-    },
-    "prettier-linter-helpers": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
-      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
-      "requires": {
-        "fast-diff": "^1.1.2"
-      }
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-    },
-    "progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true
-    },
-    "proxy-addr": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
-      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
-      "requires": {
-        "forwarded": "~0.1.2",
-        "ipaddr.js": "1.9.1"
-      }
-    },
-    "pstree.remy": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
-      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
-      "dev": true
-    },
-    "pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "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.1.1",
-      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
-      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
-      "dev": true,
-      "requires": {
-        "escape-goat": "^2.0.0"
-      }
-    },
-    "qs": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
-    },
-    "range-parser": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
-    },
-    "raw-body": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
-      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
-      "requires": {
-        "bytes": "3.1.0",
-        "http-errors": "1.7.2",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      }
-    },
-    "rc": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
-      "dev": true,
-      "requires": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
-      },
-      "dependencies": {
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
-          "dev": true
-        }
-      }
-    },
-    "read-pkg": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
-      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
-      "dev": true,
-      "requires": {
-        "load-json-file": "^2.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^2.0.0"
-      }
-    },
-    "read-pkg-up": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
-      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
-      "dev": true,
-      "requires": {
-        "find-up": "^2.0.0",
-        "read-pkg": "^2.0.0"
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "readdirp": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
-      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
-      "dev": true,
-      "requires": {
-        "picomatch": "^2.2.1"
-      }
-    },
-    "regexp-clone": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
-      "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
-    },
-    "regexpp": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
-      "dev": true
-    },
-    "registry-auth-token": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
-      "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
-      "dev": true,
-      "requires": {
-        "rc": "^1.2.8"
-      }
-    },
-    "registry-url": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
-      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
-      "dev": true,
-      "requires": {
-        "rc": "^1.2.8"
-      }
-    },
-    "require_optional": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
-      "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
-      "requires": {
-        "resolve-from": "^2.0.0",
-        "semver": "^5.1.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
-        }
-      }
-    },
-    "resolve": {
-      "version": "1.18.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
-      "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
-      "dev": true,
-      "requires": {
-        "is-core-module": "^2.0.0",
-        "path-parse": "^1.0.6"
-      }
-    },
-    "resolve-from": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
-      "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
-    },
-    "responselike": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
-      "dev": true,
-      "requires": {
-        "lowercase-keys": "^1.0.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": "2.6.3",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.1.3"
-      }
-    },
-    "rxjs": {
-      "version": "6.6.3",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
-      "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "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=="
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-    },
-    "saslprep": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
-      "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
-      "optional": true,
-      "requires": {
-        "sparse-bitfield": "^3.0.3"
-      }
-    },
-    "semver": {
-      "version": "7.3.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-      "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
-      "dev": true
-    },
-    "semver-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
-      "dev": true
-    },
-    "semver-diff": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
-      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
-      "dev": true,
-      "requires": {
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "send": {
-      "version": "0.17.1",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
-      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
-      "requires": {
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "destroy": "~1.0.4",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "~1.7.2",
-        "mime": "1.6.0",
-        "ms": "2.1.1",
-        "on-finished": "~2.3.0",
-        "range-parser": "~1.2.1",
-        "statuses": "~1.5.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          },
-          "dependencies": {
-            "ms": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-            }
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
-        }
-      }
-    },
-    "serve-static": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
-      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
-      "requires": {
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.3",
-        "send": "0.17.1"
-      }
-    },
-    "setprototypeof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
-    },
-    "shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "requires": {
-        "shebang-regex": "^3.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true
-    },
-    "sift": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
-      "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
-    },
-    "signal-exit": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
-      "dev": true
-    },
-    "slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true
-    },
-    "slice-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
-      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "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"
-          }
-        },
-        "color-convert": {
-          "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"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true
-        }
-      }
-    },
-    "sliced": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
-      "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
-    },
-    "sparse-bitfield": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
-      "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
-      "optional": true,
-      "requires": {
-        "memory-pager": "^1.0.2"
-      }
-    },
-    "spdx-correct": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
-      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-      "dev": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
-      "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
-      "dev": true
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "statuses": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
-    },
-    "string-argv": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
-      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
-      "dev": true
-    },
-    "string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-      "dev": true,
-      "requires": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "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==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "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": "^4.1.0"
-          }
-        }
-      }
-    },
-    "string.prototype.trimend": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz",
-      "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.18.0-next.1",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
-          "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.2",
-            "is-negative-zero": "^2.0.0",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
-      }
-    },
-    "string.prototype.trimstart": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz",
-      "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.18.0-next.1",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
-          "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.2",
-            "is-negative-zero": "^2.0.0",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        }
-      }
-    },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "stringify-object": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
-      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
-      "dev": true,
-      "requires": {
-        "get-own-enumerable-property-symbols": "^3.0.0",
-        "is-obj": "^1.0.1",
-        "is-regexp": "^1.0.0"
-      },
-      "dependencies": {
-        "is-obj": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
-          "dev": true
-        }
-      }
-    },
-    "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"
-      }
-    },
-    "strip-bom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
-      "dev": true
-    },
-    "strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true
-    },
-    "strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "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"
-      }
-    },
-    "table": {
-      "version": "5.4.6",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
-      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.10.2",
-        "lodash": "^4.17.14",
-        "slice-ansi": "^2.1.0",
-        "string-width": "^3.0.0"
-      }
-    },
-    "term-size": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
-      "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
-      "dev": true
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true
-    },
-    "to-readable-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
-      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
-      "dev": true
-    },
-    "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"
-      }
-    },
-    "toidentifier": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
-      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
-    },
-    "touch": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
-      "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
-      "dev": true,
-      "requires": {
-        "nopt": "~1.0.10"
-      }
-    },
-    "tsconfig-paths": {
-      "version": "3.9.0",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
-      "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
-      "dev": true,
-      "requires": {
-        "@types/json5": "^0.0.29",
-        "json5": "^1.0.1",
-        "minimist": "^1.2.0",
-        "strip-bom": "^3.0.0"
-      }
-    },
-    "tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1"
-      }
-    },
-    "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
-    },
-    "type-is": {
-      "version": "1.6.18",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
-      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
-      "requires": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.24"
-      }
-    },
-    "typedarray-to-buffer": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
-      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-      "dev": true,
-      "requires": {
-        "is-typedarray": "^1.0.0"
-      }
-    },
-    "undefsafe": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
-      "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
-      "dev": true,
-      "requires": {
-        "debug": "^2.2.0"
-      },
-      "dependencies": {
-        "debug": {
-          "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"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "unique-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
-      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
-      "dev": true,
-      "requires": {
-        "crypto-random-string": "^2.0.0"
-      }
-    },
-    "unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
-    },
-    "update-notifier": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
-      "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
-      "dev": true,
-      "requires": {
-        "boxen": "^4.2.0",
-        "chalk": "^3.0.0",
-        "configstore": "^5.0.1",
-        "has-yarn": "^2.1.0",
-        "import-lazy": "^2.1.0",
-        "is-ci": "^2.0.0",
-        "is-installed-globally": "^0.3.1",
-        "is-npm": "^4.0.0",
-        "is-yarn-global": "^0.3.0",
-        "latest-version": "^5.0.0",
-        "pupa": "^2.0.1",
-        "semver-diff": "^3.1.1",
-        "xdg-basedir": "^4.0.0"
-      },
-      "dependencies": {
-        "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"
-          }
-        }
-      }
-    },
-    "uri-js": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
-      "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "url-parse-lax": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
-      "dev": true,
-      "requires": {
-        "prepend-http": "^2.0.0"
-      }
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "utils-merge": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
-    },
-    "v8-compile-cache": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
-      "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
-      "dev": true
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "vary": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
-    },
-    "which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-pm-runs": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
-      "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
-      "dev": true
-    },
-    "widest-line": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
-      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
-      "dev": true,
-      "requires": {
-        "string-width": "^4.0.0"
-      },
-      "dependencies": {
-        "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
-        },
-        "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
-        },
-        "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"
-          }
-        }
-      }
-    },
-    "word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-      "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==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "dependencies": {
-        "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
-        },
-        "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
-        },
-        "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"
-          }
-        }
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "write": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
-      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
-      "dev": true,
-      "requires": {
-        "mkdirp": "^0.5.1"
-      }
-    },
-    "write-file-atomic": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
-      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
-      }
-    },
-    "xdg-basedir": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
-      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
-      "dev": true
-    },
-    "yaml": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
-      "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
-      "dev": true
-    }
-  }
-}
diff --git a/package.json b/package.json
index bee26a5..b0b94b8 100644
--- a/package.json
+++ b/package.json
@@ -36,10 +36,166 @@
   },
   "homepage": "https://github.com/fga-eps-mds/2020.1-GaiaDex-backend#readme",
   "dependencies": {
-    "axios": "^0.21.0",
+    "abbrev": "^1.1.1",
+    "accepts": "^1.3.7",
+    "acorn": "^8.0.4",
+    "acorn-jsx": "^5.3.1",
+    "aggregate-error": "^3.1.0",
+    "ajv": "^6.12.6",
+    "ansi-align": "^3.0.0",
+    "ansi-colors": "^4.1.1",
+    "ansi-escapes": "^4.3.1",
+    "ansi-regex": "^5.0.0",
+    "ansi-styles": "^4.3.0",
+    "anymatch": "^3.1.1",
+    "argparse": "^2.0.1",
+    "aria-query": "^4.2.2",
+    "array-flatten": "^3.0.0",
+    "array-includes": "^3.1.1",
+    "array.prototype.flat": "^1.2.3",
+    "array.prototype.flatmap": "^1.2.3",
+    "ast-types-flow": "^0.0.7",
+    "astral-regex": "^2.0.0",
+    "axe-core": "^4.0.2",
+    "axobject-query": "^2.2.0",
+    "balanced-match": "^1.0.0",
+    "basic-auth": "^2.0.1",
+    "binary-extensions": "^2.1.0",
+    "bl": "^4.0.3",
+    "bluebird": "^3.7.2",
+    "body-parser": "^1.19.0",
+    "boxen": "^4.2.0",
+    "brace-expansion": "^2.0.0",
+    "braces": "^3.0.2",
+    "bson": "^4.2.0",
+    "buffer-equal-constant-time": "^1.0.1",
+    "bytes": "^3.1.0",
+    "cacheable-request": "^7.0.1",
+    "callsites": "^3.1.0",
+    "camelcase": "^6.1.0",
+    "chalk": "^4.1.0",
+    "chardet": "^1.3.0",
+    "chokidar": "^3.4.3",
+    "ci-info": "^2.0.0",
+    "clean-stack": "^3.0.0",
+    "cli-boxes": "^2.2.1",
+    "cli-cursor": "^3.1.0",
+    "cli-truncate": "^2.1.0",
+    "cli-width": "^3.0.0",
+    "clone-response": "^1.0.2",
+    "color-convert": "^2.0.1",
+    "color-name": "^1.1.4",
+    "commander": "^6.1.0",
+    "compare-versions": "^3.6.0",
+    "concat-map": "^0.0.1",
+    "configstore": "^5.0.1",
+    "confusing-browser-globals": "^1.0.9",
+    "contains-path": "^1.0.0",
+    "content-disposition": "^0.5.3",
+    "content-type": "^1.0.4",
+    "cookie": "^0.4.1",
+    "cookie-signature": "^1.1.0",
+    "core-js-pure": "^3.6.5",
+    "cosmiconfig": "^7.0.0",
+    "core-util-is": "^1.0.2",
+    "cross-spawn": "^7.0.3",
+    "crypto-random-string": "^3.3.0",
+    "damerau-levenshtein": "^1.0.6",
+    "debug": "^4.2.0",
+    "decompress-response": "^6.0.0",
+    "dedent": "^0.7.0",
+    "deep-extend": "^0.6.0",
+    "deep-is": "^0.1.3",
+    "defer-to-connect": "^2.0.0",
+    "define-properties": "^1.1.3",
+    "denque": "^1.4.1",
+    "depd": "^2.0.0",
+    "destroy": "^1.0.4",
+    "doctrine": "^3.0.0",
+    "dot-prop": "^6.0.0",
+    "axios": "^0.20.0",
     "dotenv": "^8.2.0",
     "express": "^4.17.1",
-    "joi": "^17.3.0",
+    "external-editor": "^3.1.0",
+    "fast-deep-equal": "^3.1.3",
+    "fast-json-stable-stringify": "^2.1.0",
+    "fast-levenshtein": "^3.0.0",
+    "figures": "^3.2.0",
+    "file-entry-cache": "^5.0.1",
+    "fill-range": "^7.0.1",
+    "finalhandler": "^1.1.2",
+    "find-up": "^5.0.0",
+    "find-versions": "^3.2.0",
+    "flat-cache": "^2.0.1",
+    "flatted": "^3.1.0",
+    "forwarded": "^0.1.2",
+    "fresh": "^0.5.2",
+    "fs.realpath": "^1.0.0",
+    "function-bind": "^1.1.1",
+    "functional-red-black-tree": "^1.0.1",
+    "get-own-enumerable-property-symbols": "^3.0.2",
+    "get-stream": "^6.0.0",
+    "glob": "^7.1.6",
+    "glob-parent": "^5.1.1",
+    "global-dirs": "^2.0.1",
+    "globals": "^13.2.0",
+    "got": "^11.7.0",
+    "graceful-fs": "^4.2.4",
+    "has": "^1.0.3",
+    "has-flag": "^4.0.0",
+    "has-yarn": "^2.1.0",
+    "has-symbols": "^1.0.1",
+    "hosted-git-info": "^3.0.7",
+    "http-cache-semantics": "^4.1.0",
+    "http-errors": "^1.8.0",
+    "human-signals": "^2.1.0",
+    "iconv-lite": "^0.6.2",
+    "ignore": "^5.1.8",
+    "ignore-by-default": "^2.0.0",
+    "import-fresh": "^3.2.1",
+    "import-lazy": "^4.0.0",
+    "imurmurhash": "^0.1.4",
+    "indent-string": "^4.0.0",
+    "inflight": "^1.0.6",
+    "inherits": "^2.0.4",
+    "ini": "^1.3.5",
+    "inquirer": "^7.3.3",
+    "internal-slot": "^1.0.2",
+    "ipaddr.js": "^2.0.0",
+    "is-arrayish": "^0.3.2",
+    "is-binary-path": "^2.1.0",
+    "is-callable": "^1.2.2",
+    "is-ci": "^2.0.0",
+    "is-core-module": "^2.0.0",
+    "is-date-object": "^1.0.2",
+    "is-extglob": "^2.1.1",
+    "is-fullwidth-code-point": "^3.0.0",
+    "is-glob": "^4.0.1",
+    "is-installed-globally": "^0.3.2",
+    "is-negative-zero": "^2.0.0",
+    "is-npm": "^5.0.0",
+    "is-number": "^7.0.0",
+    "is-obj": "^2.0.0",
+    "is-path-inside": "^3.0.2",
+    "is-regex": "^1.1.1",
+    "is-regexp": "^2.1.0",
+    "is-stream": "^2.0.0",
+    "is-string": "^1.0.5",
+    "is-symbol": "^1.0.3",
+    "is-typedarray": "^1.0.0",
+    "is-yarn-global": "^0.3.0",
+    "isarray": "^2.0.5",
+    "isexe": "^2.0.0",
+    "form-data": "^3.0.0",
+    "joi": "^17.2.1",
+    "js-tokens": "^6.0.0",
+    "js-yaml": "^3.14.0",
+    "jsesc": "^3.0.1",
+    "json-buffer": "^3.0.1",
+    "json-parse-even-better-errors": "^2.3.1",
+    "json-schema-traverse": "^0.5.0",
+    "json-stable-stringify-without-jsonify": "^1.0.1",
+    "json5": "^2.1.3",
     "jsonwebtoken": "^8.5.1",
     "mongoose": "^5.10.11",
     "morgan": "^1.10.0"
diff --git a/src/index.js b/src/index.js
index c3d2e13..a3fa336 100644
--- a/src/index.js
+++ b/src/index.js
@@ -11,6 +11,7 @@ const commentRoutes = require('./routes/commentRoutes');
 const myPlantRoutes = require('./routes/myPlantRoutes');
 const favoriteRoutes = require('./routes/favoriteRoutes');
 const collectionRoutes = require('./routes/collectionRoutes');
+const scanner = require('./routes/scanner')
 
 // MongoDB connection
 // mongodb://localhost:27017/noderest  => meu banco de dados local polupado
@@ -24,6 +25,7 @@ mongoose
   .catch((err) => console.log(err));
 
 // middlewares
+app.use(express.json({ limit: 20*1024*1024}));
 app.use(morgan('dev'));
 app.use(express.urlencoded({ extended: false }));
 app.use(express.json());
@@ -37,9 +39,10 @@ app.use('/comment', commentRoutes);
 app.use('/myplants', myPlantRoutes);
 app.use('/favorites', favoriteRoutes);
 app.use('/collection', collectionRoutes);
+app.use('/scanner', scanner);
 
 // starting the server
-app.set('port', process.env.PORT || 3000);
+app.set('port', process.env.PORT || 2000);
 app.listen(app.get('port'), () => {
   console.log(`Server on port ${app.get('port')}`);
 });
diff --git a/src/routes/scanner.js b/src/routes/scanner.js
new file mode 100644
index 0000000..d855945
--- /dev/null
+++ b/src/routes/scanner.js
@@ -0,0 +1,47 @@
+const express = require('express');
+const router = express.Router();
+const fs = require('fs'); // File System | Node.js
+const axios = require('axios'); // HTTP client
+const FormData = require('form-data'); // Readable "multipart/form-data" streams
+const path = require('path');
+require('dotenv').config();
+
+function openFileReadStream(filePath) {
+    return new Promise((resolve,reject)=>{
+        const readStream = fs.createReadStream(filePath);
+        readStream.on('open', () => resolve(readStream));
+        readStream.on('error', (err) => reject(err));
+    });
+}
+
+router.post('/',async(req,res,next) => {
+    try{
+        const apiKey = process.env.PLANT_NET_API_KEY; // api key do plant net
+        const {data,filename,mime,plantType} = req.body;
+        const requireFields = {data,filename,mime,plantType};
+        const erros = [];
+        Object.entries(requireFields).forEach( ([key,value]) => {
+            if(!value) erros.push(`${key} is required`);
+        });
+        if (erros.length) throw erros;
+        const fileFormat = mime.split("/").pop();
+        const filePath = path.join(__dirname, '..', `${filename}.${fileFormat}`);
+
+        fs.writeFileSync(filePath, data, {encoding: 'base64'});
+
+        const form = new FormData();
+        form.append('organs', plantType);
+        const stream = await openFileReadStream(filePath);
+        form.append('images', stream);
+
+        const response = await axios.post(`https://my-api.plantnet.org/v2/identify/all?api-key=${apiKey}`,form, {headers: form.getHeaders()});
+        fs.unlinkSync(filePath);
+        
+        res.send(response.data);
+    }catch(err){
+        if(Array.isArray(err)) res.status(400).send({errors : err});
+        next(err);
+    }
+});
+
+module.exports = router;
\ No newline at end of file

From 38ebda2af96b60a31768b2f433c87c533eb57633 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Thu, 29 Oct 2020 23:25:14 -0300
Subject: [PATCH 133/147] adding topic search by id and change the response to
 like qnt

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/scanner.js     |  2 +-
 src/routes/topicRoutes.js | 51 ++++++++++++++++++++++-----------------
 2 files changed, 30 insertions(+), 23 deletions(-)

diff --git a/src/routes/scanner.js b/src/routes/scanner.js
index d855945..a8deaf5 100644
--- a/src/routes/scanner.js
+++ b/src/routes/scanner.js
@@ -37,7 +37,7 @@ router.post('/',async(req,res,next) => {
         const response = await axios.post(`https://my-api.plantnet.org/v2/identify/all?api-key=${apiKey}`,form, {headers: form.getHeaders()});
         fs.unlinkSync(filePath);
         
-        res.send(response.data);
+        res.send(response.data.results);
     }catch(err){
         if(Array.isArray(err)) res.status(400).send({errors : err});
         next(err);
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index d03c9c6..812237f 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -106,32 +106,39 @@ router.get('/list', async (req, res) => {
   }
 });
 
+router.get('/find/:topicId', async (req, res) => {
+    try {
+
+        const topic = await Topic.findById(req.params.topicId).populate(['user']);
+
+        return res.send({ topic });
+
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while listing topics.' + err });
+    }
+});
+
 router.post('/like/:topicId', async (req, res) => {
-  try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { likes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Liked!' });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while liking topic.${err}` });
-  }
+    try {
+
+        const topic = await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
+        res.send(topic)
+        
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while liking topic.' + err });
+    }
 });
 
 router.post('/dislike/:topicId', async (req, res) => {
-  try {
-    await Topic.findOneAndUpdate(
-      { _id: req.params.topicId },
-      { $inc: { dislikes: 1 } },
-      { useFindAndModify: false }
-    );
-    return res.send({ message: 'Disliked!' });
-  } catch (err) {
-    return res
-      .status(400)
-      .send({ error: `Error while dislikinng topic.${err}` });
-  }
+    try {
+
+        const topic = await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
+        res.send(topic)
+        
+        
+    } catch (err) {
+        return res.status(400).send({ error: 'Error while dislikinng topic.' + err });
+    }
 });
 
 module.exports = router;

From a4cb6ba76182eefd97d3fb39c7b08989092d198f Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Thu, 29 Oct 2020 23:31:38 -0300
Subject: [PATCH 134/147] change port to 3000 at index.js

---
 src/index.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/index.js b/src/index.js
index a3fa336..e054cb3 100644
--- a/src/index.js
+++ b/src/index.js
@@ -42,7 +42,7 @@ app.use('/collection', collectionRoutes);
 app.use('/scanner', scanner);
 
 // starting the server
-app.set('port', process.env.PORT || 2000);
+app.set('port', process.env.PORT || 3000);
 app.listen(app.get('port'), () => {
   console.log(`Server on port ${app.get('port')}`);
 });

From b4c6f3af243ebfef6d45c9be85e5d8bb61656b7d Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Tue, 3 Nov 2020 15:25:04 -0300
Subject: [PATCH 135/147] adding some changes to err treatment

Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
---
 src/index.js              |  1 -
 src/routes/plantRoutes.js | 49 ++++++++++++++++++++++-----------------
 2 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/src/index.js b/src/index.js
index e054cb3..4d61e5f 100644
--- a/src/index.js
+++ b/src/index.js
@@ -23,7 +23,6 @@ mongoose
   })
   .then(() => console.log('MongoDB Connected'))
   .catch((err) => console.log(err));
-
 // middlewares
 app.use(express.json({ limit: 20*1024*1024}));
 app.use(morgan('dev'));
diff --git a/src/routes/plantRoutes.js b/src/routes/plantRoutes.js
index 86b8c00..da8688e 100644
--- a/src/routes/plantRoutes.js
+++ b/src/routes/plantRoutes.js
@@ -48,20 +48,26 @@ router.post('/register', async (req, res) => {
 
     await plant.save();
 
-    return res.send({ plant });
-  } catch (err) {
-    return res.send(err);
-  }
+        return res.send({ plant });
+    }catch (err){
+        if (err.code == 11000){
+            const {scientificName} = req.body;
+            const plant = await Plant.find({'scientificName':scientificName}).populate('topics');
+            return res.send({plant});
+        }else{
+            return res.send(err);
+        }
+       
+    }
 });
-// Listagem de Todas as plantas
-router.get('/', async (req, res) => {
-  try {
-    const plants = await Plant.find().populate('topics');
-
-    return res.send({ plants });
-  } catch (err) {
-    return res.status(400).send({ error: 'Loading plants failed' });
-  }
+//Listagem de Todas as plantas
+router.get('/', async (req , res) => {
+    try{
+        const plants = await Plant.find().populate('topics');
+        return res.send({ plants });
+    }catch (err){
+        return res.status(400).send({ error: 'Loading plants failed'});
+    }
 });
 // Procurando planta por id
 router.get('/:plantId', async (req, res) => {
@@ -75,15 +81,16 @@ router.get('/:plantId', async (req, res) => {
       .send({ error: 'error when searching for this plant ' });
   }
 });
-// Deletando planta por id
-router.delete('/:plantId', async (req, res) => {
-  try {
-    const deleted = await Plant.findByIdAndRemove(req.params.plantId);
 
-    return res.send(deleted);
-  } catch (err) {
-    return res.status(400).send({ error: 'Error when Delete this plant' });
-  }
+//Detando planta por id
+router.delete('/:plantId', async (req , res) => {
+    try{
+        const deleted = await Plant.findByIdAndRemove(req.params.plantId);
+
+        return res.send(deleted);
+    }catch (err){
+        return res.status(400).send({ error: 'Error when Delete this plant'});
+    }
 });
 // Dando upgrade planta por id
 router.put('/:plantId', async (req, res) => {

From 397e8f208884fa5894f643a7e39c949328b3278e Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Tue, 3 Nov 2020 17:06:02 -0300
Subject: [PATCH 136/147] rebase

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/models/Plant.js | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/models/Plant.js b/src/models/Plant.js
index 21d4eed..c86c9b2 100644
--- a/src/models/Plant.js
+++ b/src/models/Plant.js
@@ -16,7 +16,6 @@ const PlantSchema = new mongoose.Schema({
   },
   specieName: {
     type: String,
-    require: true,
   },
   commonName: {
     type: String,
@@ -24,23 +23,23 @@ const PlantSchema = new mongoose.Schema({
   },
   usage: {
     type: String,
-    require: true,
+
   },
   firstUser: {
     type: String,
-    require: true,
+
   },
   collectionCount: {
     type: Number,
-    require: true,
+
   },
   extinction: {
     type: Boolean,
-    require: true,
+
   },
   profilePicture: {
     type: String,
-    require: true,
+
   },
   gbifID: {
     type: Number,
@@ -48,7 +47,7 @@ const PlantSchema = new mongoose.Schema({
   },
   stateProvince: {
     type: String,
-    require: true,
+
   },
   topics: [
     {

From 4be49ce4408732ce5ff580f6f18f1e68197ecc72 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Fri, 6 Nov 2020 15:19:40 -0300
Subject: [PATCH 137/147] change the response of routes to be a topic, to
 upgrade the refresh page

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/commentRoutes.js |  4 ++--
 src/routes/scanner.js       | 15 +++++++++------
 src/routes/topicRoutes.js   |  6 ++++--
 3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index b670585..26689b6 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -15,14 +15,14 @@ router.post('/create/:topicId/:userId', async (req, res) => {
       user: req.params.userId,
       topic: req.params.topicId,
     });
-    const topic = await Topic.findById(req.params.topicId);
+    const topic = await Topic.findById(req.params.topicId).populate([{path:'comments',populate:{path:'user'}},{path:'user'},{path:'plant'}]);;
 
     await comment.save();
 
     topic.comments.push(comment);
     await topic.save();
 
-    return res.send({ message: 'Comment successfully registered.' });
+    return res.send(topic);
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
diff --git a/src/routes/scanner.js b/src/routes/scanner.js
index a8deaf5..3ce16b8 100644
--- a/src/routes/scanner.js
+++ b/src/routes/scanner.js
@@ -26,18 +26,21 @@ router.post('/',async(req,res,next) => {
         if (erros.length) throw erros;
         const fileFormat = mime.split("/").pop();
         const filePath = path.join(__dirname, '..', `${filename}.${fileFormat}`);
-
         fs.writeFileSync(filePath, data, {encoding: 'base64'});
-
         const form = new FormData();
         form.append('organs', plantType);
         const stream = await openFileReadStream(filePath);
-        form.append('images', stream);
 
-        const response = await axios.post(`https://my-api.plantnet.org/v2/identify/all?api-key=${apiKey}`,form, {headers: form.getHeaders()});
+        form.append('images', stream);
+  
+        const response = await axios.post(
+			`https://my-api.plantnet.org/v2/identify/all?api-key=${apiKey}`,
+			form, {
+				headers: form.getHeaders()
+			}
+        );
         fs.unlinkSync(filePath);
-        
-        res.send(response.data.results);
+        res.send(response.data);
     }catch(err){
         if(Array.isArray(err)) res.status(400).send({errors : err});
         next(err);
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 812237f..95bd6e6 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -109,8 +109,8 @@ router.get('/list', async (req, res) => {
 router.get('/find/:topicId', async (req, res) => {
     try {
 
-        const topic = await Topic.findById(req.params.topicId).populate(['user']);
-
+        const topic = await Topic.findById(req.params.topicId)
+          .populate([{path:'comments',populate:{path:'user'}},{path:'user'},{path:'plant'}]);
         return res.send({ topic });
 
     } catch (err) {
@@ -122,6 +122,7 @@ router.post('/like/:topicId', async (req, res) => {
     try {
 
         const topic = await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { likes: 1 }}, { useFindAndModify: false})
+        .populate([{path:'comments',populate:{path:'user'}},{path:'user'},{path:'plant'}]);
         res.send(topic)
         
     } catch (err) {
@@ -133,6 +134,7 @@ router.post('/dislike/:topicId', async (req, res) => {
     try {
 
         const topic = await Topic.findOneAndUpdate({_id: req.params.topicId}, { $inc: { dislikes: 1 }}, { useFindAndModify: false})
+        .populate([{path:'comments',populate:{path:'user'}},{path:'user'},{path:'plant'}]);
         res.send(topic)
         
         

From 9ddd130820e662ca3a8ab493c4863a1c751e6d00 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Fri, 6 Nov 2020 15:19:40 -0300
Subject: [PATCH 138/147] change the response of routes to be a topic, to
 upgrade the refresh page

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/scanner.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/routes/scanner.js b/src/routes/scanner.js
index 3ce16b8..b6572dd 100644
--- a/src/routes/scanner.js
+++ b/src/routes/scanner.js
@@ -40,6 +40,7 @@ router.post('/',async(req,res,next) => {
 			}
         );
         fs.unlinkSync(filePath);
+        
         res.send(response.data);
     }catch(err){
         if(Array.isArray(err)) res.status(400).send({errors : err});

From 7fd373b888ed1f5a1b33b687dfc7d15ecf4b2d02 Mon Sep 17 00:00:00 2001
From: Antonio Ruan Moura Barreto <ruanmoura13@outlook.com>
Date: Tue, 10 Nov 2020 19:22:24 -0300
Subject: [PATCH 139/147] Modified response of Comment create, and add topic
 find by id router

Co-authored-by: Marcos Filipe <marofelipe@live.com>
---
 src/routes/commentRoutes.js |  6 +++++-
 src/routes/topicRoutes.js   | 14 ++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index bb9c9f7..a0be99f 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -17,7 +17,11 @@ router.post('/create/:topicId', auth, async (req, res) => {
       user: req.userId,
       topic: req.params.topicId,
     });
-    const topic = await Topic.findById(req.params.topicId);
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
 
     await comment.save();
     topic.comments.push(comment);
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 6063ac2..0a34b0d 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -191,4 +191,18 @@ router.get('/find/:topicId', async (req, res) => {
   }
 });
 
+router.get('/find/:topicId', async (req, res) => {
+  try {
+    const topic = await Topic.findById(req.params.topicId).populate([
+      { path: 'comments', populate: { path: 'user' } },
+      { path: 'user' },
+      { path: 'plant' },
+    ]);
+
+    return res.send({ topic });
+  } catch (err) {
+    return res.status(400).send({ error: `Error while find topic id.${err}` });
+  }
+});
+
 module.exports = router;

From 0653cc7bee5697dbec93744e1f41b1ed234b91c0 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 00:14:44 -0300
Subject: [PATCH 140/147] Adding Likes's model and commentLike route and this
 route check if the user liked the post previously

---
 src/models/Comment.js       | 10 ++++------
 src/models/Topic.js         | 10 ++++------
 src/routes/auth.js          |  2 +-
 src/routes/commentRoutes.js |  1 -
 4 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/src/models/Comment.js b/src/models/Comment.js
index 4388c13..f6afa51 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -17,12 +17,10 @@ const CommentSchema = new mongoose.Schema({
     ref: 'Topic',
     require: true,
   },
-  likes: [
-    {
-      type: Schema.Types.ObjectId,
-      ref: 'Like',
-    },
-  ],
+  likes: [{
+    type: Schema.Types.ObjectId,
+    ref: 'Like',
+  }],
 });
 
 const Comment = mongoose.model('Comment', CommentSchema);
diff --git a/src/models/Topic.js b/src/models/Topic.js
index 68daa6c..f8f541a 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -20,12 +20,10 @@ const topicSchema = new Schema({
     ref: 'User',
     require: true,
   },
-  likes: [
-    {
-      type: Schema.Types.ObjectId,
-      ref: 'Like',
-    },
-  ],
+  likes: [{
+    type: Schema.Types.ObjectId,
+    ref: 'Like',
+  }],
   comments: [
     {
       type: Schema.Types.ObjectId,
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 4d7e317..d11a148 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -3,7 +3,7 @@ require('dotenv').config();
 const jwt = require('jsonwebtoken');
 
 const authConfig = {
-  secret: process.env.SECRET,
+  secret: 'd41d8cd98f00b204e9800998ecf8427e',
 };
 function auth(req, res, next) {
   const sessiontoken = req.headers.authtoken;
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index a0be99f..fcbb63d 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -147,5 +147,4 @@ router.post('/dislike/:commentId', auth, async (req, res) => {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
-
 module.exports = router;

From 6b761e53145bb06d61b473faa87130ec00aa9dad Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 13:43:16 -0300
Subject: [PATCH 141/147] Adding dislike toppic and comment routes

Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/commentRoutes.js |  1 +
 src/routes/topicRoutes.js   | 13 -------------
 2 files changed, 1 insertion(+), 13 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index fcbb63d..a0be99f 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -147,4 +147,5 @@ router.post('/dislike/:commentId', auth, async (req, res) => {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
 });
+
 module.exports = router;
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 0a34b0d..c1ec06e 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -191,18 +191,5 @@ router.get('/find/:topicId', async (req, res) => {
   }
 });
 
-router.get('/find/:topicId', async (req, res) => {
-  try {
-    const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' },
-      { path: 'plant' },
-    ]);
-
-    return res.send({ topic });
-  } catch (err) {
-    return res.status(400).send({ error: `Error while find topic id.${err}` });
-  }
-});
 
 module.exports = router;

From 0287882c7f540047dab76953e1e27e39bfecda8b Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 16:21:19 -0300
Subject: [PATCH 142/147] userId now came from authtoken, not url more

Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/routes/auth.js          | 5 +++++
 src/routes/commentRoutes.js | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/routes/auth.js b/src/routes/auth.js
index d11a148..88dd0f9 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -24,6 +24,8 @@ function auth(req, res, next) {
     return res.status(401).send({ Error: 'Token malformated' });
   }
 
+  
+  jwt.verify(token, authConfig.secret, function(err ,decoded){
   try {
     jwt.verify(token, authConfig.secret, (err, decoded) => {
       req.userId = decoded.id;
@@ -32,5 +34,8 @@ function auth(req, res, next) {
   } catch (err) {
     return res.status(400);
   }
+  });
+    
+ 
 }
 module.exports = { authConfig, auth };
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index a0be99f..65f7bba 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,5 +1,5 @@
 const express = require('express');
-
+const jwt = require('jsonwebtoken');
 const router = express.Router();
 const User = require('../models/User');
 const Like = require('../models/Likes');

From eb6cc0d96f15f238daf4903c5922de9f3d1976ec Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 11 Nov 2020 18:23:57 -0300
Subject: [PATCH 143/147] adding eslint on my pages

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: Antonio Ruan <ruanmoura13@outlook.com>
---
 src/models/Comment.js       | 10 ++++++----
 src/models/Topic.js         | 10 ++++++----
 src/routes/auth.js          |  7 +------
 src/routes/commentRoutes.js |  2 +-
 src/routes/topicRoutes.js   | 10 +++++-----
 5 files changed, 19 insertions(+), 20 deletions(-)

diff --git a/src/models/Comment.js b/src/models/Comment.js
index f6afa51..4388c13 100644
--- a/src/models/Comment.js
+++ b/src/models/Comment.js
@@ -17,10 +17,12 @@ const CommentSchema = new mongoose.Schema({
     ref: 'Topic',
     require: true,
   },
-  likes: [{
-    type: Schema.Types.ObjectId,
-    ref: 'Like',
-  }],
+  likes: [
+    {
+      type: Schema.Types.ObjectId,
+      ref: 'Like',
+    },
+  ],
 });
 
 const Comment = mongoose.model('Comment', CommentSchema);
diff --git a/src/models/Topic.js b/src/models/Topic.js
index f8f541a..68daa6c 100644
--- a/src/models/Topic.js
+++ b/src/models/Topic.js
@@ -20,10 +20,12 @@ const topicSchema = new Schema({
     ref: 'User',
     require: true,
   },
-  likes: [{
-    type: Schema.Types.ObjectId,
-    ref: 'Like',
-  }],
+  likes: [
+    {
+      type: Schema.Types.ObjectId,
+      ref: 'Like',
+    },
+  ],
   comments: [
     {
       type: Schema.Types.ObjectId,
diff --git a/src/routes/auth.js b/src/routes/auth.js
index 88dd0f9..4d7e317 100644
--- a/src/routes/auth.js
+++ b/src/routes/auth.js
@@ -3,7 +3,7 @@ require('dotenv').config();
 const jwt = require('jsonwebtoken');
 
 const authConfig = {
-  secret: 'd41d8cd98f00b204e9800998ecf8427e',
+  secret: process.env.SECRET,
 };
 function auth(req, res, next) {
   const sessiontoken = req.headers.authtoken;
@@ -24,8 +24,6 @@ function auth(req, res, next) {
     return res.status(401).send({ Error: 'Token malformated' });
   }
 
-  
-  jwt.verify(token, authConfig.secret, function(err ,decoded){
   try {
     jwt.verify(token, authConfig.secret, (err, decoded) => {
       req.userId = decoded.id;
@@ -34,8 +32,5 @@ function auth(req, res, next) {
   } catch (err) {
     return res.status(400);
   }
-  });
-    
- 
 }
 module.exports = { authConfig, auth };
diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 65f7bba..a0be99f 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -1,5 +1,5 @@
 const express = require('express');
-const jwt = require('jsonwebtoken');
+
 const router = express.Router();
 const User = require('../models/User');
 const Like = require('../models/Likes');
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index c1ec06e..4d64586 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -107,7 +107,7 @@ router.get('/list', async (req, res) => {
     const topic = await Topic.find().populate([
       { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plnt' },
+      { path: 'plant' },
     ]);
     return res.send({ topic });
   } catch (err) {
@@ -121,7 +121,7 @@ router.post('/like/:topicId', auth, async (req, res) => {
     const topic = await Topic.findById(req.params.topicId).populate([
       { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plnt' },
+      { path: 'plant' },
     ]);
     const isLiked = await Like.findOne({
       user: req.userId,
@@ -138,7 +138,7 @@ router.post('/like/:topicId', auth, async (req, res) => {
       const topictrue = await Topic.findById(req.params.topicId).populate([
         { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'plnt' },
+        { path: 'plant' },
       ]);
       return res.send(topictrue);
     }
@@ -154,7 +154,7 @@ router.post('/dislike/:topicId', auth, async (req, res) => {
     const topic = await Topic.findById(req.params.topicId).populate([
       { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plnt' },
+      { path: 'plant' },
     ]);
     const like = await Like.findOne({
       user: req.userId,
@@ -169,7 +169,7 @@ router.post('/dislike/:topicId', auth, async (req, res) => {
       await Like.findByIdAndRemove(like._id).populate([
         { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'plnt' },
+        { path: 'plant' },
       ]);
     }
     return res.send(topic);

From d8efa867a0c3e85a8872b96ea509f072df5131e4 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Tue, 17 Nov 2020 15:26:09 -0300
Subject: [PATCH 144/147] Adding new likes request
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Rafael Makaha <rafael.makaha@gmail.com>
Co-authored-by: João Vítor Morandi <joao.lemos4000@gmail.com>
---
 src/routes/commentRoutes.js | 3 +--
 src/routes/topicRoutes.js   | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index a0be99f..10eafa8 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -19,8 +19,7 @@ router.post('/create/:topicId', auth, async (req, res) => {
     });
     const topic = await Topic.findById(req.params.topicId).populate([
       { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' },
-      { path: 'plant' },
+      { path: 'user' }
     ]);
 
     await comment.save();
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 4d64586..44bd514 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -25,7 +25,7 @@ router.post('/create/:plantId/:userId', async (req, res) => {
       ...req.body,
       user: req.params.userId,
       plant: req.params.plantId,
-    });
+    })
 
     await topic.save();
 

From 0e04c62202f4dca2ca0dc139957d16dae5bb89e1 Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 25 Nov 2020 18:58:46 -0300
Subject: [PATCH 145/147] adding comment and topic correct response

---
 src/routes/commentRoutes.js |  5 +----
 src/routes/topicRoutes.js   | 10 +++++-----
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 10eafa8..bb9c9f7 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -17,10 +17,7 @@ router.post('/create/:topicId', auth, async (req, res) => {
       user: req.userId,
       topic: req.params.topicId,
     });
-    const topic = await Topic.findById(req.params.topicId).populate([
-      { path: 'comments', populate: { path: 'user' } },
-      { path: 'user' }
-    ]);
+    const topic = await Topic.findById(req.params.topicId);
 
     await comment.save();
     topic.comments.push(comment);
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 44bd514..42e8feb 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -25,7 +25,7 @@ router.post('/create/:plantId/:userId', async (req, res) => {
       ...req.body,
       user: req.params.userId,
       plant: req.params.plantId,
-    })
+    });
 
     await topic.save();
 
@@ -121,7 +121,7 @@ router.post('/like/:topicId', auth, async (req, res) => {
     const topic = await Topic.findById(req.params.topicId).populate([
       { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plant' },
+      { path: 'plnt' },
     ]);
     const isLiked = await Like.findOne({
       user: req.userId,
@@ -138,7 +138,7 @@ router.post('/like/:topicId', auth, async (req, res) => {
       const topictrue = await Topic.findById(req.params.topicId).populate([
         { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'plant' },
+        { path: 'plnt' },
       ]);
       return res.send(topictrue);
     }
@@ -154,7 +154,7 @@ router.post('/dislike/:topicId', auth, async (req, res) => {
     const topic = await Topic.findById(req.params.topicId).populate([
       { path: 'comments', populate: 'user' },
       { path: 'user' },
-      { path: 'plant' },
+      { path: 'plnt' },
     ]);
     const like = await Like.findOne({
       user: req.userId,
@@ -169,7 +169,7 @@ router.post('/dislike/:topicId', auth, async (req, res) => {
       await Like.findByIdAndRemove(like._id).populate([
         { path: 'comments', populate: 'user' },
         { path: 'user' },
-        { path: 'plant' },
+        { path: 'plnt' },
       ]);
     }
     return res.send(topic);

From 5cdc2170e9a43b880de78d036a9c7d3d28291dcc Mon Sep 17 00:00:00 2001
From: Marcos Felipe <marofelipe@live.com>
Date: Wed, 2 Dec 2020 16:57:52 -0300
Subject: [PATCH 146/147] resolve eslint bugs

---
 src/routes/commentRoutes.js | 1 -
 src/routes/topicRoutes.js   | 1 -
 2 files changed, 2 deletions(-)

diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js
index 7c24fe4..9bc7ea4 100644
--- a/src/routes/commentRoutes.js
+++ b/src/routes/commentRoutes.js
@@ -27,7 +27,6 @@ router.post('/create/:topicId', auth, async (req, res) => {
     topic.comments.push(comment);
     await topic.save();
     return res.send(topic);
-
   } catch (err) {
     return res.status(400).send({ error: `Error while commenting.${err}` });
   }
diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js
index 83b3d7f..fe81962 100644
--- a/src/routes/topicRoutes.js
+++ b/src/routes/topicRoutes.js
@@ -192,5 +192,4 @@ router.get('/find/:topicId', async (req, res) => {
   }
 });
 
-
 module.exports = router;

From c5cadc122dd6226c3395d836e5129d89d34010eb Mon Sep 17 00:00:00 2001
From: Rafael Makaha <rafael.makaha@gmail.com>
Date: Wed, 2 Dec 2020 17:05:43 -0300
Subject: [PATCH 147/147] Update .dockerignore

Signed-off-by: Rafael Makaha <rafael.makaha@gmail.com>
---
 .dockerignore | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/.dockerignore b/.dockerignore
index 87dcaf7..edd83c0 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,5 +1,4 @@
 node_modules
 npm-debug.log
 Dockerfile
-.dockerignore
-.env
\ No newline at end of file
+.dockerignore
\ No newline at end of file