From aeb317703c9c82edb7c4c7ecc5985eef62864c7c Mon Sep 17 00:00:00 2001
From: jazz <jazzxhunter@163.com>
Date: 星期二, 05 十二月 2023 19:41:21 +0800
Subject: [PATCH] update_202312051941_项目-治疗室屏幕web-切图v1

---
 src/icons/svg/user.svg                       |    1 
 src/icons/svg/eye.svg                        |    1 
 vue.config.js                                |   26 
 package-lock.json                            | 1384 ++++++++++++++++++++++---
 src/components/xio_customer_select/index.vue |   36 
 src/pages/login/getQueryObj.js               |   27 
 src/pages/room/list.vue                      |   15 
 src/icons/index.js                           |    9 
 src/icons/svg/safecode.svg                   |    1 
 src/utils/auth.js                            |   98 +
 src/icons/svgo.yml                           |   22 
 src/utils/fn.js                              |   44 
 src/components/xio_room_status_chg/index.vue |  118 ++
 src/config/index.js                          |   11 
 src/assets/login/logo.png                    |    0 
 .babelrc                                     |    2 
 src/icons/svg/password.svg                   |    1 
 src/pages/login/index.vue                    | 1030 +++++++++++++++++++
 config/index.js                              |   26 
 src/assets/login/login_left.png              |    0 
 src/components/SvgIcon/index.vue             |   62 +
 src/assets/login/login_right.png             |    0 
 src/router/index.js                          |    8 
 src/pages/room/detail.vue                    |   52 
 src/utils/validate.js                        |   20 
 src/assets/login/login_mid.png               |    0 
 src/main.js                                  |   15 
 build/webpack.base.conf.js                   |    4 
 src/assets/css/common.css                    |   16 
 src/icons/svg/eye-open.svg                   |    1 
 package.json                                 |    4 
 src/pages/login/g_mockData.js                |   69 +
 src/utils/element-ui-preprocessing.js        |   12 
 33 files changed, 2,888 insertions(+), 227 deletions(-)

diff --git a/.babelrc b/.babelrc
index d530c00..dca8ca9 100644
--- a/.babelrc
+++ b/.babelrc
@@ -8,7 +8,7 @@
     }],
     "stage-2"
   ],
-  "plugins": ["transform-vue-jsx", "transform-runtime"],
+  "plugins": ["transform-vue-jsx", "transform-runtime"], 
   "env": {
     "test": {
       "presets": ["env", "stage-2"]
diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js
index a07e683..371a0b4 100644
--- a/build/webpack.base.conf.js
+++ b/build/webpack.base.conf.js
@@ -64,6 +64,10 @@
           limit: 10000,
           name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
         }
+      },
+      {
+        test: /\.sass$/,
+        loaders: ['style', 'css', 'sass']
       }
     ]
   },
diff --git a/config/index.js b/config/index.js
index 782f223..6a3d140 100644
--- a/config/index.js
+++ b/config/index.js
@@ -3,7 +3,9 @@
 // see http://vuejs-templates.github.io/webpack for documentation.
 
 const path = require('path')
-
+function resolve(dir) {
+  return path.join(__dirname, dir)
+}
 module.exports = {
   dev: {
 
@@ -20,7 +22,8 @@
         }
       },
       '/api_test': { // 娴嬭瘯鐜
-        target: 'http://192.168.31.69:8080',
+        // target: 'http://192.168.31.69:8080',
+        target: 'https://test6.phiskin.com/phi_appt/', // 鏂伴绾�
         // target: 'http://hymctest.huoxiongit.com/',// 杩欎釜鏄綘鏈嶅姟鍣ㄥ紑鍚殑鎺ュ彛
         changeOrigin: true,// 鏄惁璺ㄥ煙
         pathRewrite: {
@@ -82,5 +85,24 @@
     // `npm run build --report`
     // Set to `true` or `false` to always turn it on or off
     bundleAnalyzerReport: process.env.npm_config_report
+  },
+  // 閰嶇疆浣跨敤stylus鍏ㄥ眬鍙橀噺
+  chainWebpack: config => {
+    // set svg-sprite-loader
+    config.module
+      .rule('svg')
+      .exclude.add(resolve('src/icons'))
+      .end()
+    config.module
+      .rule('icons')
+      .test(/\.svg$/)
+      .include.add(resolve('src/icons'))
+      .end()
+      .use('svg-sprite-loader')
+      .loader('svg-sprite-loader')
+      .options({
+        symbolId: 'icon-[name]'
+      })
+      .end()
   }
 }
diff --git a/package-lock.json b/package-lock.json
index d96515f..de3367c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,8 @@
       "dependencies": {
         "axios": "^0.19.2",
         "clipboard": "^2.0.6",
+        "element-ui": "^2.15.6",
+        "svg-sprite-loader": "^6.0.11",
         "vue": "^2.5.2",
         "vue-router": "^3.0.1",
         "vuex": "^3.5.1"
@@ -42,6 +44,7 @@
         "mockjs": "^1.1.0",
         "nightwatch": "^0.9.12",
         "node-notifier": "^5.1.2",
+        "node-sass": "^4.14.1",
         "optimize-css-assets-webpack-plugin": "^3.2.0",
         "ora": "^1.2.0",
         "portfinder": "^1.0.13",
@@ -51,6 +54,7 @@
         "postcss-url": "^7.2.1",
         "postcss-viewport-units": "^0.1.6",
         "rimraf": "^2.6.0",
+        "sass-loader": "^7.3.1",
         "selenium-server": "^3.0.1",
         "semver": "^5.3.0",
         "shelljs": "^0.7.6",
@@ -349,6 +353,12 @@
       "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
       "dev": true
     },
+    "node_modules/abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+      "dev": true
+    },
     "node_modules/accepts": {
       "version": "1.3.7",
       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
@@ -460,6 +470,15 @@
       "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
       "dev": true
     },
+    "node_modules/amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.2"
+      }
+    },
     "node_modules/ansi-escapes": {
       "version": "4.3.2",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -491,7 +510,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
       "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -500,7 +518,6 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
       "dependencies": {
         "color-convert": "^1.9.0"
       },
@@ -528,6 +545,16 @@
       "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
       "dev": true
     },
+    "node_modules/are-we-there-yet": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
+      "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
+      "dev": true,
+      "dependencies": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
     "node_modules/argparse": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -541,7 +568,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
       "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -550,7 +576,6 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
       "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -559,7 +584,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
       "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -621,7 +645,6 @@
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
       "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -700,7 +723,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
       "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -741,11 +763,28 @@
       "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
       "dev": true
     },
+    "node_modules/async-foreach": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+      "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==",
+      "dev": true,
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/async-limiter": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
       "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
       "dev": true
+    },
+    "node_modules/async-validator": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
+      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+      "dependencies": {
+        "babel-runtime": "6.x"
+      }
     },
     "node_modules/asynckit": {
       "version": "0.4.0",
@@ -757,7 +796,6 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
       "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true,
       "bin": {
         "atob": "bin/atob.js"
       },
@@ -1105,8 +1143,7 @@
     "node_modules/babel-helper-vue-jsx-merge-props": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
-      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==",
-      "dev": true
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
     },
     "node_modules/babel-helpers": {
       "version": "6.24.1",
@@ -1645,7 +1682,6 @@
       "version": "6.26.0",
       "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
       "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "dev": true,
       "dependencies": {
         "core-js": "^2.4.0",
         "regenerator-runtime": "^0.11.0"
@@ -1712,7 +1748,6 @@
       "version": "0.11.2",
       "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
       "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
       "dependencies": {
         "cache-base": "^1.0.1",
         "class-utils": "^0.3.5",
@@ -1730,7 +1765,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
       "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-      "dev": true,
       "dependencies": {
         "is-descriptor": "^1.0.0"
       },
@@ -1742,7 +1776,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
       "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -1754,7 +1787,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
       "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -1766,7 +1798,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
       "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
       "dependencies": {
         "is-accessor-descriptor": "^1.0.0",
         "is-data-descriptor": "^1.0.0",
@@ -1780,7 +1811,6 @@
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -1825,7 +1855,6 @@
       "version": "5.2.2",
       "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
       "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
-      "dev": true,
       "engines": {
         "node": "*"
       }
@@ -1850,11 +1879,22 @@
         "file-uri-to-path": "1.0.0"
       }
     },
+    "node_modules/block-stream": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+      "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "~2.0.0"
+      },
+      "engines": {
+        "node": "0.4 || >=0.5.8"
+      }
+    },
     "node_modules/bluebird": {
       "version": "3.7.2",
       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
-      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
-      "dev": true
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
     },
     "node_modules/bn.js": {
       "version": "5.1.3",
@@ -2195,7 +2235,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
       "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
       "dependencies": {
         "collection-visit": "^1.0.0",
         "component-emitter": "^1.2.1",
@@ -2318,10 +2357,24 @@
       "dev": true
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001113",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001113.tgz",
-      "integrity": "sha512-qMvjHiKH21zzM/VDZr6oosO6Ri3U0V2tC015jRXjOecwQCJtsU5zklTNTk31jQbIOP8gha0h1ccM/g0ECP+4BA==",
-      "dev": true
+      "version": "1.0.30001566",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz",
+      "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ]
     },
     "node_modules/caseless": {
       "version": "0.12.0",
@@ -2359,7 +2412,6 @@
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -2486,7 +2538,6 @@
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
       "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
       "dependencies": {
         "arr-union": "^3.1.0",
         "define-property": "^0.2.5",
@@ -2501,7 +2552,6 @@
       "version": "0.2.5",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
       "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -2590,6 +2640,29 @@
         "node": ">=0.8"
       }
     },
+    "node_modules/clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "dev": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/clone-deep/node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/co": {
       "version": "4.6.0",
       "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -2625,7 +2698,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
       "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
       "dependencies": {
         "map-visit": "^1.0.0",
         "object-visit": "^1.0.0"
@@ -2649,7 +2721,6 @@
       "version": "1.9.3",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
       "dependencies": {
         "color-name": "1.1.3"
       }
@@ -2657,8 +2728,7 @@
     "node_modules/color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
     },
     "node_modules/color-string": {
       "version": "0.3.0",
@@ -2722,8 +2792,7 @@
     "node_modules/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==",
-      "dev": true
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
     },
     "node_modules/compressible": {
       "version": "2.0.18",
@@ -2798,6 +2867,12 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
       "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true
+    },
+    "node_modules/console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
       "dev": true
     },
     "node_modules/consolidate": {
@@ -2879,7 +2954,6 @@
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
       "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -2925,7 +2999,6 @@
       "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
       "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
       "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
-      "dev": true,
       "hasInstallScript": true
     },
     "node_modules/core-util-is": {
@@ -3412,18 +3485,6 @@
         "type": "tidelift",
         "url": "https://tidelift.com/funding/github/npm/browserslist"
       }
-    },
-    "node_modules/cssnano-preset-advanced/node_modules/browserslist/node_modules/caniuse-lite": {
-      "version": "1.0.30001124",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001124.tgz",
-      "integrity": "sha512-zQW8V3CdND7GHRH6rxm6s59Ww4g/qGWTheoboW9nfeMg7sUoopIfKCcNZUjwYRCOrvereh3kwDpZj4VLQ7zGtA==",
-      "dev": true
-    },
-    "node_modules/cssnano-preset-advanced/node_modules/electron-to-chromium": {
-      "version": "1.3.564",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.564.tgz",
-      "integrity": "sha512-fNaYN3EtKQWLQsrKXui8mzcryJXuA0LbCLoizeX6oayG2emBaS5MauKjCPAvc29NEY4FpLHIUWiP+Y0Bfrs5dg==",
-      "dev": true
     },
     "node_modules/cssnano-preset-advanced/node_modules/postcss": {
       "version": "7.0.32",
@@ -4393,7 +4454,6 @@
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -4411,7 +4471,6 @@
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
       "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true,
       "engines": {
         "node": ">=0.10"
       }
@@ -4451,6 +4510,14 @@
       "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
       "dev": true
     },
+    "node_modules/deepmerge": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+      "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/define-properties": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -4467,7 +4534,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
       "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
       "dependencies": {
         "is-descriptor": "^1.0.2",
         "isobject": "^3.0.1"
@@ -4480,7 +4546,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
       "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -4492,7 +4557,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
       "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -4504,7 +4568,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
       "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
       "dependencies": {
         "is-accessor-descriptor": "^1.0.0",
         "is-data-descriptor": "^1.0.0",
@@ -4518,7 +4581,6 @@
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -4583,6 +4645,12 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
       "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
+    "node_modules/delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+      "dev": true
     },
     "node_modules/depd": {
       "version": "1.1.2",
@@ -4721,7 +4789,6 @@
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
       "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
-      "dev": true,
       "dependencies": {
         "domelementtype": "^2.0.1",
         "entities": "^2.0.0"
@@ -4730,8 +4797,7 @@
     "node_modules/dom-serializer/node_modules/domelementtype": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
-      "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
-      "dev": true
+      "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ=="
     },
     "node_modules/domain-browser": {
       "version": "1.2.0",
@@ -4746,23 +4812,25 @@
     "node_modules/domelementtype": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
-      "dev": true
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
     },
     "node_modules/domhandler": {
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
       "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
-      "dev": true,
       "dependencies": {
         "domelementtype": "1"
       }
+    },
+    "node_modules/domready": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz",
+      "integrity": "sha512-uIzsOJUNk+AdGE9a6VDeessoMCzF8RrZvJCX/W8QtyfgdR6Uofn/MvRonih3OtCO79b2VDzDOymuiABrQ4z3XA=="
     },
     "node_modules/domutils": {
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
       "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
-      "dev": true,
       "dependencies": {
         "dom-serializer": "0",
         "domelementtype": "1"
@@ -4824,10 +4892,26 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.3.533",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.533.tgz",
-      "integrity": "sha512-YqAL+NXOzjBnpY+dcOKDlZybJDCOzgsq4koW3fvyty/ldTmsb4QazZpOWmVvZ2m0t5jbBf7L0lIGU3BUipwG+A==",
+      "version": "1.4.603",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.603.tgz",
+      "integrity": "sha512-Dvo5OGjnl7AZTU632dFJtWj0uJK835eeOVQIuRcmBmsFsTNn3cL05FqOyHAfGQDIoHfLhyJ1Tya3PJ0ceMz54g==",
       "dev": true
+    },
+    "node_modules/element-ui": {
+      "version": "2.15.14",
+      "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.14.tgz",
+      "integrity": "sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==",
+      "dependencies": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "deepmerge": "^1.2.0",
+        "normalize-wheel": "^1.0.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "throttle-debounce": "^1.0.1"
+      },
+      "peerDependencies": {
+        "vue": "^2.5.17"
+      }
     },
     "node_modules/elliptic": {
       "version": "6.5.3",
@@ -4860,7 +4944,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
       "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-      "dev": true,
       "engines": {
         "node": ">= 4"
       }
@@ -4901,8 +4984,7 @@
     "node_modules/entities": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
-      "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
-      "dev": true
+      "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
     },
     "node_modules/errno": {
       "version": "0.1.7",
@@ -5058,9 +5140,9 @@
       }
     },
     "node_modules/escalade": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz",
