diff --git a/.gitignore b/.gitignore
index 49f8907c56774bbe5a165802ffbe844af6ae1241..287d7f2735eaad5f58778131a4b1be47fac703f0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 /node_modules
 sp-account-metadata.xml
+.idea
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..273c37c201f929bfc816bdecc014e0b205da7be9
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,12 @@
+pages-devel:    
+  stage: deploy
+  script:
+    - npm install
+    - "pm2 delete --silent account || :"
+    - pm2 start ./app.js --name=account
+    - pm2 save
+  tags: 
+    - testing
+  only: 
+    - testing
+    - test_logoutbutton
\ No newline at end of file
diff --git a/app.js b/app.js
index 0feeba4c0f15393a90788c3491edc7f758b19463..f3ed756b08f43e2b00d9a2ba38528dca12308b2f 100644
--- a/app.js
+++ b/app.js
@@ -8,6 +8,11 @@ const bodyParser = require('body-parser');
 const session = require('express-session');
 const errorhandler = require('errorhandler');
 const flash = require('express-flash');
+const i18n = require('i18n'); // internationalization
+i18n.configure({
+  locales:['de', 'en'],
+  directory: './locales'
+});
 
 var env = process.env.NODE_ENV || 'development';
 const config = require('./config/config')[env];
@@ -23,6 +28,12 @@ app.use(bodyParser.json());
 app.use(bodyParser.urlencoded({extended: false}));
 app.use(express.static(path.join(__dirname, 'public')));
 
+app.use(i18n.init);
+app.use((req, res, next) => {
+  res.setLocale('de');
+  next();
+});
+
 app.use(session(
   {
     resave: true,
@@ -47,10 +58,24 @@ app.use(function(req, res, next) {
   next();
 });
 
-require('./routes/routes')(app, config, passport);
-//require('./routes/dbconn')(app, config);
+require('./routes/routes-account')(app, config, passport, i18n);
+require('./routes/routes-project')(app, config, passport);
 require('./routes/api')(app, config, passport);
 
+// Handle 404
+app.use(function (req, res, next) {
+  //res.status(404).send('404: Page not Found', 404)
+  res.status(404).render('./DE/404')
+})
+
+// Handle 500 - any server error
+app.use(function (err, req, res, next) {
+  console.error(err.stack)
+  res.status(500).render('./DE/500', {
+    error: err
+  })
+})
+
 app.listen(app.get('port'), function () {
   console.log('Express server listening on port ' + app.get('port'));
-});
+});
\ No newline at end of file
diff --git a/config/config.js b/config/config.js
index dfcd65ef417a6cc3247ffbb84763254b7996b9e9..5c0c2cfc56bd3d8e619413a1928de3eac06e9c9f 100644
--- a/config/config.js
+++ b/config/config.js
@@ -8,18 +8,21 @@ module.exports = {
       strategy: 'saml',
       saml: {
         path: process.env.SAML_PATH || '/saml/SSO',
-        entryPoint: process.env.SAML_ENTRY_POINT || 'https://transfer.hft-stuttgart.de/idp/saml2/idp/SSOService.php',
-        issuer: 'sp-account.m4lab.hft-stuttgart.de',
-        logoutUrl: 'https://transfer.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php'
+        entryPoint: process.env.SAML_ENTRY_POINT || 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php',
+        //issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata
+        issuer: 'sp-account-testing.m4lab.hft-stuttgart.de', //testing metadata
+        //issuer: 'sp-account-prod.m4lab.hft-stuttgart.de', //production metadata
+        logoutUrl: 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php'
       }
     },
     database: {
-      host: 'localhost',      	  // DB host
+      host: 'transfer.hft-stuttgart.de',      	  // DB host
       user: 'DBManager',          // DB username
       password: 'Stuttgart2019',  // DB password
       port: 3306,                 // MySQL port
       dbUser: 'userdb',           // User DB
-      dbProject: 'projectdb'     // Project DB
+      host_project: 'm4lab.hft-stuttgart.de', // DB host project db
+      dbProject: 'projectDB'     // Project DB
     },
     mailer: {
       host: 'mail.hft-stuttgart.de',  // hostname
@@ -32,4 +35,3 @@ module.exports = {
     }
   }
 }