-      "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
       "dev": true,
       "engines": {
         "node": ">=6"
@@ -5076,7 +5158,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true,
       "engines": {
         "node": ">=0.8.0"
       }
@@ -5558,7 +5639,6 @@
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
       "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
       "dependencies": {
         "debug": "^2.3.3",
         "define-property": "^0.2.5",
@@ -5576,7 +5656,6 @@
       "version": "0.2.5",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
       "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -5588,7 +5667,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
       "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
       "dependencies": {
         "is-extendable": "^0.1.0"
       },
@@ -5671,7 +5749,6 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
       "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
       "dependencies": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -5684,7 +5761,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
       "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-      "dev": true,
       "dependencies": {
         "is-plain-object": "^2.0.4"
       },
@@ -5710,7 +5786,6 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
       "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
       "dependencies": {
         "array-unique": "^0.3.2",
         "define-property": "^1.0.0",
@@ -5729,7 +5804,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
       "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-      "dev": true,
       "dependencies": {
         "is-descriptor": "^1.0.0"
       },
@@ -5741,7 +5815,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
       "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
       "dependencies": {
         "is-extendable": "^0.1.0"
       },
@@ -5753,7 +5826,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
       "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -5765,7 +5837,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
       "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -5777,7 +5848,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
       "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
       "dependencies": {
         "is-accessor-descriptor": "^1.0.0",
         "is-data-descriptor": "^1.0.0",
@@ -5791,7 +5861,6 @@
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -6080,7 +6149,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
       "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -6121,7 +6189,6 @@
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
       "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
       "dependencies": {
         "map-cache": "^0.2.2"
       },
@@ -6229,6 +6296,21 @@
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
+    "node_modules/fstream": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      },
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
     "node_modules/ftp": {
       "version": "0.3.10",
       "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
@@ -6267,16 +6349,72 @@
       "dev": true
     },
     "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/functional-red-black-tree": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
       "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
       "dev": true
+    },
+    "node_modules/gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
+      "dev": true,
+      "dependencies": {
+        "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"
+      }
+    },
+    "node_modules/gauge/node_modules/is-fullwidth-code-point": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+      "dev": true,
+      "dependencies": {
+        "number-is-nan": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/gauge/node_modules/string-width": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+      "dev": true,
+      "dependencies": {
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
+        "strip-ansi": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/gaze": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+      "dev": true,
+      "dependencies": {
+        "globule": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 4.0.0"
+      }
     },
     "node_modules/get-caller-file": {
       "version": "1.0.3",
@@ -6320,7 +6458,6 @@
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
       "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -6400,6 +6537,20 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/globule": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz",
+      "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==",
+      "dev": true,
+      "dependencies": {
+        "glob": "~7.1.1",
+        "lodash": "^4.17.21",
+        "minimatch": "~3.0.2"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
     "node_modules/good-listener": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
@@ -6409,9 +6560,9 @@
       }
     },
     "node_modules/graceful-fs": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
-      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
       "dev": true
     },
     "node_modules/graceful-readlink": {
@@ -6490,7 +6641,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
       "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
       "dependencies": {
         "ansi-regex": "^2.0.0"
       },
@@ -6502,7 +6652,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
       "engines": {
         "node": ">=4"
       }
@@ -6519,11 +6668,16 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+      "dev": true
+    },
     "node_modules/has-value": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
       "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
       "dependencies": {
         "get-value": "^2.0.6",
         "has-values": "^1.0.0",
@@ -6537,7 +6691,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
       "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
       "dependencies": {
         "is-number": "^3.0.0",
         "kind-of": "^4.0.0"
@@ -6550,7 +6703,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
       "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -6562,7 +6714,6 @@
       "version": "3.2.2",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
       "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -6574,7 +6725,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
       "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-      "dev": true,
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -6646,11 +6796,21 @@
         "minimalistic-assert": "^1.0.1"
       }
     },
+    "node_modules/hasown": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/he": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
-      "dev": true,
       "bin": {
         "he": "bin/he"
       }
@@ -6800,7 +6960,6 @@
       "version": "3.10.1",
       "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
       "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
-      "dev": true,
       "dependencies": {
         "domelementtype": "^1.3.1",
         "domhandler": "^2.3.0",
@@ -6813,14 +6972,12 @@
     "node_modules/htmlparser2/node_modules/entities": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
-      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
-      "dev": true
+      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
     },
     "node_modules/htmlparser2/node_modules/readable-stream": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
       "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "dev": true,
       "dependencies": {
         "inherits": "^2.0.3",
         "string_decoder": "^1.1.1",
@@ -6975,6 +7132,17 @@
       "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
       "dev": true
     },
+    "node_modules/image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+      "bin": {
+        "image-size": "bin/image-size.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/import-cwd": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
@@ -7037,6 +7205,18 @@
         "node": ">=0.8.19"
       }
     },
+    "node_modules/in-publish": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz",
+      "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==",
+      "dev": true,
+      "bin": {
+        "in-install": "in-install.js",
+        "in-publish": "in-publish.js",
+        "not-in-install": "not-in-install.js",
+        "not-in-publish": "not-in-publish.js"
+      }
+    },
     "node_modules/indent-string": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
@@ -7068,8 +7248,7 @@
     "node_modules/inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "node_modules/inquirer": {
       "version": "7.3.3",
@@ -7337,7 +7516,6 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
       "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -7376,8 +7554,7 @@
     "node_modules/is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
     },
     "node_modules/is-callable": {
       "version": "1.2.0",
@@ -7409,7 +7586,6 @@
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
       "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -7433,7 +7609,6 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
       "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
       "dependencies": {
         "is-accessor-descriptor": "^0.1.6",
         "is-data-descriptor": "^0.1.4",
@@ -7447,7 +7622,6 @@
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
       "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7465,7 +7639,6 @@
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
       "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7568,7 +7741,6 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
       "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7577,7 +7749,6 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -7676,7 +7847,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
       "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7707,8 +7877,7 @@
     "node_modules/isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
     },
     "node_modules/isexe": {
       "version": "2.0.0",
@@ -7720,7 +7889,6 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
       "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7734,8 +7902,7 @@
     "node_modules/js-base64": {
       "version": "2.6.4",
       "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
-      "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
-      "dev": true
+      "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ=="
     },
     "node_modules/js-tokens": {
       "version": "3.0.2",
@@ -7861,7 +8028,6 @@
       "version": "3.2.2",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
       "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -7962,7 +8128,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
       "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-      "dev": true,
       "dependencies": {
         "big.js": "^5.2.2",
         "emojis-list": "^3.0.0",
@@ -7976,7 +8141,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
       "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-      "dev": true,
       "dependencies": {
         "minimist": "^1.2.0"
       },
@@ -8279,7 +8443,6 @@
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
       "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -8297,7 +8460,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
       "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
       "dependencies": {
         "object-visit": "^1.0.0"
       },
@@ -8500,6 +8662,17 @@
       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
       "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
       "dev": true
+    },
+    "node_modules/merge-options": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz",
+      "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==",
+      "dependencies": {
+        "is-plain-obj": "^1.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
     },
     "node_modules/methods": {
       "version": "1.1.2",
@@ -8728,8 +8901,7 @@
     "node_modules/minimist": {
       "version": "1.2.5",
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
     },
     "node_modules/mississippi": {
       "version": "2.0.0",
@@ -8752,11 +8924,15 @@
         "node": ">=4.0.0"
       }
     },
+    "node_modules/mitt": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.2.tgz",
+      "integrity": "sha512-3btxP0O9iGADGWAkteQ8mzDtEspZqu4I32y4GZYCV5BrwtzdcRpF4dQgNdJadCrbBx7Lu6Sq9AVrerMHR0Hkmw=="
+    },
     "node_modules/mixin-deep": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
       "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
       "dependencies": {
         "for-in": "^1.0.2",
         "is-extendable": "^1.0.1"
@@ -8769,7 +8945,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
       "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-      "dev": true,
       "dependencies": {
         "is-plain-object": "^2.0.4"
       },
@@ -8963,17 +9138,15 @@
       "dev": true
     },
     "node_modules/nan": {
-      "version": "2.14.1",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
-      "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
-      "dev": true,
-      "optional": true
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz",
+      "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==",
+      "dev": true
     },
     "node_modules/nanomatch": {
       "version": "1.2.13",
       "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
       "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
       "dependencies": {
         "arr-diff": "^4.0.0",
         "array-unique": "^0.3.2",
@@ -8995,7 +9168,6 @@
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -9103,6 +9275,41 @@
         "node": ">= 4.5.0"
       }
     },
+    "node_modules/node-gyp": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+      "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+      "dev": true,
+      "dependencies": {
+        "fstream": "^1.0.0",
+        "glob": "^7.0.3",
+        "graceful-fs": "^4.1.2",
+        "mkdirp": "^0.5.0",
+        "nopt": "2 || 3",
+        "npmlog": "0 || 1 || 2 || 3 || 4",
+        "osenv": "0",
+        "request": "^2.87.0",
+        "rimraf": "2",
+        "semver": "~5.3.0",
+        "tar": "^2.0.0",
+        "which": "1"
+      },
+      "bin": {
+        "node-gyp": "bin/node-gyp.js"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/node-gyp/node_modules/semver": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+      "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
     "node_modules/node-libs-browser": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
@@ -9159,6 +9366,94 @@
       "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==",
       "dev": true
     },
+    "node_modules/node-sass": {
+      "version": "4.14.1",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
+      "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
+      "dev": true,
+      "hasInstallScript": true,
+      "dependencies": {
+        "async-foreach": "^0.1.3",
+        "chalk": "^1.1.1",
+        "cross-spawn": "^3.0.0",
+        "gaze": "^1.0.0",
+        "get-stdin": "^4.0.1",
+        "glob": "^7.0.3",
+        "in-publish": "^2.0.0",
+        "lodash": "^4.17.15",
+        "meow": "^3.7.0",
+        "mkdirp": "^0.5.1",
+        "nan": "^2.13.2",
+        "node-gyp": "^3.8.0",
+        "npmlog": "^4.0.0",
+        "request": "^2.88.0",
+        "sass-graph": "2.2.5",
+        "stdout-stream": "^1.4.0",
+        "true-case-path": "^1.0.2"
+      },
+      "bin": {
+        "node-sass": "bin/node-sass"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/node-sass/node_modules/ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/node-sass/node_modules/chalk": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+      "dev": true,
+      "dependencies": {
+        "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"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/node-sass/node_modules/cross-spawn": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+      "integrity": "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^4.0.1",
+        "which": "^1.2.9"
+      }
+    },
+    "node_modules/node-sass/node_modules/supports-color": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+      "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/nopt": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+      "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
+      "dev": true,
+      "dependencies": {
+        "abbrev": "1"
+      },
+      "bin": {
+        "nopt": "bin/nopt.js"
+      }
+    },
     "node_modules/normalize-package-data": {
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@@ -9204,6 +9499,11 @@
         "node": ">=4"
       }
     },
+    "node_modules/normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
+    },
     "node_modules/npm-run-path": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@@ -9214,6 +9514,18 @@
       },
       "engines": {
         "node": ">=4"
+      }
+    },
+    "node_modules/npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "dev": true,
+      "dependencies": {
+        "are-we-there-yet": "~1.1.2",
+        "console-control-strings": "~1.1.0",
+        "gauge": "~2.7.3",
+        "set-blocking": "~2.0.0"
       }
     },
     "node_modules/nth-check": {
@@ -9253,7 +9565,6 @@
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
       "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -9262,7 +9573,6 @@
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
       "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
       "dependencies": {
         "copy-descriptor": "^0.1.0",
         "define-property": "^0.2.5",
@@ -9276,7 +9586,6 @@
       "version": "0.2.5",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
       "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -9322,7 +9631,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
       "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
       "dependencies": {
         "isobject": "^3.0.0"
       },
@@ -9365,7 +9673,6 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
       "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -9610,6 +9917,16 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+      "dev": true,
+      "dependencies": {
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.0"
+      }
+    },
     "node_modules/p-finally": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -9783,7 +10100,6 @@
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
       "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -9974,7 +10290,6 @@
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
       "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -9983,7 +10298,6 @@
       "version": "6.0.23",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
       "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
-      "dev": true,
       "dependencies": {
         "chalk": "^2.4.1",
         "source-map": "^0.6.1",
@@ -12219,6 +12533,14 @@
         "node": ">=0.8.0"
       }
     },
+    "node_modules/postcss-prefix-selector": {
+      "version": "1.16.0",
+      "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz",
+      "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==",
+      "peerDependencies": {
+        "postcss": ">4 <9"
+      }
+    },
     "node_modules/postcss-px-to-viewport-opt": {
       "version": "0.0.4",
       "resolved": "https://registry.npmjs.org/postcss-px-to-viewport-opt/-/postcss-px-to-viewport-opt-0.0.4.tgz",
@@ -12964,6 +13286,65 @@
         "node": ">=0.8.0"
       }
     },
+    "node_modules/posthtml": {
+      "version": "0.9.2",
+      "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz",
+      "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==",
+      "dependencies": {
+        "posthtml-parser": "^0.2.0",
+        "posthtml-render": "^1.0.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/posthtml-parser": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz",
+      "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==",
+      "dependencies": {
+        "htmlparser2": "^3.8.3",
+        "isobject": "^2.1.0"
+      }
+    },
+    "node_modules/posthtml-parser/node_modules/isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+      "dependencies": {
+        "isarray": "1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/posthtml-rename-id": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz",
+      "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==",
+      "dependencies": {
+        "escape-string-regexp": "1.0.5"
+      }
+    },
+    "node_modules/posthtml-render": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz",
+      "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/posthtml-svg-mode": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz",
+      "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==",
+      "dependencies": {
+        "merge-options": "1.0.1",
+        "posthtml": "^0.9.2",
+        "posthtml-parser": "^0.2.1",
+        "posthtml-render": "^1.0.6"
+      }
+    },
     "node_modules/prelude-ls": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -13169,7 +13550,6 @@
       "version": "4.3.4",
       "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
       "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
-      "dev": true,
       "dependencies": {
         "object-assign": "^4.1.0",
         "strict-uri-encode": "^1.0.0"
@@ -13400,8 +13780,7 @@
     "node_modules/regenerator-runtime": {
       "version": "0.11.1",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
-      "dev": true
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
     },
     "node_modules/regenerator-transform": {
       "version": "0.10.1",
@@ -13418,7 +13797,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
       "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
       "dependencies": {
         "extend-shallow": "^3.0.2",
         "safe-regex": "^1.1.0"
@@ -13522,7 +13900,6 @@
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
       "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -13531,7 +13908,6 @@
       "version": "1.6.1",
       "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
       "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-      "dev": true,
       "engines": {
         "node": ">=0.10"
       }
@@ -13610,6 +13986,11 @@
       "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
       "dev": true
     },
+    "node_modules/resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
     "node_modules/resolve": {
       "version": "1.17.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
@@ -13647,8 +14028,7 @@
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
       "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "deprecated": "https://github.com/lydell/resolve-url#deprecated",
-      "dev": true
+      "deprecated": "https://github.com/lydell/resolve-url#deprecated"
     },
     "node_modules/restore-cursor": {
       "version": "2.0.0",
@@ -13667,7 +14047,6 @@
       "version": "0.1.15",
       "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
       "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true,
       "engines": {
         "node": ">=0.12"
       }
@@ -13757,14 +14136,12 @@
     "node_modules/safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
     },
     "node_modules/safe-regex": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
       "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
       "dependencies": {
         "ret": "~0.1.10"
       }
@@ -13774,6 +14151,237 @@
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
       "dev": true
+    },
+    "node_modules/sass-graph": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
+      "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.0.0",
+        "lodash": "^4.0.0",
+        "scss-tokenizer": "^0.2.3",
+        "yargs": "^13.3.2"
+      },
+      "bin": {
+        "sassgraph": "bin/sassgraph"
+      }
+    },
+    "node_modules/sass-graph/node_modules/ansi-regex": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-graph/node_modules/camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-graph/node_modules/cliui": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^3.1.0",
+        "strip-ansi": "^5.2.0",
+        "wrap-ansi": "^5.1.0"
+      }
+    },
+    "node_modules/sass-graph/node_modules/emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "dev": true
+    },
+    "node_modules/sass-graph/node_modules/find-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-graph/node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true,
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/sass-graph/node_modules/locate-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-graph/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/sass-graph/node_modules/p-locate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-graph/node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-graph/node_modules/require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+      "dev": true
+    },
+    "node_modules/sass-graph/node_modules/string-width": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^7.0.1",
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-graph/node_modules/strip-ansi": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-graph/node_modules/wrap-ansi": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.0",
+        "string-width": "^3.0.0",
+        "strip-ansi": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-graph/node_modules/yargs": {
+      "version": "13.3.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+      "dev": true,
+      "dependencies": {
+        "cliui": "^5.0.0",
+        "find-up": "^3.0.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^3.0.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^13.1.2"
+      }
+    },
+    "node_modules/sass-graph/node_modules/yargs-parser": {
+      "version": "13.1.2",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+      "dev": true,
+      "dependencies": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      }
+    },
+    "node_modules/sass-loader": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz",
+      "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==",
+      "dev": true,
+      "dependencies": {
+        "clone-deep": "^4.0.1",
+        "loader-utils": "^1.0.1",
+        "neo-async": "^2.5.0",
+        "pify": "^4.0.1",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">= 6.9.0"
+      },
+      "peerDependencies": {
+        "webpack": "^3.0.0 || ^4.0.0"
+      }
+    },
+    "node_modules/sass-loader/node_modules/pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sass-loader/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
     },
     "node_modules/sax": {
       "version": "1.2.4",
@@ -13816,6 +14424,28 @@
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
       "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
       "dev": true
+    },
+    "node_modules/scss-tokenizer": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+      "integrity": "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==",
+      "dev": true,
+      "dependencies": {
+        "js-base64": "^2.1.8",
+        "source-map": "^0.4.2"
+      }
+    },
+    "node_modules/scss-tokenizer/node_modules/source-map": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+      "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
+      "dev": true,
+      "dependencies": {
+        "amdefine": ">=0.0.4"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
     },
     "node_modules/select": {
       "version": "1.1.2",
@@ -13961,7 +14591,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
       "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-      "dev": true,
       "dependencies": {
         "extend-shallow": "^2.0.1",
         "is-extendable": "^0.1.1",
@@ -13976,7 +14605,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
       "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
       "dependencies": {
         "is-extendable": "^0.1.0"
       },
@@ -14007,6 +14635,27 @@
       },
       "bin": {
         "sha.js": "bin.js"
+      }
+    },
+    "node_modules/shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shallow-clone/node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
     "node_modules/shebang-command": {
@@ -14055,9 +14704,9 @@
       "dev": true
     },
     "node_modules/signal-exit": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
       "dev": true
     },
     "node_modules/simple-swizzle": {
@@ -14112,7 +14761,6 @@
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
       "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
       "dependencies": {
         "base": "^0.11.1",
         "debug": "^2.2.0",
@@ -14131,7 +14779,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
       "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
       "dependencies": {
         "define-property": "^1.0.0",
         "isobject": "^3.0.0",
@@ -14145,7 +14792,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
       "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-      "dev": true,
       "dependencies": {
         "is-descriptor": "^1.0.0"
       },
@@ -14157,7 +14803,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
       "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -14169,7 +14814,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
       "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -14181,7 +14825,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
       "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
       "dependencies": {
         "is-accessor-descriptor": "^1.0.0",
         "is-data-descriptor": "^1.0.0",
@@ -14195,7 +14838,6 @@
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -14204,7 +14846,6 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
       "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
       "dependencies": {
         "kind-of": "^3.2.0"
       },
@@ -14216,7 +14857,6 @@
       "version": "0.2.5",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
       "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -14228,7 +14868,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
       "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
       "dependencies": {
         "is-extendable": "^0.1.0"
       },
@@ -14240,7 +14879,6 @@
       "version": "0.5.7",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
       "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -14335,7 +14973,6 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -14345,7 +14982,6 @@
       "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
       "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
       "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
-      "dev": true,
       "dependencies": {
         "atob": "^2.1.2",
         "decode-uri-component": "^0.2.0",
@@ -14376,8 +15012,7 @@
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
       "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
-      "dev": true
+      "deprecated": "See https://github.com/lydell/source-map-url#deprecated"
     },
     "node_modules/spdx-correct": {
       "version": "3.1.1",
@@ -14491,7 +15126,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
       "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
       "dependencies": {
         "extend-shallow": "^3.0.0"
       },
@@ -14556,7 +15190,6 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
       "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
       "dependencies": {
         "define-property": "^0.2.5",
         "object-copy": "^0.1.0"
@@ -14569,7 +15202,6 @@
       "version": "0.2.5",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
       "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -14584,6 +15216,15 @@
       "dev": true,
       "engines": {
         "node": ">= 0.6"
+      }
+    },
+    "node_modules/stdout-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+      "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
+      "dev": true,
+      "dependencies": {
+        "readable-stream": "^2.0.1"
       }
     },
     "node_modules/stream-browserify": {
@@ -14629,7 +15270,6 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
       "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -14638,7 +15278,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
       "dependencies": {
         "safe-buffer": "~5.1.0"
       }
@@ -14707,7 +15346,6 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
       "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "dev": true,
       "dependencies": {
         "ansi-regex": "^2.0.0"
       },
@@ -14844,12 +15482,310 @@
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
       "dependencies": {
         "has-flag": "^3.0.0"
       },
       "engines": {
         "node": ">=4"
+      }
+    },
+    "node_modules/svg-baker": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz",
+      "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==",
+      "dependencies": {
+        "bluebird": "^3.5.0",
+        "clone": "^2.1.1",
+        "he": "^1.1.1",
+        "image-size": "^0.5.1",
+        "loader-utils": "^1.1.0",
+        "merge-options": "1.0.1",
+        "micromatch": "3.1.0",
+        "postcss": "^5.2.17",
+        "postcss-prefix-selector": "^1.6.0",
+        "posthtml-rename-id": "^1.0",
+        "posthtml-svg-mode": "^1.0.3",
+        "query-string": "^4.3.2",
+        "traverse": "^0.6.6"
+      }
+    },
+    "node_modules/svg-baker-runtime": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmjs.org/svg-baker-runtime/-/svg-baker-runtime-1.4.7.tgz",
+      "integrity": "sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw==",
+      "dependencies": {
+        "deepmerge": "1.3.2",
+        "mitt": "1.1.2",
+        "svg-baker": "^1.7.0"
+      }
+    },
+    "node_modules/svg-baker-runtime/node_modules/deepmerge": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz",
+      "integrity": "sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dependencies": {
+        "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"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/chalk": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+      "dependencies": {
+        "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"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/chalk/node_modules/supports-color": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+      "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/svg-baker/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/has-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+      "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/is-accessor-descriptor": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+      "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
+      "dependencies": {
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/svg-baker/node_modules/is-data-descriptor": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+      "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
+      "dependencies": {
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/svg-baker/node_modules/is-descriptor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
+      "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/svg-baker/node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/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==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/micromatch": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz",
+      "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==",
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.2.2",
+        "define-property": "^1.0.0",
+        "extend-shallow": "^2.0.1",
+        "extglob": "^2.0.2",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^5.0.2",
+        "nanomatch": "^1.2.1",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/postcss": {
+      "version": "5.2.18",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+      "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+      "dependencies": {
+        "chalk": "^1.1.3",
+        "js-base64": "^2.1.9",
+        "source-map": "^0.5.6",
+        "supports-color": "^3.2.3"
+      },
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/svg-baker/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/supports-color": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+      "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
+      "dependencies": {
+        "has-flag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-sprite-loader": {
+      "version": "6.0.11",
+      "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.11.tgz",
+      "integrity": "sha512-TedsTf8wsHH6HgdwKjUveDZRC6q5gPloYV8A8/zZaRWP929J7x6TzQ6MvZFl+YYDJuJ0Akyuu/vNVJ+fbPuYXg==",
+      "dependencies": {
+        "bluebird": "^3.5.0",
+        "deepmerge": "1.3.2",
+        "domready": "1.0.8",
+        "escape-string-regexp": "1.0.5",
+        "loader-utils": "^1.1.0",
+        "svg-baker": "^1.5.0",
+        "svg-baker-runtime": "^1.4.7",
+        "url-slug": "2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/svg-sprite-loader/node_modules/deepmerge": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz",
+      "integrity": "sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==",
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
     "node_modules/svgo": {
@@ -14952,6 +15888,18 @@
         "node": ">=0.6"
       }
     },
+    "node_modules/tar": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
+      "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+      "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.",
+      "dev": true,
+      "dependencies": {
+        "block-stream": "*",
+        "fstream": "^1.0.12",
+        "inherits": "2"
+      }
+    },
     "node_modules/tcp-port-used": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz",
@@ -14983,6 +15931,14 @@
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
       "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "dev": true
+    },
+    "node_modules/throttle-debounce": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==",
+      "engines": {
+        "node": ">=4"
+      }
     },
     "node_modules/through": {
       "version": "2.3.8",
@@ -15075,7 +16031,6 @@
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
       "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -15087,7 +16042,6 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
       "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
       "dependencies": {
         "define-property": "^2.0.2",
         "extend-shallow": "^3.0.2",
@@ -15139,6 +16093,14 @@
         "node": ">=0.8"
       }
     },
+    "node_modules/traverse": {
+      "version": "0.6.7",
+      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz",
+      "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/trim-newlines": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
@@ -15155,6 +16117,15 @@
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
+      }
+    },
+    "node_modules/true-case-path": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+      "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.1.2"
       }
     },
     "node_modules/tryer": {
@@ -15338,11 +16309,18 @@
         "node": ">=0.8.0"
       }
     },
+    "node_modules/unidecode": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz",
+      "integrity": "sha512-SdoZNxCWpN2tXTCrGkPF/0rL2HEq+i2gwRG1ReBvx8/0yTzC3enHfugOf8A9JBShVwwrRIkLX0YcDUGbzjbVCA==",
+      "engines": {
+        "node": ">= 0.4.12"
+      }
+    },
     "node_modules/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==",
-      "dev": true,
       "dependencies": {
         "arr-union": "^3.1.0",
         "get-value": "^2.0.6",
@@ -15402,7 +16380,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
       "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
       "dependencies": {
         "has-value": "^0.3.1",
         "isobject": "^3.0.0"
@@ -15415,7 +16392,6 @@
       "version": "0.3.1",
       "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
       "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-      "dev": true,
       "dependencies": {
         "get-value": "^2.0.3",
         "has-values": "^0.1.4",
@@ -15429,7 +16405,6 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
       "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-      "dev": true,
       "dependencies": {
         "isarray": "1.0.0"
       },
@@ -15441,7 +16416,6 @@
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
       "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -15475,8 +16449,7 @@
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
       "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "deprecated": "Please see https://github.com/lydell/urix#deprecated",
-      "dev": true
+      "deprecated": "Please see https://github.com/lydell/urix#deprecated"
     },
     "node_modules/url": {
       "version": "0.11.0",
@@ -15520,6 +16493,14 @@
         "requires-port": "^1.0.0"
       }
     },
+    "node_modules/url-slug": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/url-slug/-/url-slug-2.0.0.tgz",
+      "integrity": "sha512-aiNmSsVgrjCiJ2+KWPferjT46YFKoE8i0YX04BlMVDue022Xwhg/zYlnZ6V9/mP3p8Wj7LEp0myiTkC/p6sxew==",
+      "dependencies": {
+        "unidecode": "0.1.8"
+      }
+    },
     "node_modules/url/node_modules/punycode": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
@@ -15530,7 +16511,6 @@
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
       "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -15547,8 +16527,7 @@
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
     },
     "node_modules/util.promisify": {
       "version": "1.0.1",
@@ -16774,6 +17753,15 @@
       "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
       "dev": true
     },
+    "node_modules/wide-align": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^1.0.2 || 2 || 3 || 4"
+      }
+    },
     "node_modules/window-size": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
diff --git a/package.json b/package.json
index 884b5ba..2456f98 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,8 @@
   "dependencies": {
     "axios": "^0.19.2",
     "clipboard": "^2.0.6",
+    "element-ui": "^2.15.6",
+    "svg-sprite-loader": "^6.0.11",
     "vue": "^2.5.2",
     "vue-router": "^3.0.1",
     "vuex": "^3.5.1"
@@ -47,6 +49,7 @@
     "mockjs": "^1.1.0",
     "nightwatch": "^0.9.12",
     "node-notifier": "^5.1.2",
+    "node-sass": "^4.14.1",
     "optimize-css-assets-webpack-plugin": "^3.2.0",
     "ora": "^1.2.0",
     "portfinder": "^1.0.13",
@@ -56,6 +59,7 @@
     "postcss-url": "^7.2.1",
     "postcss-viewport-units": "^0.1.6",
     "rimraf": "^2.6.0",
+    "sass-loader": "^7.3.1",
     "selenium-server": "^3.0.1",
     "semver": "^5.3.0",
     "shelljs": "^0.7.6",
diff --git a/src/assets/css/common.css b/src/assets/css/common.css
index 7601764..021caf0 100644
--- a/src/assets/css/common.css
+++ b/src/assets/css/common.css
@@ -43,7 +43,21 @@
 	align-items: center;
 	-webkit-align-items: center;
 }