-  
diff --git a/database/userdb_role.sql b/database/userdb_role.sql
new file mode 100644
index 0000000000000000000000000000000000000000..be18e685ca0e5b100bf1164972733c9720bb6b63
--- /dev/null
+++ b/database/userdb_role.sql
@@ -0,0 +1,51 @@
+-- MySQL dump 10.13  Distrib 8.0.15, for Win64 (x86_64)
+--
+-- Host: localhost    Database: userdb
+-- ------------------------------------------------------
+-- Server version	8.0.15
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+ SET NAMES utf8 ;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `role`
+--
+
+DROP TABLE IF EXISTS `role`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+ SET character_set_client = utf8mb4 ;
+CREATE TABLE `role` (
+  `id` int(11) NOT NULL,
+  `name` varchar(45) NOT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `role`
+--
+
+LOCK TABLES `role` WRITE;
+/*!40000 ALTER TABLE `role` DISABLE KEYS */;
+INSERT INTO `role` VALUES (1,'ADMIN'),(2,'USER'),(3,'OVERVIEW_CREATOR');
+/*!40000 ALTER TABLE `role` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2020-03-19  9:21:39
diff --git a/locales/de.json b/locales/de.json
new file mode 100644
index 0000000000000000000000000000000000000000..13a9c09210fdde2225ce2a378649592f2e9826db
--- /dev/null
+++ b/locales/de.json
@@ -0,0 +1,4 @@
+{
+	"Hello World": "Hallo Welt",
+	"Hello": "Hallo"
+}
\ No newline at end of file
diff --git a/locales/en.json b/locales/en.json
new file mode 100644
index 0000000000000000000000000000000000000000..0873ff891aa278c7cf58ff1bb548db68ed5b2edf
--- /dev/null
+++ b/locales/en.json
@@ -0,0 +1,4 @@
+{
+	"Hello World": "Hello World",
+	"Hello": "Hello",
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index ced597feddcdeaa96e4f444645a58e605e4012f9..23c18b893acaa6380eacf6dafc631388f394e344 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,12 +7,12 @@
     "@types/babel-types": {
       "version": "7.0.7",
       "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz",
-      "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ=="
+      "integrity": "sha1-Zn6xZA6AOUNgKAVXN9K5mG7jNuM="
     },
     "@types/babylon": {
       "version": "6.16.5",
       "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz",
-      "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==",
+      "integrity": "sha1-HFZB22nrjN83jt0ltL53VL7rSLQ=",
       "requires": {
         "@types/babel-types": "*"
       }
@@ -20,22 +20,17 @@
     "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": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg="
     },
     "accepts": {
       "version": "1.3.7",
       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
-      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=",
       "requires": {
         "mime-types": "~2.1.24",
         "negotiator": "0.6.2"
       }
     },
-    "acorn": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
-      "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc="
-    },
     "align-text": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
@@ -46,73 +41,46 @@
         "repeat-string": "^1.5.2"
       }
     },
+    "ansi-align": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+      "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+      "requires": {
+        "string-width": "^2.0.0"
+      }
+    },
     "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
     },
     "ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
-    },
-    "anymatch": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
-      "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
       "requires": {
-        "micromatch": "^2.1.5",
-        "normalize-path": "^2.0.0"
+        "color-convert": "^1.9.0"
       }
     },
-    "arr-diff": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
-      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+    "anymatch": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+      "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=",
       "requires": {
-        "arr-flatten": "^1.0.1"
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
       }
     },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
-    },
     "array-flatten": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
       "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
     },
-    "array-unique": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
-      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
-    },
     "async": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz",
       "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ=="
     },
-    "async-each": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
-      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
-    },
-    "atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
-    },
     "babel-runtime": {
       "version": "6.26.0",
       "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
@@ -143,82 +111,20 @@
     "babylon": {
       "version": "6.18.0",
       "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+      "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM="
     },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
     },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
-        }
-      }
-    },
-    "base64-url": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz",
-      "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg="
-    },
     "basic-auth": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz",
-      "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA="
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+      "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=",
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
     },
     "bcryptjs": {
       "version": "2.4.3",
@@ -231,79 +137,80 @@
       "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ=="
     },
     "binary-extensions": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
+      "integrity": "sha1-I8DfFPaogHf1+YbA0WfsA8PVU3w="
     },
     "body-parser": {
-      "version": "1.15.1",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.1.tgz",
-      "integrity": "sha1-m87vBmm4+LlD8K2M5dlXFr10D9I=",
-      "requires": {
-        "bytes": "2.3.0",
-        "content-type": "~1.0.1",
-        "debug": "~2.2.0",
-        "depd": "~1.1.0",
-        "http-errors": "~1.4.0",
-        "iconv-lite": "0.4.13",
+      "version": "1.19.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=",
+      "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.1.0",
-        "raw-body": "~2.1.6",
-        "type-is": "~1.6.12"
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      }
+    },
+    "boxen": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+      "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=",
+      "requires": {
+        "ansi-align": "^2.0.0",
+        "camelcase": "^4.0.0",
+        "chalk": "^2.0.1",
+        "cli-boxes": "^1.0.0",
+        "string-width": "^2.0.0",
+        "term-size": "^1.2.0",
+        "widest-line": "^2.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+        }
       }
     },
     "brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
     "braces": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
-      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
       "requires": {
-        "expand-range": "^1.8.1",
-        "preserve": "^0.2.0",
-        "repeat-element": "^1.1.2"
+        "fill-range": "^7.0.1"
       }
     },
     "bytes": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.3.0.tgz",
-      "integrity": "sha1-1baAoWW2IBc5rLYRVCqrwtjOsHA="
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      },
-      "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        }
-      }
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+      "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY="
     },
     "camelcase": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
       "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
     },
+    "capture-stack-trace": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+      "integrity": "sha1-psC74fOPOqC5Ijjstv9Cw0TUE10="
+    },
     "center-align": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
@@ -314,59 +221,40 @@
       }
     },
     "chalk": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
       "requires": {
-        "ansi-styles": "^2.2.1",
-        "escape-string-regexp": "^1.0.2",
-        "has-ansi": "^2.0.0",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^2.0.0"
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
       }
     },
     "chokidar": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
-      "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
-      "requires": {
-        "anymatch": "^1.3.0",
-        "async-each": "^1.0.0",
-        "fsevents": "^1.0.0",
-        "glob-parent": "^2.0.0",
-        "inherits": "^2.0.1",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^2.0.0",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.0.0"
-      }
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        }
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
+      "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
+      "requires": {
+        "anymatch": "~3.1.1",
+        "braces": "~3.0.2",
+        "fsevents": "~2.1.1",
+        "glob-parent": "~5.1.0",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.2.0"
       }
     },
+    "ci-info": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
+      "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc="
+    },
+    "cli-boxes": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+      "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
+    },
     "cliui": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
@@ -384,19 +272,18 @@
         }
       }
     },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
       "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
+        "color-name": "1.1.3"
       }
     },
-    "component-emitter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
     },
     "concat-map": {
       "version": "0.0.1",
@@ -404,18 +291,16 @@
       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
     },
     "configstore": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.4.0.tgz",
-      "integrity": "sha1-w1eB0FAdJowlxUuLF/YkDopPsCE=",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+      "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=",
       "requires": {
+        "dot-prop": "^4.1.0",
         "graceful-fs": "^4.1.2",
-        "mkdirp": "^0.5.0",
-        "object-assign": "^4.0.1",
-        "os-tmpdir": "^1.0.0",
-        "osenv": "^0.1.0",
-        "uuid": "^2.0.1",
-        "write-file-atomic": "^1.1.2",
-        "xdg-basedir": "^2.0.0"
+        "make-dir": "^1.0.0",
+        "unique-string": "^1.0.0",
+        "write-file-atomic": "^2.0.0",
+        "xdg-basedir": "^3.0.0"
       }
     },
     "connect-flash": {
@@ -424,22 +309,28 @@
       "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA="
     },
     "constantinople": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz",
-      "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz",
+      "integrity": "sha1-1F7XJPV9PRBQABen06iJwTga5kc=",
       "requires": {
-        "acorn": "^2.1.0"
+        "@types/babel-types": "^7.0.0",
+        "@types/babylon": "^6.16.2",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0"
       }
     },
     "content-disposition": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz",
-      "integrity": "sha1-h0dsamfI2qh+Muh2Ft+IO6f7Bxs="
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=",
+      "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=="
+      "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js="
     },
     "cookie": {
       "version": "0.3.1",
@@ -460,11 +351,6 @@
       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
       "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
     },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
-    },
     "core-js": {
       "version": "2.6.10",
       "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz",
@@ -475,22 +361,47 @@
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
       "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
     },
-    "crc": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.0.tgz",
-      "integrity": "sha1-QljjUWE6dO8RU9/LBeggw+lxXX8="
+    "create-error-class": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+      "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+      "requires": {
+        "capture-stack-trace": "^1.0.0"
+      }
+    },
+    "cross-spawn": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+      "requires": {
+        "lru-cache": "^4.0.1",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
     },
     "crypto": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
-      "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig=="
+      "integrity": "sha1-KvG3ytgXXSTIobB3glV5SiGAMDc="
+    },
+    "crypto-random-string": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+      "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
     },
     "debug": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
-      "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
       "requires": {
-        "ms": "0.7.1"
+        "ms": "2.0.0"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
       }
     },
     "decamelize": {
@@ -498,15 +409,10 @@
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
       "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
     },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
-    },
     "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": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw="
     },
     "define-properties": {
       "version": "1.1.3",
@@ -516,53 +422,6 @@
         "object-keys": "^1.0.12"
       }
     },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
-        }
-      }
-    },
     "depd": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -578,39 +437,33 @@
       "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
       "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
     },
-    "duplexer": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
-      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
-    },
-    "duplexify": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
-      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+    "dot-prop": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+      "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=",
       "requires": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
+        "is-obj": "^1.0.0"
       }
     },
+    "duplexer3": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+    },
     "ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
       "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
     },
     "ejs": {
-      "version": "0.8.8",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-0.8.8.tgz",
-      "integrity": "sha1-/9xW3MNdApJt1QrRNDm7xUBh1Zg="
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
+      "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA=="
     },
-    "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==",
-      "requires": {
-        "once": "^1.4.0"
-      }
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
     },
     "errorhandler": {
       "version": "1.4.3",
@@ -622,37 +475,32 @@
       }
     },
     "es-abstract": {
-      "version": "1.16.0",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
-      "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
+      "version": "1.16.3",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.3.tgz",
+      "integrity": "sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==",
       "requires": {
-        "es-to-primitive": "^1.2.0",
+        "es-to-primitive": "^1.2.1",
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
-        "has-symbols": "^1.0.0",
+        "has-symbols": "^1.0.1",
         "is-callable": "^1.1.4",
         "is-regex": "^1.0.4",
-        "object-inspect": "^1.6.0",
+        "object-inspect": "^1.7.0",
         "object-keys": "^1.1.1",
         "string.prototype.trimleft": "^2.1.0",
         "string.prototype.trimright": "^2.1.0"
       }
     },
     "es-to-primitive": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
-      "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+      "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"
       }
     },
-    "es6-promise": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
-      "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM="
-    },
     "escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -666,98 +514,68 @@
     "esutils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+      "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q="
     },
     "etag": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz",
-      "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg="
-    },
-    "event-stream": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
-      "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
-      "requires": {
-        "duplexer": "~0.1.1",
-        "from": "~0",
-        "map-stream": "~0.1.0",
-        "pause-stream": "0.0.11",
-        "split": "0.3",
-        "stream-combiner": "~0.0.4",
-        "through": "~2.3.1"
-      }
-    },
-    "expand-brackets": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
-      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
-      "requires": {
-        "is-posix-bracket": "^0.1.0"
-      }
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
     },
-    "expand-range": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
-      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+    "execa": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
       "requires": {
-        "fill-range": "^2.1.0"
+        "cross-spawn": "^5.0.1",
+        "get-stream": "^3.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
       }
     },
     "express": {
-      "version": "4.13.4",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz",
-      "integrity": "sha1-PAt288d1kMg0VzkGHsC9O6Bn7CQ=",
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+      "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=",
       "requires": {
-        "accepts": "~1.2.12",
+        "accepts": "~1.3.7",
         "array-flatten": "1.1.1",
-        "content-disposition": "0.5.1",
-        "content-type": "~1.0.1",
-        "cookie": "0.1.5",
+        "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.2.0",
-        "depd": "~1.1.0",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
         "escape-html": "~1.0.3",
-        "etag": "~1.7.0",
-        "finalhandler": "0.4.1",
-        "fresh": "0.3.0",
+        "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.1",
+        "parseurl": "~1.3.3",
         "path-to-regexp": "0.1.7",
-        "proxy-addr": "~1.0.10",
-        "qs": "4.0.0",
-        "range-parser": "~1.0.3",
-        "send": "0.13.1",
-        "serve-static": "~1.10.2",
-        "type-is": "~1.6.6",
-        "utils-merge": "1.0.0",
-        "vary": "~1.0.1"
+        "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": {
-        "accepts": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz",
-          "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=",
-          "requires": {
-            "mime-types": "~2.1.6",
-            "negotiator": "0.5.3"
-          }
-        },
         "cookie": {
-          "version": "0.1.5",
-          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz",
-          "integrity": "sha1-armUiksa4hlSzSWIUwpHItQETXw="
-        },
-        "negotiator": {
-          "version": "0.5.3",
-          "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz",
-          "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g="
-        },
-        "qs": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz",
-          "integrity": "sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc="
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+          "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo="
         }
       }
     },
@@ -770,118 +588,68 @@
       }
     },
     "express-session": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.13.0.tgz",
-      "integrity": "sha1-isO1wBiLSDgoUdiCB7jndG77QBE=",
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz",
+      "integrity": "sha1-m1DbteigPDU3NoE48HJzYVC3+bM=",
       "requires": {
-        "cookie": "0.2.3",
+        "cookie": "0.4.0",
         "cookie-signature": "1.0.6",
-        "crc": "3.4.0",
-        "debug": "~2.2.0",
-        "depd": "~1.1.0",
-        "on-headers": "~1.0.1",
-        "parseurl": "~1.3.0",
-        "uid-safe": "~2.0.0",
-        "utils-merge": "1.0.0"
+        "debug": "2.6.9",
+        "depd": "~2.0.0",
+        "on-headers": "~1.0.2",
+        "parseurl": "~1.3.3",
+        "safe-buffer": "5.2.0",
+        "uid-safe": "~2.1.5"
       },
       "dependencies": {
         "cookie": {
-          "version": "0.2.3",
-          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.2.3.tgz",
-          "integrity": "sha1-GllTavaFN6IReKATRvh8sFnSrlw="
-        }
-      }
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+          "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo="
+        },
+        "depd": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+          "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8="
+        },
+        "safe-buffer": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+          "integrity": "sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk="
         }
       }
     },
-    "extglob": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
-      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
-      "requires": {
-        "is-extglob": "^1.0.0"
-      }
-    },
-    "filename-regex": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
-      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
-    },
     "fill-range": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
-      "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
-      "requires": {
-        "is-number": "^2.1.0",
-        "isobject": "^2.0.0",
-        "randomatic": "^3.0.0",
-        "repeat-element": "^1.1.2",
-        "repeat-string": "^1.5.2"
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
+      "requires": {
+        "to-regex-range": "^5.0.1"
       }
     },
     "finalhandler": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz",
-      "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=",
       "requires": {
-        "debug": "~2.2.0",
+        "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"
       }
     },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
-    },
-    "for-own": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
-      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
-      "requires": {
-        "for-in": "^1.0.1"
-      }
-    },
     "forwarded": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
       "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
     },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
     "fresh": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz",
-      "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8="
-    },
-    "from": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
-      "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4="
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
     },
     "fs": {
       "version": "0.0.1-security",
@@ -889,693 +657,167 @@
       "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ="
     },
     "fsevents": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
-      "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
-      "optional": true,
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+      "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0="
+    },
+    "get-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+    },
+    "glob-parent": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
+      "integrity": "sha1-X0wdHnSNMM1zrSlEs1d6gbCB6MI=",
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "global-dirs": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+      "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+      "requires": {
+        "ini": "^1.3.4"
+      }
+    },
+    "got": {
+      "version": "6.7.1",
+      "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+      "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+      "requires": {
+        "create-error-class": "^3.0.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^3.0.0",
+        "is-redirect": "^1.0.0",
+        "is-retry-allowed": "^1.0.0",
+        "is-stream": "^1.0.0",
+        "lowercase-keys": "^1.0.0",
+        "safe-buffer": "^5.0.1",
+        "timed-out": "^4.0.0",
+        "unzip-response": "^2.0.1",
+        "url-parse-lax": "^1.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+      "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM="
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
       "requires": {
-        "nan": "^2.12.1",
-        "node-pre-gyp": "^0.12.0"
+        "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="
+    },
+    "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=="
+    },
+    "http-errors": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+      "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=",
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
       },
       "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "bundled": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.5",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "delegates": "^1.0.0",
-            "readable-stream": "^2.0.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true,
-          "optional": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true,
-          "optional": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "debug": {
-          "version": "4.1.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "deep-extend": {
-          "version": "0.6.0",
-          "bundled": true,
-          "optional": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "bundled": true,
-          "optional": true
-        },
-        "fs-minipass": {
-          "version": "1.2.5",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "aproba": "^1.0.3",
-            "console-control-strings": "^1.0.0",
-            "has-unicode": "^2.0.0",
-            "object-assign": "^4.1.0",
-            "signal-exit": "^3.0.0",
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wide-align": "^1.1.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.3",
-          "bundled": true,
-          "optional": 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"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "ignore-walk": {
-          "version": "3.0.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "minimatch": "^3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
         "inherits": {
           "version": "2.0.3",
-          "bundled": true,
-          "optional": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "bundled": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true,
-          "optional": true
-        },
-        "minipass": {
-          "version": "2.3.5",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.0"
-          }
-        },
-        "minizlib": {
-          "version": "1.2.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "needle": {
-          "version": "2.3.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "debug": "^4.1.0",
-            "iconv-lite": "^0.4.4",
-            "sax": "^1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.12.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "detect-libc": "^1.0.2",
-            "mkdirp": "^0.5.1",
-            "needle": "^2.2.1",
-            "nopt": "^4.0.1",
-            "npm-packlist": "^1.1.6",
-            "npmlog": "^4.0.2",
-            "rc": "^1.2.7",
-            "rimraf": "^2.6.1",
-            "semver": "^5.3.0",
-            "tar": "^4"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.0.6",
-          "bundled": true,
-          "optional": true
-        },
-        "npm-packlist": {
-          "version": "1.4.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "ignore-walk": "^3.0.1",
-            "npm-bundled": "^1.0.1"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "^1.0.0",
-            "os-tmpdir": "^1.0.0"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.8",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "^0.6.0",
-            "ini": "~1.3.0",
-            "minimist": "^1.2.0",
-            "strip-json-comments": "~2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "bundled": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "bundled": true,
-          "optional": true,
-          "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"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "bundled": true,
-          "optional": true
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "bundled": true,
-          "optional": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "bundled": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "5.7.0",
-          "bundled": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "4.4.8",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "chownr": "^1.1.1",
-            "fs-minipass": "^1.2.5",
-            "minipass": "^2.3.4",
-            "minizlib": "^1.1.1",
-            "mkdirp": "^0.5.0",
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.2"
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "wide-align": {
-          "version": "1.1.3",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.2 || 2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "yallist": {
-          "version": "3.0.3",
-          "bundled": true,
-          "optional": true
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
         }
       }
     },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
-    },
-    "glob-base": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
-      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
-      "requires": {
-        "glob-parent": "^2.0.0",
-        "is-glob": "^2.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
-      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
-      "requires": {
-        "is-glob": "^2.0.0"
-      }
-    },
-    "got": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/got/-/got-3.3.1.tgz",
-      "integrity": "sha1-5dDtSvVfw+701WAHdp2YGSvLLso=",
-      "requires": {
-        "duplexify": "^3.2.0",
-        "infinity-agent": "^2.0.0",
-        "is-redirect": "^1.0.0",
-        "is-stream": "^1.0.0",
-        "lowercase-keys": "^1.0.0",
-        "nested-error-stacks": "^1.0.0",
-        "object-assign": "^3.0.0",
-        "prepend-http": "^1.0.0",
-        "read-all-stream": "^3.0.0",
-        "timed-out": "^2.0.0"
-      },
-      "dependencies": {
-        "object-assign": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
-          "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I="
-        }
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
-      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
-    },
-    "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-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "has-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
-    },
-    "has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+    "i18n": {
+      "version": "0.8.5",
+      "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.5.tgz",
+      "integrity": "sha512-6UgLbhJGgn4XFeuZc/dDdrrri0ij24EK4hxv4Pbi5hloYAZ1B2+0eQchEryBFezLKYOHhVGV/5+H4i0oxng94w==",
       "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        }
+        "debug": "*",
+        "make-plural": "^6.0.1",
+        "math-interval-parser": "^2.0.1",
+        "messageformat": "^2.3.0",
+        "mustache": "*",
+        "sprintf-js": "^1.1.2"
       }
     },
-    "has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "http-errors": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz",
-      "integrity": "sha1-bAJC3qaz33r9oVPHEImzHG6Cqr8=",
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
       "requires": {
-        "inherits": "2.0.1",
-        "statuses": ">= 1.2.1 < 2"
+        "safer-buffer": ">= 2.1.2 < 3"
       }
     },
-    "iconv-lite": {
-      "version": "0.4.13",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
-      "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI="
-    },
     "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="
     },
+    "import-lazy": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+    },
     "imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
       "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
     },
-    "infinity-agent": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/infinity-agent/-/infinity-agent-2.0.3.tgz",
-      "integrity": "sha1-ReDi/3qesDCyfWK3SzdEt6esQhY="
-    },
-    "inherits": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-      "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
-    },
     "ini": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+      "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc="
     },
     "ipaddr.js": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz",
-      "integrity": "sha1-X6eM8wG4JceKvDBC2BJyMEnqI8c="
-    },
-    "is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "requires": {
-        "kind-of": "^3.0.2"
-      }
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
+      "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
     },
     "is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=",
       "requires": {
-        "binary-extensions": "^1.0.0"
+        "binary-extensions": "^2.0.0"
       }
     },
     "is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+      "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4="
     },
     "is-callable": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
       "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA=="
     },
-    "is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+    "is-ci": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
+      "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=",
       "requires": {
-        "kind-of": "^3.0.2"
+        "ci-info": "^1.5.0"
       }
     },
     "is-date-object": {
@@ -1583,36 +825,6 @@
       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
       "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
     },
-    "is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "requires": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
-        }
-      }
-    },
-    "is-dotfile": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
-      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
-    },
-    "is-equal-shallow": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
-      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
-      "requires": {
-        "is-primitive": "^2.0.0"
-      }
-    },
     "is-expression": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
@@ -1629,30 +841,31 @@
         }
       }
     },
-    "is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
-    },
     "is-extglob": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
     },
-    "is-finite": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+    "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="
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+      "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
       "requires": {
-        "number-is-nan": "^1.0.0"
+        "is-extglob": "^2.1.1"
       }
     },
-    "is-glob": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+    "is-installed-globally": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+      "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
       "requires": {
-        "is-extglob": "^1.0.0"
+        "global-dirs": "^0.1.0",
+        "is-path-inside": "^1.0.0"
       }
     },
     "is-npm": {
@@ -1661,38 +874,23 @@
       "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ="
     },
     "is-number": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
-      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
-      "requires": {
-        "kind-of": "^3.0.2"
-      }
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss="
     },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+    "is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+    },
+    "is-path-inside": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
       "requires": {
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        }
+        "path-is-inside": "^1.0.1"
       }
     },
-    "is-posix-bracket": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
-      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
-    },
-    "is-primitive": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
-      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
-    },
     "is-promise": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
@@ -1711,36 +909,33 @@
         "has": "^1.0.1"
       }
     },
+    "is-retry-allowed": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+      "integrity": "sha1-13hIi9CkZmo76KFIK58rqv7eqLQ="
+    },
     "is-stream": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
       "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
     },
     "is-symbol": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
-      "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
       "requires": {
-        "has-symbols": "^1.0.0"
+        "has-symbols": "^1.0.1"
       }
     },
-    "is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
-    },
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
       "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
     },
-    "isobject": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-      "requires": {
-        "isarray": "1.0.0"
-      }
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
     },
     "js-stringify": {
       "version": "1.0.2",
@@ -1756,11 +951,11 @@
       }
     },
     "latest-version": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-1.0.1.tgz",
-      "integrity": "sha1-cs/Ebj6NG+ZR4eu1Tqn26pbzdLs=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+      "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
       "requires": {
-        "package-json": "^1.0.0"
+        "package-json": "^4.0.0"
       }
     },
     "lazy-cache": {
@@ -1769,92 +964,9 @@
       "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
     },
     "lodash": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.2.0.tgz",
-      "integrity": "sha1-S/UKMkP5rrC6xBpV09WZBnWkYvs="
-    },
-    "lodash._baseassign": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
-      "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
-      "requires": {
-        "lodash._basecopy": "^3.0.0",
-        "lodash.keys": "^3.0.0"
-      }
-    },
-    "lodash._basecopy": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
-      "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY="
-    },
-    "lodash._bindcallback": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz",
-      "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4="
-    },
-    "lodash._createassigner": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz",
-      "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=",
-      "requires": {
-        "lodash._bindcallback": "^3.0.0",
-        "lodash._isiterateecall": "^3.0.0",
-        "lodash.restparam": "^3.0.0"
-      }
-    },
-    "lodash._getnative": {
-      "version": "3.9.1",
-      "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
-      "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U="
-    },
-    "lodash._isiterateecall": {
-      "version": "3.0.9",
-      "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
-      "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw="
-    },
-    "lodash.assign": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz",
-      "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=",
-      "requires": {
-        "lodash._baseassign": "^3.0.0",
-        "lodash._createassigner": "^3.0.0",
-        "lodash.keys": "^3.0.0"
-      }
-    },
-    "lodash.defaults": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz",
-      "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=",
-      "requires": {
-        "lodash.assign": "^3.0.0",
-        "lodash.restparam": "^3.0.0"
-      }
-    },
-    "lodash.isarguments": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
-      "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo="
-    },
-    "lodash.isarray": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
-      "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
-    },
-    "lodash.keys": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
-      "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
-      "requires": {
-        "lodash._getnative": "^3.0.0",
-        "lodash.isarguments": "^3.0.0",
-        "lodash.isarray": "^3.0.0"
-      }
-    },
-    "lodash.restparam": {
-      "version": "3.6.1",
-      "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
-      "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU="
+      "version": "4.17.15",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+      "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg="
     },
     "longest": {
       "version": "1.0.1",
@@ -1864,30 +976,34 @@
     "lowercase-keys": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+      "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8="
     },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
-    },
-    "map-stream": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
-      "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ="
+    "lru-cache": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+      "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=",
+      "requires": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      }
     },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+    "make-dir": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+      "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=",
       "requires": {
-        "object-visit": "^1.0.0"
+        "pify": "^3.0.0"
       }
     },
-    "math-random": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
-      "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A=="
+    "make-plural": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.0.1.tgz",
+      "integrity": "sha512-h0uBNi4tpDkiWUyYKrJNj8Kif6q3Ba5zp/8jnfPy3pQE+4XcTj6h3eZM5SYVUyDNX9Zk69Isr/dx0I+78aJUaQ=="
+    },
+    "math-interval-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz",
+      "integrity": "sha1-4izW0VoKf0wDrsVg23ZRPaYVvtQ="
     },
     "media-typer": {
       "version": "0.3.0",
@@ -1899,35 +1015,45 @@
       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
       "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
     },
+    "messageformat": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz",
+      "integrity": "sha1-3iY8SQKdXq5l1+4l4HVPV/QlrZE=",
+      "requires": {
+        "make-plural": "^4.3.0",
+        "messageformat-formatters": "^2.0.1",
+        "messageformat-parser": "^4.1.2"
+      },
+      "dependencies": {
+        "make-plural": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz",
+          "integrity": "sha1-8j3gjv2wysLgybqfMVsN/2tMJzU=",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        }
+      }
+    },
+    "messageformat-formatters": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz",
+      "integrity": "sha1-BJLBQCpId191HJsXwDVOkr4BKwg="
+    },
+    "messageformat-parser": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.2.tgz",
+      "integrity": "sha1-/TTsOZEqFIaKFZXq63QkhauKs3I="
+    },
     "methods": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
       "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
     },
-    "micromatch": {
-      "version": "2.3.11",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
-      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
-      "requires": {
-        "arr-diff": "^2.0.0",
-        "array-unique": "^0.2.1",
-        "braces": "^1.8.2",
-        "expand-brackets": "^0.1.4",
-        "extglob": "^0.3.1",
-        "filename-regex": "^2.0.0",
-        "is-extglob": "^1.0.0",
-        "is-glob": "^2.0.1",
-        "kind-of": "^3.0.2",
-        "normalize-path": "^2.0.1",
-        "object.omit": "^2.0.0",
-        "parse-glob": "^3.0.4",
-        "regex-cache": "^0.4.2"
-      }
-    },
     "mime": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
-      "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM="
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE="
     },
     "mime-db": {
       "version": "1.40.0",
@@ -1945,59 +1071,37 @@
     "minimatch": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
       "requires": {
         "brace-expansion": "^1.1.7"
       }
     },
     "minimist": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
-    },
-    "mixin-deep": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "requires": {
-        "minimist": "0.0.8"
-      }
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
     },
     "morgan": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.7.0.tgz",
-      "integrity": "sha1-6xDKjlDRq+D409rVwCAdBS2YHGI=",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
+      "integrity": "sha1-Co0Wc0odmvvIJLmd+H5zjlji2lk=",
       "requires": {
-        "basic-auth": "~1.0.3",
-        "debug": "~2.2.0",
-        "depd": "~1.1.0",
+        "basic-auth": "~2.0.0",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
         "on-finished": "~2.3.0",
         "on-headers": "~1.0.1"
       }
     },
     "ms": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
-      "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg="
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "mustache": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.0.tgz",
+      "integrity": "sha512-FJgjyX/IVkbXBXYUwH+OYwQKqWpFPLaLVESd70yHjSDunwzV2hZOoTBvPf4KLoxesUzzyfTH6F784Uqd7Wm5yA=="
     },
     "mysql": {
       "version": "2.17.1",
@@ -2010,64 +1114,15 @@
         "sqlstring": "2.3.1"
       }
     },
-    "nan": {
-      "version": "2.14.0",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
-      "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
-      "optional": true
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "arr-diff": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
-        },
-        "array-unique": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
-        }
-      }
-    },
     "negotiator": {
       "version": "0.6.2",
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
-      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
-    },
-    "nested-error-stacks": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz",
-      "integrity": "sha1-GfYZWRUZ8JZ2mlupqG5u7sgjw88=",
-      "requires": {
-        "inherits": "~2.0.1"
-      }
+      "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs="
     },
     "node-forge": {
-      "version": "0.2.24",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.2.24.tgz",
-      "integrity": "sha1-+m+Eb0L6k/Y6CjDJ+/97ThMOCFg="
+      "version": "0.7.6",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz",
+      "integrity": "sha1-/fO0GK7h+U8O9kLNY0hsd8qXJKw="
     },
     "nodemailer": {
       "version": "6.3.1",
@@ -2075,20 +1130,30 @@
       "integrity": "sha512-j0BsSyaMlyadEDEypK/F+xlne2K5m6wzPYMXS/yxKI0s7jmT1kBx6GEKRVbZmyYfKOsjkeC/TiMVDJBI/w5gMQ=="
     },
     "nodemon": {
-      "version": "1.9.2",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.9.2.tgz",
-      "integrity": "sha1-IbPNFX1Ug4M7RzNyyY4XlaTVWXA=",
-      "requires": {
-        "chokidar": "^1.4.3",
-        "debug": "^2.2.0",
-        "es6-promise": "^3.0.2",
-        "ignore-by-default": "^1.0.0",
-        "lodash.defaults": "^3.1.2",
-        "minimatch": "^3.0.0",
-        "ps-tree": "^1.0.1",
-        "touch": "1.0.0",
-        "undefsafe": "0.0.3",
-        "update-notifier": "0.5.0"
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.1.tgz",
+      "integrity": "sha512-UC6FVhNLXjbbV4UzaXA3wUdbEkUZzLGgMGzmxvWAex5nzib/jhcSHVFlQODdbuUHq8SnnZ4/EABBAbC3RplvPg==",
+      "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.2",
+        "update-notifier": "^2.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
       }
     },
     "nopt": {
@@ -2100,68 +1165,33 @@
       }
     },
     "normalize-path": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU="
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
       "requires": {
-        "remove-trailing-separator": "^1.0.1"
+        "path-key": "^2.0.0"
       }
     },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
-    },
     "object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
       "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
     },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
     "object-inspect": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
-      "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ=="
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+      "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
     },
     "object-keys": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
     },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "requires": {
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        }
-      }
-    },
     "object.getownpropertydescriptors": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
@@ -2171,30 +1201,6 @@
         "es-abstract": "^1.5.1"
       }
     },
-    "object.omit": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
-      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
-      "requires": {
-        "for-own": "^0.1.4",
-        "is-extendable": "^0.1.1"
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "requires": {
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        }
-      }
-    },
     "on-finished": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -2206,64 +1212,28 @@
     "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=",
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+      "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8="
     },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
-    },
-    "osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "requires": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
     },
     "package-json": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz",
-      "integrity": "sha1-yOysCUInzfdqMWh07QXifMk5oOA=",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+      "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
       "requires": {
-        "got": "^3.2.0",
-        "registry-url": "^3.0.0"
-      }
-    },
-    "parse-glob": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
-      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
-      "requires": {
-        "glob-base": "^0.3.0",
-        "is-dotfile": "^1.0.0",
-        "is-extglob": "^1.0.0",
-        "is-glob": "^2.0.0"
+        "got": "^6.7.1",
+        "registry-auth-token": "^3.0.1",
+        "registry-url": "^3.0.3",
+        "semver": "^5.1.0"
       }
     },
     "parseurl": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+      "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ="
     },
     "passport": {
       "version": "0.3.2",
@@ -2275,17 +1245,28 @@
       }
     },
     "passport-saml": {
-      "version": "0.15.0",
-      "resolved": "https://registry.npmjs.org/passport-saml/-/passport-saml-0.15.0.tgz",
-      "integrity": "sha1-fUXAe6r4DY4s+Jg2cTKl5MBTXK0=",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/passport-saml/-/passport-saml-1.2.0.tgz",
+      "integrity": "sha512-CU1JOx9FTITF8+vl/G1g7FV6kHWXYzECV3pq3D8K3RIM1MS0efbfQ2hkgDFdoZGdG9DdMH5z8OBW/O8qoXnkLQ==",
       "requires": {
+        "debug": "^3.1.0",
         "passport-strategy": "*",
-        "q": "1.1.x",
-        "xml-crypto": "0.8.x",
-        "xml-encryption": "~0.7",
+        "q": "^1.5.0",
+        "xml-crypto": "^1.1.4",
+        "xml-encryption": "^0.11.0",
         "xml2js": "0.4.x",
-        "xmlbuilder": "2.5.x",
+        "xmlbuilder": "^11.0.0",
         "xmldom": "0.1.x"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
       }
     },
     "passport-strategy": {
@@ -2293,15 +1274,20 @@
       "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
       "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ="
     },
-    "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-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
     },
     "path-parse": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+      "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw="
     },
     "path-to-regexp": {
       "version": "0.1.7",
@@ -2313,68 +1299,49 @@
       "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
       "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
     },
-    "pause-stream": {
-      "version": "0.0.11",
-      "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
-      "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
-      "requires": {
-        "through": "~2.3"
-      }
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
+    "picomatch": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz",
+      "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA=="
     },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+    "pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
     },
     "prepend-http": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
       "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
     },
-    "preserve": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
-      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
-    },
     "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=="
+      "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I="
     },
     "proxy-addr": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz",
-      "integrity": "sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
+      "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
       "requires": {
-        "forwarded": "~0.1.0",
-        "ipaddr.js": "1.0.5"
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.9.0"
       }
     },
-    "ps-tree": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
-      "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==",
-      "requires": {
-        "event-stream": "=3.3.4"
-      }
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+    },
+    "pstree.remy": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz",
+      "integrity": "sha1-x2ljooBH7WFULcNhqibuVaf6FfM="
     },
     "pug": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz",
-      "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==",
+      "integrity": "sha1-7naC7ApgSUs41IqI8F87CskxN30=",
       "requires": {
         "pug-code-gen": "^2.0.2",
         "pug-filters": "^3.1.1",
@@ -2389,7 +1356,7 @@
     "pug-attrs": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz",
-      "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==",
+      "integrity": "sha1-svRMQ55OtK1dTvJcrCDRitKMwzY=",
       "requires": {
         "constantinople": "^3.0.1",
         "js-stringify": "^1.0.1",
@@ -2399,7 +1366,7 @@
     "pug-code-gen": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz",
-      "integrity": "sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==",
+      "integrity": "sha1-rQlnFirqB33PeHg42U7RSssCF8I=",
       "requires": {
         "constantinople": "^3.1.2",
         "doctypes": "^1.1.0",
@@ -2456,12 +1423,12 @@
     "pug-error": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz",
-      "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ=="
+      "integrity": "sha1-80L7AIdS1YA0wYXeA2At2f/hX6Y="
     },
     "pug-filters": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz",
-      "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==",
+      "integrity": "sha1-qyzILbnuzPV4vaiRMOJSoNsCaqc=",
       "requires": {
         "clean-css": "^4.1.11",
         "constantinople": "^3.0.1",
@@ -2512,7 +1479,7 @@
     "pug-lexer": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz",
-      "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==",
+      "integrity": "sha1-UxzeSMfAsfy7wrhUhchmXjFInP0=",
       "requires": {
         "character-parser": "^2.1.1",
         "is-expression": "^3.0.0",
@@ -2532,7 +1499,7 @@
     "pug-linker": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz",
-      "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==",
+      "integrity": "sha1-9b8hiw79Zc5mcPevxRZY0Pgpifs=",
       "requires": {
         "pug-error": "^1.3.3",
         "pug-walk": "^1.1.8"
@@ -2541,7 +1508,7 @@
     "pug-load": {
       "version": "2.0.12",
       "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz",
-      "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==",
+      "integrity": "sha1-04yF64X24vcE3qFNzKlBRNNdPns=",
       "requires": {
         "object-assign": "^4.1.0",
         "pug-walk": "^1.1.8"
@@ -2550,7 +1517,7 @@
     "pug-parser": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz",
-      "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==",
+      "integrity": "sha1-A+etpItoQL04Ivhn19kPhC0P/ck=",
       "requires": {
         "pug-error": "^1.3.3",
         "token-stream": "0.0.1"
@@ -2559,12 +1526,12 @@
     "pug-runtime": {
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz",
-      "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw=="
+      "integrity": "sha1-baeXbDa/IvaOczw1kkDYrnoylTo="
     },
     "pug-strip-comments": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz",
-      "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==",
+      "integrity": "sha1-zBtt4fbo9ZMc8C7GbN/9P1Dq+Kg=",
       "requires": {
         "pug-error": "^1.3.3"
       }
@@ -2572,87 +1539,48 @@
     "pug-walk": {
       "version": "1.1.8",
       "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz",
-      "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA=="
+      "integrity": "sha1-tAj2fyeRL4wh2i9FtyMMS9Kl6no="
     },
     "q": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz",
-      "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok="
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
     },
     "qs": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.1.0.tgz",
-      "integrity": "sha1-7B0WJrJCeNmfD99FSeUk4k7O6yY="
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+      "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw="
     },
-    "randomatic": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
-      "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
-      "requires": {
-        "is-number": "^4.0.0",
-        "kind-of": "^6.0.0",
-        "math-random": "^1.0.1"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
-        }
-      }
+    "random-bytes": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
+      "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
     },
     "range-parser": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
-      "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU="
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE="
     },
     "raw-body": {
-      "version": "2.1.7",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz",
-      "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+      "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=",
       "requires": {
-        "bytes": "2.4.0",
-        "iconv-lite": "0.4.13",
+        "bytes": "3.1.0",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
         "unpipe": "1.0.0"
-      },
-      "dependencies": {
-        "bytes": {
-          "version": "2.4.0",
-          "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
-          "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk="
-        }
       }
     },
     "rc": {
       "version": "1.2.8",
       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=",
       "requires": {
         "deep-extend": "^0.6.0",
         "ini": "~1.3.0",
         "minimist": "^1.2.0",
         "strip-json-comments": "~2.0.1"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-        }
-      }
-    },
-    "read-all-stream": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz",
-      "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
-      "requires": {
-        "pinkie-promise": "^2.0.0",
-        "readable-stream": "^2.0.0"
       }
     },
     "readable-stream": {
@@ -2660,315 +1588,42 @@
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
       "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
       "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": {
-        "inherits": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-          "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-        }
-      }
-    },
-    "readdirp": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "micromatch": "^3.1.10",
-        "readable-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "arr-diff": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
-        },
-        "array-unique": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "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"
-          }
-        },
-        "expand-brackets": {
-          "version": "2.1.4",
-          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-          "requires": {
-            "debug": "^2.3.3",
-            "define-property": "^0.2.5",
-            "extend-shallow": "^2.0.1",
-            "posix-character-classes": "^0.1.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "0.2.5",
-              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              }
-            },
-            "kind-of": {
-              "version": "5.1.0",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
-            }
-          }
-        },
-        "extglob": {
+        "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": {
+        "inherits": {
           "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-          "requires": {
-            "array-unique": "^0.3.2",
-            "define-property": "^1.0.0",
-            "expand-brackets": "^2.1.4",
-            "extend-shallow": "^2.0.1",
-            "fragment-cache": "^0.2.1",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "1.0.0",
-              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-              "requires": {
-                "is-descriptor": "^1.0.0"
-              }
-            },
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+          "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
         }
       }
     },
+    "readdirp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
+      "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
+      "requires": {
+        "picomatch": "^2.0.4"
+      }
+    },
     "regenerator-runtime": {
       "version": "0.11.1",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
-    },
-    "regex-cache": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
-      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
-      "requires": {
-        "is-equal-shallow": "^0.1.3"
-      }
+      "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk="
     },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+    "registry-auth-token": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
+      "integrity": "sha1-10RoFUM/XV7WQxzV3KIQSPZrOX4=",
       "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
+        "rc": "^1.1.6",
+        "safe-buffer": "^5.0.1"
       }
     },
     "registry-url": {
@@ -2979,29 +1634,11 @@
         "rc": "^1.0.1"
       }
     },
-    "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="
-    },
-    "repeat-element": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
-    },
     "repeat-string": {
       "version": "1.6.1",
       "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
       "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
     },
-    "repeating": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz",
-      "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=",
-      "requires": {
-        "is-finite": "^1.0.0"
-      }
-    },
     "resolve": {
       "version": "1.12.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
@@ -3010,16 +1647,6 @@
         "path-parse": "^1.0.6"
       }
     },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
-    },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
-    },
     "right-align": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
@@ -3031,25 +1658,22 @@
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
     },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "requires": {
-        "ret": "~0.1.10"
-      }
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
     },
     "sax": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+      "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk="
     },
     "semver": {
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+      "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc="
     },
     "semver-diff": {
       "version": "2.1.0",
@@ -3060,294 +1684,88 @@
       }
     },
     "send": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz",
-      "integrity": "sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=",
+      "version": "0.17.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+      "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=",
       "requires": {
-        "debug": "~2.2.0",
-        "depd": "~1.1.0",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
         "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
         "escape-html": "~1.0.3",
-        "etag": "~1.7.0",
-        "fresh": "0.3.0",
-        "http-errors": "~1.3.1",
-        "mime": "1.3.4",
-        "ms": "0.7.1",
+        "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.0.3",
-        "statuses": "~1.2.1"
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
       },
       "dependencies": {
-        "http-errors": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
-          "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=",
-          "requires": {
-            "inherits": "~2.0.1",
-            "statuses": "1"
-          }
-        },
-        "statuses": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz",
-          "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg="
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo="
         }
       }
     },
     "serve-static": {
-      "version": "1.10.3",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz",
-      "integrity": "sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=",
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=",
       "requires": {
+        "encodeurl": "~1.0.2",
         "escape-html": "~1.0.3",
-        "parseurl": "~1.3.1",
-        "send": "0.13.2"
-      },
-      "dependencies": {
-        "http-errors": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
-          "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=",
-          "requires": {
-            "inherits": "~2.0.1",
-            "statuses": "1"
-          }
-        },
-        "send": {
-          "version": "0.13.2",
-          "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz",
-          "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=",
-          "requires": {
-            "debug": "~2.2.0",
-            "depd": "~1.1.0",
-            "destroy": "~1.0.4",
-            "escape-html": "~1.0.3",
-            "etag": "~1.7.0",
-            "fresh": "0.3.0",
-            "http-errors": "~1.3.1",
-            "mime": "1.3.4",
-            "ms": "0.7.1",
-            "on-finished": "~2.3.0",
-            "range-parser": "~1.0.3",
-            "statuses": "~1.2.1"
-          }
-        },
-        "statuses": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz",
-          "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg="
-        }
-      }
-    },
-    "set-value": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "slide": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
-      "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
-    },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-        }
-      }
-    },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
-        }
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
       }
     },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "requires": {
-        "kind-of": "^3.2.0"
-      }
+    "setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM="
     },
-    "source-map-resolve": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
-      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
       "requires": {
-        "atob": "^2.1.1",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
+        "shebang-regex": "^1.0.0"
       }
     },
-    "source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
     },
-    "split": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
-      "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
-      "requires": {
-        "through": "2"
-      }
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
     },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
+    "sprintf-js": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+      "integrity": "sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM="
     },
     "sqlstring": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
       "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A="
     },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
     "statuses": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
       "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
     },
-    "stream-combiner": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
-      "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
-      "requires": {
-        "duplexer": "~0.1.1"
-      }
-    },
-    "stream-shift": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
-      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
-    },
-    "string-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz",
-      "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=",
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
       "requires": {
-        "strip-ansi": "^3.0.0"
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
       }
     },
     "string.prototype.trimleft": {
@@ -3371,91 +1789,77 @@
     "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==",
+      "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
       "requires": {
         "safe-buffer": "~5.1.0"
       }
     },
     "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
       "requires": {
-        "ansi-regex": "^2.0.0"
+        "ansi-regex": "^3.0.0"
       }
     },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+    },
     "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="
     },
     "supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
     },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+    "term-size": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+      "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+      "requires": {
+        "execa": "^0.7.0"
+      }
     },
     "timed-out": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz",
-      "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo="
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
     },
     "to-fast-properties": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
       "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
     },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "requires": {
-        "kind-of": "^3.0.2"
-      }
-    },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
     "to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
       "requires": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        }
+        "is-number": "^7.0.0"
       }
     },
+    "toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM="
+    },
     "token-stream": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
       "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo="
     },
     "touch": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/touch/-/touch-1.0.0.tgz",
-      "integrity": "sha1-RJy+LbrlqMgDjjDXH6D/RklHxN4=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
+      "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=",
       "requires": {
         "nopt": "~1.0.10"
       }
@@ -3463,7 +1867,7 @@
     "type-is": {
       "version": "1.6.18",
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
-      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=",
       "requires": {
         "media-typer": "0.3.0",
         "mime-types": "~2.1.24"
@@ -3493,27 +1897,27 @@
       "optional": true
     },
     "uid-safe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz",
-      "integrity": "sha1-p/PGymSh9qXQTsDvPkw9U2cxcTc=",
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
+      "integrity": "sha1-Kz1cckDo/C5Y+Komnl7knAhXvTo=",
       "requires": {
-        "base64-url": "1.2.1"
+        "random-bytes": "~1.0.0"
       }
     },
     "undefsafe": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz",
-      "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8="
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz",
+      "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=",
+      "requires": {
+        "debug": "^2.2.0"
+      }
     },
-    "union-value": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+    "unique-string": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+      "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
       "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
+        "crypto-random-string": "^1.0.0"
       }
     },
     "unpipe": {
@@ -3521,70 +1925,35 @@
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
       "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
     },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
-          }
-        },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-        }
-      }
+    "unzip-response": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+      "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
     },
     "update-notifier": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.5.0.tgz",
-      "integrity": "sha1-B7XcIGazYnqztPUwEw9+3doHpMw=",
-      "requires": {
-        "chalk": "^1.0.0",
-        "configstore": "^1.0.0",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+      "integrity": "sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y=",
+      "requires": {
+        "boxen": "^1.2.1",
+        "chalk": "^2.0.1",
+        "configstore": "^3.0.0",
+        "import-lazy": "^2.1.0",
+        "is-ci": "^1.0.10",
+        "is-installed-globally": "^0.1.0",
         "is-npm": "^1.0.0",
-        "latest-version": "^1.0.0",
-        "repeating": "^1.1.2",
+        "latest-version": "^3.0.0",
         "semver-diff": "^2.0.0",
-        "string-length": "^1.0.0"
+        "xdg-basedir": "^3.0.0"
       }
     },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
-    },
-    "use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+    "url-parse-lax": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+      "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+      "requires": {
+        "prepend-http": "^1.0.1"
+      }
     },
     "util-deprecate": {
       "version": "1.0.2",
@@ -3601,85 +1970,84 @@
       }
     },
     "utils-merge": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
-      "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg="
-    },
-    "uuid": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
-      "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho="
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
     },
     "vary": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz",
-      "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA="
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
     },
     "void-elements": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
       "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
     },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "widest-line": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
+      "integrity": "sha1-dDh2RzDsfvQ4HOTfgvuYpTFCo/w=",
+      "requires": {
+        "string-width": "^2.1.1"
+      }
+    },
     "window-size": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
       "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
     },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
     "write-file-atomic": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
-      "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+      "integrity": "sha1-H9Lprh3z51uNjDZ0Q8aS1MqB9IE=",
       "requires": {
         "graceful-fs": "^4.1.11",
         "imurmurhash": "^0.1.4",
-        "slide": "^1.1.5"
+        "signal-exit": "^3.0.2"
       }
     },
     "xdg-basedir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz",
-      "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=",
-      "requires": {
-        "os-homedir": "^1.0.0"
-      }
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+      "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ="
     },
     "xml-crypto": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-0.8.5.tgz",
-      "integrity": "sha1-K7z7PrM/OoKiGLgiv2craxwg5Tg=",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-1.4.0.tgz",
+      "integrity": "sha1-3hzsjNMcvWic2Q09boon1K6Afec=",
       "requires": {
-        "xmldom": "=0.1.19",
-        "xpath.js": ">=0.0.3"
-      },
-      "dependencies": {
-        "xmldom": {
-          "version": "0.1.19",
-          "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.19.tgz",
-          "integrity": "sha1-Yx/Ad3bv2EEYvyUXGzftTQdaCrw="
-        }
+        "xmldom": "0.1.27",
+        "xpath": "0.0.27"
       }
     },
     "xml-encryption": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-0.7.4.tgz",
-      "integrity": "sha1-Qnkexk1VbSRV3LnaClQSNmWsZcc=",
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-0.11.2.tgz",
+      "integrity": "sha512-jVvES7i5ovdO7N+NjgncA326xYKjhqeAnnvIgRnY7ROLCfFqEDLwP0Sxp/30SHG0AXQV1048T5yinOFyvwGFzg==",
       "requires": {
-        "async": "~0.2.7",
-        "ejs": "~0.8.3",
-        "node-forge": "0.2.24",
+        "async": "^2.1.5",
+        "ejs": "^2.5.6",
+        "node-forge": "^0.7.0",
         "xmldom": "~0.1.15",
-        "xpath": "0.0.5"
+        "xpath": "0.0.27"
       },
       "dependencies": {
         "async": {
-          "version": "0.2.10",
-          "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
-          "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
+          "version": "2.6.3",
+          "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+          "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+          "requires": {
+            "lodash": "^4.17.14"
+          }
         }
       }
     },
@@ -3691,22 +2059,12 @@
         "sax": ">=0.6.0",
         "util.promisify": "~1.0.0",
         "xmlbuilder": "~11.0.0"
-      },
-      "dependencies": {
-        "xmlbuilder": {
-          "version": "11.0.1",
-          "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-          "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
-        }
       }
     },
     "xmlbuilder": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-2.5.2.tgz",
-      "integrity": "sha1-WriPxQirL/FIcwELVhY9P5KxkyU=",
-      "requires": {
-        "lodash": "~3.2.0"
-      }
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+      "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM="
     },
     "xmldom": {
       "version": "0.1.27",
@@ -3714,14 +2072,14 @@
       "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk="
     },
     "xpath": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.5.tgz",
-      "integrity": "sha1-RUA29u8PPfWvXUukoRn7dWdLPmw="
+      "version": "0.0.27",
+      "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz",
+      "integrity": "sha1-3TQh+9zFZGrDLEhTG01+nQws+pI="
     },
-    "xpath.js": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz",
-      "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ=="
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
     },
     "yargs": {
       "version": "3.10.0",
diff --git a/package.json b/package.json
index f7d2d9b90987bd9916d7deb4e7e60cbff06f08cc..2c3a256225dfdd55c4ad54c364b6e4d650af6004 100644
--- a/package.json
+++ b/package.json
@@ -23,20 +23,21 @@
   "dependencies": {
     "async": "^3.1.0",
     "bcryptjs": "^2.4.3",
-    "body-parser": "1.15.1",
+    "body-parser": "^1.19.0",
     "cookie-parser": "1.4.3",
     "crypto": "^1.0.1",
     "errorhandler": "1.4.3",
-    "express": "4.13.4",
+    "express": "^4.17.1",
     "express-flash": "0.0.2",
-    "express-session": "1.13.0",
+    "express-session": "^1.17.0",
     "fs": "0.0.1-security",
-    "morgan": "1.7.0",
+    "i18n": "^0.8.5",
+    "morgan": "^1.9.1",
     "mysql": "^2.17.1",
     "nodemailer": "^6.3.1",
-    "nodemon": "1.9.2",
+    "nodemon": "^2.0.1",
     "passport": "0.3.2",
-    "passport-saml": "0.15.0",
+    "passport-saml": "^1.2.0",
     "pug": "^2.0.4"
   },
   "devDependencies": {},
diff --git a/public/js/headfootLogout.js b/public/js/headfootLogout.js
new file mode 100644
index 0000000000000000000000000000000000000000..3de579214613513c5927401173ee0ee46dd9a573
--- /dev/null
+++ b/public/js/headfootLogout.js
@@ -0,0 +1,241 @@
+var menu = [{'name':'Informationen', 'combos':[{'name':'Projekte', 'link':'/project'}, {'name':'Über das M4_LAB', 'link':'/projectoverview?projectID=1'}], 'type':'dropdown', 'link':'#'},{'name':'Zusammenarbeit', 'combos':[{'name':'Mailinglisten', 'link':'/mailinglists'},{'name':'Videokonferenzen', 'link':'/videoconference.html'},/* {'name':'...', 'link':'#'}*/], 'type':'dropdown', 'link':'#'},{'name':'Events', 'combos':[{'name':'Veranstaltungen der HfT', 'link':'http://www.hft-stuttgart.de/Aktuell/Veranstaltungen/'}/*,{'name':'...', 'link':'#'}*/], 'type':'dropdown', 'link':'#'},/*{'name':'Bürgerbeteiligung', 'combos':[{'name':'...', 'link':'#'}, {'name':'...', 'link':'#'}], 'type':'dropdown', 'link':'#'},*/{'name':'Logout', 'combos':[], 'type':'logoutbutton', 'link':'/logout'}];
+
+
+var hft_links = [{'url':'http://www.hft-stuttgart.de/Forschung/M4-Lab/Team/index.html/de', 'name':'Kontakt'},{'url':'http://www.hft-stuttgart.de/Hochschule/Impressum.html/de', 'name':'Impressum'},{'url':'http://www.hft-stuttgart.de/Einrichtungen/Datenschutz/Datenschutz-Homepage', 'name':'Datenschutz'}]
+
+var socialmedias = [{'url':'https://twitter.com/InnolabM4', 'name': 'fa-twitter'}, {'url':'https://www.facebook.com/HfTStuttgart/', 'name': 'fa-facebook-square'}, {'url':'https://www.instagram.com/m4_lab/', 'name': 'fa-instagram'}, {'url':'https://de.linkedin.com/school/hochschule-f%C3%BCr-technik-stuttgart-%E2%80%93-university-of-applied-sciences/', 'name': 'fa-linkedin'}, {'url':'https://www.youtube.com/channel/UCi0_JfF2qMZbOhOnNH5PyHA', 'name': 'fa-youtube'}];
+
+var footer_images = [/*{'src':'/images/demo/bbf_logo.png', 'alt':'BMBF'},*/ {'src':'/images/demo/Innovative_Hochschule_Initiative_BMBF_GWK_RGB.jpg', 'alt':'Innovative Hochschule'}]
+
+function prependChild(parent,child){
+    parent.insertBefore(child, parent.childNodes[0]);
+}
+
+function userAuthenticated(){
+    let params = new URLSearchParams(window.location.search);
+    if(params.get('isAuthenticatedUser')){
+        return true;
+    }else if(document.getElementById('loginswitch')){   //relikt login via OAuth
+        if(document.getElementById('loginswitch').getAttribute('authenticated') == '1'){
+            return true;
+        }
+    }else{
+        return false;
+    }
+}
+
+
+function readCookie(cname) {
+  var name = cname + "=";
+  var decodedCookie = decodeURIComponent(document.cookie);
+  var ca = decodedCookie.split(';');
+  for(var i = 0; i <ca.length; i++) {
+    var c = ca[i];
+    while (c.charAt(0) == ' ') {
+      c = c.substring(1);
+    }
+    if (c.indexOf(name) == 0) {
+      return c.substring(name.length, c.length);
+    }
+  }
+  return "";
+}
+
+function sendRequest(URL){
+    console.log(document.cookie);
+    let xhr = new XMLHttpRequest();
+    xhr.open("POST", URL, true);
+    let token = readCookie("XSRF-TOKEN");
+    //Send the proper header information along with the request
+    xhr.setRequestHeader('X-CSRF-TOKEN', token);
+    xhr.send();
+}
+
+
+/* function head()
+ * creates header and prepends it to the documents body
+ */
+
+function head(){
+    let headerdiv = document.createElement('div');
+    let alertdiv = document.createElement('div');
+    headerdiv.classList.add("wrapper","row1");
+    let navheader = document.createElement('header');
+    navheader.id = "header";
+    navheader.classList.add("clear");
+    let alertbutton = document.createElement('button');
+    alertbutton.type = "button";
+    alertbutton.classList.add("close");
+    alertbutton.setAttribute("data-dismiss", "alert");
+    alertbutton.innerHTML = "&times;";
+    alertdiv.innerHTML="<strong>Disclaimer</strong> This website is under construction and in prototype-phase. It is not for public use."
+    prependChild(alertdiv, alertbutton);
+    alertdiv.classList.add('alert','alert-danger', 'alert-dismissible', 'fade','show');
+    alertdiv.style = "text-align:center;";
+    navheader.appendChild(alertdiv);
+    let navbar = document.createElement('nav');
+    navbar.classList.add("navbar", "navbar-default");
+    let fluiddiv = document.createElement('div');
+    fluiddiv.classList.add("container-fluid");
+    let navbardiv = document.createElement('div');
+    navbardiv.classList.add("navbar-header");
+    let navelements = document.createElement('ul');
+    navelements.id="navelemente";
+    let logos = document.createElement('li');
+    let link_m4lab = document.createElement('a');
+    link_m4lab.href = "/";
+    link_m4lab.innerHTML = "<img src='/images/demo/m4lab_logo.jpg' alt='Logo Innovationslabor M4_LAB'>";
+    logos.appendChild(link_m4lab);
+    navelements.appendChild(logos);
+    for(let j = 0; j<menu.length; j++){
+        let headitem = document.createElement('li');
+        let itemtype = menu[j].type;
+        headitem.classList.add("nav-item")
+        let headlink = document.createElement('a');
+        headlink.href=menu[j].link;
+        headlink.id="navbarDropdown" + j;
+        headlink.classList.add('nav-link');
+        headlink.setAttribute("role", "button");
+        if(itemtype=='dropdown'){
+            headitem.classList.add("dropdown");
+            headlink.classList.add('dropdown-toggle');
+            headlink.setAttribute("data-toggle", "dropdown");
+            headlink.setAttribute("aria-haspopup", "true");
+            headlink.setAttribute("aria-expanded", "false");
+        }
+        headlink.innerHTML=menu[j].name;
+        if(itemtype=='dropdown'){
+            let combodiv = document.createElement('div');
+            combodiv.id=headlink.id+"_par";
+            combodiv.setAttribute("aria-labelledby",headlink.id);
+            combodiv.classList.add("dropdown-menu");
+            for(let k = 0; k< menu[j].combos.length; k++){
+                let combolink = document.createElement('a');
+                combolink.classList.add("dropdown-item");
+                if(userAuthenticated() || typeof user !== 'undefined'){ //either logged in the old way or logged in using SAML
+                    if(menu[j].combos[k].link.includes('?')){
+                        combolink.href = menu[j].combos[k].link + "&isAuthenticatedUser=true";
+                    }else{    
+                        combolink.href = menu[j].combos[k].link + "?isAuthenticatedUser=true";
+                    }
+                }else{
+                    combolink.href = menu[j].combos[k].link;
+                }
+                combolink.innerHTML = menu[j].combos[k].name;
+                combodiv.appendChild(combolink);
+            }
+            headitem.appendChild(combodiv);
+        }else if(itemtype=='logoutbutton'){
+        /*    if(userAuthenticated()){
+                headlink.innerHTML="Account";
+                headlink.href="/account/";
+            } */
+            headlink.innerHTML="Logout";
+            headlink.href="/logout";
+            headlink.classList.remove("nav-link");
+            headlink.classList.add("btn");
+            headlink.classList.add("btn-outline-danger");
+        }
+        headitem.appendChild(headlink);
+        navelements.appendChild(headitem);
+    }
+/*    let searchitem = document.createElement('li');
+    searchitem.classList.add("nav-item");
+    let searchinput = document.createElement('input');
+    searchinput.value='Suche...'
+    searchinput.type="text";
+    searchinput.classList.add("nav-item-suchfeld");
+    searchinput.setAttribute('onFocus', "this.value=(this.value=='search...')? '' : this.value");
+    searchitem.appendChild(searchinput);
+    let magnifier = document.createElement('input');
+    magnifier.type="image"
+    magnifier.src="/images/Lupe_grau.png";
+    magnifier.width="25";
+    magnifier.height="25";
+    magnifier.alt="";
+    magnifier.id="sf_submit";
+    magnifier.value="search";
+    searchitem.appendChild(magnifier);
+    navelements.appendChild(searchitem);*/
+    navbardiv.appendChild(navelements);
+    fluiddiv.appendChild(navbardiv);
+    navbar.appendChild(fluiddiv);
+    navheader.appendChild(navbar);
+    headerdiv.appendChild(navheader);
+    prependChild(document.body, headerdiv);
+};
+
+/* function foot()
+ * creates footer and appends it to the documents body
+ */
+
+function foot(){
+    let footerdiv = document.createElement('div');
+    footerdiv.id="homepage";
+    footerdiv.classList.add("last", "clear");
+    footerdiv.innerHTML = "<hr>";
+    let containerdiv = document.createElement('div');
+    containerdiv.classList.add('flex-container');
+    let hftlink = document.createElement('a');
+    hftlink.classList.add("col-md-3");
+    hftlink.setAttribute('style','flex-basis: 400px;');
+    hftlink.href="https://www.hft-stuttgart.de";
+    let hftimage = document.createElement('img');
+    hftimage.src="/images/demo/hft_logo.jpg"; 
+    hftimage.alt="Logo der Hochschule für Technik Stuttgart";
+    hftimage.height= '75';
+    hftlink.appendChild(hftimage);
+    containerdiv.appendChild(hftlink);
+    let contactdiv = document.createElement('div');
+    contactdiv.classList.add("col-md-3", "footer-unten")
+    contactdiv.setAttribute('style',"flex-basis:400px");
+    contactdiv.innerHTML="Hochschule für Technik Stuttgart";
+    let rowdiv = document.createElement('div');
+    rowdiv.classList.add("row");
+    for(let i = 0; i<hft_links.length; i++){
+        let coldiv = document.createElement('div');
+        coldiv.classList.add("contactrow", "footer-unten");
+        let collink = document.createElement('a');
+        collink.innerHTML = hft_links[i].name;
+        collink.classList.add("contact-lower")
+        collink.href = hft_links[i].url;
+        coldiv.appendChild(collink)
+        rowdiv.appendChild(coldiv);
+    }
+    contactdiv.appendChild(rowdiv);
+    containerdiv.appendChild(contactdiv);
+    let socialdiv = document.createElement('div');
+    socialdiv.classList.add("col-md-3");
+    socialdiv.setAttribute('style','flex-basis: 400px;');
+    let socialrow = document.createElement('div');
+    socialrow.id="socialmediabuttons";
+    for(let j = 0; j< socialmedias.length; j++){
+        let sociallink = document.createElement('a');
+        sociallink.href = socialmedias[j].url;
+        let socialcontent = document.createElement('i');
+        socialcontent.classList.add("fab", socialmedias[j].name);
+        sociallink.appendChild(socialcontent);
+        socialrow.appendChild(sociallink);
+        socialrow.innerHTML+="&nbsp;";
+    }
+    socialdiv.appendChild(socialrow);
+    containerdiv.appendChild(socialdiv);
+    let imagediv = document.createElement('div');
+    imagediv.classList.add("col-md-3");
+    imagediv.setAttribute("style", "flex-basis:400px;");
+    for (let k = 0; k< footer_images.length; k++){
+        let image = document.createElement('img');
+        image.src = footer_images[k].src;
+        image.width="300";
+        image.height= "73";
+        image.alt = footer_images[k].alt;
+        imagediv.appendChild(image);
+    }
+    containerdiv.appendChild(imagediv);
+    footerdiv.appendChild(containerdiv);
+    document.body.appendChild(footerdiv);
+};
+
+
+head();
+foot();
\ No newline at end of file
diff --git a/public/js/jquery-ui/i18n/datepicker-de.js b/public/js/jquery-ui/i18n/datepicker-de.js
new file mode 100644
index 0000000000000000000000000000000000000000..e2e61d27b6b4bf33c0fd59e9ebf2d307d0337af3
--- /dev/null
+++ b/public/js/jquery-ui/i18n/datepicker-de.js
@@ -0,0 +1,37 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.de = {
+	closeText: "Schließen",
+	prevText: "&#x3C;Zurück",
+	nextText: "Vor&#x3E;",
+	currentText: "Heute",
+	monthNames: [ "Januar","Februar","März","April","Mai","Juni",
+	"Juli","August","September","Oktober","November","Dezember" ],
+	monthNamesShort: [ "Jan","Feb","Mär","Apr","Mai","Jun",
+	"Jul","Aug","Sep","Okt","Nov","Dez" ],
+	dayNames: [ "Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag" ],
+	dayNamesShort: [ "So","Mo","Di","Mi","Do","Fr","Sa" ],
+	dayNamesMin: [ "So","Mo","Di","Mi","Do","Fr","Sa" ],
+	weekHeader: "KW",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.de );
+
+return datepicker.regional.de;
+
+} ) );
\ No newline at end of file
diff --git a/public/js/registration.js b/public/js/registration.js
index 1033ce3f3ced7a3959a1af6da82efebd3ab1b777..3e6184f9f79ee61c290e2bfb44a7b5046c276e46 100644
--- a/public/js/registration.js
+++ b/public/js/registration.js
@@ -22,7 +22,8 @@ $('#inputPassword').on('keyup', function () {
     isPasswordValid = checkPasswordReq($('#inputPassword').val())
     $('#passwordWarning').empty();
     if (!isPasswordValid) {
-        $('#passwordWarning').html('Must be at least 8 characters')
+        //$('#passwordWarning').html('Must be at least 8 characters')
+        $('#passwordWarning').html('Das Passwort muss mindestens 8 Zeichen haben')
     }
     switchSubmitButton()
 });