-
+/* 姘村钩灞呬腑 */
+.flex-align-center{
+	justify-content: center;
+	-webkit-justify-content: center;
+}
+/* 姘村钩灞呭乏 */
+.flex-align-start{
+	justify-content: start;
+	-webkit-justify-content: start;
+}
+/* 姘村钩灞呭彸 */
+.flex-align-end{
+	justify-content: end;
+	-webkit-justify-content: end;
+}
 .flex-ver {-webkit-align-items: center;align-items: center;}
 .flex-col {-webkit-flex-flow: column;flex-flow: column;}
 .flex-end{
diff --git a/src/assets/login/login_left.png b/src/assets/login/login_left.png
new file mode 100644
index 0000000..596902f
--- /dev/null
+++ b/src/assets/login/login_left.png
Binary files differ
diff --git a/src/assets/login/login_mid.png b/src/assets/login/login_mid.png
new file mode 100644
index 0000000..c4d9c07
--- /dev/null
+++ b/src/assets/login/login_mid.png
Binary files differ
diff --git a/src/assets/login/login_right.png b/src/assets/login/login_right.png
new file mode 100644
index 0000000..f2cb600
--- /dev/null
+++ b/src/assets/login/login_right.png
Binary files differ
diff --git a/src/assets/login/logo.png b/src/assets/login/logo.png
new file mode 100644
index 0000000..299f4d7
--- /dev/null
+++ b/src/assets/login/logo.png
Binary files differ
diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..b07ded2
--- /dev/null
+++ b/src/components/SvgIcon/index.vue
@@ -0,0 +1,62 @@
+<template>
+  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
+  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
+    <use :xlink:href="iconName" />
+  </svg>
+</template>
+
+<script>
+// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
+import { isExternal } from '@/utils/validate'
+
+export default {
+  name: 'SvgIcon',
+  props: {
+    iconClass: {
+      type: String,
+      required: true
+    },
+    className: {
+      type: String,
+      default: ''
+    }
+  },
+  computed: {
+    isExternal() {
+      return isExternal(this.iconClass)
+    },
+    iconName() {
+      return `#icon-${this.iconClass}`
+    },
+    svgClass() {
+      if (this.className) {
+        return 'svg-icon ' + this.className
+      } else {
+        return 'svg-icon'
+      }
+    },
+    styleExternalIcon() {
+      return {
+        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
+        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.svg-icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+
+.svg-external-icon {
+  background-color: currentColor;
+  mask-size: cover!important;
+  display: inline-block;
+}
+</style>
diff --git a/src/components/xio_customer_select/index.vue b/src/components/xio_customer_select/index.vue
index 9ed82b5..4c6dfbe 100644
--- a/src/components/xio_customer_select/index.vue
+++ b/src/components/xio_customer_select/index.vue
@@ -1,6 +1,6 @@
 <template>
-  <div class="mask hide">
-    <div class="xio_customer_select_dialog">
+  <div v-if="isShow" class="mask" @click="hideDialog">
+    <div class="xio_customer_select_dialog" @click.stop="noop">
       <div class="title">鏄惁閫夋嫨瀹汉[寮犳��姘慮锛屼娇鐢ㄥ綋鍓嶆埧闂达紵</div>
       <div class="content flex flex-sb">
         <div class="tx flex-1" style="text-align: left;">鍖荤敓锛氬紶鎬�姘�</div>
@@ -12,8 +12,8 @@
       </div>
       <div class="btn_box flex flex-center">
         <div class="flex flex-ver">
-          <div class="btn_box__item flex flex-center">鍙栨秷</div>
-          <div class="btn_box__item flex flex-center">纭畾</div>
+          <div class="btn_box__item flex flex-center" @click="cancel">鍙栨秷</div>
+          <div class="btn_box__item flex flex-center" @click="submit">纭畾</div>
         </div>
       </div>
     </div>
@@ -31,12 +31,34 @@
   },
   data() {
     return {
-      isShow: false
+      isShow: false,
+      dialogData: {}
     }
   },
   methods: {
-    toggleClick() {
-      this.$emit('toggleClick')
+    // 鍙栨秷
+    cancel() {
+      this.$emit('cancel', {})
+    },
+    // 鎻愪氦
+    submit() {
+      this.$emit('submit', {})
+    },
+    noop() {
+      return
+    },
+    // 鏄剧ず寮圭獥
+    showDialog() {
+      this.isShow = true
+    },
+    // 鍏抽棴寮圭獥
+    hideDialog() {
+      this.isShow = false
+      this.dialogData = {}
+    },
+    // 鏁版嵁鍒濆鍖�
+    dataInit(data) {
+      this.dialogData = data
     }
   }
 }
diff --git a/src/components/xio_room_status_chg/index.vue b/src/components/xio_room_status_chg/index.vue
index 1e9034d..208e4d2 100644
--- a/src/components/xio_room_status_chg/index.vue
+++ b/src/components/xio_room_status_chg/index.vue
@@ -1,6 +1,40 @@
 <template>
-  <div class="mask">
-    <div class="xio_room_status_chg_dialog"></div>
+  <div v-if="isShow" class="mask" @click="hideDialog">
+    <div class="xio_room_status_chg_dialog" @click.stop="noop">
+      <div class="title">鍒濆鍖栨埧闂寸姸鎬侊紙鐐瑰嚮涓嬫柟鎸夐挳鐩存帴鏇存敼鎴块棿鐘舵�侊級</div>
+      <div class="btn_box flex flex-center">
+        <div style="width: 100%;">
+          <div class="line flex flex-ver flex-sb">
+            <div class="btn_box_item flex flex-center white" @click="changeStatus('绌洪棽')">
+              <div class="flex flex-ver">
+                <img class="icon" src="../../assets/img/free.png">
+                <div class="tx">绌洪棽</div>
+              </div>
+            </div>
+            <div class="btn_box_item flex flex-center blue" @click="changeStatus('浣跨敤涓�')">
+              <div class="flex flex-ver">
+                <img class="icon" src="../../assets/img/using.png">
+                <div class="tx white">浣跨敤涓�</div>
+              </div>
+            </div>
+          </div>
+          <div class="line flex flex-ver flex-sb">
+            <div class="btn_box_item flex flex-center yellow" @click="changeStatus('瀹汉浼戞伅')">
+              <div class="flex flex-ver">
+                <img class="icon" src="../../assets/img/rest.png">
+                <div class="tx">瀹汉浼戞伅</div>
+              </div>
+            </div>
+            <div class="btn_box_item flex flex-center gray" @click="changeStatus('閫氱煡鎵撴壂')">
+              <div class="flex flex-ver">
+                <img class="icon" src="../../assets/img/clear.png">
+                <div class="tx">閫氱煡鎵撴壂</div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
   </div>
 </template>
 
@@ -19,13 +53,87 @@
     }
   },
   methods: {
-    toggleClick() {
-      this.$emit('toggleClick')
+    noop() {
+      return
+    },
+    // 鏇存崲鐘舵��
+    changeStatus(tx) {
+      this.$emit('changeStatus', { statusTx: tx })
+    },
+    // 鏄剧ず寮圭獥
+    showDialog() {
+      this.isShow = true
+    },
+    // 鍏抽棴寮圭獥
+    hideDialog() {
+      this.isShow = false
     }
   }
 }
 </script>
 
 <style scoped>
-
+.xio_room_status_chg_dialog {
+  width: 1105px;
+  min-height: 602px;
+  border-radius: 10px;
+  background-color: rgba(255,255,255,1);
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  -webkit-transform: translate(-50%, -50%);
+  z-index: 1;
+}
+.xio_room_status_chg_dialog .title {
+  line-height: 37px;
+  color: rgba(16,16,16,1);
+  font-size: 26px;
+  text-align: left;
+  font-family: PingFangSC-medium;
+  padding: 37px 31px 16px 31px;
+}
+.xio_room_status_chg_dialog .btn_box {
+  padding: 0 193px;
+}
+.xio_room_status_chg_dialog .btn_box .line {
+  width: 100%;
+}
+.xio_room_status_chg_dialog .btn_box_item {
+  width: 250px;
+  height: 120px;
+  line-height: 20px;
+  border-radius: 10px;
+  text-align: center;
+  box-shadow: 0px 2px 6px 0px rgba(206,206,206,0.86);
+  margin-top: 76px;
+}
+.xio_room_status_chg_dialog .btn_box_item.white {
+  background-color: rgba(255,255,255,1);
+}
+.xio_room_status_chg_dialog .btn_box_item.blue {
+  background-color: rgba(46,77,124,1);
+}
+.xio_room_status_chg_dialog .btn_box_item.yellow {
+  background-color: rgba(255,199,115,1);
+}
+.xio_room_status_chg_dialog .btn_box_item.gray {
+  background-color: rgba(206,206,206,1);
+}
+.xio_room_status_chg_dialog .btn_box_item .icon {
+  width: 60px;
+  height: 60px;
+  display: block;
+  margin-right: 17px;
+}
+.xio_room_status_chg_dialog .btn_box_item .tx {
+  line-height: 37px;
+  color: rgba(51,51,51,1);
+  font-size: 26px;
+  text-align: center;
+  font-family: PingFangSC-medium;
+}
+.xio_room_status_chg_dialog .btn_box_item .tx.white {
+  color: #ffffff;
+}
 </style>
diff --git a/src/config/index.js b/src/config/index.js
index f7eb119..613e9f2 100644
--- a/src/config/index.js
+++ b/src/config/index.js
@@ -7,16 +7,21 @@
 
 import appId from './appid.js'
 
-var ismock = 1// 铏氭嫙鏁版嵁 0涓嶄娇鐢� 1浣跨敤
-var istest = 0// 0绾夸笂 1鏈湴 2娴嬭瘯鐜
+var ismock = 0// 铏氭嫙鏁版嵁 0涓嶄娇鐢� 1浣跨敤
+var istest = 2// 0绾夸笂 1鏈湴 2娴嬭瘯鐜
 var isConsole = 1// 鏄惁灞忚斀console 0灞忚斀 1寮�鏀�
 var debug = isConsole
 var isWxLoginType = 0 // 寰俊鐧诲綍 0鏃� 1闈欓粯寰俊鐧诲綍snsapi_base 2鎵嬪姩寰俊鐧诲綍snsapi_userinfo
+var isTestView = 1
+
+var localOnline = istest ? 0 : 1 // 鏈湴杩炵嚎涓�
 
 // 鎵撳寘鍚庣殑鐜
 if (process.env && process.env.NODE_ENV !== 'development') {
   istest = 0
   ismock = 0
+  isTestView = 0
+  localOnline = 0
 }
 
 const pdomain = '/' // 绾夸笂
@@ -74,6 +79,8 @@
 export default {
   ismock,
   istest,
+  isTestView,
+  localOnline,
   isWxLoginType,
   isConsole,
   debug,
diff --git a/src/icons/index.js b/src/icons/index.js
new file mode 100644
index 0000000..2c6b309
--- /dev/null
+++ b/src/icons/index.js
@@ -0,0 +1,9 @@
+import Vue from 'vue'
+import SvgIcon from '@/components/SvgIcon'// svg component
+
+// register globally
+Vue.component('svg-icon', SvgIcon)
+
+const req = require.context('./svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys().map(requireContext)
+requireAll(req)
diff --git a/src/icons/svg/eye-open.svg b/src/icons/svg/eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/src/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
\ No newline at end of file
diff --git a/src/icons/svg/eye.svg b/src/icons/svg/eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/src/icons/svg/eye.svg
@@ -0,0 +1 @@
+<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
\ No newline at end of file
diff --git a/src/icons/svg/password.svg b/src/icons/svg/password.svg
new file mode 100644
index 0000000..e291d85
--- /dev/null
+++ b/src/icons/svg/password.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>
\ No newline at end of file
diff --git a/src/icons/svg/safecode.svg b/src/icons/svg/safecode.svg
new file mode 100644
index 0000000..ae547af
--- /dev/null
+++ b/src/icons/svg/safecode.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="40px" height="40.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#00AFAA" d="M511.92574 1023.975247C357.959389 1023.975247 71.50029 794.49855 71.50029 577.448076V163.162251c0-10.049894 8.416167-18.16902 18.837362-18.379424l24.95146-0.420808c0.953007 0 98.766196-1.967898 199.599304-41.895185 103.481725-40.843164 170.179849-87.936569 170.885322-88.419261l14.691162-10.421195a19.86463 19.86463 0 0 1 11.398956-3.601625 19.480951 19.480951 0 0 1 11.324696 3.539741l14.975826 10.507832c0.680719 0.482692 67.440727 47.526591 170.798685 88.419262 100.932121 39.927287 198.74531 41.895185 199.747825 41.895184l24.753432 0.420809c10.433572 0.210404 18.824985 8.32953 18.824986 18.379423l0.210404 414.285825c0 217.02572-286.508606 446.527171-440.6111 446.527171z m372.625797-812.568556c-37.860375-2.846645-117.516921-12.624251-200.267646-45.385419-84.557726-33.417134-146.725972-71.005221-172.358151-87.602398-25.557919 16.535293-87.763295 54.135757-172.296268 87.602398-82.602205 32.686908-162.03597 42.464514-200.416167 45.385419v366.041385c0 170.216979 249.576484 378.281957 372.712435 378.281957 47.724618 0 140.723264-38.726745 232.137691-123.767163 88.12222-81.909108 140.723264-177.07368 140.723264-254.490041z m-407.948946 435.660414a33.305744 33.305744 0 0 1-23.899439 10.049894 33.738929 33.738929 0 0 1-23.998453-10.037517l-101.674724-102.330691a34.345388 34.345388 0 0 1 0-48.269193 33.664668 33.664668 0 0 1 47.935022 0l77.738155 78.183717 196.269967-197.69329a33.590408 33.590408 0 0 1 47.910269 0 34.18449 34.18449 0 0 1 0 48.269194z m0 0" /></svg>
\ No newline at end of file
diff --git a/src/icons/svg/user.svg b/src/icons/svg/user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/src/icons/svg/user.svg
@@ -0,0 +1 @@
+<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
\ No newline at end of file
diff --git a/src/icons/svgo.yml b/src/icons/svgo.yml
new file mode 100644
index 0000000..d11906a
--- /dev/null
+++ b/src/icons/svgo.yml
@@ -0,0 +1,22 @@
+# replace default config
+
+# multipass: true
+# full: true
+
+plugins:
+
+  # - name
+  #
+  # or:
+  # - name: false
+  # - name: true
+  #
+  # or:
+  # - name:
+  #     param1: 1
+  #     param2: 2
+
+- removeAttrs:
+    attrs:
+      - 'fill'
+      - 'fill-rule'
diff --git a/src/main.js b/src/main.js
index b5688cd..84fe861 100644
--- a/src/main.js
+++ b/src/main.js
@@ -2,9 +2,10 @@
 // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
 
 // 鐩存帴浠巆ore-js寮曞叆鍏ㄥ眬鐨刾olyfill
-import 'core-js/fn/promise';
+import 'core-js/fn/promise'
 
 import Vue from 'vue'
+import Element from 'element-ui'
 import App from './App'
 
 import router from './router' // 璺敱琛�
@@ -15,6 +16,12 @@
 import Req from './utils/jun_httpInstall' // http 璇锋眰
 import fn from './utils/g_fn_install'
 
+import 'element-ui/lib/theme-chalk/index.css'
+import 'element-ui/lib/theme-chalk/display.css'
+import '@/icons' // icon
+
+Vue.prototype.isTestView = config.isTestView
+
 Vue.config.productionTip = false
 
 Vue.config.devtools = config.devtools
@@ -23,7 +30,11 @@
   require('./mock.js')
 }
 Vue.config.productionTip = false
-// Vue.use(element)
+// 瑙e喅elementui涓嬫媺鎼滅储妗嗗湪ios涓婂敜涓嶈捣杞敭鐩�
+import ElementUI from '@/utils/element-ui-preprocessing'
+
+Vue.use(Element)
+Vue.use(ElementUI)
 Vue.use(Axios)
 Vue.use(filter)
 Vue.use(Req)
diff --git a/src/pages/login/g_mockData.js b/src/pages/login/g_mockData.js
new file mode 100644
index 0000000..9b9fb0b
--- /dev/null
+++ b/src/pages/login/g_mockData.js
@@ -0,0 +1,69 @@
+module.exports = {
+  // login: {
+  //   code: 100,
+  //   msg: '',
+  //   data: {
+  //     adminToken: 'mockdAmintoken', // 鐧诲綍鍑瘉
+  //     name: '娼樺鎷夌殑鑷槾', // 鐢ㄦ埛鍚嶇О
+  //     // arr: ['sys_admin_see'], // 鏉冮檺鍒楄〃
+  //     arr: ['sys_admin_see', 'sys_admin_add', 'sys_admin_edit', 'sys_admin_del', 'sys_admin_role_see',
+  //       'sys_admin_role_add', 'sys_admin_role_edit', 'sys_admin_role_del', 'corp_user_schedule_see',
+  //       'corp_user_schedule_add', 'corp_user_schedule_edit', 'corp_user_schedule_del', 'user_mp_banner_see',
+  //       'user_mp_banner_add', 'user_mp_banner_edit', 'user_mp_banner_del', 'shop_see', 'shop_add', 'shop_edit',
+  //       'shop_del', 'shop_device', 'corp_user_see', 'corp_user_add', 'corp_user_edit', 'corp_user_del',
+  //       'change_assistant_see', 'ser_pro_material_see', 'service_project_see', 'service_project_add',
+  //       'service_project_edit', 'service_project_del', 'service_topic_see', 'service_topic_add',
+  //       'service_topic_edit', 'service_topic_del', 'service_project_order_see', 'service_project_order_edit',
+  //       'goods_type_see', 'goods_type_add', 'goods_type_edit', 'goods_type_del', 'goods_see', 'goods_add', 'goods_edit',
+  //       'goods_del', 'goods_inventory', 'goods_order_see', 'goods_order_edit', 'goods_index_banner_see',
+  //       'goods_index_banner_add', 'goods_index_banner_edit', 'goods_index_banner_del', 'user_see', 'user_edit',
+  //       'user_cash_see', 'user_cash_edit', 'distribute_relate', 'distribute_order', 'document_edit', 'operation_see',
+  //       'coupon_see', 'coupon_add', 'coupon_edit', 'coupon_del', 'activity_see', 'activity_add', 'activity_edit', 'activity_del', 'system_set',
+  //       // 闂ㄥ簵
+  //       'shop_see', 'shop_add', 'shop_edit', 'shop_del', 'shop_time', 'shop_time', 'doctor_schedule',
+  //       // 椤鹃棶
+  //       'corp_user_see', 'corp_user_list', 'corp_user_add', 'corp_user_edit', 'corp_user_del',
+  //       // 椤鹃棶缁�
+  //       'corp_user_team_see', 'corp_user_team_add', 'corp_user_team_edit', 'corp_user_team_delete',
+  //       // 椤圭洰
+  //       'project_type', 'project_see', 'project_add', 'project_edit', 'project_del', 'project_device',
+  //       // 鎶ゅ+
+  //       'nurse_see', 'nurse_add', 'nurse_edit', 'nurse_del',
+  //       // 鎴块棿
+  //       'room_see', 'room_add', 'room_edit', 'room_del', 'room_project', 'room_schedule',
+  //       // 璁惧
+  //       'device_see', 'device_add', 'device_edit', 'device_del', 'device_no', 'device_schedule',
+  //       // 鍖荤敓
+  //       'doctor_see', 'doctor_add', 'doctor_edit', 'doctor_del', 'doctor_schedule',
+  //       // 鐢ㄦ埛
+  //       'user_see', 'user_add', 'user_edit', 'user_del',
+  //       // 鐢ㄦ埛鏉ユ簮
+  //       'user_from_see', 'user_from_add', 'user_from_edit', 'user_from_del',
+  //       // 棰勭害
+  //       'appointment_see', 'appointment_add', 'appointment_edit', 'appointment_add', 'appointment_edit'
+
+  //     ],
+  //     tel: '13113113111',
+  //     job: '宸ヤ綔浜哄憳',
+  //     role: '瓒呯骇绠$悊鍛�'
+  //   }
+  // },
+
+  scanLoginTest: {
+    'code': '100',
+    'msg': 'SUCCESS',
+    'data': {
+      'roleList': [
+        {
+          'roleId': '7c5d1244034611edaaa6525400b8510a',
+          'shopName': '闈欏畨搴�',
+          'roleName': '绯荤粺缁存姢鍛�',
+          'roleUniqueStr': 'admin',
+          'id': '138ef33f123511ed91d1525400b8510a',
+          'shopId': 'bb4e8a7d620d11ebb06bb8599f4cafbe'
+        }
+      ]
+    }
+  }
+
+}
diff --git a/src/pages/login/getQueryObj.js b/src/pages/login/getQueryObj.js
new file mode 100644
index 0000000..3d6d926
--- /dev/null
+++ b/src/pages/login/getQueryObj.js
@@ -0,0 +1,27 @@
+export function getQueryObj() {
+  let search = location.search.replace('?', '')
+  const obj = {}
+  if (!search) {
+    return obj
+  }
+  if (search.indexOf('&') > -1) {
+    search = search.split('&')
+  } else {
+    search = [search]
+  }
+
+  search.forEach(item => {
+    const [key, value] = item.split('=')
+    if (!obj[key]) {
+      obj[key] = value
+    } else {
+      if (obj[key] instanceof Array) {
+        obj[key].push(value)
+      } else {
+        obj[key] = [obj[key], value]
+      }
+    }
+  })
+
+  return obj
+}
diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue
new file mode 100644
index 0000000..f9ef4a6
--- /dev/null
+++ b/src/pages/login/index.vue
@@ -0,0 +1,1030 @@
+<template>
+  <div class="login-container flex flex-ver">
+    <div class="login-form">
+      <!-- <div class="title-container flex flex-ver mb20">
+        <img class="login_logo" src="../../assets/login/logo.png">
+        <h3 class="title">鑺欒壘棰勭害绠$悊绯荤粺</h3>
+        <div class="title ml10">鑺欒壘锛圥-HIS锛夊尰闄㈢鐞嗙郴缁�</div>
+        <h3 class="title ml10">鏄婅姖缁煎悎鍖荤枟杩愯惀绠$悊绯荤粺</h3>
+      </div> -->
+      <!-- 璐﹀彿鐧诲綍 -->
+      <div v-if="loginType===0">
+        <el-form ref="loginForm" :model="loginForm" :rules="loginRules" autocomplete="on" label-position="left">
+
+          <el-form-item prop="username">
+            <span class="svg-container">
+              <svg-icon icon-class="user" />
+            </span>
+            <el-input
+              ref="username"
+              v-model="loginForm.username"
+              placeholder="璇疯緭鍏ヨ处鍙�"
+              name="username"
+              type="text"
+              tabindex="1"
+              autocomplete="on"
+              @keyup.enter.native="handleLogin"
+            />
+          </el-form-item>
+
+          <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
+            <el-form-item prop="password">
+              <span class="svg-container">
+                <svg-icon icon-class="password" />
+              </span>
+              <el-input
+                :key="passwordType"
+                ref="password"
+                v-model="loginForm.password"
+                :type="passwordType"
+                placeholder="璇疯緭鍏ュ瘑鐮�"
+                name="password"
+                tabindex="2"
+                autocomplete="on"
+                @keyup.native="checkCapslock"
+                @blur="capsTooltip = false"
+                @keyup.enter.native="handleLogin"
+              />
+              <span class="show-pwd" @click="showPwd">
+                <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
+              </span>
+            </el-form-item>
+          </el-tooltip>
+
+          <div class="flex flex-start flex-sb">
+            <el-form-item prop="safecode" class="flex-1">
+              <span class="svg-container">
+                <svg-icon icon-class="safecode" />
+              </span>
+              <el-input
+                ref="safecode"
+                v-model="loginForm.safecode"
+                style="width: 70%"
+                placeholder="璇疯緭鍏ラ獙璇佺爜"
+                name="safecode"
+                type="text"
+                tabindex="3"
+                autocomplete="off"
+                @keyup.enter.native="handleLogin"
+              />
+              <el-image
+                v-if="isTestView"
+                class="safecode-img"
+                :src="safecodeImg"
+                fit="fill"
+                @click="getSafeCodeImg"
+              >
+                <div slot="error" class="image-slot">
+                  <i class="el-icon-picture-outline" />
+                </div>
+              </el-image>
+            </el-form-item>
+            <el-button v-if="!isTestView" class="ml10 mt5" :disabled="isShowCount" type="blackblue" @click="sendCode">
+              {{ isShowCount ? secondCount + '绉掑悗閲嶅彂' : '鍙戦�侀獙璇佺爜' }}
+            </el-button>
+          </div>
+
+          <!-- <el-form-item prop="safecode">
+            <span class="svg-container">
+              <svg-icon icon-class="safecode" />
+            </span>
+            <el-input
+              ref="safecode"
+              v-model="loginForm.safecode"
+              style="width: 60%"
+              placeholder="璇疯緭鍏ラ獙璇佺爜"
+              name="safecode"
+              type="text"
+              tabindex="3"
+              autocomplete="off"
+              @keyup.enter.native="handleLogin"
+            />
+            <el-image
+              class="safecode-img"
+              :src="safecodeImg"
+              fit="fill"
+              @click="getSafeCodeImg"
+            >
+              <div slot="error" class="image-slot">
+                <i class="el-icon-picture-outline" />
+              </div>
+            </el-image>
+          </el-form-item> -->
+
+        </el-form>
+
+        <div>
+          <el-button :loading="loading" type="blackblue" style="width:100%;margin-bottom:20px;border-radius: 22px;" @click.native.prevent="handleLogin">鐧诲綍</el-button>
+        </div>
+        <div>
+          <el-button v-if="!isTestView" :loading="loading" plain style="width:100%;border-radius: 22px;" @click="loginType=1">鍒囨崲鎵爜鐧诲綍</el-button>
+          <!-- <el-button v-else :loading="loading" plain style="width:100%;border-radius: 22px;" @click="simulateLogin">妯℃嫙鎵爜鐧诲綍</el-button> -->
+        </div>
+        <!-- 浼佷笟寰俊鐩存帴甯︿笂state鍜宑ode锛屾棤闇�鍐嶇敤鎸夐挳 -->
+        <!-- <div>
+          <el-button :loading="loading" plain style="width:100%;margin-top:20px;border-radius: 22px;" @click.native.prevent="handleWebLogin">缃戦〉鐧诲綍</el-button>
+        </div> -->
+      </div>
+      <!-- 鎵爜鐧诲綍 -->
+      <div v-if="loginType===1">
+        <!-- 鎵爜 -->
+        <div v-if="!show_role_list" id="wx_reg" class="flex flex-align-center" />
+        <!-- 鎵爜鍥炶皟鍚� -->
+        <div v-if="show_role_list">
+          <div class="role-list-title">璇烽�夋嫨瑙掕壊</div>
+          <div class="role-list flex flex-wrap" :class="{'block-list': roleList.length<=4}">
+            <!-- 20231117 long 鍔犱釜鍙屽嚮杩涘叆 -->
+            <div v-for="(item,index) in roleList" :key="index" class="item flex flex-ver" :class="{active:item.id == roleId}" @click="selectRole(item.id)" @dblclick="item.id == roleId?selectCodeLoginTest(roleId):noop()">
+              <div class="flex-1">
+                <div class="role-name ell">{{ item.roleName }}</div>
+                <div class="shop-name ell">{{ item.shopName }}</div>
+              </div>
+              <i class="el-icon-check" />
+            </div>
+          </div>
+          <div>
+            <el-button v-if="isTestView" :loading="loading" :disabled="!roleId" type="blackblue" style="width: 100%;margin-bottom:20px;border-radius: 22px;" @click.native.prevent="selectCodeLoginTest(roleId)">{{ roleId ? '椹笂鐧诲綍' : '閫夋嫨瑙掕壊鍚庣櫥褰�' }}</el-button>
+            <el-button v-else :loading="loading" :disabled="!roleId" type="blackblue" style="width: 100%;margin-bottom:20px;border-radius: 22px;" @click.native.prevent="selectCodeLogin(roleId)">{{ roleId ? '椹笂鐧诲綍' : '閫夋嫨瑙掕壊鍚庣櫥褰�' }}</el-button>
+          </div>
+          <div v-if="!isTestView">
+            <el-button type="blackblue" style="width: 100%;margin-bottom:20px;border-radius: 22px;" @click.native.prevent="scanAgain">閲嶆柊鎵爜<i class="el-icon-refresh-right el-icon--right" /></el-button>
+          </div>
+        </div>
+        <!-- <el-button :loading="loading" plain style="width:100%;border-radius: 22px;" @click="loginType=0">鍒囨崲璐﹀彿鐧诲綍<i class="el-icon-arrow-right el-icon--right" /></el-button> -->
+        <!-- <el-button :loading="loading" plain style="width:100%;border-radius: 22px;" @click="loginType=0">鍒囨崲鐧诲綍鏂瑰紡<i class="el-icon-arrow-right el-icon--right" /></el-button> -->
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+// 璁剧疆token鍜岀敤鎴锋暟鎹�
+import { setToken, setUserData } from '@/utils/auth' // get token from session
+// 鍩虹閰嶇疆 - 鑾峰彇褰撳墠鐜
+const baseConfig = require('../../config/index')
+// 鐧诲綍鎺ュ彛鐨� mockData
+const g_mockData = require('./g_mockData.js')
+// 鑾峰彇鍙傛暟鏂规硶
+import { getQueryObj } from '@/pages/login/getQueryObj'
+import Req from '../../utils/jun_httpInstall' // http 璇锋眰
+export default {
+  name: 'Login',
+  components: {},
+  data() {
+    const validateUsername = (rule, value, callback) => {
+      if (!value) {
+        callback(new Error('璇疯緭鍏ヨ处鍙�'))
+      } else {
+        callback()
+      }
+    }
+    const validatePassword = (rule, value, callback) => {
+      if (value ? value.length < 6 : !value) {
+        callback(new Error('瀵嗙爜涓嶈兘灏戜簬6浣�'))
+      } else {
+        callback()
+      }
+    }
+    const validateSafecode = (rule, value, callback) => {
+      if (!value) {
+        callback(new Error('璇疯緭鍏ラ獙璇佺爜'))
+      } else {
+        callback()
+      }
+    }
+    return {
+      // 褰撳墠鐧婚檰鐜
+      localOnline: baseConfig.localOnline, // 鏈湴杩炵嚎涓婏紙鍜宨sTestView涓�璧峰垽鏂級 20230619 long
+
+      loginForm: {
+        username: '',
+        password: '',
+        safecode: '',
+        checkedId: ''
+      },
+      loginRules: {
+        username: [{ required: true, trigger: 'blur', validator: validateUsername }],
+        password: [{ required: true, trigger: 'blur', validator: validatePassword }],
+        safecode: [{ required: true, trigger: 'blur', validator: validateSafecode }]
+      },
+      passwordType: 'password',
+      capsTooltip: false,
+      loading: false,
+      showDialog: false,
+      redirect: undefined,
+      otherQuery: {},
+      // 娴嬭瘯鏈嶇敤鍥剧墖楠岃瘉鐮�  绾夸笂鐢ㄥ彂閫佹墜鏈洪獙璇佺爜
+      safecodeImg: '',
+      secondCount: 0, // 绉�
+      telCode: '', // 鐭俊楠岃瘉鐮�
+      messageId: '', // 鍙戦�佹垚鍔�
+      isShowCount: false,
+      timer: null,
+
+      loginType: 0,
+
+      // 20230216 long 鐢ㄦ埛閲嶅畾鍚戦〉闈㈣瘑鍒櫥褰曠被鍨�
+      // 鎵爜鐧诲綍STATE_SCAN銆佺綉椤电櫥褰昑ATE_WEB
+      state: '',
+      STATE_SCAN: 'hx168',
+      STATE_WEB: 'hx168_web',
+
+      show_role_list: false, // 鏄剧ず閫夋嫨瑙掕壊
+      roleList: [],
+      roleId: '',
+      code: ''
+    }
+  },
+  watch: {
+    $route: {
+      handler: function(route) {
+        const query = route.query
+        if (query) {
+          this.redirect = query.redirect
+          this.otherQuery = this.getOtherQuery(query)
+        }
+      },
+      immediate: true
+    },
+
+    // 鍒囨崲loginType
+    loginType: {
+      handler(loginType) {
+        this.$nextTick(() => {
+          if (loginType === 1) {
+            if (baseConfig.ismock) {
+              // this.$messageWarn('鏈湴鐜璇蜂娇鐢ㄥ瘑鐮佺櫥褰�')
+              // this.loginType = 0
+            } else {
+              if (!this.show_role_list) {
+                if (!this.isTestView) this.initCodeLogin()
+              }
+            }
+          } else {
+            this.initLoginData()
+          }
+        })
+      },
+      immediate: true
+    }
+  },
+  mounted() {
+    this.init()
+  },
+  methods: {
+    init() {
+      this.loginType = this.isTestView ? 0 : 1
+      if (getQueryObj() && getQueryObj().loginType === '1') {
+        this.loginType = 1
+      }
+      if (this.$route.query.logout) {
+        // 娓呯┖浼佷笟寰俊鐧诲綍code
+        this.replaceNoCode()
+        return
+      }
+      if (this.$route.query.logout_603) {
+        // 娓呯┖浼佷笟寰俊鐧诲綍code锛屾竻绌簉edirect
+        this.replaceNoCodeNoRedirect()
+        return
+      }
+      const code = getQueryObj().code
+      if (code) {
+        this.state = getQueryObj().state
+        this.code = code
+        this.$nextTick(() => {
+          this.codeLogin(code)
+        })
+      }
+    },
+
+    // 娓呯┖浼佷笟寰俊鐧诲綍code
+    replaceNoCode() {
+      if (this.$route.query.isMiniprogram) { return }
+      window.location.replace('//' + window.location.host + window.location.pathname + '#/login?redirect=' + this.$route.query.redirect)
+    },
+
+    // 娓呯┖浼佷笟寰俊鐧诲綍code锛屾竻绌簉edirect
+    replaceNoCodeNoRedirect() {
+      if (this.$route.query.isMiniprogram) { return }
+      window.location.replace('//' + window.location.host + window.location.pathname + '#/login')
+    },
+
+    // 浼佷笟寰俊鎵爜鐧诲綍 - 鍒濆鍖�
+    initCodeLogin() {
+      // 娴嬭瘯
+      // this.selectCodeLogin(window.prompt('璇疯緭鍏ヨ鑹瞚d'))
+      // return
+
+      // 娴嬭瘯鍥炶皟
+      // this.wwLogin = new window.WwLogin({
+      //   'id': 'wx_reg',
+      //   'appid': 'wx23a7c266dcd048aa',
+      //   'agentid': '1000050',
+      //   'redirect_uri': 'http://test6.phiskin.com/assist/admin/employee/login/scanLogin',
+      //   'state': 'hx168',
+      //   'href': '',
+      //   'lang': 'zh'
+      // })
+
+      if (this.code) {
+        return
+      }
+
+      this.wwLogin = new window.WwLogin({
+        'id': 'wx_reg',
+        'appid': 'wx23a7c266dcd048aa',
+        'agentid': '1000050',
+        'redirect_uri': 'https://' + window.location.host + window.location.pathname,
+        // 'redirect_uri': 'http://serv3.phiskin.com/appointment/adminweb_v2/index.html',
+        // 'redirect_uri': 'http://test6.phiskin.com/adminwebV3/index.html', // 鏂扮増绠$悊绯荤粺
+        'state': this.STATE_SCAN,
+        'href': '',
+        'lang': 'zh'
+      })
+    },
+
+    scanAgain() {
+      this.code = ''
+      this.show_role_list = false
+      if (this.loginType === 1) {
+        this.$nextTick(() => {
+          this.initCodeLogin()
+        })
+      } else {
+        this.loginType = 1
+      }
+    },
+
+    // 缃戦〉鐧诲綍
+    handleWebLogin() {
+      let redirect_uri = 'https://' + window.location.host + window.location.pathname
+      redirect_uri = encodeURIComponent(redirect_uri)
+      const appid = 'wx23a7c266dcd048aa'
+      const response_type = 'code'
+      const scope = 'snsapi_base'
+      const state = this.STATE_WEB
+      const agentid = '1000050'
+
+      const loginUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=${response_type}&scope=${scope}&state=${state}&agentid=${agentid}#wechat_redirect`
+
+      window.location.replace(loginUrl)
+    },
+
+    // 鎵爜鐧诲綍鍥炶皟
+    codeLogin(code) {
+      const { state, STATE_SCAN, STATE_WEB } = this
+      let url = ''
+      if (state === STATE_SCAN) url = 'admin/employee/login/scanLogin'
+      if (state === STATE_WEB) url = 'admin/employee/login/webAuthLogin'
+
+      if (this.localOnline && this.isTestView) url = 'admin/employee/login/scanLogin' // 鏈湴杩炵嚎涓� 20230619 long
+
+      // state鍊间笉瀵癸紝閲嶆柊鐧诲綍
+      if (!url) {
+        this.$alert('鐧诲綍寮傚父锛岃閲嶆柊鐧诲綍', '鎻愮ず', {
+          confirmButtonText: '閲嶆柊鐧诲綍',
+          showClose: false,
+          callback: action => {
+            this.replaceNoCodeNoRedirect()
+          }
+        })
+        return
+      }
+
+      Req.http.post({
+        url: url,
+        udData: { noToken: true },
+        data: {
+          code, state
+        },
+        mockData: { 'code': '100', 'msg': 'SUCCESS', 'data': { 'roleList': [{ 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '椤鹃棶', 'shopName': '鏂板ぉ鍦板簵', 'employeeId': '', 'roleUniqueStr': 'adviser_leader', 'id': '82c1a5fe0a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': 'MIC', 'shopName': '鏂板ぉ鍦板簵', 'employeeId': '', 'roleUniqueStr': 'mic', 'id': '82c1ca2f0a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '鍖荤敓', 'shopName': '鏂板ぉ鍦板簵', 'employeeId': '', 'roleUniqueStr': 'doctor', 'id': '82c1eb980a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '鎶ゅ+', 'shopName': '鏂板ぉ鍦板簵', 'employeeId': '', 'roleUniqueStr': 'nurse', 'id': '82c20cde0a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '鍓嶅彴', 'shopName': '鏂板ぉ鍦板簵', 'employeeId': '', 'roleUniqueStr': 'reception', 'id': '82c22d150a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '搴楅暱', 'shopName': '鏂板ぉ鍦板簵', 'employeeId': '', 'roleUniqueStr': 'shopowner', 'id': '82c24da90a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '鎶ゅ+鍔╃悊', 'shopName': '鏂板ぉ鍦板簵', 'employeeId': '', 'roleUniqueStr': 'nurse_assistant', 'id': '82c26d510a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '鍖荤敓鍔╃悊', 'shopName': '鏂板ぉ鍦板簵', 'employeeId': '', 'roleUniqueStr': 'doctor_assistant', 'id': '82c28d7d0a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }], 'employeeId': '476051fc000711ecbbe230d0422e31b5' }}
+      }).then((inf) => {
+        // this.afterLogin(inf)
+        // 鏇存敼鏄剧ず鐧诲綍閫夐」
+        this.roleList = inf.roleList
+        this.show_role_list = true
+        // 鍒囨崲鐧诲綍妯″紡
+        this.loginType = 1
+      }).catch((res) => {
+        this.loading = false
+        this.code = '' // 娓呯┖鍏抽敭鍒ゆ柇
+        this.$messageError(res.msg)
+
+        // 鍘绘帀code鍙傛暟锛屽埛鏂伴〉闈�
+        setTimeout(() => {
+          this.replaceNoCodeNoRedirect()
+        }, 1500)
+      })
+    },
+
+    // 閫夋嫨瑙掕壊
+    selectRole(id) {
+      this.roleId = id
+    },
+    // 閫夋嫨瑙掕壊鍚庣櫥褰�
+    selectCodeLogin(roleId) {
+      if (!roleId) {
+        this.$messageWarn('缂哄皯閫夋嫨瑙掕壊id')
+        return
+      }
+      Req.http.post({
+        // 2022-06-23 鐧诲綍鏂版帴鍙�
+        url: 'admin/employee/login/selectLoginRoleNew',
+        // url: 'admin/employee/login/selectLoginRole',
+        udData: { noToken: true },
+        data: {
+          roleId
+        },
+        mockData: g_mockData.login
+      }).then((inf) => {
+        this.afterLogin(inf)
+      }).catch((res) => {
+        this.loading = false
+        this.$messageError(res.msg)
+      })
+    },
+
+    // 鍙戦�侀獙璇佺爜
+    sendCode() {
+      if (!this.loginForm.username) return this.$message.error('璇疯緭鍏ヨ处鍙�')
+      Req.http.post({
+        url: 'admin/employee/login/sendVerifyCode',
+        data: { account: this.loginForm.username },
+        mockData: {
+          code: 100,
+          msg: '',
+          data: {}
+        }
+      }).then((inf) => {
+        this.getCode()
+        this.$message.success('楠岃瘉鐮佸彂閫佹垚鍔�')
+      })
+    },
+    // 鍊掕鏃�
+    getCode() {
+      const times = 60 // 鍊掕鏃舵椂闂�
+      if (!this.timer) {
+        this.secondCount = times
+        this.isShowCount = true
+        this.timer = setInterval(() => {
+          if (this.secondCount > 0 && this.secondCount <= times) {
+            this.secondCount--
+          } else {
+            this.isShowCount = false
+            clearInterval(this.timer)
+            this.timer = null
+          }
+        }, 1000)
+      }
+    },
+
+    // 瀵嗙爜鐧诲綍 - 鍒濆鍖�
+    initLoginData() {
+      var loginData = localStorage.getItem('loginData')
+      // console.log(loginData)
+      // 鑾峰彇淇濆瓨鐨勮处鍙峰瘑鐮�
+      if (loginData) this.loginForm = JSON.parse(loginData)
+
+      if (this.loginForm.username === '') {
+        this.$refs.username && this.$refs.username.focus()
+      } else if (this.loginForm.password === '') {
+        this.$refs.password && this.$refs.password.focus()
+      } else if (this.loginForm.safecode === '') {
+        this.$refs.safecode && this.$refs.safecode.focus()
+      }
+      if (this.isTestView) this.getSafeCodeImg()
+    },
+
+    // 鏄惁澶у啓
+    checkCapslock(e) {
+      const { key } = e
+      this.capsTooltip = key && key.length === 1 && (key >= 'A' && key <= 'Z')
+    },
+
+    // 鍒囨崲瀵嗙爜鏄剧ず
+    showPwd() {
+      if (this.passwordType === 'password') {
+        this.passwordType = ''
+      } else {
+        this.passwordType = 'password'
+      }
+      this.$nextTick(() => {
+        this.$refs.password.focus()
+      })
+    },
+
+    // 鑾峰彇楠岃瘉鐮佸浘
+    getSafeCodeImg() {
+      var checkedId = this.getCheckedId()
+      Req.http.post({
+        url: 'admin/create/cheked',
+        data: { checkedId: checkedId },
+        udData: { noToken: true },
+        mockData: {
+          code: 100,
+          msg: '',
+          data: {
+            imgStr: 'xxxx'
+          }
+        }
+      }).then((inf) => {
+        this.safecodeImg = this.perfectSafeCode(inf.data.imgStr)
+        this.loginForm.checkedId = checkedId
+      })
+    },
+    // 琛ュ叏楠岃瘉鐮�
+    perfectSafeCode(img) {
+      if (!img) return
+      return `data:image/jpeg;base64,${img}`
+    },
+    // 鐧诲綍鍚庡洖璋�
+    afterLogin(inf) {
+      // 淇濆瓨鐧诲綍鍑瘉
+      setToken(inf.adminToken)
+
+      // 淇濆瓨璐﹀彿瀵嗙爜
+      var loginData = JSON.stringify({
+        username: this.loginForm.username.trim()
+      })
+      // password: this.loginForm.password.trim() // 20210322 long 鍙栨秷璁颁綇瀵嗙爜
+      localStorage.setItem('loginData', loginData)
+
+      sessionStorage.setItem('newAppTime', new Date()) //  瀛樺叆鏃堕棿 鐢ㄤ簬鑾峰彇鏂扮殑棰勭害鏁�
+
+      // 淇濆瓨鐢ㄦ埛鏁版嵁
+      setUserData(inf)
+
+      this.loading = false
+
+      // 鐧诲綍鎴愬姛璺宠浆椤甸潰
+      this.$messageSuc('鐧诲綍鎴愬姛')
+      setTimeout(() => {
+        // this.$router.push({ path: '/dashboard' })
+        this.$router.push({ path: this.redirect || '/dashboard', query: this.otherQuery })
+      }, 1000)
+    },
+    // 瀵嗙爜鐧诲綍
+    handleLogin() {
+      this.$refs.loginForm.validate(valid => {
+        if (valid) {
+          const { username, password, safecode, checkedId } = this.loginForm
+          const params = {
+            account: username.trim(),
+            password: password.trim(),
+            checkedCode: safecode.trim()
+          }
+          this.loading = true
+          // const url = this.isTestView ? 'admin/employee/login/accountLogin' : 'admin/loginNew'
+          const url = this.isTestView ? 'admin/employee/login/accountLogin' : 'admin/employee/login/accountLogin/v2'
+          if (this.isTestView) {
+            params.checkedId = checkedId
+          }
+          Req.http.post({
+            // url: 'admin/loginNew',
+            url,
+            data: params,
+            udData: { noToken: true },
+            // mockData: g_mockData.login
+            mockData: g_mockData.scanLoginTest
+          }).then((inf) => {
+            this.loading = false
+            this.loginType = 1
+            this.jumpToRoomList()
+            // this.show_role_list = true
+            // this.roleList = inf.roleList || []
+            /* if (this.isTestView) {
+              this.loading = false
+              this.loginType = 1
+              this.show_role_list = true
+              this.roleList = inf.roleList || []
+            } else {
+              this.afterLogin(inf)
+            } */
+          }).catch((res) => {
+            this.loading = false
+            this.$messageError(res.msg)
+          })
+        } else {
+          console.log('琛ㄥ崟楠岃瘉澶辫触')
+          return false
+        }
+      })
+    },
+    // 璺宠浆鎴块棿鍒楄〃
+    jumpToRoomList() {
+      this.$router.push({
+        path: `./room/list`
+      })
+    },
+    // 鑾峰彇route query瀵硅薄
+    getOtherQuery(query) {
+      return Object.keys(query).reduce((acc, cur) => {
+        if (cur !== 'redirect') {
+          acc[cur] = query[cur]
+        }
+        return acc
+      }, {})
+    },
+
+    // 娴嬭瘯鏈嶇櫥褰� 馃憞
+    // 娴嬭瘯鎵爜鐧诲綍
+    simulateLogin() {
+      this.loginType = 1
+      // 鑾峰彇鐢ㄦ埛缂撳瓨鏉冮檺淇℃伅
+      // const userData = JSON.parse(getUserData())
+      Req.http.post({
+        url: 'admin/employee/login/scanLoginTest',
+        data: {
+          employeeId: '476051fc000711ecbbe230d0422e31b5' // 榛勫槈鑽e憳宸d 476051fc000711ecbbe230d0422e31b5
+          // employeeId: '3eb10b540b2b11ecb06bb8599f4cafbe' // 榛勫槈鑽e憳宸d 3eb10b540b2b11ecb06bb8599f4cafbe - 鍜岀埛
+        },
+        mockData: g_mockData.scanLoginTest
+      }).then((res) => {
+        this.show_role_list = true
+        this.roleList = res.roleList || []
+      })
+    },
+
+    selectCodeLoginTest(id) {
+      let url = 'admin/employee/login/selectLoginRoleNewTest'
+      if (this.localOnline && this.isTestView) url = 'admin/employee/login/selectLoginRoleNew' // 鏈湴杩炵嚎涓� 20230619 long
+      Req.http.post({
+        url,
+        data: {
+          roleId: id
+        },
+        mockData: {
+          code: 100,
+          msg: '',
+          data: {
+            'adminToken': 'eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMzhlZjMzZjEyMzUxMWVkOTFkMTUyNTQwMGI4NTEwYSIsInN1YiI6ImxvZ2luX2FkbWluX2VtcGxveWVlIiwiaXNzIjoidXNlciIsImlhdCI6MTY3MzA4MTcwOSwiZXhwIjoxNjczMTI0MDA5fQ.s3QiYhK6EemOw9ksbxvM0jygnQxkHZwTWJ3JdAAFxkc',
+            'name': '榛勫槈鑽�',
+            'tel': '15999971794',
+            'imgUrl': 'https://phiskin-pre-1305571091.cos.ap-shanghai.myqcloud.com/member/3a82bead-4960-44c1-915f-467df3a80cf3.jpg',
+            arr: [],
+            arrNew: [],
+            'employeeId': '476051fc000711ecbbe230d0422e31b5',
+            'shopId': 'bb4e8a7d620d11ebb06bb8599f4cafbe',
+            'roleName': 'admin',
+            'dataAuth': {
+              'warehouseList': [],
+              'noAttributionData': 0,
+              'roleId': '138ef33f123511ed91d1525400b8510a',
+              'dataList': [
+                {
+                  'name': '闈欏畨搴�',
+                  'id': 'bb4e8a7d620d11ebb06bb8599f4cafbe'
+                },
+                {
+                  'name': '鍚堣偉搴�',
+                  'id': '66c581244ebb11edbebb525400b8510a'
+                },
+                {
+                  'name': '鑺欒壘缇庡',
+                  'id': '2baa4ed774f111ecb4d45254007749be'
+                },
+                {
+                  'name': '鍊鹃�夊簵',
+                  'id': '2bab614774f111ecb4d45254007749be'
+                },
+                {
+                  'name': '涔濇柟搴�',
+                  'id': '2bac145474f111ecb4d45254007749be'
+                },
+                {
+                  'name': '鏂板ぉ鍦板簵',
+                  'id': '605e391b620d11ebb06bb8599f4cafbe'
+                },
+                {
+                  'name': '闈欏畨鍥介檯鍙奦IP闂ㄨ瘖',
+                  'id': '973f9b28620e11ebb06bb8599f4cafbe'
+                },
+                {
+                  'name': '鑹鹃�夊簵',
+                  'id': '66cb53b84ebb11edbebb525400b8510a'
+                },
+                {
+                  'name': '鍖椾含鍏夊崕搴�',
+                  'id': '66ca982f4ebb11edbebb525400b8510a'
+                },
+                {
+                  'name': '涓滈摱搴�',
+                  'id': 'b88e3cd8620d11ebb06bb8599f4cafbe'
+                },
+                {
+                  'name': '鏉窞搴�',
+                  'id': 'b96aa6d1620d11ebb06bb8599f4cafbe'
+                },
+                {
+                  'name': '瀹佹尝娴锋洐搴�',
+                  'id': 'b9fbfd79620d11ebb06bb8599f4cafbe'
+                },
+                {
+                  'name': '鑺欒壘鎬婚儴',
+                  'id': 'd685ff306ca54b1ea06b707fb0f57659'
+                },
+                {
+                  'name': '钀ラ攢鍔╂墜鍔熻兘娴嬭瘯闂ㄥ簵',
+                  'id': 'd4b9ace5a01911ecb4d45254007749be'
+                },
+                {
+                  'name': '鍙ゅ寳搴�',
+                  'id': 'fc9f34d2994711ecb4d45254007749be'
+                }
+              ]
+            },
+            'shopList': [
+              {
+                'carWay': '',
+                'clinicName': '',
+                'code': '',
+                'maxAppNum': 0,
+                'city': '',
+                'departmentId': '',
+                'colorStr': '',
+                'doctorRelaxTime': '',
+                'editTime': {
+                  'date': 7,
+                  'hours': 16,
+                  'seconds': 10,
+                  'month': 0,
+                  'timezoneOffset': -480,
+                  'year': 123,
+                  'minutes': 55,
+                  'time': 1673081710058,
+                  'day': 6
+                },
+                'corpMpDepId': 0,
+                'isUp': 0,
+                'province': '',
+                'subWay': '',
+                'id': 'bb4e8a7d620d11ebb06bb8599f4cafbe',
+                'addr': '',
+                'institutionalCode': '',
+                'apiId': '',
+                'area': '',
+                'sameTimeCustomerNum': 0,
+                'shengMeiNum': 0,
+                'workTime': '',
+                'createTime': {
+                  'date': 7,
+                  'hours': 16,
+                  'seconds': 10,
+                  'month': 0,
+                  'timezoneOffset': -480,
+                  'year': 123,
+                  'minutes': 55,
+                  'time': 1673081710058,
+                  'day': 6
+                },
+                'maxSwitchNum': 0,
+                'name': '闈欏畨搴�',
+                'clinicCode': '',
+                'isDel': 0
+              }
+            ],
+            'warehouseList': []
+          }
+        }
+      }).then((inf) => {
+        this.afterLogin(inf)
+      }).catch((res) => {
+        this.loading = false
+        this.$messageError(res.msg)
+      })
+    },
+
+    noop() {}
+  }
+}
+</script>
+
+<style lang="scss">
+/* 淇input 鑳屾櫙涓嶅崗璋� 鍜屽厜鏍囧彉鑹� */
+/* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */
+
+$bg:#283443;
+$light_gray:#fff;
+$gray_gray:#1B1E2F;
+$cursor: #fff;
+
+@supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
+  .login-container .el-input input {
+    color: $cursor;
+  }
+}
+
+/* reset element-ui css */
+.login-container {
+  .el-input {
+    display: inline-block;
+    height: 47px;
+    width: 70%;
+
+    input {
+      background: transparent;
+      border: 0px;
+      -webkit-appearance: none;
+      border-radius: 0px;
+      padding: 12px 5px 12px 15px;
+      color: $gray_gray;
+      height: 47px;
+      caret-color: $gray_gray;
+
+      &:-webkit-autofill {
+        box-shadow: 0 0 0px 1000px #f0f1f6 inset !important;
+        -webkit-text-fill-color: $gray_gray !important;
+      }
+    }
+
+  }
+
+  .el-form-item {
+    border: 1px solid #2B3855;
+    // background: rgba(0, 0, 0, 0.1);
+    background: transparent;
+    border-radius: 22px;
+    color: #2B3855;
+  }
+}
+</style>
+
+<style lang="scss" scoped>
+$bg:#2d3a4b;
+$dark_gray:#889aa4;
+$light_gray:#eee;
+$gray_gray:#2B3855;
+
+.login-container {
+  min-height: 100vh;
+  width: 100vw;
+  position: relative;
+  overflow: hidden;
+  background: url('../../assets/login/login_left.png') 0 0 repeat-y, url('../../assets/login/login_mid.png') 15.2% 50% no-repeat,url('../../assets/login/login_right.png') 18% 0 no-repeat;
+  background-size: 15% auto, 15px auto, cover;
+  background-attachment: fixed;
+  .login-logo {
+    width: 40px;
+    height: 40px;
+  }
+
+  .login-form {
+    position: relative;
+    width: 85%;
+    max-width: 520px;
+    padding: 30px 35px 130px;
+    // padding: 160px 35px;
+    // padding: 0 25px;
+    margin: 0 auto;
+    // margin-top: 18vh;
+    // margin-left: 18%;
+    overflow: hidden;
+  }
+
+  .tips {
+    font-size: 14px;
+    color: #fff;
+    margin-bottom: 10px;
+
+    span {
+      &:first-of-type {
+        margin-right: 16px;
+      }
+    }
+  }
+
+  .svg-container {
+    padding: 6px 5px 6px 15px;
+    color: $dark_gray;
+    vertical-align: middle;
+    width: 30px;
+    display: inline-block;
+  }
+
+  .title-container {
+    position: relative;
+    margin-top: 100px;
+    .title {
+      font-size: 26px;
+      color: $gray_gray;
+      // margin: 0px auto 40px auto;
+      text-align: left;
+      font-weight: bold;
+    }
+  }
+
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 7px;
+    font-size: 16px;
+    color: $dark_gray;
+    cursor: pointer;
+    user-select: none;
+  }
+
+  .safecode-img{
+    width: 80px;
+    height: 70%;
+    position: absolute;
+    right: 10px;
+    top: 50%;
+    transform: translateY(-50%);
+    font-size: 30px;
+    text-align: right;
+    color: $light_gray;
+    cursor: pointer;
+  }
+
+  .thirdparty-button {
+    position: absolute;
+    right: 0;
+    bottom: 6px;
+  }
+
+  @media only screen and (max-width: 470px) {
+    .thirdparty-button {
+      display: none;
+    }
+  }
+
+  // 浼佷笟寰俊鎵爜鐧诲綍
+  #wx_reg{
+    padding: 30px 0 0;
+    border: 1px solid rgba(255, 255, 255, 0.1);
+    background: rgba(0, 0, 0, 0.1);
+    border-radius: 12px;
+    margin-bottom: 30px;
+    iframe{
+      width: 300px;
+      height: 300px;
+    }
+  }
+  .role-list-title{
+    color: $gray_gray;
+    margin-bottom: 20px;
+    text-align: center;
+    font-size: 18px;
+    font-weight: bold;
+    letter-spacing: 1px;
+  }
+  .role-list{
+    // margin-bottom: 20px;
+
+    .item{
+      box-sizing: border-box;
+      width: 47.5%;
+      margin-right: 5%;
+      padding: 10px 20px;
+      border: 1px solid $gray_gray;
+      background: transparent;
+      border-radius: 12px;
+      color: $gray_gray;
+      margin-bottom: 5%;
+      cursor: pointer;
+      transition: background .1s ease;
+      position: relative;
+
+      &:nth-child(2n){
+        margin-right: 0;
+      }
+
+      &:hover, &.active{
+        background: rgba(43, 56, 85, 0.8);
+        color: #fff;
+      }
+
+      .el-icon-check{
+        font-size: 24px;
+        font-weight: bold;
+        color: #99FFCC;
+        transition: opacity .1s ease;
+        opacity: 0;
+        position: absolute;
+        right: 10px;
+        bottom: 5px;
+      }
+
+      &.active .el-icon-check{
+        opacity: 1;
+      }
+    }
+
+    &.block-list .item{
+      margin-right: 0;
+      width: 100%;
+    }
+
+    .role-name{
+      font-size: 16px;
+      margin-bottom: 10px;
+    }
+
+    .shop-name{
+      font-size: 14px;
+      // color: #aaa;
+    }
+  }
+}
+</style>
diff --git a/src/pages/room/detail.vue b/src/pages/room/detail.vue
index 9490937..e0101a0 100644
--- a/src/pages/room/detail.vue
+++ b/src/pages/room/detail.vue
@@ -1,13 +1,13 @@
 <!--room-detail.vue-->
 <template>
   <div class="page">
-    <div class="page_header flex flex-ver">
+    <div class="page_header flex flex-ver" @click="back">
       <div class="left flex flex-ver">
         <img class="page_logo_1" src="../../assets/img/logo_1.png">
         <img class="page_logo_2" src="../../assets/img/logo_2.png">
       </div>
       <div class="right flex-1 flex flex-jcfe flex-ver">
-        <div class="reset_btn flex flex-center">閲嶇疆鎴块棿鐘舵��</div>
+        <div class="reset_btn flex flex-center" @click="resetStatus">閲嶇疆鎴块棿鐘舵��</div>
         <div class="page_date">
           <div class="page_week">{{ timeObj.week }}</div>
           <div class="page_day">{{ timeObj.date }}</div>
@@ -68,7 +68,7 @@
           <div class="guest_title flex flex-center">绛夊緟璇婄枟</div>
           <div class="guest_block flex-1">
             <div class="guest_list">
-              <div v-for="(item, index) in list" :key="index" class="guest_list__row flex flex-ver">
+              <div v-for="(item, index) in list" :key="index" class="guest_list__row flex flex-ver" @click="selectCustomer">
                 <div class="guest_list__td flex flex-center">
                   <div>
                     <div class="tx">寮�*姘�</div>
@@ -140,7 +140,7 @@
           <div class="guest_title flex flex-center">绛夊緟璇婄枟</div>
           <div class="guest_block flex-1">
             <div class="guest_list">
-              <div v-for="(item, index) in list" :key="index" class="guest_list__row flex flex-ver">
+              <div v-for="(item, index) in list" :key="index" class="guest_list__row flex flex-ver" @click="selectCustomer">
                 <div class="guest_list__td flex flex-center">
                   <div>
                     <div class="tx">寮�*姘�</div>
@@ -162,17 +162,24 @@
         </div>
       </div>
     </div>
-    <XioCustomerSelect ref="XioCustomerSelect"></XioCustomerSelect>
+    <!-- 閫夋嫨瀹汉寮圭獥 -->
+    <XioCustomerSelect ref="XioCustomerSelect" @cancel="selectCustomerCancel" @submit="selectCustomerSubmit" />
+    <!-- 鏇存敼鎴块棿鐘舵�佺獥 -->
+    <XioRoomStatusChg ref="XioRoomStatusChg" @changeStatus="changeStatus" />
   </div>
 </template>
 
 <script>
 // import Login from '../utils/jun_login.js'
+// 閫夋嫨瀹汉寮圭獥
 import XioCustomerSelect from '@/components/xio_customer_select'
+// 鏇存敼鎴块棿鐘舵�佺獥
+import XioRoomStatusChg from '@/components/xio_room_status_chg'
 export default {
   name: 'RoomDetail',
   components: {
-    XioCustomerSelect
+    XioCustomerSelect,
+    XioRoomStatusChg
   },
   inject: ['noop'],
   data() {
@@ -194,6 +201,39 @@
   methods: {
     init() {
       this.countGetTime(this, 'timeObj', 'detail')
+    },
+    // 杩斿洖
+    back() {
+      this.stopCountGetTime('detail')
+      this.stopPollingAjaxFn('detail')
+      this.$router.go(-1)
+    },
+    // 閲嶇疆鐘舵��
+    resetStatus() {
+      // 鎵撳紑寮圭獥
+      this.$refs['XioRoomStatusChg'].showDialog()
+    },
+    // 鏇存敼鎴块棿鐘舵��
+    changeStatus(opt) {
+      console.log(opt.statusTx)
+      // 鍏抽棴寮圭獥
+      this.$refs['XioRoomStatusChg'].hideDialog()
+    },
+    // 閫夋嫨瀹㈡埛
+    selectCustomer(item = {}) {
+      // 鎵撳紑寮圭獥
+      this.$refs['XioCustomerSelect'].showDialog()
+      this.$refs['XioCustomerSelect'].dataInit(item)
+    },
+    // 閫夋嫨瀹㈡埛鍙栨秷
+    selectCustomerCancel(opt) {
+      console.log('cancel', opt)
+      this.$refs['XioCustomerSelect'].hideDialog()
+    },
+    // 閫夋嫨瀹㈡埛纭畾
+    selectCustomerSubmit(opt) {
+      console.log('submit', opt)
+      this.$refs['XioCustomerSelect'].hideDialog()
     }
   }
 }
diff --git a/src/pages/room/list.vue b/src/pages/room/list.vue
index 54e4c6b..a7e191e 100644
--- a/src/pages/room/list.vue
+++ b/src/pages/room/list.vue
@@ -2,7 +2,7 @@
 <template>
   <div class="page">
     <div class="page_header flex flex-ver">
-      <div class="left flex flex-ver">
+      <div class="left flex flex-ver" @click="back">
         <img class="page_logo_1" src="../../assets/img/logo_1.png">
         <img class="page_logo_2" src="../../assets/img/logo_2.png">
       </div>
@@ -21,7 +21,7 @@
         <div class="list_block flex-1">
           <div class="list flex flex-ver flex-wrap">
             <!-- act -->
-            <div v-for="(item, index) in list" :key="index" class="list__item flex flex-center">VIP璇婄枟瀹�-1</div>
+            <div v-for="(item, index) in list" :key="index" class="list__item flex flex-center" @click="selectRoom()">VIP璇婄枟瀹�-1</div>
           </div>
         </div>
       </div>
@@ -55,6 +55,17 @@
   methods: {
     init() {
       this.countGetTime(this, 'timeObj', 'list')
+    },
+    // 杩斿洖
+    back() {
+      this.stopCountGetTime('list')
+      this.stopPollingAjaxFn('list')
+      this.$router.go(-1)
+    },
+    selectRoom(item = {}) {
+      this.$router.push({
+        path: `./detail?id=${item.id || ''}`
+      })
     }
   }
 }
diff --git a/src/router/index.js b/src/router/index.js
index 347fa0c..932b582 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -15,7 +15,13 @@
       path: '/',
       name: 'root',
       // component: () => import('@/pages/index')
-      component: () => import('@/pages/room/detail')
+      component: () => import('@/pages/login/index')
+      // component: () => import('@/pages/room/list')
+    },
+    {
+      path: '/login',
+      name: 'login',
+      component: () => import('@/pages/login/index')
     },
     {
       path: '/index',
diff --git a/src/utils/auth.js b/src/utils/auth.js
new file mode 100644
index 0000000..fccd7c3
--- /dev/null
+++ b/src/utils/auth.js
@@ -0,0 +1,98 @@
+
+// token
+const TokenKey = 'adminToken'
+export function getToken() {
+  return sessionStorage.getItem(TokenKey)
+}
+
+export function setToken(token) {
+  return sessionStorage.setItem(TokenKey, token)
+}
+
+export function removeToken() {
+  return sessionStorage.removeItem(TokenKey)
+}
+
+// userData 瀛樺偍褰撳墠鐧诲綍璐﹀彿淇℃伅
+const userDataKey = 'userData'
+export function getUserData() {
+  return sessionStorage.getItem(userDataKey)
+}
+
+export function setUserData(data) {
+  return sessionStorage.setItem(userDataKey, JSON.stringify(data))
+}
+
+export function removeUserData() {
+  return sessionStorage.removeItem(userDataKey)
+}
+
+// userNameList 鐐瑰嚮瀛樺偍閫変腑瀹㈡埛鍒楄〃
+const clientListKey = 'userNameList'
+export function getClientList() {
+  return sessionStorage.getItem(clientListKey)
+}
+
+export function setClientList(data) {
+  return sessionStorage.setItem(clientListKey, JSON.stringify(data))
+}
+
+export function removeClientList() {
+  return sessionStorage.removeItem(clientListKey)
+}
+
+// clientInfo 鐐瑰嚮瀛樺偍閫変腑瀹㈡埛鍒楄〃
+const clientInfoKey = 'clientInfo'
+export function getClientInfo() {
+  return sessionStorage.getItem(clientInfoKey)
+}
+
+export function setClientInfo(data) {
+  return sessionStorage.setItem(clientInfoKey, JSON.stringify(data))
+}
+
+export function removeClientInfo() {
+  return sessionStorage.removeItem(clientInfoKey)
+}
+
+// userDatilsId 鐐瑰嚮瀛樺偍閫変腑瀹㈡埛ID
+const clientIdKey = 'userDatilsId'
+export function getClientId() {
+  return sessionStorage.getItem(clientIdKey)
+}
+
+export function setClientId(data) {
+  return sessionStorage.setItem(clientIdKey, data)
+}
+
+export function removeClientId() {
+  return sessionStorage.removeItem(clientIdKey)
+}
+
+// 鑾峰彇鐧诲綍鐢ㄦ埛姘村嵃鍥緎vg
+export function getWaterMark(str) {
+  const userData = JSON.parse(sessionStorage.getItem('userData'))
+  var waterMarkText, telBack
+  if (userData.tel)telBack = (userData.tel).substr(-4)
+  if (userData.name)waterMarkText = userData.name
+  if (telBack)waterMarkText = `${waterMarkText}锛�${telBack}锛塦
+  str && (waterMarkText = str)
+  // console.log('11111111111111111111111111111',waterMarkText);
+
+  const can = document.createElement('canvas')// 鍒涘缓涓�涓敾甯�
+  can.width = 140 // 璁剧疆瀹藉害
+  can.height = 140 // 楂樺害
+
+  const cans = can.getContext('2d')
+  cans.rotate(-45 * Math.PI / 180) // 姘村嵃鏃嬭浆瑙掑害    0 姘村钩
+  // cans.font = '80px' // 瀛椾綋澶у皬
+  cans.font = '13px Georgia'
+  cans.fillStyle = '#e9e9e9' // 姘村嵃鐨勯鑹�
+  cans.textAlign = 'left' // 璁剧疆鏂囨湰鍐呭鐨勫綋鍓嶅榻愭柟寮�
+  cans.textBaseline = 'Middle' // 璁剧疆鍦ㄧ粯鍒舵枃鏈椂浣跨敤鐨勫綋鍓嶆枃鏈熀绾�
+  cans.globalAlpha = 1 // 閫忔槑搴�
+  cans.fillText(waterMarkText, 0, can.height - 36) // 鍦ㄧ敾甯冧笂缁樺埗濉壊鐨勬枃鏈紙杈撳嚭鐨勬枃鏈紝寮�濮嬬粯鍒舵枃鏈殑X鍧愭爣浣嶇疆锛屽紑濮嬬粯鍒舵枃鏈殑Y鍧愭爣浣嶇疆锛�
+  // cans.fillText(str1, can.width / 3, can.height / 2.5) // 鏍规嵁闇�姹傚彲娣诲姞澶氳姘村嵃锛屽湪鏂规硶涓坊鍔爏tr1
+  // console.log('1111111111111111111111', can)
+  return can.toDataURL('image/png')
+}
diff --git a/src/utils/element-ui-preprocessing.js b/src/utils/element-ui-preprocessing.js
new file mode 100644
index 0000000..c1f2b9d
--- /dev/null
+++ b/src/utils/element-ui-preprocessing.js
@@ -0,0 +1,12 @@
+// utils/element-ui-preprocessing.js
+import ElementUI from 'element-ui'
+
+// Fixes an issue with filters not working on mobile
+ElementUI.Select.computed.readonly = function() {
+  if (!this.filterable) return true
+  // trade-off for IE input readonly problem: https://github.com/ElemeFE/element/issues/10403
+  const isIE = !this.$isServer && !Number.isNaN(Number(document.documentMode))
+  return !(this.filterable || this.multiple || !isIE) && !this.visible
+}
+
+export default ElementUI
diff --git a/src/utils/fn.js b/src/utils/fn.js
index c569024..15fa356 100644
--- a/src/utils/fn.js
+++ b/src/utils/fn.js
@@ -330,6 +330,47 @@
   fn_obj[`timer_${pageKey}`] = null
 }
 
+/**
+ * 杞寮傛璋冪敤鎺ュ彛
+ * @param {Object} page 椤甸潰瀵硅薄this
+ * @param {String} fnName 瑕佽疆璇㈢殑鏂规硶鍚嶇О
+ * @param {String} pageKey 椤甸潰鍏抽敭瀛�
+ * @param {Number} timeStamp 澶氬皯绉掕疆璇�
+ */
+function pollingAjaxFn(page, fnName, pageKey, timeStamp = 1000) {
+  if (!page || !fnName || !pageKey) {
+    return
+  }
+  page[fnName] && page[fnName]()
+  fn_obj[`pollingTimer_${pageKey}`] = setTimeout(() => {
+    pollingAjaxFn(page, fnName, pageKey, timeStamp)
+  }, timeStamp)
+}
+
+/**
+ * 鍋滄杞
+ * @param {String} pageKey 椤甸潰鍏抽敭璇�
+ */
+function stopPollingAjaxFn(pageKey) {
+  clearTimeout(fn_obj[`pollingTimer_${pageKey}`])
+  fn_obj[`pollingTimer_${pageKey}`] = null
+}
+
+// 闅忔満12浣嶆暟
+function getCheckedId() {
+  var s = []
+  var hexDigits = '0123456789abcdef'
+  for (var i = 0; i < 12; i++) {
+    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
+  }
+  // s[14] = '4';
+  // s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
+
+  // s[8] = s[13] = s[18] = s[23] = '-'
+  var uuid = s.join('')
+  return uuid
+}
+
 var fn = {
   getLocalStorage,
   getSessionStorage,
@@ -358,6 +399,9 @@
 
   countGetTime,
   stopCountGetTime,
+  pollingAjaxFn,
+  stopPollingAjaxFn,
+  getCheckedId,
 
   /**
      * 娣辨嫹璐�
diff --git a/src/utils/validate.js b/src/utils/validate.js
new file mode 100644
index 0000000..8d962ad
--- /dev/null
+++ b/src/utils/validate.js
@@ -0,0 +1,20 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+  return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+  const valid_map = ['admin', 'editor']
+  return valid_map.indexOf(str.trim()) >= 0
+}
diff --git a/vue.config.js b/vue.config.js
new file mode 100644
index 0000000..79cbaa4
--- /dev/null
+++ b/vue.config.js
@@ -0,0 +1,26 @@
+'use strict'
+const path = require('path')
+function resolve(dir) {
+  return path.join(__dirname, dir)
+}
+module.exports = {
+  // 閰嶇疆浣跨敤stylus鍏ㄥ眬鍙橀噺
+  chainWebpack: config => {
+    // set svg-sprite-loader
+    config.module
+      .rule('svg')
+      .exclude.add(resolve('src/icons'))
+      .end()
+    config.module
+      .rule('icons')
+      .test(/\.svg$/)
+      .include.add(resolve('src/icons'))
+      .end()
+      .use('svg-sprite-loader')
+      .loader('svg-sprite-loader')
+      .options({
+        symbolId: 'icon-[name]'
+      })
+      .end()
+  }
+}

--
Gitblit v1.8.0