diff --git a/public/js/security.js b/public/js/security.js
index 52b42f148943c5e1671d4141bcd3097523196132..535a95a208292eda555273f548af3e71012bd107 100644
--- a/public/js/security.js
+++ b/public/js/security.js
@@ -1,19 +1,23 @@
 // check password and password confirmation input fields
+// used in Security and Reset Password
 $('#inputNewPwd, #inputConfirm').on('keyup', function () {
     var isBest, isMatch;
 
     isBest = checkPasswordReq($('#inputNewPwd').val())
     $('#recommendation').empty();
     if (!isBest) {
-        $('#recommendation').html('Must be at least 8 characters').css('color', 'red');
+        //$('#recommendation').html('Must be at least 8 characters').css('color', 'red');
+        $('#recommendation').html('Das Passwort muss mindestens 8 Zeichen haben').css('color', 'red');
     }
 
     // match or not?
     if ($('#inputNewPwd').val() == $('#inputConfirm').val()) {
-        $('#message').html('Matching').css('color', 'green');
+        //$('#message').html('Matching').css('color', 'green');
+        $('#message').html('Ãœbereinstimmend').css('color', 'green');
         isMatch = true;
     } else {
-        $('#message').html('Not Matching').css('color', 'red');
+        //$('#message').html('Not Matching').css('color', 'red');
+        $('#message').html('Nicht übereinstimmend').css('color', 'red');
         isMatch = false;
     }
     
diff --git a/public/views_TBD/404.jade b/public/views_TBD/404.jade
deleted file mode 100644
index dc9e0a8c7ee898d69e8d78b4a1cc11c0a54831bc..0000000000000000000000000000000000000000
--- a/public/views_TBD/404.jade
+++ /dev/null
@@ -1,4 +0,0 @@
-extends error
-
-block content
-  h2 Cannot find #{url}
\ No newline at end of file
diff --git a/public/views_TBD/500.jade b/public/views_TBD/500.jade
deleted file mode 100644
index cbc47e79df7455b95490f0288aa35542df297d85..0000000000000000000000000000000000000000
--- a/public/views_TBD/500.jade
+++ /dev/null
@@ -1,8 +0,0 @@
-extends error
-
-block content
-  h1 Error: #{error.message}
-  if settings['verbose errors']
-    pre= error.stack
-  else
-    p An error ocurred!
\ No newline at end of file
diff --git a/public/views_TBD/error.jade b/public/views_TBD/error.jade
deleted file mode 100644
index bf750c0087880c06604b3d1bc9bb1bfe8e522372..0000000000000000000000000000000000000000
--- a/public/views_TBD/error.jade
+++ /dev/null
@@ -1,6 +0,0 @@
-html
-  head 
-    title Error
-  body
-    h1 An error occurred!
-    block content
\ No newline at end of file
diff --git a/public/views_TBD/home.jade b/public/views_TBD/home.jade
deleted file mode 100644
index 2c704c1a0cb5152873ac1d62eddf25981c78874c..0000000000000000000000000000000000000000
--- a/public/views_TBD/home.jade
+++ /dev/null
@@ -1,12 +0,0 @@
-extends layout
-
-block content
-	if user !== null
-		h1 Hello, #{user.firstName}
-		a(href="/profile") Profile
-		br
-		a(href="/logout") Logout
-	else
-		h1 Welcome
-		br
-		a(href="/login") Login
diff --git a/public/views_TBD/profile.html b/public/views_TBD/profile.html
deleted file mode 100644
index 723f2815835add2504774f897392a742d2716d67..0000000000000000000000000000000000000000
--- a/public/views_TBD/profile.html
+++ /dev/null
@@ -1,105 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-	    <title>User Profile</title>
-	    <meta charset="UTF-8"/>
-	    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
-	    <link rel="stylesheet" type="text/css" href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css" />
-	    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css" integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay" crossorigin="anonymous" />
-	    <style>
-			.collapse {
-				display: none;
-			}
-			.collapse.in {
-				display: block;
-			}
-			.collapsing {
-				position: relative;
-				height: 0;
-				overflow: hidden;
-				-webkit-transition-timing-function: ease;
-				-o-transition-timing-function: ease;
-				transition-timing-function: ease;
-				-webkit-transition-duration: .35s;
-				-o-transition-duration: .35s;
-				transition-duration: .35s;
-				-webkit-transition-property: height,visibility;
-				-o-transition-property: height,visibility;
-				transition-property: height,visibility;
-			}	    
-		</style>
-	    
-	    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
-		<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
-        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
-        <script>
-            $(function(){
-                $("#header").load("fragment/header.html"); 
-                $("#footer").load("fragment/footer.html"); 
-            });
-        </script> 
-	</head>
-	
-	<body>
-		
-		<!-- CONTENT -->
-		<div class="container-fluid">
-		  <div class="row">
-		    <!-- https://getbootstrap.com/docs/4.3/components/navs/ -->
-		    <div class="col-3">
-		    	<h5>
-                    <!-- TODO: Firstname + Lastname-->
-			    	<span>TODO: Firstname + Lastname</span>
-			    </h5>
-			    <div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical">
-			      <a class="nav-link" href="#" aria-selected="true">Profile</a>
-			      <a class="nav-link" href="#" aria-selected="false">Security</a>
-			      <a class="nav-link" href="#" aria-selected="false">Services</a>
-			    </div>
-			  </div>
-		
-		    <div class="col-sm-9">
-				<form>
-		            <p><input type="hidden" th:value="${id}"/></p>
-		                	
-		            <table class="table table-borderless">
-						<tr>
-						    <th><label for="title">Title</label></th>
-						    <td><input type="text" placeholder="Title"></td> 
-						</tr>
-						<tr>
-						    <th><label for="firstname">Vorname</label></th>
-						    <td><input type="text" placeholder="Vorname"></td>
-					    </tr>
-						<tr>
-						    <th><label for="lastname">Nachname</label></th>
-						    <td><input type="text" placeholder="Nachname"></td>
-					    </tr>
-						<tr>
-						    <th><label for="email">Email</label></th>
-						    <td><input type="text" placeholder="Email"></td>
-						</tr>
-						<tr>
-						    <th><label for="email">Unternehmen</label></th>
-						    <td><input type="text" placeholder="Unternehmen"></td>
-						</tr>
-					    <tr>
-							<th><label for="email">Branche</label></th>
-						    <td><input type="text" placeholder="Branche"></td>
-						</tr>
-						<tr>
-							<th><label for="email">Fachgebiete</label></th>
-						    <td><input type="text" placeholder="Fachgebiete"></td>
-						</tr>
-					</table>
-						    
-					<p><input type="submit" class="btn btn-primary" value="Update" disabled></p>   
-				</form>	      
-		    </div>
-		  </div>
-		</div>
-		
-		<!-- HEADER & FOOTER -->
-        <script src="https://transfer.hft-stuttgart.de/js/headfoot.js"></script>
-	</body>
-</html>
\ No newline at end of file
diff --git a/public/views_TBD/profile.jade b/public/views_TBD/profile.jade
deleted file mode 100644
index 6f03f645812732855910916dae29e652e19e93de..0000000000000000000000000000000000000000
--- a/public/views_TBD/profile.jade
+++ /dev/null
@@ -1 +0,0 @@
-include profile.html
\ No newline at end of file
diff --git a/routes/api.js b/routes/api.js
index d18af65fd50662870390dcecb37998b88e1d3005..5a6ee24d95d8e35431ea2c408e3f0f5792e1fe7a 100644
--- a/routes/api.js
+++ b/routes/api.js
@@ -7,13 +7,13 @@ module.exports = function (app) {
     
     app.get('/api/v1/profile', function (req, res) {
         if (req.isAuthenticated()) {
-            // read data based on ID
-            dbconn.user.query('SELECT title, firstname, lastname, email, industry, organisation, speciality FROM user WHERE email="'+req.user.email+'"', function (err, rows, fields) {
+            // read data based on email
+            dbconn.user.query('SELECT * FROM user WHERE email="'+req.user.email+'"', function (err, rows, fields) {
                 if (err) throw err
                 res.send(rows[0])
             })
         } else {
-          res.redirect('/');
+          res.send('authentication required');
         }
     });
     
diff --git a/routes/dbconn.js b/routes/dbconn.js
index 4b8f44b6da59152d8363c65d89b0f874c9779a23..834eb1aaa465674e73190ffc8d8809b2d28c3274 100644
--- a/routes/dbconn.js
+++ b/routes/dbconn.js
@@ -18,7 +18,7 @@ userConnection.connect(function(err) {
 })
 userConnection.query('USE '+config.database.dbUser)
     
-// db connection test
+// user db connection test
 userConnection.query('SELECT 1 + 5 AS solution', function (err, rows, fields) {
     if (err) throw err
     console.log('Solution = ', rows[0].solution)
@@ -51,7 +51,7 @@ var dbconn = function dbconn(query, values, next) {
 
 // ==== PROJECT DB CONNECTION ====
 var projectConnection = mysql.createConnection({
-    host: config.database.host,
+    host: config.database.host_project,
     user: config.database.user,
     password: config.database.password,
     port: config.database.port,
diff --git a/routes/helpers.js b/routes/helpers.js
new file mode 100644
index 0000000000000000000000000000000000000000..4645aec75363bf4110ce33f65b8615dc60902f60
--- /dev/null
+++ b/routes/helpers.js
@@ -0,0 +1,11 @@
+var helpers = {
+    stringToArray: function (input){
+        if(input != null){
+            return input.split(',');
+        }else{
+            return null;
+        }
+    }
+};
+
+module.exports = helpers;
\ No newline at end of file
diff --git a/routes/mailer.js b/routes/mailer.js
new file mode 100644
index 0000000000000000000000000000000000000000..510b5bb1d11e075f446cdf19b8a954411025ee38
--- /dev/null
+++ b/routes/mailer.js
@@ -0,0 +1,31 @@
+const nodemailer = require('nodemailer')
+
+var env = process.env.NODE_ENV || 'development';
+const config = require('../config/config')[env]
+
+var smtpTransport = nodemailer.createTransport({
+    host: config.mailer.host,
+    secureConnection: config.mailer.secureConnection,
+    port: config.mailer.port,
+    auth: {
+      user: config.mailer.authUser,
+      pass: config.mailer.authPass
+    },
+    tls: {
+        ciphers: config.mailer.tlsCiphers
+    } 
+});
+  
+var mailOptions = {
+    to: "",
+    from: config.mailer.from,
+    subject: "",
+    text: ""
+};
+
+var mailer = {
+    transport: smtpTransport,
+    options: mailOptions
+}
+
+module.exports = mailer
\ No newline at end of file
diff --git a/routes/methods.js b/routes/methods.js
index cdec75e0ec5a47876c6acce66bb67eeb1ff08593..9864273b4322e89b4d4e3093f1979b4b8b01986b 100644
--- a/routes/methods.js
+++ b/routes/methods.js
@@ -57,7 +57,7 @@ var methods = {
         })
     },
     getUserByEmail: function(email, callback) {
-        dbconn.user.query('SELECT title, firstname, lastname, industry, organisation, speciality FROM user WHERE email = "' +email+'"', function (err, rows, fields) {
+        dbconn.user.query('SELECT salutation, title, firstname, lastname, industry, organisation, speciality FROM user WHERE email = "' +email+'"', function (err, rows, fields) {
             if (err) {
                 throw err;
             }
@@ -83,19 +83,22 @@ var methods = {
             callback(err, user);
         });
     },
-    checkUserToken: function(token, callback) {
+    getUserByToken: function(token, callback) {
         var user;
-        dbconn.user.query('SELECT user_id FROM credential WHERE resetPasswordToken = "'+token+'" and resetPasswordExpires > '+Date.now(), function (err, rows, fields) {
-            if (err) {
-                throw err;
-            }
-            else {
-                if ( rows.length > 0) {
-                    user = rows[0];
+        dbconn.user.query('SELECT t1.user_id, t2.email FROM userdb.credential AS t1 INNER JOIN userdb.user AS t2 ON t1.user_id = t2.id AND t1.resetPasswordToken = "'
+            +token+'" and resetPasswordExpires > '+Date.now(), function (err, rows, fields) {
+                if (err) {
+                    throw err;
                 }
+                else {
+                    if ( rows.length > 0) {
+                        user = rows[0]
+                        console.log(user)
+                    }
+                }
+                callback(err, user);
             }
-            callback(err, user);
-        });
+        );
     },
 	updateUser: function(userData, callback) {
 		dbconn.user.query('UPDATE user SET ? WHERE email = "' +userData.email+'"', userData, function (err, rows, fields) {
@@ -129,12 +132,44 @@ var methods = {
             callback(rows, err);
         });
     },
+    addUserProjectRole: function(data, callback) {
+        dbconn.user.query('INSERT INTO user_project_role SET ?', data, function (err, results, fields){
+            if (err) throw err;
+            callback(err);
+        })
+    },
     // ======================= project db =======================
     getAllProjects: function(callback) {
         dbconn.project.query('CALL getAllprojects', function (err, rows, fields){
             if (err) throw err;
             callback(rows[0], err);
         })
+    },
+    getAllMailinglists: function(callback) {
+        dbconn.project.query('CALL getAllLists', function (err, rows, fields){
+            if (err) throw err;
+            callback(rows[0], err);
+	    })
+    },
+    getProjectOverviewById: function(projectId, callback) {
+        dbconn.project.query('CALL GetProjectInformationByProjectID(' + projectId+ ')', function (err, rows, fields){
+            if (err) throw err;
+            callback(rows[0], err);
+    	})
+    },
+    getProjectImagesById: function(projectId, callback) {
+        dbconn.project.query('CALL getImagesByProjectID(' + projectId+ ')', function (err, rows, fields){
+            if (err) throw err;
+            callback(rows[0], err);
+        })
+    },
+    addProjectOverview: function(data, callback) {
+        dbconn.project.query('INSERT INTO project_overview SET ?', data, function (err, results, fields){
+            if (err) {
+                console.error(err);
+            }
+            callback(results, err);
+        })
     }
 };
 
diff --git a/routes/routes.js b/routes/routes-account.js
similarity index 56%
rename from routes/routes.js
rename to routes/routes-account.js
index 7077fc1d8155c938f62feb12f8089972247df1fa..5c84648e4a9e20bcd3fb050b93b13e913efacb46 100644
--- a/routes/routes.js
+++ b/routes/routes-account.js
@@ -3,14 +3,15 @@ const SamlStrategy = require('passport-saml').Strategy
 const dbconn = require('./dbconn')
 const methods = require('./methods')
 // pwd encryption
-const bcrypt = require('bcryptjs')
-const saltRounds = 10
+const bcrypt = require('bcryptjs');
+const saltRounds = 10;
+const salt = 64; // salt length
 // forgot pwd
 const async = require('async')
 const crypto = require('crypto')
-const nodemailer = require('nodemailer')
+const mailer = require('./mailer')
 
-module.exports = function (app, config, passport) {
+module.exports = function (app, config, passport, i18n) {
 
   // =========== PASSPORT =======
   passport.serializeUser(function (user, done) {
@@ -61,7 +62,7 @@ module.exports = function (app, config, passport) {
         failureFlash: true
       }),
     function (req, res) {
-      res.redirect('/');
+      res.redirect('/account/');
     }
   );
 
@@ -74,30 +75,37 @@ module.exports = function (app, config, passport) {
     }
   );
 
-  // ======== NODEMAILER ====================
-  var smtpTransport = nodemailer.createTransport({
-    host: config.mailer.host,
-    secureConnection: config.mailer.secureConnection,
-    port: config.mailer.port,
-    auth: {
-      user: config.mailer.authUser,
-      pass: config.mailer.authPass
-    },
-    tls: {
-        ciphers: config.mailer.tlsCiphers
-    } 
+  // ================ test i18n ==================
+  i18n.setLocale('de');
+  app.get('/de', function(req, res) {
+    var greeting = i18n.__('Hello World')
+    res.send(greeting)
   });
-  
-  var mailOptions = {
-    to: "",
-    from: config.mailer.from,
-    subject: "",
-    text: ""
-  };
-  
-  // ======== APP ROUTES ====================
+
+  var lang = 'DE'
+
+  // ======== APP ROUTES - ACCOUNT ====================
+  var updatePasswordMailSubject = "Ihr Passwort für das Transferportal wurde gespeichert."
+  var mailSignature = "Mit den besten Grüßen,\ndas Transferportal-Team der HFT Stuttgart\n\n"+
+    "Transferportal der Hochschule für Technik Stuttgart\n"+
+    "Schellingstr. 24\n"+
+    "70174 Stuttgart\n"+
+    "m4lab@hft-stuttgart.de\n"+
+    "https://transfer.hft-stuttgart.de"
+  var updatePasswordMailContent = "Lieber Nutzer,\n\n"+"Ihr Passwort wurde erfolgreich geändert.\n\n"+mailSignature
+
   app.get('/', function (req, res) {
-    res.redirect('/profile')
+    if (req.isAuthenticated()) {
+      methods.getUserByEmail(req.user.email, function(data, err){
+        if (!err) {
+          res.render(lang+'/account/home', {
+            user: data
+          });
+        }
+      })
+    } else {
+      res.redirect('/account/login'); // localhost
+    } 
   });
 
   app.get('/login',
@@ -110,9 +118,9 @@ module.exports = function (app, config, passport) {
 
   app.get('/logout', function (req, res) {
     if (req.user == null) {
-      return res.redirect('/');
+      return res.redirect('/account/');
     }
-    
+
     req.user.nameID = req.user.id;
     req.user.nameIDFormat = req.user.idFormat;
     return samlStrategy.logout(req, function(err, uri) {
@@ -134,14 +142,14 @@ module.exports = function (app, config, passport) {
     if (req.isAuthenticated()) {
       methods.getUserByEmail(req.user.email, function(data, err){
         if (!err) {
-          res.render('profile', {
+          res.render(lang+'/account/profile', {
             user: data,
             email: req.user.email
           });
         }
       })
     } else {
-      res.redirect('/login');
+      res.redirect('/account/login');
     }
   });
 
@@ -183,9 +191,9 @@ module.exports = function (app, config, passport) {
 
           for (var i = 0; i < projectsOverview.length; i++) {
             // check if projectId is exist in userProjectId[]
-            var status = "You cannot access this service"
+            var status = false
             if (userProjectId.indexOf(projectsOverview[i].id) > -1) {
-              status = "You can access this service"
+              status = true
             }
             // add data to JSON object
             allProjects.push({
@@ -198,30 +206,30 @@ module.exports = function (app, config, passport) {
           }
 
           // render the page
-          res.render('services', {
+          res.render(lang+'/account/services', {
             user: req.user,
             project: allProjects
           });
         }
       ])
     } else {
-      res.redirect('/login');
+      res.redirect('/account/login');
     }
   });
 
   app.get('/security', function (req, res) {
     if (req.isAuthenticated()) {
-      console.log(req.user)
-      res.render('security', {
+      res.render(lang+'/account/security', {
         user: req.user // useful for view engine, useless for HTML
       });
     } else {
-      res.redirect('/login');
+      res.redirect('/account/login');
     }
   });
 
   app.post('/updateProfile', function (req, res) {
     var userData = {
+      salutation: req.body.inputSalutation,
       title: req.body.inputTitle,
       firstname: req.body.inputFirstname,
       lastname: req.body.inputLastname,
@@ -239,13 +247,14 @@ module.exports = function (app, config, passport) {
               req.flash('error', "Failed");
             }
             else {
-              req.flash('success', 'Profile updated!');
+              //req.flash('success', 'Profile updated!');
+              req.flash('success', 'Ihr Benutzerprofil wurde aktualisiert!');
             }
-            res.redirect('/profile');
+            res.redirect('/account/profile');
         })
       }
     } else {
-      res.redirect('/login');
+      res.redirect('/account/login');
     }
   });
   
@@ -272,13 +281,15 @@ module.exports = function (app, config, passport) {
                 throw err
               }
               else if (!isMatch) {
-                req.flash('error', "Sorry, your password was incorrect. Please double-check your password.")
-                res.redirect('/security')
+                //req.flash('error', "Sorry, your password was incorrect. Please double-check your password.")
+                req.flash('error', "Das Passwort ist leider falsch. Bitte überprüfen Sie Ihre Eingabe.")
+                //res.redirect('/security')
+                res.redirect('/account/security')
               }
               else {
                 if ( newPwd != retypePwd ) {
                   req.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.")
-                  res.redirect('/security')
+                  res.redirect('/account/security')
                 }
                 else {
                   // update password
@@ -290,14 +301,24 @@ module.exports = function (app, config, passport) {
                       }
                       methods.updateCredential(credentialData, function(err){
                         if (err) {
-                          req.flash('error', "Database error: Password cannot be modified.")
+                          //req.flash('error', "Database error: Password cannot be modified.")
+                          req.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.")
                           throw err
                         }
                         else {
-                          req.flash('success', "Pasword updated!")
-                          console.log('pasword updated!')
+                          //req.flash('success', "Pasword updated!")
+                          req.flash('success', "Passwort aktualisiert!")
+                          mailer.options.to = req.user.email
+                          //mailOptions.subject = "Your M4_LAB Password has been updated."
+                          mailer.options.subject = updatePasswordMailSubject
+                          mailer.options.text = updatePasswordMailContent
+                          mailer.transport.sendMail(mailer.options, function(err) {
+                            if (err) {
+                              console.log(err)
+                            }
+                          });
                         }
-                        res.redirect('/security')
+                        res.redirect('/account/security')
                       })
                     });
                   });
@@ -309,12 +330,12 @@ module.exports = function (app, config, passport) {
       })  
     }
     else {
-      res.redirect('/login');
+      res.redirect('/account/login');
     }
   });
 
   app.get('/forgotPwd', function (req, res) {
-    res.render('forgotPwd', {
+    res.render(lang+'/account/forgotPwd', {
       user: req.user
     });
   });
@@ -323,10 +344,10 @@ module.exports = function (app, config, passport) {
     //methods.currentDate();
 
     var emailAddress = req.body.inputEmail;
-    var emailContent = "Hi there,\n\n"+
+  /*  var emailContent = "Hi there,\n\n"+
       "we've received a request to reset your password. However, this email address is not on our database of registered users.\n\n"+
       "Thanks,\nM4_LAB Team";
-    var emailSubject = "Account Access Attempted";
+    var emailSubject = "Account Access Attempted"; */
     
     async.waterfall([
       function(done) {
@@ -339,13 +360,19 @@ module.exports = function (app, config, passport) {
         methods.checkUserEmail(emailAddress, function(err, user){
           if (user) {
             console.log("email: user found");
-            emailSubject = "M4_LAB Password Reset";
-            emailContent = "Hi User,\n\n"+
+            //var emailSubject = "M4_LAB Password Reset";
+            var emailSubject = "Ihre Passwort-Anfrage an das Transferportal der HFT Stuttgart";
+            /* var emailContent = "Hi User,\n\n"+
               "we've received a request to reset your password. If you didn't make the request, just ignore this email.\n\n"+
-              "Otherwise, you can reset your password using this link: http://" + req.headers.host + "/reset/" + token + "\n" +
+              "Otherwise, you can reset your password using this link: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" +
               "This password reset is only valid for 1 hour.\n\n"+
-              "Thanks,\nM4_LAB Team"
-            
+              "Thanks,\nM4_LAB Team" */
+            var emailContent = "Lieber Nutzer,\n\n"+
+              "wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.\n\n"+
+              "Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" + // test server
+              //"Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://localhost:9989/reset/" + token + "\n" + // localhost
+              "Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.\n\n"+mailSignature
+
             var credentialData = {
               user_id: user.id,
               resetPasswordToken: token,
@@ -354,50 +381,56 @@ module.exports = function (app, config, passport) {
             methods.updateCredential(credentialData, function(err) {
               done(err, token, user);
             });
+
+            // send email
+            mailer.options.to = emailAddress;
+            mailer.options.subject = emailSubject;
+            mailer.options.text = emailContent;
+            mailer.transport.sendMail(mailer.options, function(err) {
+              done(err, 'done');
+            });
           }
           else {
-            done(err, null, null);
+            //done(err, null, null);
+            done(err, 'no user found');
           }
         });
-      },
-      function(token, user, done) {
-        mailOptions.to = emailAddress;
-        mailOptions.subject = emailSubject;
-        mailOptions.text = emailContent;
-        smtpTransport.sendMail(mailOptions, function(err) {
-          done(err, 'done');
-        });
       }
     ], function(err) {
       if (err) {
-        req.flash('error', 'An error occured. Please try again.');
+        //req.flash('error', 'An error occured. Please try again.');
+        req.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.');
       }
       else {
-        req.flash('success', 'An e-mail has been sent to ' + emailAddress + ' with further instructions.');
+        //req.flash('success', 'If your email is registered, an e-mail has been sent to ' + emailAddress + ' with further instructions.');
+        req.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.');
       }
-      res.redirect('/forgotPwd');
+      //res.redirect('/forgotPwd'); // deployment
+      res.redirect('/account/forgotPwd'); // localhost
     });
   });
 
   app.get('/reset/:token', function(req, res) {
-    methods.checkUserToken(req.params.token, function(err, user){
-      //console.log(user);
+    methods.getUserByToken(req.params.token, function(err, user){
       if (!user) {
-        req.flash('error', 'Password reset token is invalid or has expired.');
-        res.redirect('/forgotPwd');
+        //req.flash('error', 'Password reset token is invalid or has expired.');
+        req.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.');
+        //res.redirect('/forgotPwd'); // deployment
+        res.redirect('/account/forgotPwd'); // localhost
       }
       else {
-        res.render('reset');
+        res.render(lang+'/account/reset');
       }
     });
   });
 
   app.post('/reset/:token', function(req, res) {
-    methods.checkUserToken(req.params.token, function(err, user){
+    var newPwd = req.body.inputNewPwd
+    methods.getUserByToken(req.params.token, function(err, user){
       if (user) {
         // encrypt password
         bcrypt.genSalt(saltRounds, function(err, salt) {
-          bcrypt.hash(req.body.inputNewPwd, salt, function(err, hash) {
+          bcrypt.hash(newPwd, salt, function(err, hash) {
             var credentialData = {
               password: hash,
               user_id: user.user_id
@@ -405,13 +438,24 @@ module.exports = function (app, config, passport) {
             // update password
             methods.updateCredential(credentialData, function(err){
               if (err) {
-                req.flash('error', "Database error: Password cannot be modified.")
+                //req.flash('error', "Database error: Password cannot be modified.")
+                req.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.")
                 throw err
               }
               else {
-                req.flash('success', "Your pasword has been updated.")
-                console.log('pasword updated!')
-                // todo: send confirmation email
+                //req.flash('success', "Your pasword has been updated.")
+                req.flash('success', "Passwort aktualisiert!")
+                // send notifiaction email
+                mailer.options.to = user.email
+                mailer.options.subject = updatePasswordMailSubject
+                mailer.options.text = updatePasswordMailContent
+                mailer.transport.sendMail(mailer.options, function(err) {
+                  if (err) {
+                    console.log(err)
+                  }
+                });
+                // redirect to login page
+                res.redirect('/account/login')
               }
             })
           });
@@ -419,15 +463,15 @@ module.exports = function (app, config, passport) {
       }
       else {
         req.flash('error', "User not found.")
+        res.redirect('/account/login')
       }
     });
    
-    res.redirect('/login')
   });
 
   // todo: user registration with captcha
   app.get('/registration', function(req, res) {
-    res.render('registration')
+    res.render(lang+'/account/registration')
   })
 
   app.post('/registration', function(req, res) {
@@ -438,6 +482,7 @@ module.exports = function (app, config, passport) {
     // user data
     var curDate = new Date()
     var userData = {
+      salutation: req.body.inputSalutation,
       title: req.body.inputTitle,
       firstname: req.body.inputFirstname,
       lastname: req.body.inputLastname,
@@ -457,12 +502,14 @@ module.exports = function (app, config, passport) {
         }
         methods.registerNewUser(newAccount, function(err){
           if (err) {
-            req.flash('error', "Failed");
+            //req.flash('error', "Failed")
+            req.flash('error', "Fehlgeschlagen")
           }
           else {
-            req.flash('success', 'Your account has been created. Please log in.');
+            //req.flash('success', 'Your account has been created. Please log in.')
+            req.flash('success', 'Ihr Benutzerkonto wurde angelegt. Bitte melden Sie sich an.') 
           }
-          res.redirect('/registration');
+          res.redirect('/account/registration');
         })
       });
     });
@@ -481,4 +528,40 @@ module.exports = function (app, config, passport) {
     })
   })
 
+  app.get('/contact', function (req, res) {
+      res.render(lang+'/account/contact', {
+        user: req.user
+      });
+    });
+
+    app.post('/contact', function(req, res, next) {
+      //methods.currentDate();
+      let emailAddress = req.body.inputEmail;
+      let supportAddress = "support-transfer@hft-stuttgart.de";
+      let inputName = req.body.name;
+      let inputContent = req.body.message;
+      let emailContent = "Es wurde eine Anfrage an das Transferportal gestellt: \n\n NAME: " + inputName + "\n NACHRICHT:\n "+ inputContent;
+      let emailSubject = "Ihre Anfrage an das Transferportal";
+      async.waterfall([
+        function(done) {
+            // send email
+            mailer.options.to = supportAddress;
+            mailer.options.cc = emailAddress;
+            mailer.options.subject = emailSubject;
+            mailer.options.text = emailContent;
+            mailer.transport.sendMail(mailer.options, function(err) {
+                done(err, 'done');
+              });
+          }
+      ], function(err) {
+        if (err) {
+          req.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.');
+        }
+        else {
+          req.flash('success', 'Vielen Dank für Ihre Anfrage. Wir melden uns baldmöglichst bei Ihnen. Eine Kopie Ihrer Anfrage wurde an ' + emailAddress + ' versandt.');
+        }
+        //res.redirect('/forgotPwd'); // deployment
+        res.redirect('/account/contact'); // localhost
+      });
+    });
 };
\ No newline at end of file
diff --git a/routes/routes-project.js b/routes/routes-project.js
new file mode 100644
index 0000000000000000000000000000000000000000..a85058ff18155ccb4347ce0d512e491da30d5d0a
--- /dev/null
+++ b/routes/routes-project.js
@@ -0,0 +1,305 @@
+const methods = require('./methods')
+const async = require('async')
+const helpers = require('./helpers')
+
+module.exports = function (app) {
+ 
+  // ======== APP ROUTES - PROJECT ====================
+  var lang = 'DE'
+
+  app.get('/mailinglists', function (req, res) {
+    async.waterfall([
+        function(done) {
+            methods.getAllMailinglists(function(mailinglistOverview, err) {
+                if (!err) {
+                    done(err, mailinglistOverview)
+                }
+            })
+        },
+        // create JSON object of mailinglists for front-end
+        function(mailinglistOverview, done) {
+            var allMailingLists = []  // JSON object
+            for (let i = 0; i < mailinglistOverview.length; i++) {
+                // add data to JSON object
+                allMailingLists.push({
+                    id: mailinglistOverview[i].id,
+                    name: mailinglistOverview[i].name,
+                    src: mailinglistOverview[i].src,
+                    projectstatus: mailinglistOverview[i].projectstatus,
+                    project_title: mailinglistOverview[i].project_title
+                });
+            }
+
+            res.render(lang+'/project/mailinglists', {
+                isUserAuthenticated: req.isAuthenticated(),
+                user: req.user,
+                mailinglists: allMailingLists
+            });
+        }
+    ])
+  });
+
+  app.get('/project_', function (req, res) {
+    async.waterfall([
+      // get all projects from projectdb
+      function(done) {
+        methods.getAllProjects(function(projectsOverview, err) {
+          if (!err) {
+            done(err, projectsOverview)
+          }
+        })
+      },
+      // create JSON object for front-end
+      function(projectsOverview, done) {
+        var activeProjects = []
+        var nonActiveProjects = []
+
+        for (var i = 0; i < projectsOverview.length; i++) {
+          var project = {
+            id: projectsOverview[i].id,
+            logo: projectsOverview[i].logo,
+            akronym: projectsOverview[i].pname,
+            title: projectsOverview[i].title,
+            summary: projectsOverview[i].onelinesummary,
+            category: projectsOverview[i].category,
+            cp: projectsOverview[i].contact_email,
+            gitlab: projectsOverview[i].gitlab
+          }
+          if (projectsOverview[i].projectstatus == 0) {
+            nonActiveProjects.push(project)
+          }
+          else if (projectsOverview[i].projectstatus == 1) {
+            activeProjects.push(project)
+          }
+        }
+
+        // render the page
+        if (req.isAuthenticated()) {
+          res.render(lang+'/project/projects', {
+            isUserAuthenticated: true,
+            nonActive: nonActiveProjects,
+            active: activeProjects
+          });
+        }
+        else {
+          res.render(lang+'/project/projects', {
+            isUserAuthenticated: false,
+            nonActive: nonActiveProjects,
+            active: activeProjects
+          });
+        }
+      }
+    ])
+  })
+
+  app.get('/project', function (req, res) {
+    res.render(lang+'/project/project-simplified', {
+       isUserAuthenticated: req.isAuthenticated(),
+       user: req.user
+    });
+  })
+
+  app.get('/addprojectoverview', function (req, res) {
+    if (req.isAuthenticated()) {
+      res.render(lang+'/project/addProjectOverview')
+    }
+    else {
+      res.redirect('/account/login')
+    }
+  })
+  
+  app.post('/addprojectoverview__', function (req, res) {
+    if (req.isAuthenticated()) {
+      var wiki = 0
+      if (req.body.wiki)
+        wiki = 1
+
+      var projectTerm = req.body.termForm + " - " + req.body.termTo
+      var projectOverviewData = {
+        pname: req.body.pname,
+        title: req.body.title,
+        onelinesummary: req.body.summary,
+        category: req.body.category,
+        logo: req.body.logo,
+        gitlab: req.body.gitlabURL,
+        wiki: wiki,
+        overview: req.body.overview,
+        question: req.body.question,
+        approach: req.body.approach,
+        result: req.body.result,
+        keywords: req.body.keywords,
+        announcement: req.body.announcement,
+        term: projectTerm,
+        further_details: req.body.furtherDetails,
+        website: req.body.website,
+        src: req.body.src,
+        caption: req.body.caption,
+        contact_lastname: req.body.contactName,
+        contact_email: req.body.contactEmail,
+        leader_lastname: req.body.leaderName,
+        leader_email: req.body.leaderEmail
+      }
+      
+      methods.addProjectOverview(projectOverviewData, function(err){
+        if (err) {
+          //req.flash('error', "Failed")
+          req.flash('error', "Fehlgeschlagen")
+          res.redirect('/account/addProjectOverview');
+        }
+        else {
+          req.flash('success', 'Your project has been created.')
+          res.redirect('/project');
+        }
+      })
+    }
+  })
+
+  app.post('/addprojectoverview', function (req, res) {
+    if (req.isAuthenticated()) {
+      var wiki = 0
+      if (req.body.wiki)
+        wiki = 1
+
+      var projectTerm = req.body.termForm + " - " + req.body.termTo
+      var projectOverviewData = {
+        pname: req.body.pname,
+        title: req.body.title,
+        onelinesummary: req.body.summary,
+        category: req.body.category,
+        logo: req.body.logo,
+        gitlab: req.body.gitlabURL,
+        wiki: wiki,
+        overview: req.body.overview,
+        question: req.body.question,
+        approach: req.body.approach,
+        result: req.body.result,
+        keywords: req.body.keywords,
+        announcement: req.body.announcement,
+        term: projectTerm,
+        further_details: req.body.furtherDetails,
+        website: req.body.website,
+        src: req.body.src,
+        caption: req.body.caption,
+        contact_lastname: req.body.contactName,
+        contact_email: req.body.contactEmail,
+        leader_lastname: req.body.leaderName,
+        leader_email: req.body.leaderEmail
+      }
+      
+      /* RS: Temporary solution while Project DB is still in early phase.
+              When User DB and Project DB are integrated and quite stabil, this operation should be done in 1 transaction.
+      */
+      var userId // todo: make this global variable?
+      async.waterfall([
+        // get userId by email from userdb
+        function(done) {
+          methods.getUserIdByEmail(req.user.email, function(id, err) {
+            if (!err) {
+              userId = id
+              done(err)
+            }
+          })
+        },
+        // add project overview
+        function(done) {
+          methods.addProjectOverview(projectOverviewData, function(data, err){
+            if (err) {
+              res.status(500).render(lang+'/500', {
+                error: err
+              })
+            }
+            else {
+              done(err, data.insertId)
+            }
+          })
+        },
+        // assign the created overview to logged-in user
+        function(projectOverviewId, done) {
+          var userProjectRoleData = {
+            project_id: projectOverviewId,
+            user_id: userId,
+            role_id: 3 // OVERVIEW_CREATOR
+          }
+          methods.addUserProjectRole(userProjectRoleData, function(userProjects, err) {
+            if (err) {
+              //req.flash('error', "Failed")
+              req.flash('error', "Fehlgeschlagen")
+              res.redirect('/account/addProjectOverview');
+            }
+            else {
+              req.flash('success', 'Your project has been created.')
+              res.redirect('/project');
+            }
+          })
+        }
+      ])
+    }
+  })
+
+  app.get('/updateprojectoverview', function (req, res) {
+    // only their own project
+  })
+
+  app.post('/updateprojectoverview', function (req, res) {
+    // only their own project
+  })
+
+  app.get('/projectoverview', function(req, res){
+    async.waterfall([
+            function(done) {
+                methods.getProjectOverviewById(req.query.projectID, function(projectOverview, err) {
+                    if (!err) {
+                        done(err, projectOverview)
+                    }
+                })
+            },
+            function(projectOverview,done){
+                methods.getProjectImagesById(req.query.projectID, function(projectImages, err) {
+                    if (!err) {
+                        done(err, projectImages, projectOverview)
+                    }
+                })
+            },
+            // render projectOverview page
+            function(projectImages, projectOverview, done) {
+
+                console.log(projectImages);
+                partnerWebsites = helpers.stringToArray(projectOverview[0].partner_website);
+                partnerNames = helpers.stringToArray(projectOverview[0].partner_name);
+                awardSites = helpers.stringToArray(projectOverview[0].award_website);
+                awardNames = helpers.stringToArray(projectOverview[0].award_name);
+                sponsorWebsites = helpers.stringToArray(projectOverview[0].sponsor_website);
+                sponsorImgs = helpers.stringToArray(projectOverview[0].sponsor_img);
+                sponsorNames = helpers.stringToArray(projectOverview[0].sponsor_name);
+
+                res.render(lang+'/project/projectOverview', {
+                    isUserAuthenticated: req.isAuthenticated(),
+                    user: req.user,
+                    projectOV: projectOverview,
+                    projectImgs: projectImages,
+                    partnerWS: partnerWebsites,
+                    partnerN: partnerNames,
+                    awardWS: awardSites,
+                    awardN: awardNames,
+                    sponsorWS: sponsorWebsites,
+                    sponsorIMG: sponsorImgs,
+                    sponsorN: sponsorNames
+                });
+            }
+        ])
+  })
+
+  app.get('/videoconferences', function(req, res){
+      res.render(lang+'/project/videoconferences', {
+              isUserAuthenticated: req.isAuthenticated(),
+              user: req.user,
+      });
+  })
+
+  app.get('/landingpage', function(req, res){
+        res.render(lang+'/project/landingpage', {
+                isUserAuthenticated: req.isAuthenticated(),
+                user: req.user,
+        });
+    })
+};
\ No newline at end of file
diff --git a/views/DE/404.pug b/views/DE/404.pug
new file mode 100644
index 0000000000000000000000000000000000000000..c4178253b9cec40907906ccd33fc39ac6e85c990
--- /dev/null
+++ b/views/DE/404.pug
@@ -0,0 +1,30 @@
+doctype html
+html(lang="de")
+  head
+    title= "404 - Page not found"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    style.
+      .container { 
+        height: 400px;
+        position: relative;
+      }
+      .center {
+        margin: 0;
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        -ms-transform: translate(-50%, -50%);
+        transform: translate(-50%, -50%);
+      }
+  body
+    div(class="container")
+      div(class="center", align="center")
+        a(href="https://m4lab.hft-stuttgart.de")
+          img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192")
+        br
+        br
+        p(class="h5") 404. The requested URL was not found.
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
\ No newline at end of file
diff --git a/views/DE/500.pug b/views/DE/500.pug
new file mode 100644
index 0000000000000000000000000000000000000000..704573397c7252fc0a8034428da47602afa9b994
--- /dev/null
+++ b/views/DE/500.pug
@@ -0,0 +1,31 @@
+doctype html
+html(lang="de")
+  head
+    title= "500 - Internal Server Error"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    style.
+      .container { 
+        height: 400px;
+        position: relative;
+      }
+      .center {
+        margin: 0;
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        -ms-transform: translate(-50%, -50%);
+        transform: translate(-50%, -50%);
+      }
+  body
+    div(class="container")
+      div(class="center", align="center")
+        a(href="https://m4lab.hft-stuttgart.de")
+          img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192")
+        br
+        br
+        p(class="h5") 500. Unexpected Error :(
+        p #{ error }
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
\ No newline at end of file
diff --git a/views/DE/account/forgotPwd.pug b/views/DE/account/forgotPwd.pug
new file mode 100644
index 0000000000000000000000000000000000000000..46210a02d8c8cbbafed3ed8e9b65b3c086ad8246
--- /dev/null
+++ b/views/DE/account/forgotPwd.pug
@@ -0,0 +1,56 @@
+doctype html
+html(lang="de")
+  head
+    title= "Forgot Password"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-md-6 offset-md-3")
+                if successes
+                    for success in successes
+                        div.alert.alert-success.alert-dismissible #{ success }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                if errors
+                    for error, i in errors
+                        div.alert.alert-danger.alert-dismissible.fade.show #{ error }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                form#forgotForm(class="form-signin", method="POST")
+                    img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192")
+                    div(class="form-row")
+                        input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="E-Mail-Adresse" required)                  
+                    br
+                    input(type="submit", class="btn btn-outline-dark btn-block", value="Passwort zurücksetzen")
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // M4_LAB
+    script(src="/js/headfoot.js")
diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug
new file mode 100644
index 0000000000000000000000000000000000000000..dc4e1c83fb6e851c47dd4e86cc07792f1f05c2f9
--- /dev/null
+++ b/views/DE/account/home.pug
@@ -0,0 +1,50 @@
+doctype html
+html(lang="de")
+  head
+    title= "User Account"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-3")
+                h5
+                    span #{user.firstname} #{user.lastname}
+                div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
+                    a(class="nav-link" href="/account/profile" aria-selected="true") Benutzerprofil
+                    a(class="nav-link" href="/account/security" aria-selected="false") Sicherheitseinstellungen
+                    a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste
+                    a(class="nav-link" href="/logout" aria-selected="false") Logout
+            div(class="col-sm-9")
+                p content goes here
+                
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // M4_LAB
+    script(src="/js/headfootLogout.js")
\ No newline at end of file
diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug
new file mode 100644
index 0000000000000000000000000000000000000000..eba579b384e8e1667f795e742fe7366b29fd0c3b
--- /dev/null
+++ b/views/DE/account/profile.pug
@@ -0,0 +1,108 @@
+doctype html
+html(lang="de")
+  head
+    title= "User Profile"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-3")
+                h5
+                    span #{user.firstname} #{user.lastname}
+                div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
+                    a(class="nav-link" href="#" aria-selected="true") Benutzerprofil
+                    a(class="nav-link" href="/account/security" aria-selected="false") Sicherheitseinstellungen
+                    a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste
+                    a(class="nav-link" href="/logout" aria-selected="false") Logout
+            div(class="col-sm-9")
+                if successes
+                    for success in successes
+                        div.alert.alert-success.alert-dismissible #{ success }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                if errors
+                    for error, i in errors
+                        div.alert.alert-danger.alert-dismissible.fade.show #{ error }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                form#profileForm(method="POST", action="/account/updateProfile")
+                    div(class="form-row")
+                        div(class='form-group col-md-2')
+                            label(for="title") Anrede
+                            select#inputSalutation(name="inputSalutation", class="form-control", , value=user.salutation)
+                                option(value="") - Anrede -
+                                option(value="Herr") Herr
+                                option(value="Frau") Frau
+                                option(value="Divers") Divers
+                                script.
+                                    var salutationOptions = document.getElementById('inputSalutation').options;
+                                    for (i=0; i < salutationOptions.length; i++) {
+                                        if (salutationOptions[i].value == '#{user.salutation}')
+                                            salutationOptions[i].selected = true;
+                                    }
+                        div(class='form-group col-md-2')
+                            label(for="title") Titel
+                            select#inputTitle(name="inputTitle", class="form-control", value=user.title)
+                                option(value="") - Titel -
+                                option(value="Prof.") Prof.
+                                option(value="Dr.") Dr.
+                                option(value="Dipl.-Ing.") Dipl.-Ing.
+                                script.
+                                    var titleOptions = document.getElementById('inputTitle').options;
+                                    for (i=0; i < titleOptions.length; i++) {
+                                        if (titleOptions[i].value == '#{user.title}')
+                                            titleOptions[i].selected = true;
+                                    }
+                        div(class='form-group col-md-2')
+                            label(for="firstname") Vorname
+                            input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname", value=user.firstname required)
+                        div(class='form-group col-md-2')
+                            label(for="lastname") Nachname
+                            input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname", value=user.lastname required)
+                    div(class="form-row")
+                        div(class='form-group col-md-8')
+                            label(for="email") E-mail Adresse
+                            input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email", value=email required)
+                    div(class="form-row")
+                        div(class='form-group col-md-8')
+                            label(for="organisation") Unternehmen
+                            input#inputOrganisation(name="inputOrganisation", type="text", class="form-control", placeholder="Unternehmen", value=user.organisation)
+                    div(class="form-row")
+                        div(class='form-group col-md-8')
+                            label(for="industry") Branche
+                            input#inputIndustry(name="inputIndustry", type="text", class="form-control", placeholder="Branche", value=user.industry)
+                    div(class="form-row")
+                        div(class='form-group col-md-8')
+                            label(for="speciality") Fachgebiete
+                            input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete", value=user.speciality)                    
+                    input(type="submit", class="btn btn-primary", value="Speichern")
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // M4_LAB
+    script(src="/js/headfootLogout.js")
\ No newline at end of file
diff --git a/views/DE/account/registration.pug b/views/DE/account/registration.pug
new file mode 100644
index 0000000000000000000000000000000000000000..3de3ed5a731a614fc8baa4eea95465e98a6df82f
--- /dev/null
+++ b/views/DE/account/registration.pug
@@ -0,0 +1,97 @@
+doctype html
+html(lang="de")
+  head
+    title= "Create New Account"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            color: red;
+            font-size: 11px;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-md-6 offset-md-2")
+                h3(class="mb-3 font-weight-bold") Neues Benutzerkonto anlegen
+            div(class="col-md-6 offset-md-3")
+                if successes
+                    for success in successes
+                        div.alert.alert-success.alert-dismissible #{ success }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                if errors
+                    for error, i in errors
+                        div.alert.alert-danger.alert-dismissible.fade.show #{ error }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                form(method="POST")
+                    h5(class="mb-3 font-weight-bold") Anmeldedaten
+                    div(class='form-row')
+                        div(class='form-group col-md-6')
+                            input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="E-Mail-Adresse*", maxlength="45" required)
+                            span#emailWarning(class='warning')
+                        div(class="form-group col-md-6")
+                            input#inputPassword(name="inputPassword", type="password", class="form-control", data-toggle="password", placeholder="Passwort*", maxlength="45" required)
+                            span#passwordWarning(class='warning')
+                    h5(class="mb-3 font-weight-bold") Benutzerprofil
+                    div(class="form-row")
+                        div(class='form-group col-md-2')
+                            select#inputSalutation(name="inputSalutation", class="form-control")
+                                option(value="") - Anrede -
+                                option(value="Herr") Herr
+                                option(value="Frau") Frau
+                                option(value="Divers") Divers
+                        div(class='form-group col-md-2')
+                            select#inputTitle(name="inputTitle", class="form-control")
+                                option(value="") - Titel -
+                                option(value="Prof.") Prof.
+                                option(value="Dr.") Dr.
+                                option(value="Dipl.-Ing.") Dipl.-Ing.
+                        div(class='form-group col-md-4')
+                            input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname*", maxlength="45" required)
+                        div(class='form-group col-md-4')
+                            input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname*", maxlength="45" required)
+                    div(class="form-group")
+                        input#inputOrganisation(name="inputOrganisation", type="text", class="form-control", placeholder="Unternehmen", maxlength="45")
+                    div(class="form-group")
+                        input#inputIndustry(name="inputIndustry", type="text", class="form-control", placeholder="Branche", maxlength="45")
+                    div(class="form-group")
+                        input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete", maxlength="100")
+                    p <em><small>* Pflichtfeld</small></em>
+                    input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Senden" disabled)
+                br
+                p(class="text-center") Sie haben bereits ein Benutzerkonto? <a href="/account/">Melden Sie sich hier an</a>.
+                    
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // toggle password
+    script(src='https://unpkg.com/bootstrap-show-password@1.2.1/dist/bootstrap-show-password.min.js')
+    // M4_LAB
+    script(src="/js/generalFunction.js")
+    script(src="/js/registration.js")
+    script(src="/js/headfoot.js")
\ No newline at end of file
diff --git a/views/DE/account/reset.pug b/views/DE/account/reset.pug
new file mode 100644
index 0000000000000000000000000000000000000000..56aa2d9220f06e178f93b0f985d187d61938828c
--- /dev/null
+++ b/views/DE/account/reset.pug
@@ -0,0 +1,60 @@
+doctype html
+html(lang="de")
+  head
+    title= "Reset Password"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-md-6 offset-md-3")
+                if successes
+                    for success in successes
+                        div.alert.alert-success.alert-dismissible #{ success }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                if errors
+                    for error, i in errors
+                        div.alert.alert-danger.alert-dismissible.fade.show #{ error }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                form#forgotForm(method="POST", class="form-signin")
+                    img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192")
+                    div(class="form-row")
+                        input#inputNewPwd(name="inputNewPwd", type="password", class="form-control", placeholder="Neues Passwort" required)
+                        span#recommendation(class='warning')
+                        input#inputConfirm(name="inputConfirm", type="password", class="form-control", placeholder="Passwort bestätigen" required)
+                        span#message(class='warning')
+                    input#updateBtn(type="submit", class="btn btn-outline-dark btn-block", value="Passwort ändern" disabled)
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // M4_LAB
+    script(src="/js/security.js")
+    script(src="/js/generalFunction.js")
+    script(src="/js/headfoot.js")
diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug
new file mode 100644
index 0000000000000000000000000000000000000000..7d81edee3e47dcb85db9c70cfa392b1e7591e61e
--- /dev/null
+++ b/views/DE/account/security.pug
@@ -0,0 +1,95 @@
+doctype html
+html(lang="de")
+  head
+    title= "User Profile"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            font-size: 11px;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-3")
+                h5
+                    span #{user.firstName} #{user.lastName}
+                div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
+                    a(class="nav-link" href="/account/profile" aria-selected="true") Benutzerprofil
+                    a(class="nav-link" href="#" aria-selected="false") Sicherheitseinstellungen
+                    a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste
+                    a(class="nav-link" href="/logout" aria-selected="false") Logout
+            div(class="col-sm-9")
+                if successes
+                    for success in successes
+                        div.alert.alert-success.alert-dismissible #{ success }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                if errors
+                    for error, i in errors
+                        div.alert.alert-danger.alert-dismissible.fade.show #{ error }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                form(class="needs-validation", method="post", action="/account/changePwd" novalidate)
+                    div(class="form-group row")
+                        label(for="currPwd") Aktuelles Passwort
+                        input(id="inputCurrPwd", name="inputCurrPwd", type="password", class="form-control" required)
+                        div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus.
+                    div(class="form-group row")
+                        label(for="newPwd") Neues Passwort
+                        input#inputNewPwd(name="inputNewPwd", type="password", class="form-control" required)
+                        span#recommendation
+                        div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus.
+                    div(class="form-group row")
+                        label(for="confirm") Bestätigen Sie das neue Passwort
+                        input#inputConfirm(name="inputConfirm", type="password", class="form-control" required)
+                        span#message
+                        div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus.
+                    input#updateBtn(type="submit", class="btn btn-primary", value="Passwort ändern" disabled)
+                    
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // M4_LAB
+    script(src="/js/security.js")
+    script(src="/js/generalFunction.js")
+    script(src="/js/headfootLogout.js")
+    script.
+        // check input fields
+        'use strict';
+        window.addEventListener('load', function() {
+            // Fetch all the forms we want to apply custom Bootstrap validation styles to
+            var forms = document.getElementsByClassName('needs-validation');
+            // Loop over them and prevent submission
+            var validation = Array.prototype.filter.call(forms, function(form) {
+                form.addEventListener('submit', function(event) {
+                    if (form.checkValidity() === false) {
+                        event.preventDefault();
+                        event.stopPropagation();
+                    }
+                    form.classList.add('was-validated');
+                }, false);
+            });
+        }, false);
diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug
new file mode 100644
index 0000000000000000000000000000000000000000..525041ef0bc99e2b461d545eef822466dae4bb3f
--- /dev/null
+++ b/views/DE/account/services.pug
@@ -0,0 +1,78 @@
+doctype html
+html(lang="de")
+  head
+    title= "User Profile"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-3")
+                h5
+                    span #{user.firstName} #{user.lastName}
+                div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
+                    a(class="nav-link" href="/account/profile" aria-selected="true") Benutzerprofil
+                    a(class="nav-link" href="/account/security" aria-selected="false") Sicherheitseinstellungen
+                    a(class="nav-link" href="#" aria-selected="false") Projekte und Dienste
+                    a(class="nav-link" href="/logout" aria-selected="false") Logout
+            div(class="col-sm-9")
+                if successes
+                    for success in successes
+                        div.alert.alert-success.alert-dismissible #{ success }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                if errors
+                    for error, i in errors
+                        div.alert.alert-danger.alert-dismissible.fade.show #{ error }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                table
+                    for item in project
+                        tr
+                            td <strong>#{item.title}</strong>
+                            if item.userStatus
+                                td
+                                    button(type="button", class="btn btn-secondary", onclick="unsubscribe()") Projektbeteiligung beenden
+                            else
+                                td
+                                    button(type="button", class="btn btn-success", onclick="subscribe()") Am Projekt beteiligen
+                        tr
+                            td(colspan="2") #{item.summary}
+                        tr
+                            td(colspan="2") <i>Ansprechpartner: #{item.cp}</i>
+                    
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // M4_LAB
+    script(src="/js/headfootLogout.js")
+    script.
+        function subscribe() {
+            alert("To be implemented: Ihre Anfrage wird an den zuständigen Projektleiter gesendet.")
+        }
+        function unsubscribe() {
+            alert("To be implemented: Ihre Projektbeteiligung wurde beendet und der zuständige Projektleiter in Kenntnis gesetzt.")
+        }
\ No newline at end of file
diff --git a/views/layout.pug b/views/DE/layout.pug
similarity index 100%
rename from views/layout.pug
rename to views/DE/layout.pug
diff --git a/views/DE/project/addProjectOverview.pug b/views/DE/project/addProjectOverview.pug
new file mode 100644
index 0000000000000000000000000000000000000000..08a391713c561222dec2b9336e60137c3c12dcde
--- /dev/null
+++ b/views/DE/project/addProjectOverview.pug
@@ -0,0 +1,138 @@
+doctype html
+html(lang="de")
+  head
+    title= "Add Project Overview"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    // jQuery UI - Datepicker
+    link(rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            color: red;
+            font-size: 11px;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-md-6 offset-md-2")
+                h4(class="mb-3 font-weight-bold") Neues Projekt
+            div(class="col-md-6 offset-md-3")
+                if errors
+                    for error, i in errors
+                        div.alert.alert-danger.alert-dismissible.fade.show #{ error }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                form(method="POST")
+                    div(class='form-row')
+                        div(class='form-group col-md-12')
+                            input#inputPname(name="pname" class="form-control" type="text" placeholder="Projekttitel*" required)
+                        div(class="form-group col-md-12")
+                            input#inputTitle(name="title" class="form-control" type="text" placeholder="Akronym*" required)
+                        div(class="form-group col-md-12")
+                            input#inputSummary(name="summary" class="form-control" type="text" placeholder="Kurzbeschreibung")
+                        div(class='form-group col-md-12')
+                            select#inputCategory(name="category", class="form-control")
+                                option(value="") - Projektkategorie -
+                                option(value="Experten-Gruppe") Experten-Gruppe
+                                option(value="Student-Projekt") Student-Projekt
+                                option(value="Lehr Projekt") Lehr Projekt
+                                option(value="Transfer-projekt") Transfer-projekt
+                        div(class="form-group col-md-12")
+                            input#inputLogo(name="logo" class="form-control" type="text" placeholder="Projektlogo, to be implemented: upload picture")
+                        div(class="form-group col-md-12")
+                            div(class="input-group mb-3")
+                                input#inputGitlabURL(name="gitlabURL" type="text" class="form-control" placeholder="M4_LAB GitLab Project URL, z.B. https://transfer.hft-stuttgart.de/gitlab/username/projectname")
+                                div(class="input-group-prepend")
+                                    div(class="input-group-text")
+                                        input#inputWiki(name="wiki" type="checkbox")
+                                        | &nbsp; Wiki
+                                
+                    h5(class="mb-3 font-weight-bold") Inhalte
+                    div(class='form-row')
+                        div(class='form-group col-md-12')
+                            textarea#inputOverview(name="overview" class="form-control" type="text" rows="5" placeholder="Projektüberblick")
+                        div(class="form-group col-md-12")
+                            textarea#inputQuestion(name="question" class="form-control" type="text" rows="5" placeholder="Fragestellung")
+                        div(class='form-group col-md-12')
+                            textarea#inputApproach(name="approach" class="form-control" type="text" rows="5" placeholder="Vorgehensweise")
+                        div(class="form-group col-md-12")
+                            textarea#inputResult(name="result" class="form-control" type="text" rows="5" placeholder="Ergebnis und Nutzung")
+                        div(class="form-group col-md-12")
+                            input#inputKeywords(name="keywords" class="form-control" type="text" placeholder="keywords")
+                    h5(class="mb-3 font-weight-bold") Projektinformationen
+                    div(class='form-row')
+                        div(class='form-group col-md-12')
+                            input#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung")
+                        div(class="form-group col-md-12")
+                            div(class='form-row')
+                                div(class="form-group col-md-2")
+                                    <p class="font-weight-normal">Laufzeit</p>
+                                div(class="form-group col-md-5")
+                                    input#inputTermFrom(name="termForm" class="form-control" type="text" placeholder="von (dd.mm.yyyy)")
+                                div(class="form-group col-md-5")
+                                    input#inputTermTo(name="termTo" class="form-control" type="text" placeholder="bis (dd.mm.yyyy)")
+                        div(class='form-group col-md-12')
+                            textarea#inputFurtherDetails(name="furtherDetails" class="form-control" type="text" rows="5" placeholder="Weitere Informationen (bspw. Links zu Berichten)")
+                        div(class="form-group col-md-12")
+                            input#inputWebsite(name="website" class="form-control" type="text" placeholder="Projekt-Website")
+                    h5(class="mb-3 font-weight-bold") Bilder
+                    div(class='form-row')
+                        div(class="form-group col-md-12")
+                            input#inputSrc(name="src" class="form-control" type="text" placeholder="To be implemented: upload picture")
+                        div(class="form-group col-md-12")
+                            input#inputCaption(name="caption" class="form-control" type="text" placeholder="Bildunterschrift/Bildquelle")
+                    h5(class="mb-3 font-weight-bold") Kontakt
+                    div(class='form-row')
+                        div(class="form-group col-md-2")
+                            <p class="font-weight-normal">Ansprechperson</p>
+                        div(class="form-group col-md-5")
+                            input#inputContactName(name="contactName" class="form-control" type="text" placeholder="Anrede, Titel, Vorname, Nachname")
+                        div(class="form-group col-md-5")
+                            input#inputContactEmail(name="contactEmail" class="form-control" type="email" placeholder="E-Mail-Adresse")
+                        div(class="form-group col-md-2")
+                            <p class="font-weight-normal">Projektleitung</p>
+                        div(class="form-group col-md-5")
+                            input#inputLeaderName(name="leaderName" class="form-control" type="text" placeholder="Anrede, Titel, Vorname, Nachname")
+                        div(class="form-group col-md-5")
+                            input#inputLeaderEmail(name="leaderEmail" class="form-control" type="email" placeholder="E-Mail-Adresse")
+                    p <em><small>* Pflichtfeld</small></em>
+                    input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Projekt Anlegen")
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // jQuery UI - Datepicker
+    script(src="https://code.jquery.com/ui/1.12.1/jquery-ui.js")
+    script(src="/js/jquery-ui/i18n/datepicker-de.js")
+    //script(src="i18n/datepicker-de.js")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    script(src="/js/headfootLogout.js")
+    script.
+        $( function() {
+            $.datepicker.setDefaults( $.datepicker.regional["de"] );
+            $("#inputTermFrom").datepicker();
+            $("#inputTermTo").datepicker();
+        });
\ No newline at end of file
diff --git a/views/DE/project/landingpage.html b/views/DE/project/landingpage.html
new file mode 100644
index 0000000000000000000000000000000000000000..d9c19d49a9b7381e7a43cd7d7d6842e22663945f
--- /dev/null
+++ b/views/DE/project/landingpage.html
@@ -0,0 +1,68 @@
+        <!-- content -->
+
+        <div class="flex-container" style="align-items:flex-start">
+
+            <div id="Textblock-startseite" class="text" style="flex-basis:600px">
+                <div style="flex-grow: 1">
+                    <p>
+                    <h1>Als innovative Hochschule wollen wir den Wandel in der Gesellschaft zukunftsfähig und verantwortungsvoll mitgestalten.</h1>
+                    <br/>
+                    <h2>Unser Ziel ist die Beantwortung gesellschaftlich relevanter Zukunftsfragen.</h2>
+
+                    Diese bearbeiten wir durch Forschungs-, Innovations- und Transferprojekte und entwickeln dabei anwendungsbezogene Lösungen.
+                    Als Impulsgeber ermöglichen wir den Transfer innovativer Ideen, indem wir Kooperationen fördern und Räume für kreativen Austausch schaffen.
+                    <br/>
+                    Dabei verknüpfen wir unsere Expertise mit Partnern innerhalb und außerhalb der Region Stuttgart. Wir informieren und involvieren Interessierte und Beteiligte durch die unterschiedlichsten Events und Formate.
+                    <br/>
+                    <h2>Willst du dabei sein?</h2>
+
+                    Dann findest du unter <span onclick="event.stopPropagation();hint_navbar('0')" ><i class="fas fa-chevron-right"></i> Informationen</span> mehr über unsere Expertise, Projekte, Publikationen und Lösungen.
+                    <br/>
+                    Erfahre mehr über unsere <span onclick="event.stopPropagation();hint_navbar('2')" ><i class="fas fa-chevron-right"></i> Events</span> und über die Möglichkeiten zur <span onclick="event.stopPropagation();hint_navbar('1')" ><i class="fas fa-chevron-right"></i> Zusammenarbeit</span>.
+                    </p>
+                </div>
+            </div>
+
+
+            <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel" style="flex-basis: 50%" style="flex-grow: 1">
+                <ol class="carousel-indicators">
+                    <li data-target="#carouselExampleIndicators" data-slide-to="0"></li>
+                    <li data-target="#carouselExampleIndicators" data-slide-to="1" class="active"></li>
+                    <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
+                </ol>
+                <a class="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-slide="prev">
+                    <i class="fas fa-chevron-left"></i>
+                    <!--    <span class="carousel-control-prev-icon" aria-hidden="true"></span>-->
+                    <span class="sr-only">Previous</span>
+                </a>
+                <div class="carousel-inner" role="listbox">
+                    <div class="carousel-item">
+                        <img class="d-block w-100" src="/images/3DModell_Wermelskirchen_Startseite.jpg" alt="First slide">
+                        <div id="Bildunterschrift-slide1" class="Bildunterschrift">
+                            <br>
+                            <p><a href="/projectoverview?projectID=3" ><i class="fas fa-chevron-right"></i> AG Qualität zur Definition von 3D-Stadtmodellen</a></p>&emsp;
+                        </div>
+                    </div>
+                    <div class="carousel-item active">
+                        <img class="d-block w-100" src="/images/M4_LAB_Vision.gif" alt="Second slide">
+                        <div id="Bildunterschrift-slide2" class="Bildunterschrift">
+                            <br>
+                            <p><a href="/projectoverview?projectID=1" ><i class="fas fa-chevron-right"></i> Innovationslabor M4_LAB</a></p>&emsp;
+                        </div>
+                    </div>
+                    <div class="carousel-item">
+                        <img class="d-block w-100" src="/images/SmartPollen_Projekt/SmartPollenM2GIF.gif" alt="Third slide">
+                        <div id="Bildunterschrift-slide3" class="Bildunterschrift">
+                            <br>
+                            <p><a href="/projectoverview?projectID=2" ><i class="fas fa-chevron-right"></i> Studierendenprojekt Smart-Pollen</a></p>&emsp;
+                        </div>
+                    </div>
+                </div>
+                <a class="carousel-control-next" href="#carouselExampleIndicators" role="button" data-slide="next">
+                    <i class="fas fa-chevron-right"></i>
+                    <!--    <span class="carousel-control-next-icon" aria-hidden="true"></span>-->
+                    <span class="sr-only">Next</span>
+                </a>
+            </div>
+
+        </div>
\ No newline at end of file
diff --git a/views/DE/project/landingpage.pug b/views/DE/project/landingpage.pug
new file mode 100644
index 0000000000000000000000000000000000000000..a835ec04d9823d0f847956b9bf6012eaf92b083f
--- /dev/null
+++ b/views/DE/project/landingpage.pug
@@ -0,0 +1,47 @@
+doctype html
+html(lang="de")
+  head
+    title= "Project List"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            color: red;
+            font-size: 11px;
+        }
+  body
+    include landingpage.html
+
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    if isUserAuthenticated
+        script(src="/js/headfootLogout.js")
+    else
+        script(src="/js/headfoot.js")
\ No newline at end of file
diff --git a/views/DE/project/mailinglists.pug b/views/DE/project/mailinglists.pug
new file mode 100644
index 0000000000000000000000000000000000000000..1bc8f5c2c30b1c97c2a1f4bbe859532afd28295f
--- /dev/null
+++ b/views/DE/project/mailinglists.pug
@@ -0,0 +1,61 @@
+html(lang="de")
+  head
+    title= "Mailinglisten"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+  body
+    <hr />
+    div()
+        h5(align="left") Aktive Mailinglisten
+        div(class="flex-container" style="align-items:flex-start")
+            div(class="table")
+                table(border="0" id="listtable" class="table table-striped")
+                    thead
+                        tr
+                            th Name
+                            th Link
+                            th zugeh. Projekt
+                    tbody
+                        for item in mailinglists
+                            if item.projectstatus == '1'
+                                tr
+                                    td #{item.name}
+                                    td <a href="#{item.src}">#{item.src}</a>
+                                    td <a href='projectoverview?projectID=#{item.id}'>#{item.project_title}</a>
+    <hr />
+    div()
+        h5(align="left") Eintragung in Mailingliste
+        p() Wenn Sie sich in eine Mailingliste eintragen wollen, folgen Sie folgender Anleitung:
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    if isUserAuthenticated
+        script(src="/js/headfootLogout.js")
+    else
+        script(src="/js/headfoot.js")
\ No newline at end of file
diff --git a/views/DE/project/project-simplified.pug b/views/DE/project/project-simplified.pug
new file mode 100644
index 0000000000000000000000000000000000000000..6dead87fc997ba03a27b908f3246c1fd91d9522d
--- /dev/null
+++ b/views/DE/project/project-simplified.pug
@@ -0,0 +1,47 @@
+doctype html
+html(lang="de")
+  head
+    title= "Project List"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            color: red;
+            font-size: 11px;
+        }
+  body
+    include project.html
+
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    if isUserAuthenticated
+        script(src="/js/headfootLogout.js")
+    else
+        script(src="/js/headfoot.js")
\ No newline at end of file
diff --git a/views/DE/project/project.html b/views/DE/project/project.html
new file mode 100644
index 0000000000000000000000000000000000000000..df461962e13ae4c15eb13caa79d5e4a948d96260
--- /dev/null
+++ b/views/DE/project/project.html
@@ -0,0 +1,70 @@
+        <div class="container">
+            <hr />
+            <!-- text: Zweck dieser Seite / purpose of this page -->
+            <i class="fas fa-info-circle"></i> Diese Seite bietet den Einstieg zu den unterschiedlichen Projekten, die in unserem Portal für die Öffentlichkeit bereitgestellt werden.
+            Für diesen Zweck steht zur Zeit ein Dienst bereit: eine von der HFT selbst verwaltete Gitlab-Instanz.
+            Alle der in diesem Gitlab erfassten Projektinhalte unterliegen einer Open Source bzw. Open Data Lizenz.
+            <p>Hinweis: Die Nutzeroberfläche von GitLab ist in Englisch.</p>
+
+            <!-- link: Gitlab Projekte / Gitlab project list -->
+            <h2> Direkteinstieg </h2>
+            <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"> <i class="fas fa-chevron-right">Gitlab Projects</i></a>
+            
+            <!-- text: Hilfestellung zu Gitlab / short help about Gitlab -->
+            <hr />
+            <h2> Hilfestellung zu GitLab </h2>
+
+            <h3> <i class="fas fa-question-circle"></i> Möchten Sie die Projektinhalte ansehen oder herunterladen? </h3>
+            <p>
+                Dann klicken Sie auf diesen <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"> <i class="fas fa-chevron-right">Link zu den Gitlab-Projekten</i></a> um die Liste aller im Gitlab erfassten Projekte zu sehen.
+                Vor dort können Sie dann auf die einzelnen Projekte zugreifen.
+                Ein Anmelden am Portal ist dazu nicht nötig.
+            </p>
+            
+            <h3> <i class="fas fa-question-circle"></i> Möchten Sie zu einem Projekt beitragen? </h3>	
+            <p>
+            Wenn Sie dem Projekteigentümer eine Rückmeldung bzw. einen Fehler melden wollen, navigieren Sie im Gitlab zunächst zum entsprechenden Projekt.
+            Anschließend können Sie dann dort die Möglichkeit nutzen, ein neues "Issues" einzureichen.
+            Ein Anmelden am Portal ist dazu nicht nötig.
+            </p>
+            <p>
+            Wenn Sie darüberhinaus beitragen wollen, befolgen Sie bitte folgende Schritte:
+            </p>
+            <ol>
+                <li>
+                    Melden Sie sich bitte im Portal an. <br>
+                    Sofern Sie noch nicht als Nutzer im Portal eingetragen sind, wird das System Sie durch die Registrierung leiten. <br>
+                    Zur Anmeldung bzw. Registrierung gelangen Sie entweder über das Menü am oberen Seitenrand oder durch Klicken auf diesen <a href="https://m4lab.hft-stuttgart.de/account/"> <i class="fas fa-chevron-right">Link zum Benutzerkonto</i></a>.
+                </li>
+                <li>
+                    Folgen Sie dem <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"> <i class="fas fa-chevron-right">Link zu den Gitlab-Projekten</i></a>, um zum Gitlab zu gelangen.
+                </li>
+                <li>
+                    Fragen Sie beim Projekteigentümer um Zugang, indem Sie im Gitlab bei der entsprechende Projektseite auf den Link <em>Request Access</em> klicken. Solbald dieser ihre Anfrage bestätigt hat, können Sie loslegen.
+                </li>
+            </ol>
+
+            <h3> <i class="fas fa-question-circle"></i> Möchten Sie selbst ein Projekt anlegen, um es der Öffentlichkeit bereitzustellen? </h3>
+            
+            </p>
+            Vorraussetzung dazu ist, dass Sie aktives oder ehemaliges Mitglied der Hochschule für Technik sind, d.h. eine (noch) gültige HFT-Emailadresse haben.
+            Dann befolgen Sie bitte folgende Schritte:
+            </p>
+            
+            <ol>
+                <li>
+                    Melden Sie sich bitte im Portal an. <br>
+                    Sofern Sie noch nicht als Nutzer im Portal eingetragen sind, wird das System Sie durch die Registrierung leiten. <br>
+                    Zur Anmeldung bzw. Registrierung gelangen Sie entweder über das Menü am oberen Seitenrand oder durch Klicken auf diesen <a href="https://m4lab.hft-stuttgart.de/account/"> <i class="fas fa-chevron-right">Link zum Benutzerkonto</i></a>.
+                </li>
+                <li>
+                    Folgen Sie dem <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"> <i class="fas fa-chevron-right">Link zu den Gitlab-Projekten</i></a>, um zum Gitlab zu gelangen.
+                </li>
+                <li>
+                    Erstellen Sie dann in Gitlab ein neues Projekt durch Klicken auf den grünen <em>New Project</em>-Knopf und anschließendem Befolgen der Eingabemaske von Gitlab. <br>
+                    Weitere Hilfestellung zum Anlegen von Projekten in Gitlab finden Sie in der <a href="https://docs.gitlab.com/ee/gitlab-basics/create-project.html"> <i class="fas fa-chevron-right">Gitlab-Dokumentation</i></a>.
+                </li>
+            </ol>
+            
+            <!-- / content body -->
+        </div>
\ No newline at end of file
diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug
new file mode 100644
index 0000000000000000000000000000000000000000..7cf545fb6210357de971c9550079ac7210ca1314
--- /dev/null
+++ b/views/DE/project/projectOverview.pug
@@ -0,0 +1,168 @@
+doctype html
+html(lang="de")
+  head
+    title= "Project List"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            color: red;
+            font-size: 11px;
+        }
+  body
+    div
+        for project in projectOV
+            div(class="flex-container")
+                div(class="main")
+                    h1 #{project.title}
+                    div(style="float:right; margin-left:30px; margin-bottom:0px; width:50%;")
+                        img(src=project.src, width="100%")
+                        p(style="text-align:right") #{project.caption}
+
+                    h2 Projektüberblick
+                    p !{project.overview}
+                    br
+                    b keywords:
+                    span #{project.keywords}
+                    br
+                    h2 Fragestellung
+                    p !{project.question}
+                    p
+                    h2 Vorgehensweise
+                    p !{project.approach}
+                    br
+                    br
+                    h2 Ergebnis und Nutzung
+                    p !{project.result}
+                div(class="side")
+                    for image in projectImgs
+                        if image.pos == '2' || image.pos == '3'
+                            div(class="projectimg")
+                                <img src="#{image.src}", width="100%">
+                                if image.caption
+                                    span #{image.caption}
+                                </img>
+
+                    div(class="fakeimg")
+                        if project.leader_lastname
+                            p
+                                b Projektleitung HfT: &nbsp;
+                                <a href="mailto: #{project.leader_email}">#{project.leader_lastname}</a>
+                    div(class="fakeimg")
+                        if project.contact_lastname
+                            p
+                                b Ansprechperson: &nbsp;
+                                <a href="mailto: #{project.contact_email}">#{project.contact_lastname} </a>
+                    div(class="fakeimg")
+                        if project.announcement
+                            p
+                                b Ausschreibung: &nbsp;
+                                span !{project.announcement}
+
+                    div(class="fakeimg")
+                        if project.partner_name
+                            p
+                                b Projektpartner:
+                                br
+                                for website, i in partnerWS
+                                    if website
+                                        <a href="#{website}">#{partnerN[i]}</a>
+                                        br
+                                    else
+                                        #{partnerN[i]}
+                                        br
+
+                    div(class="fakeimg")
+                        if project.term
+                            p
+                                b Projektlaufzeit: &nbsp;
+                                span #{project.term}
+
+                    div(class="fakeimg")
+                        if project.award_name
+                            p
+                                b Preise:
+                                br
+                                for awardsite, i in awardWS
+                                    if awardsite
+                                        <a href="#{awardsite}">#{awardN[i]}</a>
+                                        br
+                                    else
+                                        #{awardN[i]}
+                                        br
+
+                    div(class="fakeimg")
+                        if project.administrator
+                            p
+                                b Projektträger: &nbsp;
+                                span #{project.administrator}
+
+                    div(class="fakeimg")
+                        if project.sponsor_name
+                            p
+                                b Geldgeber:
+                                br
+                                for website, i in sponsorWS
+                                    if website
+                                        <a href="#{website}">#{sponsorN[i]}</a>
+                                        br
+                                    else
+                                        #{sponsorN[i]}
+                                        br
+
+                    div(class="fakeimg")
+                        if project.website || project.further_details
+                        p
+                            b Mehr Informationen: &nbsp;
+                            if project.website
+                                <a href="#{project.website}">#{project.website}</a>
+                            br
+                            span !{project.further_details}
+
+                    div(class="Downloads" style="height:200px;")
+                        h5 Downloads
+                        p
+                            i(class="fas fa-file-download")
+                            a(href="./images/M4_LAB_Projekt/transferstrategie.pdf" download target="_blank") Transferstrategie der HfT Stuttgart
+
+                    div(class="Projektlogos")
+                        img(src="./images/M4_LAB_Projekt/WRS_Logo.jpg" width="32%")
+                        img(src="./images/M4_LAB_Projekt/IBA2027_Logo.jpg" width="32%")
+                        img(src="./images/M4_LAB_Projekt/GWK_Logo.jpg" width="32%")
+                        br
+                        br
+                        img(src="./images/M4_LAB_Projekt/bbf_logo.png" width="32%")
+                        img(src="./images/M4_LAB_Projekt/ihs_logo.jpg" width="32%")
+
+    //jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    if isUserAuthenticated
+        script(src="/js/headfootLogout.js")
+    else
+        script(src="/js/headfoot.js")
\ No newline at end of file
diff --git a/views/DE/project/projects.pug b/views/DE/project/projects.pug
new file mode 100644
index 0000000000000000000000000000000000000000..78a12ecfa73a2435d13067a944440feae19ecaaa
--- /dev/null
+++ b/views/DE/project/projects.pug
@@ -0,0 +1,117 @@
+doctype html
+html(lang="de")
+  head
+    title= "Project List"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            color: red;
+            font-size: 11px;
+        }
+  body
+    div(class="container-fluid")
+        if isUserAuthenticated
+            p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte.
+            a(href="/addprojectoverview" class="btn btn-primary" role="button" aria-pressed="true") Projekt anlegen
+        else
+            p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte.
+            p Möchten Sie ein neues Projekt anlegen, dann klicken Sie bitte auf #[a(href="/addprojectoverview") Anmelden und Projekt anlegen]
+        if successes
+            for success in successes
+                div.alert.alert-success.alert-dismissible #{ success }
+                    a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+        // Active projects
+        h3(class="mb-3 font-weight-bold") Aktive Projekte
+        table(class="table table-striped")
+            thead
+                tr
+                    th Logo
+                    th Akronym
+                    th Title
+                    th Kernziel
+                    th Kategorie
+                    th Ansprechpartner
+                    th Projektinhalte
+            tbody
+                for item in active
+                    tr
+                        //td #{item.status}
+                        td
+                            img(src=item.logo, width="40", height="40")
+                        td #{item.akronym}
+                        td #{item.title}
+                        td #{item.summary}
+                        td #{item.category}
+                        td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}]
+                        td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht]
+                            if item.gitlab
+                                a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/tree/master") Projektdateien
+                                a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/wikis/home") Projektwiki
+                            else
+                                a(class="nav-link", href="#") Projektdateien
+                                a(class="nav-link", href="#") Projektwiki
+        br
+        // Non-active projects
+        h3(class="mb-3 font-weight-bold") Abgeschlossene Projekte
+        table(class="table table-striped")
+            thead
+                tr
+                    th Logo
+                    th Akronym
+                    th Title
+                    th Kernziel
+                    th Kategorie
+                    th Ansprechpartner
+                    th Projektinhalte
+            tbody
+                for item in nonActive
+                    tr
+                        //td #{item.status}
+                        td
+                            img(src=item.logo, width="40", height="40")
+                        td #{item.akronym}
+                        td #{item.title}
+                        td #{item.summary}
+                        td #{item.category}
+                        td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}]
+                        td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht]
+                            if item.gitlab
+                                a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/tree/master") Projektdateien
+                                a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/wikis/home") Projektwiki
+                            else
+                                a(class="nav-link", href="#") Projektdateien
+                                a(class="nav-link", href="#") Projektwiki
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    if isUserAuthenticated
+        script(src="/js/headfootLogout.js")
+    else
+        script(src="/js/headfoot.js")
\ No newline at end of file
diff --git a/views/DE/project/videoconferences.pug b/views/DE/project/videoconferences.pug
new file mode 100644
index 0000000000000000000000000000000000000000..12fc17a9e3cc681096f35dcc1790bf36f1db7450
--- /dev/null
+++ b/views/DE/project/videoconferences.pug
@@ -0,0 +1,70 @@
+doctype html
+html(lang="de")
+  head
+    title= "Project List"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            color: red;
+            font-size: 11px;
+        }
+  body
+    div(class="flex-container")
+        div(class="main")
+            h1 Videokonferenzen
+
+            p Wir bieten grundsätzlich zwei Möglichkeiten an, Viodeokonferenzen abzuhalten:
+
+            h2 Jitsi
+
+            p
+                <a href="https://jitsi.org">Jitsi</a> ist ein Opensource Videokonferenz-System, welches es ermöglicht, direkt über den Browser Videokonferenzen abzuhalten.
+                br
+                span Da die Hauptlast bei diesem System Clientseitig getragen wird, raten wir zu einer Nutzung auf Desktopsystemen bzw. Laptops.
+
+            p   Um eine Videokonferenz starten zu können, muss sich zunächst ein Organisator am Portal anmelden und die Videokonferenz eröffnen. Weitere Teilnehmer können dann ohne Anmeldung einfach über einen Link hinzugefügt werden.
+
+            p   Der Zugang zu Jitsi findet sich <a href="https://telemeeting.hft-stuttgart.de">hier</a>
+
+            h2  GoToMeeting
+
+            p   Eine weitere Option, die wir anbieten werden, ist die Organisation von Videokonferenzen via GoToMeeting
+
+            p   Mehr Informationen darüber erhalten Sie zu gegebener Zeit an dieser Stelle
+
+
+
+
+    //jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    if isUserAuthenticated
+        script(src="/js/headfootLogout.js")
+    else
+        script(src="/js/headfoot.js")
\ No newline at end of file
diff --git a/views/404.pug b/views/EN/404.pug
similarity index 100%
rename from views/404.pug
rename to views/EN/404.pug
diff --git a/views/500.pug b/views/EN/500.pug
similarity index 100%
rename from views/500.pug
rename to views/EN/500.pug
diff --git a/views/forgotPwd.pug b/views/EN/account/forgotPwd.pug
similarity index 99%
rename from views/forgotPwd.pug
rename to views/EN/account/forgotPwd.pug
index 58d66001664ad310155ba940fd9166b9600668a1..1cde0888090e2046496e472178d2d296a6f8c647 100644
--- a/views/forgotPwd.pug
+++ b/views/EN/account/forgotPwd.pug
@@ -40,7 +40,7 @@ html(lang="en")
                     for error, i in errors
                         div.alert.alert-danger.alert-dismissible.fade.show #{ error }
                             a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
-                form#forgotForm(class="form-signin", method="POST", action="/forgotPwd")
+                form#forgotForm(class="form-signin", method="POST")
                     img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192")
                     div(class="form-row")
                         input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email" required)                  
@@ -53,4 +53,4 @@ html(lang="en")
     // Bootstrap
     script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
     // M4_LAB
-    script(src="https://transfer.hft-stuttgart.de/js/headfoot.js")
\ No newline at end of file
+    script(src="https://transfer.hft-stuttgart.de/js/headfoot.js")
diff --git a/views/EN/account/home.pug b/views/EN/account/home.pug
new file mode 100644
index 0000000000000000000000000000000000000000..d2f3875a5a831fde499fae7baddb5acfbd47e34d
--- /dev/null
+++ b/views/EN/account/home.pug
@@ -0,0 +1,49 @@
+doctype html
+html(lang="en")
+  head
+    title= "User Account"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-3")
+                h5
+                    span #{user.firstname} #{user.lastname}
+                div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
+                    a(class="nav-link" href="/profile" aria-selected="true") Profile
+                    a(class="nav-link" href="/security" aria-selected="false") Security
+                    a(class="nav-link" href="/services" aria-selected="false") Services
+            div(class="col-sm-9")
+                p content goes here
+                
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // M4_LAB
+    script(src="/js/headfootLogout.js")
\ No newline at end of file
diff --git a/views/profile.pug b/views/EN/account/profile.pug
similarity index 90%
rename from views/profile.pug
rename to views/EN/account/profile.pug
index 3d329f524ee46b7335401af160b6d88bc07b99fb..47c1f7e8683e370e2fb368337c4fca5d419230fe 100644
--- a/views/profile.pug
+++ b/views/EN/account/profile.pug
@@ -37,7 +37,7 @@ html(lang="en")
                     a(class="nav-link" href="#" aria-selected="true") Profile
                     a(class="nav-link" href="/security" aria-selected="false") Security
                     a(class="nav-link" href="/services" aria-selected="false") Services
-            div(class="col-sm-8")
+            div(class="col-sm-9")
                 if successes
                     for success in successes
                         div.alert.alert-success.alert-dismissible #{ success }
@@ -46,17 +46,22 @@ html(lang="en")
                     for error, i in errors
                         div.alert.alert-danger.alert-dismissible.fade.show #{ error }
                             a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
-                form#profileForm(method="POST",action="/updateProfile")
+                form#profileForm(method="POST", action="/updateProfile")
                     div(class="form-row")
                         div(class='form-group col-md-2')
                             label(for="title") Title
-                            // to read: https://stackoverflow.com/questions/39997579/pug-templates-how-to-mark-option-in-dropdown-list-as-selected
                             select#inputTitle(name="inputTitle", class="form-control", value=user.title)
                                 option(value="Frau/Herr") Frau/Herr
                                 option(value="Frau") Frau
                                 option(value="Herr") Herr
                                 option(value="Dr.") Dr.
                                 option(value="Prof. Dr.") Prof. Dr.
+                                script.
+                                    var titleOptions = document.getElementById('inputTitle').options;
+                                    for (i=0; i < titleOptions.length; i++) {
+                                        if (titleOptions[i].value == '#{user.title}')
+                                            titleOptions[i].selected = true;
+                                    }
                         div(class='form-group col-md-3')
                             label(for="firstname") Vorname
                             input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname", value=user.firstname required)
@@ -87,5 +92,4 @@ html(lang="en")
     // Bootstrap
     script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
     // M4_LAB
-    //script(src="/js/account.js")
-    script(src="https://transfer.hft-stuttgart.de/js/headfoot.js")
\ No newline at end of file
+    script(src="/js/headfootLogout.js")
\ No newline at end of file
diff --git a/views/registration.pug b/views/EN/account/registration.pug
similarity index 93%
rename from views/registration.pug
rename to views/EN/account/registration.pug
index 9f843960f84ce72a1c82faf292f6607d1c05e4c4..88ef5a932c510753f110253fec986dd426f6896f 100644
--- a/views/registration.pug
+++ b/views/EN/account/registration.pug
@@ -49,10 +49,10 @@ html(lang="en")
                     h5(class="mb-3 font-weight-bold") Login Data
                     div(class='form-row')
                         div(class='form-group col-md-6')
-                            input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email" required)
+                            input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email*" required)
                             span#emailWarning(class='warning')
                         div(class="form-group col-md-6")
-                            input#inputPassword(name="inputPassword", type="password", class="form-control", data-toggle="password", placeholder="Password" required)
+                            input#inputPassword(name="inputPassword", type="password", class="form-control", data-toggle="password", placeholder="Password*" required)
                             span#passwordWarning(class='warning')
                     h5(class="mb-3 font-weight-bold") Profile Data
                     div(class="form-row")
@@ -64,18 +64,19 @@ html(lang="en")
                                 option(value="Dr.") Dr.
                                 option(value="Prof. Dr.") Prof. Dr.
                         div(class='form-group col-md-4')
-                            input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname" required)
+                            input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname*" required)
                         div(class='form-group col-md-4')
-                            input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname" required)
+                            input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname*" required)
                     div(class="form-group")
                         input#inputOrganisation(name="inputOrganisation", type="text", class="form-control", placeholder="Unternehmen")
                     div(class="form-group")
                         input#inputIndustry(name="inputIndustry", type="text", class="form-control", placeholder="Branche")
                     div(class="form-group")
-                        input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete")                    
+                        input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete")
+                    p <em><small>* Mandatory</small></em>
                     input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Submit" disabled)
                 br
-                p(class="text-center") Already have an account? <a href="https://transfer.hft-stuttgart.de/login">Login</a>.
+                p(class="text-center") Already have an account? <a href="/">Login</a>.
                     
 
     // jQuery
diff --git a/views/reset.pug b/views/EN/account/reset.pug
similarity index 81%
rename from views/reset.pug
rename to views/EN/account/reset.pug
index 774f921526fc022ef093c2d43f3488cc928d9414..b8939ea2200d627786fa64a8feae03da02d5b346 100644
--- a/views/reset.pug
+++ b/views/EN/account/reset.pug
@@ -5,6 +5,7 @@ html(lang="en")
     meta(charset="UTF-8")
     meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
     link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css")
     link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
     style.
         .collapse {
@@ -30,8 +31,7 @@ html(lang="en")
   body
     div(class="container-fluid")
         div(class="row")
-            div(class="col-sm-9")
-                h2 Reset Password
+            div(class="col-md-6 offset-md-3")
                 if successes
                     for success in successes
                         div.alert.alert-success.alert-dismissible #{ success }
@@ -40,15 +40,14 @@ html(lang="en")
                     for error, i in errors
                         div.alert.alert-danger.alert-dismissible.fade.show #{ error }
                             a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
-                form#forgotForm(method="POST")
-                    div(class="form-group row")
-                        label(for="newPwd") New Password
+                form#forgotForm(method="POST", class="form-signin")
+                    img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192")
+                    div(class="form-row")
                         input#inputNewPwd(name="inputNewPwd", type="password", class="form-control", placeholder="New Password" required)
-                        span#recommendation
-                        label(for="confirmPwd") Confirm Password
+                        span#recommendation(class='warning')
                         input#inputConfirm(name="inputConfirm", type="password", class="form-control", placeholder="Confirm Password" required)
-                        span#message                 
-                    input#updateBtn(type="submit", class="btn btn-primary", value="Update Password" disabled)
+                        span#message(class='warning')
+                    input#updateBtn(type="submit", class="btn btn-outline-dark btn-block", value="Update Password" disabled)
 
     // jQuery
     script(src="https://code.jquery.com/jquery-3.3.1.min.js")
@@ -56,6 +55,6 @@ html(lang="en")
     // Bootstrap
     script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
     // M4_LAB
-    script(src="/js/account.js")
+    script(src="/js/security.js")
     script(src="/js/generalFunction.js")
-    script(src="https://transfer.hft-stuttgart.de/js/headfoot.js")
\ No newline at end of file
+    script(src="https://transfer.hft-stuttgart.de/js/headfoot.js")
diff --git a/views/security.pug b/views/EN/account/security.pug
similarity index 74%
rename from views/security.pug
rename to views/EN/account/security.pug
index 0bdea4cf0c6d59d8da7774243390af98dca0f05d..2a5c248ce1f9e98b429b52eb9261f322cd38fcf9 100644
--- a/views/security.pug
+++ b/views/EN/account/security.pug
@@ -49,24 +49,21 @@ html(lang="en")
                     for error, i in errors
                         div.alert.alert-danger.alert-dismissible.fade.show #{ error }
                             a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
-                form(class="needs-validation", method="post", action="/changePwd" novalidate)
-                    div(class="form-row")
-                        div(class='form-group col-md-6')
-                            label(for="currPwd") Current Password
-                            input(id="inputCurrPwd", name="inputCurrPwd", type="password", class="form-control" required)
-                            div(class="invalid-feedback") Please fill in this field.
-                    div(class="form-row")
-                        div(class='form-group col-md-6')
-                            label(for="newPwd") New Password
-                            input#inputNewPwd(name="inputNewPwd", type="password", class="form-control" required)
-                            span#recommendation(class='warning')
-                            div(class="invalid-feedback") Please fill in this field.
-                    div(class="form-row")
-                        div(class='form-group col-md-6')
-                            label(for="confirm") Confirm New Password
-                            input#inputConfirm(name="inputConfirm", type="password", class="form-control" required)
-                            span#message(class='warning')
-                            div(class="invalid-feedback") Please fill in this field.
+                form(class="needs-validation", method="post", action="/account/changePwd" novalidate)
+                    div(class="form-group row")
+                        label(for="currPwd") Current Password
+                        input(id="inputCurrPwd", name="inputCurrPwd", type="password", class="form-control" required)
+                        div(class="invalid-feedback") Please fill in this field.
+                    div(class="form-group row")
+                        label(for="newPwd") New Password
+                        input#inputNewPwd(name="inputNewPwd", type="password", class="form-control" required)
+                        span#recommendation
+                        div(class="invalid-feedback") Please fill in this field.
+                    div(class="form-group row")
+                        label(for="confirm") Confirm New Password
+                        input#inputConfirm(name="inputConfirm", type="password", class="form-control" required)
+                        span#message
+                        div(class="invalid-feedback") Please fill in this field.
                     input#updateBtn(type="submit", class="btn btn-primary", value="Update Password" disabled)
                     
     // jQuery
@@ -75,9 +72,9 @@ html(lang="en")
     // Bootstrap
     script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
     // M4_LAB
-    script(src="/js/generalFunction.js")
     script(src="/js/security.js")
-    script(src="https://transfer.hft-stuttgart.de/js/headfoot.js")
+    script(src="/js/generalFunction.js")
+    script(src="/js/headfootLogout.js")
     script.
         // check input fields
         'use strict';
@@ -94,4 +91,4 @@ html(lang="en")
                     form.classList.add('was-validated');
                 }, false);
             });
-        }, false);
\ No newline at end of file
+        }, false);
diff --git a/views/services.pug b/views/EN/account/services.pug
similarity index 73%
rename from views/services.pug
rename to views/EN/account/services.pug
index a751c9287d28722fac61c8441c8938bf25e28afa..f095144beb05de603a741230ae857d11b543b3f9 100644
--- a/views/services.pug
+++ b/views/EN/account/services.pug
@@ -46,13 +46,20 @@ html(lang="en")
                     for error, i in errors
                         div.alert.alert-danger.alert-dismissible.fade.show #{ error }
                             a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
-                ul
+                table
                     for item in project
-                        li= item.title
-                            ul
-                                li= item.summary
-                                li= item.cp
-                                li= item.userStatus
+                        tr
+                            td <strong>#{item.title}</strong>
+                            if item.userStatus
+                                td
+                                    button(type="button", class="btn btn-secondary", onclick="unsubscribe()") Unsubscribe
+                            else
+                                td
+                                    button(type="button", class="btn btn-success", onclick="subscribe()") Subscribe
+                        tr
+                            td(colspan="2") #{item.summary}
+                        tr
+                            td(colspan="2") <i>Contact Person: #{item.cp}</i>
                     
     // jQuery
     script(src="https://code.jquery.com/jquery-3.3.1.min.js")
@@ -60,4 +67,11 @@ html(lang="en")
     // Bootstrap
     script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
     // M4_LAB
-    script(src="https://transfer.hft-stuttgart.de/js/headfoot.js")
\ No newline at end of file
+    script(src="/js/headfootLogout.js")
+    script.
+        function subscribe() {
+            alert("To be implemented: Send a request to join/participate/have access to the page of the requested service")
+        }
+        function unsubscribe() {
+            alert("To be implemented: Send a request to withdraw access")
+        }
\ No newline at end of file
diff --git a/views/error.pug b/views/EN/error.pug
similarity index 100%
rename from views/error.pug
rename to views/EN/error.pug
diff --git a/public/views_TBD/layout.jade b/views/EN/layout.pug
similarity index 100%
rename from public/views_TBD/layout.jade
rename to views/EN/layout.pug
diff --git a/views/EN/project/addProjectOverview.pug b/views/EN/project/addProjectOverview.pug
new file mode 100644
index 0000000000000000000000000000000000000000..7b40b54fc63b3d774caf8d0b8af272f4e3a554ce
--- /dev/null
+++ b/views/EN/project/addProjectOverview.pug
@@ -0,0 +1,115 @@
+doctype html
+html(lang="de")
+  head
+    title= "Add Project Overview"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            color: red;
+            font-size: 11px;
+        }
+  body
+    div(class="container-fluid")
+        div(class="row")
+            div(class="col-md-6 offset-md-2")
+                h4(class="mb-3 font-weight-bold") Neues Projekt
+            div(class="col-md-6 offset-md-3")
+                if errors
+                    for error, i in errors
+                        div.alert.alert-danger.alert-dismissible.fade.show #{ error }
+                            a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+                form(method="POST")
+                    div(class='form-row')
+                        div(class='form-group col-md-12')
+                            input#inputPname(name="pname" class="form-control" type="text" placeholder="human-readable short project name*" required)
+                        div(class="form-group col-md-12")
+                            input#inputTitle(name="title" class="form-control" type="text" placeholder="official title of the project*" required)
+                        div(class="form-group col-md-12")
+                            input#inputSummary(name="summary" class="form-control" type="text" placeholder="one line summary of the project")
+                        div(class="form-group col-md-12")
+                            input#inputCategory(name="category" class="form-control" type="text" placeholder="category of the project")
+                        div(class="form-group col-md-12")
+                            input#inputLogo(name="logo" class="form-control" type="text" placeholder="official logo of the project")
+                        div(class="form-group col-md-12")
+                            div(class="input-group mb-3")
+                                input#inputGitlabURL(name="gitlabURL" type="text" class="form-control" placeholder="M4_LAB GitLab Project URL, z.B. https://transfer.hft-stuttgart.de/gitlab/username/projectname")
+                                div(class="input-group-prepend")
+                                    div(class="input-group-text")
+                                        input#inputWiki(name="wiki" type="checkbox")
+                                        | &nbsp; Wiki
+                                
+                    h5(class="mb-3 font-weight-bold") Content
+                    div(class='form-row')
+                        div(class='form-group col-md-12')
+                            textarea#inputOverview(name="overview" class="form-control" type="text" rows="5" placeholder="overview")
+                        div(class="form-group col-md-12")
+                            textarea#inputQuestion(name="question" class="form-control" type="text" rows="5" placeholder="question")
+                        div(class='form-group col-md-12')
+                            textarea#inputApproach(name="approach" class="form-control" type="text" rows="5" placeholder="approach")
+                        div(class="form-group col-md-12")
+                            textarea#inputResult(name="result" class="form-control" type="text" rows="5" placeholder="result")
+                        div(class="form-group col-md-12")
+                            input#inputKeywords(name="keywords" class="form-control" type="text" placeholder="keywords")
+                    h5(class="mb-3 font-weight-bold") Info
+                    div(class='form-row')
+                        div(class='form-group col-md-12')
+                            textarea#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung")
+                        div(class="form-group col-md-12")
+                            input#inputTerm(name="term" class="form-control" type="text" placeholder="Laufzeit")
+                        div(class='form-group col-md-12')
+                            textarea#inputFurtherDetails(name="furtherDetails" class="form-control" type="text" rows="5" placeholder="Mehr informationen")
+                        div(class="form-group col-md-12")
+                            input#inputWebsite(name="website" class="form-control" type="text" placeholder="website")
+                    h5(class="mb-3 font-weight-bold") Images
+                    div(class='form-row')
+                        div(class="form-group col-md-12")
+                            input#inputSrc(name="src" class="form-control" type="text" placeholder="link to the image source")
+                        div(class="form-group col-md-12")
+                            input#inputCaption(name="caption" class="form-control" type="text" placeholder="caption of the image")
+                    h5(class="mb-3 font-weight-bold") Contact
+                    div(class='form-row')
+                        div(class="form-group col-md-4")
+                            input#inputContactFirstname(name="contactFirstname" class="form-control" type="text" placeholder="contact firstname")
+                        div(class="form-group col-md-4")
+                            input#inputContactLastname(name="contactLastname" class="form-control" type="text" placeholder="contact lastname")
+                        div(class="form-group col-md-4")
+                            input#inputContactEmail(name="contactEmail" class="form-control" type="email" placeholder="contact email")
+                        div(class="form-group col-md-4")
+                            input#inputLeaderFirstname(name="leaderFirstname" class="form-control" type="text" placeholder="leader firstname")
+                        div(class="form-group col-md-4")
+                            input#inputLeaderLastname(name="leaderLastname" class="form-control" type="text" placeholder="leader lastname")
+                        div(class="form-group col-md-4")
+                            input#inputLeaderEmail(name="leaderEmail" class="form-control" type="email" placeholder="leader email")
+                    p <em><small>* Pflichtfeld</small></em>
+                    input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Projekt Anlegen")
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    script(src="/js/headfootLogout.js")
\ No newline at end of file
diff --git a/views/EN/project/mailinglists.pug b/views/EN/project/mailinglists.pug
new file mode 100644
index 0000000000000000000000000000000000000000..f2ddbd8b8e7eb89a85e4dc16310b96acf74e06e3
--- /dev/null
+++ b/views/EN/project/mailinglists.pug
@@ -0,0 +1,61 @@
+html(lang="en")
+  head
+    title= "Mailinglisten"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+  body
+    <hr />
+    div()
+        h5(align="left") Aktive Mailinglisten
+        div(class="flex-container" style="align-items:flex-start")
+            div(class="table")
+                table(border="0" id="listtable" class="table table-striped")
+                    thead
+                        tr
+                            th Name
+                            th Link
+                            th zugeh. Projekt
+                    tbody
+                        for item in mailinglists
+                            if item.projectstatus == '1'
+                                tr
+                                    td #{item.name}
+                                    td <a href="#{item.src}">#{item.src}</a>
+                                    td <a href='projectoverview?projectID=#{item.id}'>#{item.project_title}</a>
+    <hr />
+    div()
+        h5(align="left") Eintragung in Mailingliste
+        p() Wenn Sie sich in eine Mailingliste eintragen wollen, folgen Sie folgender Anleitung:
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    if isUserAuthenticated
+        script(src="/js/headfootLogout.js")
+    else
+        script(src="https://transfer.hft-stuttgart.de/js/headfoot.js")
\ No newline at end of file
diff --git a/views/EN/project/projects.pug b/views/EN/project/projects.pug
new file mode 100644
index 0000000000000000000000000000000000000000..56f65c10de4655b786ec93a865b6e57adc5f5e10
--- /dev/null
+++ b/views/EN/project/projects.pug
@@ -0,0 +1,117 @@
+doctype html
+html(lang="de")
+  head
+    title= "Project List"
+    meta(charset="UTF-8")
+    meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
+    link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
+    link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
+    style.
+        .collapse {
+            display: none;
+        }
+        .collapse.in {
+            display: block;
+        }
+        .collapsing {
+            position: relative;
+            height: 0;
+            overflow: hidden;
+            -webkit-transition-timing-function: ease;
+            -o-transition-timing-function: ease;
+            transition-timing-function: ease;
+            -webkit-transition-duration: .35s;
+            -o-transition-duration: .35s;
+            transition-duration: .35s;
+            -webkit-transition-property: height,visibility;
+            -o-transition-property: height,visibility;
+            transition-property: height,visibility;
+        }
+        .warning {
+            color: red;
+            font-size: 11px;
+        }
+  body
+    div(class="container-fluid")
+        if isUserAuthenticated
+            p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte.
+            a(href="/addprojectoverview" class="btn btn-primary" role="button" aria-pressed="true") Projekt anlegen
+        else
+            p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte.
+            p Möchten Sie ein neues Projekt anlegen, dann klicken Sie bitte auf #[a(href="/addprojectoverview") Anmelden und Projekt anlegen]
+        if successes
+            for success in successes
+                div.alert.alert-success.alert-dismissible #{ success }
+                    a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
+        // Active projects
+        h3(class="mb-3 font-weight-bold") Aktive Projekte
+        table(class="table table-striped")
+            thead
+                tr
+                    th Logo
+                    th Akronym
+                    th Title
+                    th Kernziel
+                    th Kategorie
+                    th Ansprechpartner
+                    th Projektinhalte
+            tbody
+                for item in active
+                    tr
+                        //td #{item.status}
+                        td
+                            img(src=item.logo, width="40", height="40")
+                        td #{item.akronym}
+                        td #{item.title}
+                        td #{item.summary}
+                        td #{item.category}
+                        td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}]
+                        td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht]
+                            if item.gitlab
+                                a(class="nav-link", href=item.gitlab+"/tree/master") Projektdateien
+                                a(class="nav-link", href=item.gitlab+"/wikis/home") Projektwiki
+                            else
+                                a(class="nav-link", href="#") Projektdateien
+                                a(class="nav-link", href="#") Projektwiki
+        br
+        // Non-active projects
+        h3(class="mb-3 font-weight-bold") Abgeschlossene Projekte
+        table(class="table table-striped")
+            thead
+                tr
+                    th Logo
+                    th Akronym
+                    th Title
+                    th Kernziel
+                    th Kategorie
+                    th Ansprechpartner
+                    th Projektinhalte
+            tbody
+                for item in nonActive
+                    tr
+                        //td #{item.status}
+                        td
+                            img(src=item.logo, width="40", height="40")
+                        td #{item.akronym}
+                        td #{item.title}
+                        td #{item.summary}
+                        td #{item.category}
+                        td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}]
+                        td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht]
+                            if item.gitlab
+                                a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/tree/master") Projektdateien
+                                a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/wikis/home") Projektwiki
+                            else
+                                a(class="nav-link", href="#") Projektdateien
+                                a(class="nav-link", href="#") Projektwiki
+
+    // jQuery
+    script(src="https://code.jquery.com/jquery-3.3.1.min.js")
+    script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
+    // Bootstrap
+    script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
+    // Header
+    if isUserAuthenticated
+        script(src="/js/headfootLogout.js")
+    else
+        script(src="https://transfer.hft-stuttgart.de/js/headfoot.js")
\ No newline at end of file
diff --git a/views/TBD/profile-old.html b/views/TBD/profile-old.html
deleted file mode 100644
index 2b18262f1f30ea055746fa7961d965b74f1bced9..0000000000000000000000000000000000000000
--- a/views/TBD/profile-old.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-	    <title>User Profile</title>
-	    <meta charset="UTF-8"/>
-	    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
-	    <link rel="stylesheet" type="text/css" href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css" />
-	    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css" integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay" crossorigin="anonymous" />
-	    <style>
-			.collapse {
-				display: none;
-			}
-			.collapse.in {
-				display: block;
-			}
-			.collapsing {
-				position: relative;
-				height: 0;
-				overflow: hidden;
-				-webkit-transition-timing-function: ease;
-				-o-transition-timing-function: ease;
-				transition-timing-function: ease;
-				-webkit-transition-duration: .35s;
-				-o-transition-duration: .35s;
-				transition-duration: .35s;
-				-webkit-transition-property: height,visibility;
-				-o-transition-property: height,visibility;
-				transition-property: height,visibility;
-			}	    
-		</style>
-	</head>
-	
-	<body>
-		
-		<!-- CONTENT -->
-		<div class="container-fluid">
-		  <div class="row">
-		    <!-- https://getbootstrap.com/docs/4.3/components/navs/ -->
-		    <div class="col-3">
-		    	<h5>
-			    	<span id="fullname"></span>
-			    </h5>
-			    <div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical">
-			      <a class="nav-link" href="#" aria-selected="true">Profile</a>
-			      <a class="nav-link" href="/security" aria-selected="false">Security</a>
-			      <a class="nav-link" href="#" aria-selected="false">Services</a>
-			    </div>
-			  </div>
-		
-		    <div class="col-sm-9">
-				<form id="profileForm" method="POST" action="/updateProfile">
-		            <!-- p><input type="hidden" th:value="${id}"/></p -->
-		                	
-		            <table class="table table-borderless">
-						<tr>
-						    <th><label for="title">Title</label></th>
-						    <td><input id="inputTitle" name="inputTitle" type="text" placeholder="Title"></td> 
-						</tr>
-						<tr>
-						    <th><label for="firstname">Vorname</label></th>
-						    <td><input id="inputFirstname" name="inputFirstname" type="text" placeholder="Vorname" required></td>
-					    </tr>
-						<tr>
-						    <th><label for="lastname">Nachname</label></th>
-						    <td><input id="inputLastname" name="inputLastname" type="text" placeholder="Nachname" required></td>
-					    </tr>
-						<tr>
-						    <th><label for="email">Email</label></th>
-						    <td><input id="inputEmail" name="inputEmail" type="text" placeholder="Email" required></td>
-						</tr>
-						<tr>
-						    <th><label for="organisation">Unternehmen</label></th>
-						    <td><input id="inputOrganisation" name="inputOrganisation" type="text" placeholder="Unternehmen"></td>
-						</tr>
-					    <tr>
-							<th><label for="industry">Branche</label></th>
-						    <td><input id="inputIndustry" name="inputIndustry" type="text" placeholder="Branche"></td>
-						</tr>
-						<tr>
-							<th><label for="speciality">Fachgebiete</label></th>
-						    <td><input id="inputSpeciality" name="inputSpeciality" type="text" placeholder="Fachgebiete"></td>
-						</tr>
-					</table>
-						    
-					<p><input type="submit" class="btn btn-primary" value="Update"></p>   
-				</form>	      
-		    </div>
-		  </div>
-		</div>
-
-		<!-- jQuery -->
-		<!-- script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script -->
-		<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
-		<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
-		<!-- Bootstrap -->
-		<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
-		<!-- M4_LAB -->
-		<script src="/js/account.js"></script>
-		<script src="https://transfer.hft-stuttgart.de/js/headfoot.js"></script>
-		<script>
-		/*	$( document ).ready(function() {
-				console.log( "ready!" );
-				$.get( "/api/v1/profile", function(data) {
-					alert( "success: "+data );
-				})
-			}); */
-			$(function(){
-				$("#header").load("fragment/header.html"); 
-				$("#footer").load("fragment/footer.html"); 
-			});
-		</script> 
-	</body>
-</html>
\ No newline at end of file
diff --git a/views/TBD/profile-old.pug b/views/TBD/profile-old.pug
deleted file mode 100644
index 6f03f645812732855910916dae29e652e19e93de..0000000000000000000000000000000000000000
--- a/views/TBD/profile-old.pug
+++ /dev/null
@@ -1 +0,0 @@
-include profile.html
\ No newline at end of file
diff --git a/views/TBD/security-old.html b/views/TBD/security-old.html
deleted file mode 100644
index a47b1e56ed36b286b66b69f738953ccfe6217f8b..0000000000000000000000000000000000000000
--- a/views/TBD/security-old.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-	    <title>User Profile</title>
-	    <meta charset="UTF-8"/>
-	    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
-	    <link rel="stylesheet" type="text/css" href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css" />
-	    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css" integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay" crossorigin="anonymous" />
-	    <style>
-			.collapse {
-				display: none;
-			}
-			.collapse.in {
-				display: block;
-			}
-			.collapsing {
-				position: relative;
-				height: 0;
-				overflow: hidden;
-				-webkit-transition-timing-function: ease;
-				-o-transition-timing-function: ease;
-				transition-timing-function: ease;
-				-webkit-transition-duration: .35s;
-				-o-transition-duration: .35s;
-				transition-duration: .35s;
-				-webkit-transition-property: height,visibility;
-				-o-transition-property: height,visibility;
-				transition-property: height,visibility;
-			}	    
-		</style>
-	</head>
-	
-	<body>
-		
-		<!-- CONTENT -->
-		<div class="container-fluid">
-		  <div class="row">
-		    <!-- https://getbootstrap.com/docs/4.3/components/navs/ -->
-		    <div class="col-3">
-		    	<h5>
-			    	<span id="fullname"></span>
-			    </h5>
-			    <div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical">
-			      <a class="nav-link" href="/profile" aria-selected="true">Profile</a>
-			      <a class="nav-link" href="#" aria-selected="false">Security</a>
-			      <a class="nav-link" href="#" aria-selected="false">Services</a>
-			    </div>
-			</div>
-		
-		    <div class="col-sm-9">
-				<form method="post" class="needs-validation" action="/changePwd" novalidate>
-					<div class="form-group row">
-						<label for="currPwd">Current Password</label>
-						<input type="password" class="form-control" id="inputCurrPwd" name="inputCurrPwd" required>
-						<div class="invalid-feedback">Please fill in this field.</div>
-					</div>
-					<div class="form-group row">
-						<label for="newPwd">New Password</label>
-						<input type="password" class="form-control" id="inputNewPwd" name="inputNewPwd" required>
-						<div class="invalid-feedback">Please fill in this field.</div>
-					</div>
-					<div class="form-group row">
-						<label for="retype">Re-type New Password</label>
-						<input type="password" class="form-control" id="inputRetype" name="inputRetype" required>
-						<div class="invalid-feedback">Please fill in this field.</div>
-					</div>
-					<button type="submit" class="btn btn-primary">Submit</button>
-				</form>	      
-		    </div>
-		  </div>
-		</div>
-
-		<!-- jQuery -->
-		<!-- script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script -->
-		<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
-		<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
-		<!-- Bootstrap -->
-		<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
-		<!-- M4_LAB -->
-		<script src="/js/account.js"></script>
-		<script src="https://transfer.hft-stuttgart.de/js/headfoot.js"></script>
-		<script>
-		/*	$( document ).ready(function() {
-				console.log( "ready!" );
-				$.get( "/api/v1/profile", function(data) {
-					alert( "success: "+data );
-				})
-			}); */
-			$(function(){
-				$("#header").load("fragment/header.html"); 
-				$("#footer").load("fragment/footer.html"); 
-			});
-			// check input fields
-			'use strict';
-			window.addEventListener('load', function() {
-				// Fetch all the forms we want to apply custom Bootstrap validation styles to
-				var forms = document.getElementsByClassName('needs-validation');
-				// Loop over them and prevent submission
-				var validation = Array.prototype.filter.call(forms, function(form) {
-				form.addEventListener('submit', function(event) {
-					if (form.checkValidity() === false) {
-					event.preventDefault();
-					event.stopPropagation();
-					}
-					form.classList.add('was-validated');
-				}, false);
-				});
-			}, false);
-		</script> 
-	</body>
-</html>
\ No newline at end of file
diff --git a/views/TBD/security-old.pug b/views/TBD/security-old.pug
deleted file mode 100644
index e7c91985939e3f570090b0a31d616eaa506be7cb..0000000000000000000000000000000000000000
--- a/views/TBD/security-old.pug
+++ /dev/null
@@ -1 +0,0 @@
-include security.html
\ No newline at end of file
diff --git a/views/home.pug b/views/home.pug
deleted file mode 100644
index 2c704c1a0cb5152873ac1d62eddf25981c78874c..0000000000000000000000000000000000000000
--- a/views/home.pug
+++ /dev/null
@@ -1,12 +0,0 @@
-extends layout
-
-block content
-	if user !== null
-		h1 Hello, #{user.firstName}
-		a(href="/profile") Profile
-		br
-		a(href="/logout") Logout
-	else
-		h1 Welcome
-		br
-		a(href="/login") Login