wzdxx1314@163.com 1 năm trước cách đây
commit
d970a35b56
100 tập tin đã thay đổi với 13973 bổ sung0 xóa
  1. 116 0
      .circleci/config.yml
  2. 9 0
      .editorconfig
  3. 7 0
      .env.example
  4. 33 0
      .eslintrc.js
  5. 102 0
      .github/COMMIT_CONVENTION.md
  6. 63 0
      .github/CONTRIBUTING.md
  7. 19 0
      .github/ISSUE_TEMPLATE.md
  8. 31 0
      .github/PULL_REQUEST_TEMPLATE.md
  9. BIN
      .github/assets/sponsors.jpg
  10. 5 0
      .github/dependabot.yml
  11. 28 0
      .gitignore
  12. 1 0
      .husky/.gitignore
  13. 4 0
      .husky/pre-commit
  14. 1 0
      .nvmrc
  15. 18 0
      .prettierignore
  16. 10 0
      .prettierrc
  17. 3 0
      .vscode/extensions.json
  18. 73 0
      CODE_OF_CONDUCT.md
  19. 21 0
      LICENSE
  20. 146 0
      README.ja-JP.md
  21. 192 0
      README.md
  22. 146 0
      README.zh-CN.md
  23. 7 0
      config/dev.env.js
  24. 49 0
      config/index.js
  25. 4 0
      config/prod.env.js
  26. BIN
      dist.zip
  27. 50 0
      docs/pre-production.md
  28. 17 0
      index.html
  29. 5217 0
      package-lock.json
  30. 71 0
      package.json
  31. 6 0
      postcss.config.js
  32. BIN
      public/favicon.ico
  33. BIN
      public/favicon.png
  34. BIN
      public/vendor/leaflet/marker-icon-2x.png
  35. BIN
      public/vendor/leaflet/marker-icon.png
  36. BIN
      public/vendor/leaflet/marker-shadow.png
  37. BIN
      public/vuestic-admin-image.jpg
  38. BIN
      public/vuestic-admin-logo.png
  39. 38 0
      src/App.vue
  40. 130 0
      src/api/api.js
  41. 9 0
      src/common/dict.js
  42. 79 0
      src/components/VuesticLogo.vue
  43. 40 0
      src/components/icons/VaIconCleanCode.vue
  44. 38 0
      src/components/icons/VaIconColor.vue
  45. 33 0
      src/components/icons/VaIconFaster.vue
  46. 46 0
      src/components/icons/VaIconFree.vue
  47. 34 0
      src/components/icons/VaIconFresh.vue
  48. 30 0
      src/components/icons/VaIconMenu.vue
  49. 32 0
      src/components/icons/VaIconMenuCollapsed.vue
  50. 27 0
      src/components/icons/VaIconMessage.vue
  51. 27 0
      src/components/icons/VaIconNotification.vue
  52. 29 0
      src/components/icons/VaIconResponsive.vue
  53. 40 0
      src/components/icons/VaIconRich.vue
  54. 33 0
      src/components/icons/VaIconSlower.vue
  55. 34 0
      src/components/icons/VaIconVue.vue
  56. 47 0
      src/components/icons/VaIconVuestic.vue
  57. 279 0
      src/components/maps/LineMap.vue
  58. 108 0
      src/components/navbar/Navbar.vue
  59. 97 0
      src/components/navbar/components/AppNavbarActions.vue
  60. 74 0
      src/components/navbar/components/dropdowns/ColorDropdown.vue
  61. 44 0
      src/components/navbar/components/dropdowns/ColorDropdownItem.vue
  62. 105 0
      src/components/navbar/components/dropdowns/LanguageDropdown.vue
  63. 151 0
      src/components/navbar/components/dropdowns/MessageDropdown.vue
  64. 170 0
      src/components/navbar/components/dropdowns/NotificationDropdown.vue
  65. 68 0
      src/components/navbar/components/dropdowns/ProfileDropdown.vue
  66. 79 0
      src/components/navbar/components/dropdowns/SettingsDropdown.vue
  67. 257 0
      src/components/sidebar/NavigationRoutes.ts
  68. 66 0
      src/components/sidebar/Sidebar.vue
  69. 74 0
      src/components/sidebar/menu/MenuAccordion.vue
  70. 107 0
      src/components/sidebar/menu/MenuMinimized.vue
  71. 46 0
      src/components/va-charts/VaChart.vue
  72. 17 0
      src/components/va-charts/chart-types/BarChart.vue
  73. 17 0
      src/components/va-charts/chart-types/BubbleChart.vue
  74. 17 0
      src/components/va-charts/chart-types/DoughnutChart.vue
  75. 26 0
      src/components/va-charts/chart-types/HorizontalBarChart.vue
  76. 27 0
      src/components/va-charts/chart-types/LineChart.vue
  77. 17 0
      src/components/va-charts/chart-types/PieChart.vue
  78. 48 0
      src/components/va-charts/vaChartConfigs.js
  79. 189 0
      src/components/va-medium-editor/VaMediumEditor.vue
  80. 9 0
      src/components/va-medium-editor/_variables.scss
  81. 243 0
      src/data/CountriesList.ts
  82. 30 0
      src/data/charts/barChartData.ts
  83. 231 0
      src/data/charts/bubbleChartData.ts
  84. 35 0
      src/data/charts/composables/useChartColors.ts
  85. 20 0
      src/data/charts/composables/useChartData.ts
  86. 12 0
      src/data/charts/doughnutChartData.ts
  87. 30 0
      src/data/charts/horizontalBarChartData.ts
  88. 6 0
      src/data/charts/index.ts
  89. 44 0
      src/data/charts/lineChartData.ts
  90. 12 0
      src/data/charts/pieChartData.ts
  91. 2017 0
      src/data/maps/bubbleMapData.ts
  92. 342 0
      src/data/maps/lineMapData.ts
  93. 402 0
      src/data/tables/markup-table/data.json
  94. 13 0
      src/data/types.ts
  95. 386 0
      src/data/users.json
  96. 1 0
      src/env.d.ts
  97. 23 0
      src/i18n/index.ts
  98. 258 0
      src/i18n/locales/br.json
  99. 323 0
      src/i18n/locales/cn.json
  100. 258 0
      src/i18n/locales/es.json

+ 116 - 0
.circleci/config.yml

@@ -0,0 +1,116 @@
+aliases:
+  - &restore_cache
+    name: Restore Yarn Package Cache
+    keys:
+      - yarn-packages-{{ checksum "yarn.lock" }}
+
+  - &install_dependencies
+    name: Install Dependencies
+    command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
+
+  - &save_cache
+    name: Save Yarn Package Cache
+    key: yarn-packages-{{ checksum "yarn.lock" }}
+    paths:
+      - ~/.cache/yarn
+
+docker: &docker
+  docker:
+    - image: cimg/node:16.16.0
+
+defaults: &defaults
+  <<: *docker
+  parallelism: 1
+  working_directory: ~/repo
+
+version: 2
+jobs:
+  test:
+    <<: *defaults
+    steps:
+      - checkout
+      - restore_cache: *restore_cache
+      - run: *install_dependencies
+      - save_cache: *save_cache
+      - run: yarn test:unit
+
+  deploy-staging:
+    <<: *defaults
+    steps:
+      - checkout
+      - run:
+          name: Add variables
+          command:
+            echo "VUE_APP_INCLUDE_DEMOS=true" >> .env.production.local &&
+            echo "VUE_APP_BUILD_VERSION=true" >> .env.production.local &&
+            echo "VUE_APP_GTM_ENABLED=false" >> .env.production.local
+      - restore_cache: *restore_cache
+      - run: *install_dependencies
+      - save_cache: *save_cache
+      - run: yarn build:ci
+      - add_ssh_keys:
+          fingerprints:
+            - "f8:c0:94:79:68:a2:5e:33:9f:78:bc:ad:ed:86:c6:3c"
+      - run:
+          name: Add $SERVER_IP to known_hosts
+          command: ssh-keyscan -H $SERVER_IP >> ~/.ssh/known_hosts
+      - run:
+          name: Deploy to hosting
+          command: |
+            tar -czf dist.tar.gz ~/repo/dist -C ~/repo/dist .
+            scp  ~/repo/dist.tar.gz $SERVER_USER@$SERVER_IP:~/tmp
+            ssh $SERVER_USER@$SERVER_IP /bin/bash << EOF
+              rm -rf $DEPLOY_PATH/*
+              tar -xzf ~/tmp/dist.tar.gz -C $DEPLOY_PATH
+              rm -f ~/tmp/dist.tar.gz
+            EOF
+
+  deploy-production:
+    <<: *defaults
+    steps:
+      - checkout
+      - run:
+          name: Add variables
+          command:
+            echo "VUE_APP_YANDEX_METRICS_KEY=$YANDEX_METRICS_KEY" >> .env.production.local &&
+            echo "VUE_APP_DRIFT_KEY=$DRIFT_KEY" >> .env.production.local &&
+            echo "VITE_APP_GTM_KEY=$GTM_KEY" >> .env.production.local &&
+            echo "VITE_APP_GTM_ENABLED=$GTM_ENABLED" >> .env.production.local &&
+            echo "VUE_APP_GTM_ENABLED=true" >> .env.production.local &&
+            echo "VUE_APP_ROUTER_MODE_HISTORY=$ROUTER_MODE_HISTORY" >> .env.production.local
+      - restore_cache: *restore_cache
+      - run: *install_dependencies
+      - save_cache: *save_cache
+      - run: yarn build:ci
+      - run:
+          name: Deploy to hosting
+          command: |
+            tar -czf dist.tar.gz ~/repo/dist -C ~/repo/dist .
+            ssh-keyscan -t rsa $SERVER_IP >> ~/.ssh/known_hosts
+            scp ~/repo/dist.tar.gz $SERVER_USERNAME@$SERVER_IP:~/
+            ssh $SERVER_USERNAME@$SERVER_IP << EOF
+              mkdir -p tmp
+              rm -rf $PRODUCTION_DEPLOY_PATH/*
+              tar -xzf ~/dist.tar.gz -C $PRODUCTION_DEPLOY_PATH
+              rm -rf ~/dist.tar.gz ~/tmp
+            EOF
+
+workflows:
+  version: 2
+  build-and-deploy:
+    jobs:
+#      - test
+      - deploy-staging:
+#          requires:
+#            - test
+          context: vuestic-admin-staging
+          filters:
+            branches:
+              only: develop
+      - deploy-production:
+#          requires:
+#            - test
+          context: vuestic-production
+          filters:
+            branches:
+              only: master

+ 9 - 0
.editorconfig

@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true

+ 7 - 0
.env.example

@@ -0,0 +1,7 @@
+VITE_APP_GTM_KEY=
+
+VITE_APP_INCLUDE_DEMOS=
+
+VITE_APP_ROUTER_MODE_HISTORY=
+
+VITE_APP_BUILD_VERSION=

+ 33 - 0
.eslintrc.js

@@ -0,0 +1,33 @@
+module.exports = {
+  // root: true,
+  // env: {
+  //   browser: true,
+  //   es2021: true,
+  //   node: true,
+  //   'vue/setup-compiler-macros': true,
+  // },
+  // plugins: ['@typescript-eslint'],
+  // parser: 'vue-eslint-parser',
+  // parserOptions: {
+  //   parser: '@typescript-eslint/parser',
+  //   sourceType: 'module',
+  //   ecmaVersion: 2021,
+  // },
+  // extends: [
+  //   'eslint:recommended',
+  //   'plugin:@typescript-eslint/recommended',
+  //   'plugin:vue/vue3-recommended',
+  //   '@vue/typescript/recommended',
+  //   '@vue/prettier',
+  // ],
+  //
+  // rules: {
+  //   'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+  //   'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+  //   'prettier/prettier': ['warn', {}, { usePrettierrc: true }],
+  //   '@typescript-eslint/no-non-null-assertion': 0,
+  //   '@typescript-eslint/no-explicit-any': 0, // allow explicit any's because of the legacy code and ts-less deps, but still prohibit IMplicit any's
+  //   'vue/multi-word-component-names': 0,
+  //   'vue/no-lone-template': 0,
+  // },
+}

+ 102 - 0
.github/COMMIT_CONVENTION.md

@@ -0,0 +1,102 @@
+## Git Commit Message Convention
+
+> This is adapted from [Angular's commit convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular).
+
+#### TL;DR:
+
+Messages must match the following regex:
+
+```js
+;/^(revert: )?(feat|fix|docs|style|refactor|test|ci|chore)(\(.+\))?: .{1,70}/
+```
+
+#### Types
+
+- `feat` - new functionality.
+- `fix` - patching a bug.
+- `docs` - documentation and comments.
+- `style` - style changes only (not necessarily in css).
+- `refactor` - reworking internals without impacting project interface.
+- `test` - tests and demo.
+- `ci` - deploy and continuous integration.
+- `chore` - no significant code changes: code formatting, version changes, tool updates, minor refactorings.
+
+#### Examples
+
+Appears under "Features" header, `compiler` subheader:
+
+```
+feat(compiler): add 'comments' option
+```
+
+Appears under "Bug Fixes" header, `v-model` subheader, with a link to issue #28:
+
+```
+fix(v-model): handle events on blur
+
+close #28
+```
+
+Appears under "Performance Improvements" header, and under "Breaking Changes" with the breaking change explanation:
+
+```
+feat(core): improve vdom diffing by removing 'foo' option
+
+BREAKING CHANGE: The 'foo' option has been removed.
+```
+
+The following commit and commit `667ecc1` do not appear in the changelog if they are under the same release. If not, the revert commit appears under the "Reverts" header.
+
+```
+revert: feat(compiler): add 'comments' option
+
+This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
+```
+
+### Full Message Format
+
+A commit message consists of a **header**, **body** and **footer**. The header has a **type**, **scope** and **subject**:
+
+```
+<type>(<scope>): <subject>
+<BLANK LINE>
+<body>
+<BLANK LINE>
+<footer>
+```
+
+The **header** is mandatory and the **scope** of the header is optional.
+
+### Revert
+
+If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit. In the body it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.
+
+### Type
+
+If the prefix is `feat` or `fix` it will appear in the changelog. However if there is any [BREAKING CHANGE](#footer), the commit will always appear in the changelog.
+
+Other prefixes are up to your discretion. Suggested prefixes are `docs`, `chore`, `style`, `refactor`, and `test` for non-changelog related tasks.
+
+### Scope
+
+The scope could be anything specifying place of the commit change. For example `core`, `compiler`, `ssr`, `v-model`, `transition` etc...
+
+### Subject
+
+The subject contains succinct description of the change:
+
+- use the imperative, present tense: "change" not "changed" nor "changes"
+- don't capitalize first letter
+- no period (.) at the end
+
+### Body
+
+Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes".
+The body should include the motivation for the change and contrast this with previous behavior.
+
+### Footer
+
+The footer should contain any information about **Breaking Changes** and is also the place to
+reference GitHub issues that this commit **Closes**.
+
+**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.

+ 63 - 0
.github/CONTRIBUTING.md

@@ -0,0 +1,63 @@
+# Vue.js Contributing Guide
+
+Hi! We are really excited that you are interested in contributing to Vuestic. Before submitting your contribution though, please make sure to take a moment and read through the following guidelines.
+
+- [Code of Conduct](./../CODE_OF_CONDUCT.md)
+
+## Pull Request Guidelines
+
+- The `master` branch is just a snapshot of the latest stable release. **Do not submit PRs against the `master` branch.**
+- Atomic code contribution looks something like this:
+  - Checkout from upstream `develop`.
+  - Work on your fork in dedicated branch.
+  - When you're ready to show results - create PR against upstream `develop` and add a developer for review. You can ping said developer to speed things up ;).
+- It's OK to have multiple small commits as you work on the PR - we will let GitHub automatically squash it before merging.
+
+- Good stuff to add in your pull request:
+  - If your PR fully resolves existing issue, add `(fix #xxxx[,#xxx])` (#xxxx is the issue id) so that github will close the issue once it's up on `master`. You have to add that to the body of PR, won't work in header :).
+  - Provide detailed description of the issue in the PR if it's not done in the issue.
+  - If you're working on visual changes - provide before/after screenshot. That speeds up review immensely.
+
+### Branches
+
+- Upstream branches (**epicmax/vuestic-admin**):
+
+  - `master` - stable snapshot from `develop`. Releases and hotfixes only. Do not submit PR's to `master`!.
+  - `develop` - main development branch.
+
+- Local branches
+  - For local branches naming stick to [commit message convention](./COMMIT_CONVENTION.md). So for feature branch that adds tabs name would be `feat/tabs`.
+
+### For core contributors
+
+- Keep amount of local branches minimal.
+- Always link PR to issue (via `fix #123`).
+- For small issues you may push to `develop` branch directly while adding (`fix #123`) to commit message.
+- Create single PR for one issue. If we have several PRs - move all the code into a single one and close the rest. If one PR covers several issues - either split it in several PRs or mark one of the issues as duplicate.
+- Be sure to have only one person assigned per issue.
+- Check your code: https://github.com/epicmaxco/vuestic-admin/issues/378.
+- We use [yarn](https://yarnpkg.com/lang/en/) for package management.
+- Be proactive. If you think something is wrong - create an issue or discuss.
+- Recommended tools: [GitKraken](https://www.gitkraken.com/), [WebStorm](https://www.jetbrains.com/webstorm/), [ShareX](https://getsharex.com/)
+
+#### Before release workflow
+
+- Update package versions to newest ones. Update lock files (for both `npm` and `yarn`)
+
+### Vuestic-ui
+
+Vuestic-admin uses vuestic-ui internally. So if you have some troubles with components - it's better to submit issue or PR in [respective repo](https://github.com/epicmaxco/vuestic-ui).
+
+### Commonly used NPM scripts
+
+```bash
+# run dev server
+$ yarn dev
+
+# build vuestic-admin project into bundle
+$ yarn build
+```
+
+## Credits
+
+<a href="https://github.com/epicmaxco/vuestic-admin/graphs/contributors">Hall of fame!</a>

+ 19 - 0
.github/ISSUE_TEMPLATE.md

@@ -0,0 +1,19 @@
+**Note: for support questions, please use stackoverflow**. This repository's issues are reserved for feature requests and bug reports.
+
+- **I'm submitting a ...**
+
+  - [ ] bug report
+  - [ ] feature request
+  - [ ] support request => Please do not submit support request here, see note at the top of this template.
+
+- **Do you want to request a _feature_ or report a _bug_?**
+
+- **What is the current behavior?**
+
+- **If the current behavior is a bug, please provide the steps to reproduce, ideally also a screenshot or gif if it's a style issue**
+
+- **What is the expected behavior?**
+
+- **What is the motivation / use case for changing the behavior?**
+
+- **Other information** (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, gitter, etc)

+ 31 - 0
.github/PULL_REQUEST_TEMPLATE.md

@@ -0,0 +1,31 @@
+<!--
+MAKE SURE TO READ THE CONTRIBUTING GUIDE BEFORE CREATING A PR
+https://github.com/epicmaxco/vuestic-admin/blob/master/CODE_OF_CONDUCT.md
+-->
+
+<!-- Provide a general summary of your changes in the Title above -->
+<!-- Keep the title short and descriptive, as it will be used as a commit message -->
+
+## Description
+
+<!-- Describe your changes in detail -->
+
+## Markup:
+
+<!-- Paste your markup here. -->
+<details>
+
+```vue
+// Your code
+```
+
+</details>
+
+## Types of changes
+
+<!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
+
+- [ ] Bug fix (non-breaking change which fixes an issue)
+- [ ] New feature (non-breaking change which adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
+- [ ] Improvement/refactoring (non-breaking change that doesn't add any feature but make things better)

BIN
.github/assets/sponsors.jpg


+ 5 - 0
.github/dependabot.yml

@@ -0,0 +1,5 @@
+version: 2
+updates:
+  - package-ecosystem: "npm"
+    directory: "/"
+    target-branch: "develop"

+ 28 - 0
.gitignore

@@ -0,0 +1,28 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+# Local Netlify folder
+.netlify
+netlify.toml

+ 1 - 0
.husky/.gitignore

@@ -0,0 +1 @@
+_

+ 4 - 0
.husky/pre-commit

@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx lint-staged

+ 1 - 0
.nvmrc

@@ -0,0 +1 @@
+16

+ 18 - 0
.prettierignore

@@ -0,0 +1,18 @@
+# Ignore everything recursively...
+*
+
+# But not the .{ts,js,html,css,scss,vue,json,md} files
+!*.ts
+!*.js
+!*.html
+!*.css
+!*.scss
+!*.vue
+!*.json
+!*.md
+
+# But still ignore the dist folder
+dist/**
+
+# Check subdirectories too
+!*/

+ 10 - 0
.prettierrc

@@ -0,0 +1,10 @@
+{
+  "tabWidth": 2,
+  "semi": false,
+  "singleQuote": true,
+  "quoteProps": "as-needed",
+  "trailingComma": "all",
+  "bracketSpacing": true,
+  "printWidth": 120,
+  "vueIndentScriptAndStyle": true
+}

+ 3 - 0
.vscode/extensions.json

@@ -0,0 +1,3 @@
+{
+  "recommendations": ["Vue.volar"]
+}

+ 73 - 0
CODE_OF_CONDUCT.md

@@ -0,0 +1,73 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+- Using welcoming and inclusive language
+- Being respectful of differing viewpoints and experiences
+- Gracefully accepting constructive criticism
+- Focusing on what is best for the community
+- Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+- The use of sexualized language or imagery and unwelcome sexual attention or
+  advances
+- Trolling, insulting/derogatory comments, and personal or political attacks
+- Public or private harassment
+- Publishing others' private information, such as a physical or electronic
+  address, without explicit permission
+- Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at [INSERT EMAIL ADDRESS]. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Epicmax LLC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 146 - 0
README.ja-JP.md

@@ -0,0 +1,146 @@
+<p align="center">
+  <a href="./README.md"> English </a> | <a href="./README.zh-CN.md"> 简体中文 </a> | 日本語
+</p>
+
+<h1 align="center"> Vuestic Admin </h1>
+
+<p align="center">
+  38+のカスタムUIコンポーネントと美しいデザインのVue.js無料管理画面テンプレート</br>
+  開発者  <a href="https://epicmax.co">Epicmax</a>.
+  デザイン <a href="#">Vasili Savitski</a>
+</p>
+
+<p align="center">
+  <a href="https://admin.vuestic.dev"> デモ </a> | <a href="[THEME_URL]"> 新しい白いテーマのデモ </a> | <a href="https://github.com/epicmaxco/vuestic-admin/wiki"> 説明書 </a>
+</p>
+
+<p align="center">
+  <a href="https://admin.vuestic.dev" target="_blank">
+    <img src="https://i.imgur.com/RMchKNW.jpg" align="center" width="888px"/>
+  </a>
+</p>
+
+<p align="center">
+  <a href="https://circleci.com/gh/epicmaxco/vuestic-admin">
+    <img src="https://img.shields.io/circleci/build/github/epicmaxco/vuestic-admin/master" alt="Circleci">
+  </a>
+</p>
+
+<h2>
+  <a href="[THEME_URL]" target="_blank">
+    新しい白いテーマのデモ
+  </a>
+</h2>
+
+<p align="center">
+  <a href="[THEME_URL]" target="_blank">
+    <img src="https://i.imgur.com/DnFcrjD.png" align="center" width="888px"/>
+  </a>
+</p>
+
+## インストール方法
+
+まず初めに、事前に必要なソフトが全てインストールされていることを確認してください。
+
+- [Node.js](https://nodejs.org/en/) (>=8.9)
+- [npm](https://www.npmjs.com/get-npm) バージョン 3+ (あるいは[yarn](https://yarnpkg.com/lang/en/docs/install/#mac-stable)バージョン 1.16+) と[Git](https://git-scm.com/).
+
+必要なソフトウェアがインストールされていることを確認できたら、次に示す簡単なステップに沿って Vuestic Admin をインストールして、ご使用ください。
+
+```
+# repoをクローン
+$ git clone https://github.com/epicmaxco/vuestic-admin.git myproject
+
+# appディレクトリに移動し、dependenciesをインストール
+$ cd myproject
+
+```
+
+npm をご使用の方:
+
+```
+$ npm install
+
+# localhost:8080(デフォルト)でホットリロードを使ってサーブ
+$ npm run dev
+
+# プロダクション用にビルド
+$ npm run build
+
+# プロダクション用にビルドして、バンドルアナライザーレポートを閲覧
+$ npm run build --report
+```
+
+yarn をご使用の方:
+
+```
+$ yarn install
+
+# localhost:8080(デフォルト)でホットリロードを使ってサーブ
+$ yarn dev
+
+# プロダクション用にビルド
+$ yarn build
+
+# プロダクション用にビルドして、バンドルアナライザーレポートを閲覧
+$ yarn build --report
+```
+
+## 機能
+
+[レスポンシブレイアウト](https://admin.vuestic.dev/#/admin/dashboard) |
+[チャート (Chart.js)](https://admin.vuestic.dev/#/admin/statistics/charts) |
+[プログレスバー](https://admin.vuestic.dev/#/admin/statistics/progress-bars) |
+[フォーム](https://admin.vuestic.dev/#/admin/forms/form-elements) |
+[セレクト](https://admin.vuestic.dev/#/admin/forms/form-elements) |
+[デートピッカー](https://admin.vuestic.dev/#/admin/forms/form-elements) |
+[チェックボックス・ラジオ](https://admin.vuestic.dev/#/admin/forms/form-elements) |
+[スタティックテーブル・データテーブル](https://admin.vuestic.dev/#/admin/tables/data) |
+[medium エディタ](https://admin.vuestic.dev/#/admin/forms/medium-editor) |
+[スムーズタイポグラフィ](https://admin.vuestic.dev/#/admin/ui/typography) |
+[ボタン](https://admin.vuestic.dev/#/admin/ui/buttons) |
+[折りたたみ](https://admin.vuestic.dev/#/admin/ui/collapses) |
+[カラーピッカー](https://admin.vuestic.dev/#/admin/ui/color-pickers) |
+[タイムライン](https://admin.vuestic.dev/#/admin/ui/timelines) |
+[トースト](https://admin.vuestic.dev/#/admin/ui/notifications) |
+[ツールチップ](https://admin.vuestic.dev/#/admin/ui/popovers) |
+[ポップオーバー](https://admin.vuestic.dev/#/admin/ui/popovers) |
+[アイコン](https://admin.vuestic.dev/#/admin/ui/icons/) |
+[スピナー](https://admin.vuestic.dev/#/admin/ui/spinners) |
+[モーダル](https://admin.vuestic.dev/#/admin/ui/modals) |
+[ファイルアップロード](https://admin.vuestic.dev/#/admin/ui/file-upload) |
+[チップ](https://admin.vuestic.dev/#/admin/ui/chips) |
+[ツリー](https://admin.vuestic.dev/#/admin/ui/tree-view) |
+[カード ](https://admin.vuestic.dev/#/admin/ui/cards) |
+[レーティング](https://admin.vuestic.dev/#/admin/ui/rating) |
+[スライダー](https://admin.vuestic.dev/#/admin/ui/sliders) |
+[チャット](https://admin.vuestic.dev/#/admin/ui/chat) |
+[マップ (MapLibre, Yandex, Leaflet, amMap)](https://admin.vuestic.dev/#/admin/maps/maplibre-maps) |
+[ログイン/登録ページテンプレート](https://admin.vuestic.dev/#/auth/login) |
+[404 ページテンプレート](https://admin.vuestic.dev/#/admin/pages/404-pages) |
+[i18n](https://admin.vuestic.dev/#/admin/dashboard)
+
+## ブラウザサポート
+
+| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/opera/opera_48x48.png" alt="Opera" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Opera |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| IE11, Edge                                                                                                                                                                                                      | last 2 versions                                                                                                                                                                                                   | last 2 versions                                                                                                                                                                                               | last 2 versions                                                                                                                                                                                               | last 2 versions                                                                                                                                                                                           |
+
+## 支援メンバー
+
+素晴らしい PR、課題、アイデアをご提供いただきいつもありがとうございます。[参加](https://github.com/epicmaxco/vuestic-admin/blob/master/.github/CONTRIBUTING.md)いただける方を常に受け付けています!
+
+[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/0)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/0)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/1)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/1)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/2)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/2)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/3)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/3)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/4)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/4)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/5)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/5)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/6)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/6)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/7)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/7)
+
+## あなた方に仕事を依頼することはできますか?
+
+はい!一声おかけください:[hello@epicmax.co](mailto:hello@epicmax.co) </br>
+ぜひ一緒に仕事をしましょう!その他これまでやってきた仕事 - [epicmax.co](https://epicmax.co)
+
+## ソーシャルネットワーク
+
+Vuestic の最新ニュースを受け取ろう![Twitter](https://twitter.com/epicmaxco)や [Facebook](https://facebook.com/epicmaxco)でフォローしてください。
+
+## ライセンス
+
+[MIT](https://github.com/epicmaxco/vuestic-admin/blob/master/LICENSE) license

+ 192 - 0
README.md

@@ -0,0 +1,192 @@
+<p align="center">
+  <a href="https://vuestic.dev" target="_blank">
+    <img alt="Vuestic UI Logo" width="500" src="./public/vuestic-admin-logo.png">
+  </a>
+</p>
+
+<p align="center">
+  Free and beautiful Vue.js admin template with 44+ custom UI components.</br>
+  Developed by  <a href="https://epicmax.co">Epicmax</a>.
+  Designed by <a href="#">Vasili Savitski</a>
+<br>
+Based on <a href="https://github.com/epicmaxco/vuestic-ui">Vuestic UI</a> library.
+</p>
+
+<p align="center">
+  <a href="https://admin.vuestic.dev/admin/dashboard?theme=light"> Light theme demo </a> | <a href="https://admin.vuestic.dev/admin/dashboard?theme=semi-dark">Semi-dark theme demo </a> | <a href="https://admin.vuestic.dev/admin/dashboard?theme=original">Original theme demo </a> | <a href="https://vuestic.dev"> Vuestic UI documentation </a>
+</p>
+
+> Vuestic Admin is built with Vuestic UI. See our
+> <a href="https://github.com/epicmaxco/vuestic-ui/issues">issues</a>,
+> <a href="https://vuestic.dev/en/contribution/guide">contributing guide</a> and join discussions on our
+> <a href="https://discord.gg/jTKTjj2weV">discord server</a> to help us improve Vuestic Admin & Vuestic UI experience.
+
+<p align="center">
+  <a href="https://admin.vuestic.dev" target="_blank">
+    <img src="./public/vuestic-admin-image.jpg" align="center" width="888px"/>
+  </a>
+</p>
+
+<p align="center">
+  <a href="https://circleci.com/gh/epicmaxco/vuestic-admin">
+    <img src="https://img.shields.io/circleci/build/github/epicmaxco/vuestic-admin/master" alt="Circleci">
+  </a>
+</p>
+
+### Documentation
+
+Documentation, guides and tutorials are available
+on <a href="https://vuestic.dev">vuestic.dev</a>
+
+### Official Discord Server
+
+Ask questions at the official
+community [discord server](https://discord.gg/jTKTjj2weV)
+
+### Installation
+
+First of all, make sure you have all prerequisites installed:
+
+- [Node.js](https://nodejs.org/en/) ( >=14.\*)
+- [npm](https://www.npmjs.com/get-npm) version 3+ (
+  or [yarn](https://yarnpkg.com/lang/en/docs/install) version 1.16+)
+  and [Git](https://git-scm.com).
+
+After checking the prerequisites, follow these simple steps to install and use
+Vuestic Admin:
+
+```
+# clone the repo
+$ git clone https://github.com/epicmaxco/vuestic-admin.git myproject
+
+# go into app's directory and install dependencies:
+$ cd myproject
+
+```
+
+Then, if you use npm:
+
+```
+$ npm install
+
+# serve with hot reload at localhost:8080 by default.
+$ npm run dev
+
+# build for production
+$ npm run build
+
+# build for production and view the bundle analyzer report.
+$ npm run build --report
+```
+
+If you use yarn:
+
+```
+$ yarn install
+
+# serve with hot reload at localhost:8080 by default.
+$ yarn dev
+
+# build for production
+$ yarn build
+
+# build for production and view the bundle analyzer report.
+$ yarn build --report
+```
+
+### Features
+
+[Responsive layout](https://admin.vuestic.dev/admin/dashboard) |
+[charts (Chart.js)](https://admin.vuestic.dev/admin/statistics/charts) |
+[progress bars](https://admin.vuestic.dev/admin/statistics/progress-bars) |
+[forms](https://admin.vuestic.dev/admin/forms/form-elements) |
+[selects](https://admin.vuestic.dev/admin/forms/form-elements) |
+[date pickers](https://admin.vuestic.dev/admin/forms/form-elements) |
+[checkboxes and radios](https://admin.vuestic.dev/admin/forms/form-elements)
+|
+[static tables and data tables](https://admin.vuestic.dev/admin/tables/data)
+|
+[medium editor](https://admin.vuestic.dev/admin/forms/medium-editor) |
+[smooth typography](https://admin.vuestic.dev/admin/ui/typography) |
+[buttons](https://admin.vuestic.dev/admin/ui/buttons) |
+[collapses](https://admin.vuestic.dev/admin/ui/collapses) |
+[color pickers](https://admin.vuestic.dev/admin/ui/color-pickers) |
+[timelines](https://admin.vuestic.dev/admin/ui/timelines) |
+[toasts](https://admin.vuestic.dev/admin/ui/notifications) |
+[tooltips](https://admin.vuestic.dev/admin/ui/popovers) |
+[popovers](https://admin.vuestic.dev/admin/ui/popovers) |
+[icons](https://admin.vuestic.dev/admin/ui/icons/) |
+[spinners](https://admin.vuestic.dev/admin/ui/spinners) |
+[modals](https://admin.vuestic.dev/admin/ui/modals) |
+[file upload](https://admin.vuestic.dev/admin/ui/file-upload) |
+[chips](https://admin.vuestic.dev/admin/ui/chips) |
+[trees](https://admin.vuestic.dev/admin/ui/tree-view) |
+[cards](https://admin.vuestic.dev/admin/ui/cards) |
+[ratings](https://admin.vuestic.dev/admin/ui/rating) |
+[sliders](https://admin.vuestic.dev/admin/ui/sliders) |
+[chat](https://admin.vuestic.dev/admin/ui/chat) |
+[maps (MapLibre, Yandex, Leaflet, amMap)](https://admin.vuestic.dev/admin/maps/maplibre-maps)
+|
+[login/signup pages templates](https://admin.vuestic.dev/auth/login) |
+[404 pages templates](https://admin.vuestic.dev/admin/pages/404-pages) |
+[i18n](https://admin.vuestic.dev/admin/dashboard)
+
+### Browser Support
+
+We design Vuestic Admin to support the latest modern web browsers.
+
+| <img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="Edge" width="24px" height="24px" /><br>Edge | <img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" /><br>Firefox | <img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" /><br>Chrome | <img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" /><br>Safari | <img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/opera/opera_48x48.png" alt="Opera" width="24px" height="24px" /><br>Opera |
+| ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Edge                                                                                                                                             | last 2 versions                                                                                                                                              | last 2 versions                                                                                                                                          | last 2 versions                                                                                                                                          | last 2 versions                                                                                                                                      |
+
+### Contributing
+
+Thanks for all your wonderful PRs, issues and ideas.
+
+<a href="https://github.com/epicmaxco/vuestic-admin/graphs/contributors">
+<img src="https://opencollective.com/vuestic-admin/contributors.svg?width=890&button=false" />
+</a>
+<br>
+
+You’re always welcome to join: check out
+our <a href="https://vuestic.dev/en/contribution/guide">
+contribution guides</a>
+, [open issues](https://github.com/epicmaxco/vuestic-ui/issues)
+and [discord server](https://discord.gg/jTKTjj2weV)
+
+### Partners & Sponsors ❤️
+
+<img src="./.github/assets/sponsors.jpg" loading="lazy" alt="Epicmax, vuejobs, ag-grid, flatlogic, browserstack and jetbrains" width="400px">
+
+Become a partner: [hello@epicmax.co](mailto:hello@epicmax.co)
+
+## Can I hire you guys?
+
+[Epicmax](https://epicmax.co) is committed to Open Source from its beginning.
+[Vuestic UI](https://vuestic.dev) was created and backed by Epicmax, and is supported through all the years.
+You can request a consultation or order web development services by Epicmax via this [form](https://epicmax.co/contacts) 😎
+
+Say hi: <a href="mailto:hello@epicmax.co">hello@epicmax.co</a>. We will be happy to work with you!
+
+[Other work](https://epicmax.co) we’ve done 🤘
+
+[Meet the Team](https://vuestic.dev/team)
+
+### Awards
+
+<a href="https://flatlogic.com/templates/vuestic-vue-free-admin" target="_blank">
+    <img src="https://i.imgur.com/ZeQPZ3Q.png" align="center" width="150px"/>
+</a>
+<p>
+  By <a href="https://flatlogic.com/templates/vuestic-vue-free-admin" target="_blank">@flatlogic</a> marketplace
+</p>
+
+### Follow us
+
+Stay up to date with the latest Vuestic news! Follow us
+on [Twitter](https://twitter.com/vuestic_ui)
+or [Linkedin](https://www.linkedin.com/company/18509340)
+
+### License
+
+[MIT](https://github.com/epicmaxco/vuestic-admin/blob/master/LICENSE) license.

+ 146 - 0
README.zh-CN.md

@@ -0,0 +1,146 @@
+<p align="center">
+  <a href="./README.md"> English </a> | 简体中文 | <a href="./README.ja-JP.md"> 日本語 </a>
+</p>
+
+<h1 align="center"> Vuestic Admin </h1>
+
+<p align="center">
+  免费与美妙Vue.js管理模板包括38以上个定制用户界面组件</br>
+  由<a href="https://epicmax.co">Epicmax</a>开发。
+  由<a href="#">Vasili Savitski</a>设计
+</p>
+
+<p align="center">
+  <a href="https://admin.vuestic.dev"> 演示版 </a> | <a href="[THEME_URL]"> 新白色主题演示 </a> | <a href="https://github.com/epicmaxco/vuestic-admin/wiki"> 文档 </a>
+</p>
+
+<p align="center">
+  <a href="https://admin.vuestic.dev" target="_blank">
+    <img src="https://i.imgur.com/hVxoYQM.jpg" align="center" width="888px"/>
+  </a>
+</p>
+
+<p align="center">
+  <a href="https://circleci.com/gh/epicmaxco/vuestic-admin">
+    <img src="https://img.shields.io/circleci/build/github/epicmaxco/vuestic-admin/master" alt="Circleci">
+  </a>
+</p>
+
+<h2>
+  <a href="[THEME_URL]" target="_blank">
+    新白色主题演示
+  </a>
+</h2>
+
+<p align="center">
+  <a href="[THEME_URL]" target="_blank">
+    <img src="https://i.imgur.com/DnFcrjD.png" align="center" width="888px"/>
+  </a>
+</p>
+
+## 安装
+
+首先确定 ni 安装所有的先决条件:
+
+- [Node.js](https://nodejs.org/en/) (>=8.9)
+- [npm](https://www.npmjs.com/get-npm) 3+版本 (或许[yarn](https://yarnpkg.com/lang/en/docs/install/#mac-stable) 1.16+版本) 和[Git](https://git-scm.com/)。
+
+检查先决条件之后,用简单指令之下安装与应用 Vuestic 管理台:
+
+```
+#克隆存储库
+$ git clone https://github.com/epicmaxco/vuestic-admin.git myproject
+
+#进入应用目录与安装依赖
+$ cd myproject
+
+```
+
+之后,如果您用 npm:
+
+```
+$ npm install
+
+#默认情况下在localhost:8080用热重载
+$ npm run dev
+
+#构建生产
+$ npm run build
+
+#构建生产与查看包分析报表
+$ npm run build --report
+```
+
+如果您用 yarn:
+
+```
+$ yarn install
+
+#默认情况下在localhost:8080用热重载
+$ yarn dev
+
+#构建生产
+$ yarn build
+
+#构建生产与查看包分析报表
+$ yarn build --report
+```
+
+## 功能
+
+[响应布局](https://admin.vuestic.dev/#/admin/dashboard) |
+[图表(Charts.js)](https://admin.vuestic.dev/#/admin/statistics/charts) |
+[进度表](https://admin.vuestic.dev/#/admin/statistics/progress-bars) |
+[表格](https://admin.vuestic.dev/#/admin/forms/form-elements) |
+[选辑](https://admin.vuestic.dev/#/admin/forms/form-elements) |
+[日期选择器](https://admin.vuestic.dev/#/admin/forms/form-elements) |
+[复选框和单选框](https://admin.vuestic.dev/#/admin/forms/form-elements) |
+[静态表与数据表](https://admin.vuestic.dev/#/admin/tables/data) |
+[medium editor](https://admin.vuestic.dev/#/admin/forms/medium-editor) |
+[平滑设计字体](https://admin.vuestic.dev/#/admin/ui/typography) |
+[按钮](https://admin.vuestic.dev/#/admin/ui/buttons) |
+[塌缩](https://admin.vuestic.dev/#/admin/ui/collapses) |
+[颜色选择器](https://admin.vuestic.dev/#/admin/ui/color-pickers) |
+[时间线](https://admin.vuestic.dev/#/admin/ui/timelines) |
+[土司通知](https://admin.vuestic.dev/#/admin/ui/notifications) |
+[工具提示](https://admin.vuestic.dev/#/admin/ui/popovers) |
+[弹窗](https://admin.vuestic.dev/#/admin/ui/popovers) |
+[图标](https://admin.vuestic.dev/#/admin/ui/icons/) |
+[自旋体](https://admin.vuestic.dev/#/admin/ui/spinners) |
+[模式](https://admin.vuestic.dev/#/admin/ui/modals) |
+[文件上传](https://admin.vuestic.dev/#/admin/ui/file-upload) |
+[厚切薯条通知](https://admin.vuestic.dev/#/admin/ui/chips) |
+[树](https://admin.vuestic.dev/#/admin/ui/tree-view) |
+[卡片](https://admin.vuestic.dev/#/admin/ui/cards) |
+[等级](https://admin.vuestic.dev/#/admin/ui/rating) |
+[滑动器](https://admin.vuestic.dev/#/admin/ui/sliders) |
+[聊天系统](https://admin.vuestic.dev/#/admin/ui/chat) |
+[地图(MapLibre, Yandex, Leaflet, amMap)](https://admin.vuestic.dev/#/admin/maps/maplibre-maps) |
+[登录/注册页模板](https://admin.vuestic.dev/#/auth/login) |
+[404 页模板](https://admin.vuestic.dev/#/admin/pages/404-pages) |
+[i18n](https://admin.vuestic.dev/#/admin/dashboard)
+
+## 支持的浏览器
+
+| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/opera/opera_48x48.png" alt="Opera" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Opera |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| IE11, Edge                                                                                                                                                                                                      | last 2 versions                                                                                                                                                                                                   | last 2 versions                                                                                                                                                                                               | last 2 versions                                                                                                                                                                                               | last 2 versions                                                                                                                                                                                           |
+
+## 参与贡献
+
+多谢您的出色公关、问题与注意。随时欢迎您的[加入](https://github.com/epicmaxco/vuestic-admin/blob/master/.github/CONTRIBUTING.md)!
+
+[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/0)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/0)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/1)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/1)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/2)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/2)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/3)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/3)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/4)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/4)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/5)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/5)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/6)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/6)[![](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/images/7)](https://sourcerer.io/fame/smartapant/epicmaxco/vuestic-admin/links/7)
+
+## 我可以雇佣你们吗?
+
+当然!给[hello@epicmax.co](mailto:hello@epicmax.co)发电子邮件 </br>
+和您一起工作我们将很高兴!查看我们其它项目 - [epicmax.co](https://epicmax.co)
+
+## 关注我们
+
+敬请期待 Vuestic 最新消息!关注我们[Twitter](https://twitter.com/epicmaxco)与[Facebook](https://facebook.com/epicmaxco)
+
+## 许可证
+
+[MIT](https://github.com/epicmaxco/vuestic-admin/blob/master/LICENSE)许可证.

+ 7 - 0
config/dev.env.js

@@ -0,0 +1,7 @@
+'use strict'
+const merge = require('webpack-merge')
+const prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+  NODE_ENV: '"development"',
+})

+ 49 - 0
config/index.js

@@ -0,0 +1,49 @@
+'use strict'
+
+const path = require('path')
+
+module.exports = {
+  build: {
+    env: require('./prod.env'),
+    index: path.resolve(__dirname, '../dist/index.html'),
+    assetsRoot: path.resolve(__dirname, '../dist'),
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    productionSourceMap: true,
+    // Gzip off by default as many popular static hosts such as
+    // Surge or Netlify already gzip all static assets for you.
+    // Before setting to `true`, make sure to:
+    // npm install --save-dev compression-webpack-plugin
+    productionGzip: false,
+    productionGzipExtensions: ['js', 'css'],
+    // Run the build command with an extra argument to
+    // View the bundle analyzer report after build finishes:
+    // `npm run build --report`
+    // Set to `true` or `false` to always turn it on or off
+    bundleAnalyzerReport: process.env.npm_config_report,
+  },
+  dev: {
+    env: require('./dev.env'),
+    autoOpenBrowser: true,
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    proxyTable: {
+      '/api': {
+        //这里最好有一个 /
+        target: 'http://matrix34.tpddns.cn:60006/', // 后台接口域名
+        ws: true, //如果要代理 websockets,配置这个参数
+        secure: false, // 如果是https接口,需要配置这个参数
+        changeOrigin: true, //是否跨域
+        pathRewrite: {
+          '^/api': '',
+        },
+      },
+    },
+    // CSS Sourcemaps off by default because relative paths are "buggy"
+    // with this option, according to the CSS-Loader README
+    // (https://github.com/webpack/css-loader#sourcemaps)
+    // In our experience, they generally work as expected,
+    // just be aware of this issue when enabling this option.
+    cssSourceMap: false,
+  },
+}

+ 4 - 0
config/prod.env.js

@@ -0,0 +1,4 @@
+'use strict'
+module.exports = {
+  NODE_ENV: '"production"',
+}

BIN
dist.zip


+ 50 - 0
docs/pre-production.md

@@ -0,0 +1,50 @@
+# Pre-production
+
+## SEO
+
+We have a boierplate prepared with some analytics ingrained. This includes:
+
+- [Yandex Metrica](https://metrica.yandex.com/about)
+
+To get these running - just provide keys to respective apis. You're advised to copy `.env.example` with rename to `.env` then modify it.
+
+Notice, that if you are about to use Google Maps then you also have to provide it with your personal API key. The key must be defined under the `VUE_APP_GOOGLE_MAPS_API_KEY` environment-variable (more on them below) and can be obtained [here](https://developers.google.com/maps/documentation/javascript/get-api-key).
+
+## Deploy
+
+We use [circleci](https://circleci.com) to deploy vuestic version you're able to see on demo.
+
+If you want to save some time and use our config, do notice that circleci will need the following keys, that you have to set in **Build Settings -> Environment Variables**.
+
+- `DEPLOY_PASSWORD` ssh password.
+- `DEPLOY_PATH_PRODUCTION` production build will be loaded to this folder.
+- `DEPLOY_PATH_STAGING` staging build will be loaded to this folder.
+- `DEPLOY_URL` ssh url.
+- `DEPLOY_USER` ssh password.
+
+You can modify [config](../.circleci/config.yml) if our solution doesn't suit your needs exactly.
+
+Couple of things to note:
+
+- in `.env` file keys should look like this `VUE_APP_DRIFT_KEY`. Which will correspond to circleci key `DRIFT_KEY`. You essentially have two ways to pass config into build process.
+- Circleci will run tests before both staging and production.
+
+## Demos
+
+You can enable demos in build by:
+
+```
+VUE_APP_INCLUDE_DEMOS=true
+```
+
+Demos are included in staging build by default. They're not present in production because of significant impact on bundle size.
+
+## Build Version
+
+You can enable build version, hash commit, and timestamp by build to the main page footer:
+
+```
+VUE_APP_BUILD_VERSION=true
+```
+
+This information are excluded by default.

+ 17 - 0
index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,700" rel="stylesheet" />
+    <link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400" rel="stylesheet" />
+    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" />
+    <link rel="icon" href="/favicon.png" />
+
+    <title>OA</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

+ 5217 - 0
package-lock.json

@@ -0,0 +1,5217 @@
+{
+  "name": "vuestic-admin",
+  "version": "3.1.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@amcharts/amcharts5": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/@amcharts/amcharts5/-/amcharts5-5.4.1.tgz",
+      "integrity": "sha512-8sDKUBROrm0nO824PGwQ8o/r7boeBLDwYkp0OP+RxmMFFo6QlA3TwF8Hn2VryNyNW57QysRH2nPklBO3ZuUR6g==",
+      "requires": {
+        "@types/d3": "^7.0.0",
+        "@types/d3-chord": "^3.0.0",
+        "@types/d3-hierarchy": "3.1.1",
+        "@types/d3-sankey": "^0.11.1",
+        "@types/d3-shape": "^3.0.0",
+        "@types/geojson": "^7946.0.8",
+        "@types/polylabel": "^1.0.5",
+        "@types/svg-arc-to-cubic-bezier": "^3.2.0",
+        "d3": "^7.0.0",
+        "d3-chord": "^3.0.0",
+        "d3-geo": "^3.0.0",
+        "d3-sankey": "^0.12.3",
+        "d3-selection": "^3.0.0",
+        "d3-transition": "^3.0.0",
+        "d3-voronoi-treemap": "^1.1.2",
+        "flatpickr": "^4.6.9",
+        "markerjs2": "^2.29.4",
+        "pdfmake": "^0.2.2",
+        "polylabel": "^1.1.0",
+        "regression": "^2.0.1",
+        "seedrandom": "^3.0.5",
+        "svg-arc-to-cubic-bezier": "^3.2.0",
+        "tslib": "^2.2.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+          "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+        }
+      }
+    },
+    "@amcharts/amcharts5-geodata": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/@amcharts/amcharts5-geodata/-/amcharts5-geodata-5.0.3.tgz",
+      "integrity": "sha512-rQsFO6iGfLsXR4/8Tg/DFyZ5rfdRaYU1oFZ35mwhHlt/Cm+Kk2JW2wJ1EgXCKLsM4e0LpatD0jCIf471tjGEpg==",
+      "requires": {
+        "@types/geojson": "^7946.0.8"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.22.7",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
+      "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q=="
+    },
+    "@esbuild/android-arm": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz",
+      "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-arm64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz",
+      "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-x64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz",
+      "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-arm64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz",
+      "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-x64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz",
+      "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-arm64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz",
+      "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-x64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz",
+      "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz",
+      "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz",
+      "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ia32": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz",
+      "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-loong64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz",
+      "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-mips64el": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz",
+      "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ppc64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz",
+      "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-riscv64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz",
+      "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-s390x": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz",
+      "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-x64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz",
+      "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/netbsd-x64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz",
+      "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/openbsd-x64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz",
+      "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/sunos-x64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz",
+      "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-arm64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz",
+      "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-ia32": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz",
+      "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-x64": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz",
+      "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==",
+      "dev": true,
+      "optional": true
+    },
+    "@eslint/eslintrc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+      "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.3.2",
+        "globals": "^13.15.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      }
+    },
+    "@floating-ui/core": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.5.3.tgz",
+      "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==",
+      "dev": true,
+      "requires": {
+        "@floating-ui/utils": "^0.2.0"
+      }
+    },
+    "@floating-ui/dom": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.5.4.tgz",
+      "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==",
+      "dev": true,
+      "requires": {
+        "@floating-ui/core": "^1.5.3",
+        "@floating-ui/utils": "^0.2.0"
+      }
+    },
+    "@floating-ui/utils": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.1.tgz",
+      "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==",
+      "dev": true
+    },
+    "@floating-ui/vue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/vue/-/vue-1.0.3.tgz",
+      "integrity": "sha512-XCXiEoRDN1oT4z+wWUvQAuUg8qjJFDQByq/7wkT/d1FoXvoOK/vLD0wa/QcvwjjaT7C2dgXZ10AnLptM3s0u8w==",
+      "dev": true,
+      "requires": {
+        "@floating-ui/dom": "^1.5.4",
+        "@floating-ui/utils": "^0.2.0",
+        "vue-demi": ">=0.13.0"
+      }
+    },
+    "@foliojs-fork/fontkit": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz",
+      "integrity": "sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==",
+      "requires": {
+        "@foliojs-fork/restructure": "^2.0.2",
+        "brfs": "^2.0.0",
+        "brotli": "^1.2.0",
+        "browserify-optional": "^1.0.1",
+        "clone": "^1.0.4",
+        "deep-equal": "^1.0.0",
+        "dfa": "^1.2.0",
+        "tiny-inflate": "^1.0.2",
+        "unicode-properties": "^1.2.2",
+        "unicode-trie": "^2.0.0"
+      }
+    },
+    "@foliojs-fork/linebreak": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.1.tgz",
+      "integrity": "sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==",
+      "requires": {
+        "base64-js": "1.3.1",
+        "brfs": "^2.0.2",
+        "unicode-trie": "^2.0.0"
+      }
+    },
+    "@foliojs-fork/pdfkit": {
+      "version": "0.13.0",
+      "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.13.0.tgz",
+      "integrity": "sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ==",
+      "requires": {
+        "@foliojs-fork/fontkit": "^1.9.1",
+        "@foliojs-fork/linebreak": "^1.1.1",
+        "crypto-js": "^4.0.0",
+        "png-js": "^1.0.0"
+      }
+    },
+    "@foliojs-fork/restructure": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz",
+      "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA=="
+    },
+    "@fortawesome/fontawesome-free": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.1.1.tgz",
+      "integrity": "sha512-J/3yg2AIXc9wznaVqpHVX3Wa5jwKovVF0AMYSnbmcXTiL3PpRPfF58pzWucCwEiCJBp+hCNRLWClTomD8SseKg=="
+    },
+    "@gtm-support/core": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@gtm-support/core/-/core-2.0.0.tgz",
+      "integrity": "sha512-32hyxR/LIB6EWnUcbbrUzjkAE6PSRtqv/AztEnQ8MuCOQ7+u+yXOssfZqNDSWlQkEBn0Co6f7aHG+vcNZCGiLw=="
+    },
+    "@gtm-support/vue-gtm": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@gtm-support/vue-gtm/-/vue-gtm-2.0.0.tgz",
+      "integrity": "sha512-zcnCMZbjPkTGkQpMkF9U2JcCtK9JiasfoZJCYYJLGKFj0cd7abwNLPMa3/sXB89YqiFniazkP++nIzFU9kZzqw==",
+      "requires": {
+        "@gtm-support/core": "^2.0.0",
+        "vue-router": "^4.1.0"
+      }
+    },
+    "@humanwhocodes/config-array": {
+      "version": "0.9.5",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+      "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+      "dev": true,
+      "requires": {
+        "@humanwhocodes/object-schema": "^1.2.1",
+        "debug": "^4.1.1",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "@humanwhocodes/object-schema": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+      "dev": true
+    },
+    "@intlify/bundle-utils": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-7.0.2.tgz",
+      "integrity": "sha512-8wbx9xhbawBFTE5LPTECiK26RRqrNS31jyWSur72ZXZZ4it5jiZTcG6eUJlNirr4+jXYio2DGY299JsGVT4cpw==",
+      "dev": true,
+      "requires": {
+        "@intlify/message-compiler": "9.3.0-beta.24",
+        "@intlify/shared": "9.3.0-beta.24",
+        "acorn": "^8.8.2",
+        "escodegen": "^2.0.0",
+        "estree-walker": "^2.0.2",
+        "jsonc-eslint-parser": "^1.0.1",
+        "magic-string": "^0.30.0",
+        "mlly": "^1.2.0",
+        "source-map-js": "^1.0.1",
+        "yaml-eslint-parser": "^0.3.2"
+      },
+      "dependencies": {
+        "@intlify/message-compiler": {
+          "version": "9.3.0-beta.24",
+          "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.24.tgz",
+          "integrity": "sha512-prhHATkgp0mpPqoVgiAtLmUc1JMvs8fMH6w53AVEBn+VF87dLhzanfmWY5FoZWORG51ag54gBDBOoM/VFv3m3A==",
+          "dev": true,
+          "requires": {
+            "@intlify/shared": "9.3.0-beta.24",
+            "source-map-js": "^1.0.2"
+          }
+        },
+        "@intlify/shared": {
+          "version": "9.3.0-beta.24",
+          "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.24.tgz",
+          "integrity": "sha512-AKxJ8s7eKIQWkNaf4wyyoLRwf4puCuQgjSChlDJm5JBEt6T8HGgnYTJLRXu6LD/JACn3Qwu6hM/XRX1c9yvjmQ==",
+          "dev": true
+        },
+        "escodegen": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+          "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+          "dev": true,
+          "requires": {
+            "esprima": "^4.0.1",
+            "estraverse": "^5.2.0",
+            "esutils": "^2.0.2",
+            "source-map": "~0.6.1"
+          }
+        },
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        },
+        "magic-string": {
+          "version": "0.30.1",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz",
+          "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==",
+          "dev": true,
+          "requires": {
+            "@jridgewell/sourcemap-codec": "^1.4.15"
+          }
+        }
+      }
+    },
+    "@intlify/core-base": {
+      "version": "9.1.10",
+      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.10.tgz",
+      "integrity": "sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==",
+      "requires": {
+        "@intlify/devtools-if": "9.1.10",
+        "@intlify/message-compiler": "9.1.10",
+        "@intlify/message-resolver": "9.1.10",
+        "@intlify/runtime": "9.1.10",
+        "@intlify/shared": "9.1.10",
+        "@intlify/vue-devtools": "9.1.10"
+      }
+    },
+    "@intlify/devtools-if": {
+      "version": "9.1.10",
+      "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.10.tgz",
+      "integrity": "sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==",
+      "requires": {
+        "@intlify/shared": "9.1.10"
+      }
+    },
+    "@intlify/message-compiler": {
+      "version": "9.1.10",
+      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.10.tgz",
+      "integrity": "sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==",
+      "requires": {
+        "@intlify/message-resolver": "9.1.10",
+        "@intlify/shared": "9.1.10",
+        "source-map": "0.6.1"
+      }
+    },
+    "@intlify/message-resolver": {
+      "version": "9.1.10",
+      "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.10.tgz",
+      "integrity": "sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w=="
+    },
+    "@intlify/runtime": {
+      "version": "9.1.10",
+      "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.10.tgz",
+      "integrity": "sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==",
+      "requires": {
+        "@intlify/message-compiler": "9.1.10",
+        "@intlify/message-resolver": "9.1.10",
+        "@intlify/shared": "9.1.10"
+      }
+    },
+    "@intlify/shared": {
+      "version": "9.1.10",
+      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.10.tgz",
+      "integrity": "sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA=="
+    },
+    "@intlify/unplugin-vue-i18n": {
+      "version": "0.12.2",
+      "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.12.2.tgz",
+      "integrity": "sha512-IIgzLRSPUKZM1FBdUAZ9NwVPiLUr4ea5g/HLWe2lB7gNtPDz4FOfUNUllIT504hT+3pDoJmjaYJ6pyqT7F4Wuw==",
+      "dev": true,
+      "requires": {
+        "@intlify/bundle-utils": "^7.0.2",
+        "@intlify/shared": "9.3.0-beta.24",
+        "@rollup/pluginutils": "^5.0.2",
+        "@vue/compiler-sfc": "^3.2.47",
+        "debug": "^4.3.3",
+        "fast-glob": "^3.2.12",
+        "js-yaml": "^4.1.0",
+        "json5": "^2.2.3",
+        "pathe": "^1.0.0",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2",
+        "unplugin": "^1.1.0"
+      },
+      "dependencies": {
+        "@intlify/shared": {
+          "version": "9.3.0-beta.24",
+          "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.24.tgz",
+          "integrity": "sha512-AKxJ8s7eKIQWkNaf4wyyoLRwf4puCuQgjSChlDJm5JBEt6T8HGgnYTJLRXu6LD/JACn3Qwu6hM/XRX1c9yvjmQ==",
+          "dev": true
+        },
+        "@rollup/pluginutils": {
+          "version": "5.0.2",
+          "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
+          "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
+          "dev": true,
+          "requires": {
+            "@types/estree": "^1.0.0",
+            "estree-walker": "^2.0.2",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "@vue/compiler-core": {
+          "version": "3.3.4",
+          "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz",
+          "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==",
+          "dev": true,
+          "requires": {
+            "@babel/parser": "^7.21.3",
+            "@vue/shared": "3.3.4",
+            "estree-walker": "^2.0.2",
+            "source-map-js": "^1.0.2"
+          }
+        },
+        "@vue/compiler-dom": {
+          "version": "3.3.4",
+          "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz",
+          "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==",
+          "dev": true,
+          "requires": {
+            "@vue/compiler-core": "3.3.4",
+            "@vue/shared": "3.3.4"
+          }
+        },
+        "@vue/compiler-sfc": {
+          "version": "3.3.4",
+          "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz",
+          "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==",
+          "dev": true,
+          "requires": {
+            "@babel/parser": "^7.20.15",
+            "@vue/compiler-core": "3.3.4",
+            "@vue/compiler-dom": "3.3.4",
+            "@vue/compiler-ssr": "3.3.4",
+            "@vue/reactivity-transform": "3.3.4",
+            "@vue/shared": "3.3.4",
+            "estree-walker": "^2.0.2",
+            "magic-string": "^0.30.0",
+            "postcss": "^8.1.10",
+            "source-map-js": "^1.0.2"
+          }
+        },
+        "@vue/compiler-ssr": {
+          "version": "3.3.4",
+          "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz",
+          "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==",
+          "dev": true,
+          "requires": {
+            "@vue/compiler-dom": "3.3.4",
+            "@vue/shared": "3.3.4"
+          }
+        },
+        "@vue/reactivity-transform": {
+          "version": "3.3.4",
+          "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz",
+          "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==",
+          "dev": true,
+          "requires": {
+            "@babel/parser": "^7.20.15",
+            "@vue/compiler-core": "3.3.4",
+            "@vue/shared": "3.3.4",
+            "estree-walker": "^2.0.2",
+            "magic-string": "^0.30.0"
+          }
+        },
+        "@vue/shared": {
+          "version": "3.3.4",
+          "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz",
+          "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==",
+          "dev": true
+        },
+        "magic-string": {
+          "version": "0.30.1",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz",
+          "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==",
+          "dev": true,
+          "requires": {
+            "@jridgewell/sourcemap-codec": "^1.4.15"
+          }
+        }
+      }
+    },
+    "@intlify/vue-devtools": {
+      "version": "9.1.10",
+      "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.10.tgz",
+      "integrity": "sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==",
+      "requires": {
+        "@intlify/message-resolver": "9.1.10",
+        "@intlify/runtime": "9.1.10",
+        "@intlify/shared": "9.1.10"
+      }
+    },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.4.15",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+      "dev": true
+    },
+    "@mapbox/geojson-rewind": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz",
+      "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==",
+      "requires": {
+        "get-stream": "^6.0.1",
+        "minimist": "^1.2.6"
+      }
+    },
+    "@mapbox/jsonlint-lines-primitives": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz",
+      "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="
+    },
+    "@mapbox/mapbox-gl-supported": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.1.tgz",
+      "integrity": "sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ=="
+    },
+    "@mapbox/point-geometry": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz",
+      "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="
+    },
+    "@mapbox/tiny-sdf": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.5.tgz",
+      "integrity": "sha512-OhXt2lS//WpLdkqrzo/KwB7SRD8AiNTFFzuo9n14IBupzIMa67yGItcK7I2W9D8Ghpa4T04Sw9FWsKCJG50Bxw=="
+    },
+    "@mapbox/unitbezier": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz",
+      "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw=="
+    },
+    "@mapbox/vector-tile": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz",
+      "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==",
+      "requires": {
+        "@mapbox/point-geometry": "~0.1.0"
+      }
+    },
+    "@mapbox/whoots-js": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz",
+      "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q=="
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@types/d3": {
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz",
+      "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==",
+      "requires": {
+        "@types/d3-array": "*",
+        "@types/d3-axis": "*",
+        "@types/d3-brush": "*",
+        "@types/d3-chord": "*",
+        "@types/d3-color": "*",
+        "@types/d3-contour": "*",
+        "@types/d3-delaunay": "*",
+        "@types/d3-dispatch": "*",
+        "@types/d3-drag": "*",
+        "@types/d3-dsv": "*",
+        "@types/d3-ease": "*",
+        "@types/d3-fetch": "*",
+        "@types/d3-force": "*",
+        "@types/d3-format": "*",
+        "@types/d3-geo": "*",
+        "@types/d3-hierarchy": "*",
+        "@types/d3-interpolate": "*",
+        "@types/d3-path": "*",
+        "@types/d3-polygon": "*",
+        "@types/d3-quadtree": "*",
+        "@types/d3-random": "*",
+        "@types/d3-scale": "*",
+        "@types/d3-scale-chromatic": "*",
+        "@types/d3-selection": "*",
+        "@types/d3-shape": "*",
+        "@types/d3-time": "*",
+        "@types/d3-time-format": "*",
+        "@types/d3-timer": "*",
+        "@types/d3-transition": "*",
+        "@types/d3-zoom": "*"
+      }
+    },
+    "@types/d3-array": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz",
+      "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ=="
+    },
+    "@types/d3-axis": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.1.tgz",
+      "integrity": "sha512-zji/iIbdd49g9WN0aIsGcwcTBUkgLsCSwB+uH+LPVDAiKWENMtI3cJEWt+7/YYwelMoZmbBfzA3qCdrZ2XFNnw==",
+      "requires": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "@types/d3-brush": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.1.tgz",
+      "integrity": "sha512-B532DozsiTuQMHu2YChdZU0qsFJSio3Q6jmBYGYNp3gMDzBmuFFgPt9qKA4VYuLZMp4qc6eX7IUFUEsvHiXZAw==",
+      "requires": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "@types/d3-chord": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.1.tgz",
+      "integrity": "sha512-eQfcxIHrg7V++W8Qxn6QkqBNBokyhdWSAS73AbkbMzvLQmVVBviknoz2SRS/ZJdIOmhcmmdCRE/NFOm28Z1AMw=="
+    },
+    "@types/d3-color": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz",
+      "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA=="
+    },
+    "@types/d3-contour": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.1.tgz",
+      "integrity": "sha512-C3zfBrhHZvrpAAK3YXqLWVAGo87A4SvJ83Q/zVJ8rFWJdKejUnDYaWZPkA8K84kb2vDA/g90LTQAz7etXcgoQQ==",
+      "requires": {
+        "@types/d3-array": "*",
+        "@types/geojson": "*"
+      }
+    },
+    "@types/d3-delaunay": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz",
+      "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ=="
+    },
+    "@types/d3-dispatch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+      "integrity": "sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw=="
+    },
+    "@types/d3-drag": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.1.tgz",
+      "integrity": "sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==",
+      "requires": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "@types/d3-dsv": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.0.tgz",
+      "integrity": "sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A=="
+    },
+    "@types/d3-ease": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz",
+      "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA=="
+    },
+    "@types/d3-fetch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.1.tgz",
+      "integrity": "sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw==",
+      "requires": {
+        "@types/d3-dsv": "*"
+      }
+    },
+    "@types/d3-force": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.3.tgz",
+      "integrity": "sha512-z8GteGVfkWJMKsx6hwC3SiTSLspL98VNpmvLpEFJQpZPq6xpA1I8HNBDNSpukfK0Vb0l64zGFhzunLgEAcBWSA=="
+    },
+    "@types/d3-format": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz",
+      "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg=="
+    },
+    "@types/d3-geo": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.2.tgz",
+      "integrity": "sha512-DbqK7MLYA8LpyHQfv6Klz0426bQEf7bRTvhMy44sNGVyZoWn//B0c+Qbeg8Osi2Obdc9BLLXYAKpyWege2/7LQ==",
+      "requires": {
+        "@types/geojson": "*"
+      }
+    },
+    "@types/d3-hierarchy": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz",
+      "integrity": "sha512-QwjxA3+YCKH3N1Rs3uSiSy1bdxlLB1uUiENXeJudBoAFvtDuswUxLcanoOaR2JYn1melDTuIXR8VhnVyI3yG/A=="
+    },
+    "@types/d3-interpolate": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+      "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==",
+      "requires": {
+        "@types/d3-color": "*"
+      }
+    },
+    "@types/d3-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz",
+      "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg=="
+    },
+    "@types/d3-polygon": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz",
+      "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw=="
+    },
+    "@types/d3-quadtree": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz",
+      "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw=="
+    },
+    "@types/d3-random": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz",
+      "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ=="
+    },
+    "@types/d3-sankey": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-sankey/-/d3-sankey-0.11.2.tgz",
+      "integrity": "sha512-U6SrTWUERSlOhnpSrgvMX64WblX1AxX6nEjI2t3mLK2USpQrnbwYYK+AS9SwiE7wgYmOsSSKoSdr8aoKBH0HgQ==",
+      "requires": {
+        "@types/d3-shape": "^1"
+      },
+      "dependencies": {
+        "@types/d3-path": {
+          "version": "1.0.9",
+          "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz",
+          "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ=="
+        },
+        "@types/d3-shape": {
+          "version": "1.3.8",
+          "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz",
+          "integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==",
+          "requires": {
+            "@types/d3-path": "^1"
+          }
+        }
+      }
+    },
+    "@types/d3-scale": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz",
+      "integrity": "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==",
+      "requires": {
+        "@types/d3-time": "*"
+      }
+    },
+    "@types/d3-scale-chromatic": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz",
+      "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw=="
+    },
+    "@types/d3-selection": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.3.tgz",
+      "integrity": "sha512-Mw5cf6nlW1MlefpD9zrshZ+DAWL4IQ5LnWfRheW6xwsdaWOb6IRRu2H7XPAQcyXEx1D7XQWgdoKR83ui1/HlEA=="
+    },
+    "@types/d3-shape": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.0.tgz",
+      "integrity": "sha512-jYIYxFFA9vrJ8Hd4Se83YI6XF+gzDL1aC5DCsldai4XYYiVNdhtpGbA/GM6iyQ8ayhSp3a148LY34hy7A4TxZA==",
+      "requires": {
+        "@types/d3-path": "*"
+      }
+    },
+    "@types/d3-time": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz",
+      "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg=="
+    },
+    "@types/d3-time-format": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz",
+      "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw=="
+    },
+    "@types/d3-timer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz",
+      "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g=="
+    },
+    "@types/d3-transition": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.1.tgz",
+      "integrity": "sha512-Sv4qEI9uq3bnZwlOANvYK853zvpdKEm1yz9rcc8ZTsxvRklcs9Fx4YFuGA3gXoQN/c/1T6QkVNjhaRO/cWj94g==",
+      "requires": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "@types/d3-zoom": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.1.tgz",
+      "integrity": "sha512-7s5L9TjfqIYQmQQEUcpMAcBOahem7TRoSO/+Gkz02GbMVuULiZzjF2BOdw291dbO2aNon4m2OdFsRGaCq2caLQ==",
+      "requires": {
+        "@types/d3-interpolate": "*",
+        "@types/d3-selection": "*"
+      }
+    },
+    "@types/estree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
+      "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
+      "dev": true
+    },
+    "@types/geojson": {
+      "version": "7946.0.8",
+      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz",
+      "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA=="
+    },
+    "@types/json-schema": {
+      "version": "7.0.11",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+      "dev": true
+    },
+    "@types/leaflet": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.7.11.tgz",
+      "integrity": "sha512-VwAYom2pfIAf/pLj1VR5aLltd4tOtHyvfaJlNYCoejzP2nu52PrMi1ehsLRMUS+bgafmIIKBV1cMfKeS+uJ0Vg==",
+      "dev": true,
+      "requires": {
+        "@types/geojson": "*"
+      }
+    },
+    "@types/lodash": {
+      "version": "4.14.202",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.202.tgz",
+      "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==",
+      "dev": true
+    },
+    "@types/mapbox__point-geometry": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.2.tgz",
+      "integrity": "sha512-D0lgCq+3VWV85ey1MZVkE8ZveyuvW5VAfuahVTQRpXFQTxw03SuIf1/K4UQ87MMIXVKzpFjXFiFMZzLj2kU+iA=="
+    },
+    "@types/mapbox__vector-tile": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.0.tgz",
+      "integrity": "sha512-kDwVreQO5V4c8yAxzZVQLE5tyWF+IPToAanloQaSnwfXmIcJ7cyOrv8z4Ft4y7PsLYmhWXmON8MBV8RX0Rgr8g==",
+      "requires": {
+        "@types/geojson": "*",
+        "@types/mapbox__point-geometry": "*",
+        "@types/pbf": "*"
+      }
+    },
+    "@types/medium-editor": {
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/@types/medium-editor/-/medium-editor-5.0.5.tgz",
+      "integrity": "sha512-iufODxGqPu78eZxOolGtc790n00LIZOeTVvdhX4ka+owG+/bdUnqcI59fTuW/JJavkIpYqCAFj7WKnJxJhQS6w==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "17.0.45",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
+      "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
+      "dev": true
+    },
+    "@types/pbf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.2.tgz",
+      "integrity": "sha512-EDrLIPaPXOZqDjrkzxxbX7UlJSeQVgah3i0aA4pOSzmK9zq3BIh7/MZIQxED7slJByvKM4Gc6Hypyu2lJzh3SQ=="
+    },
+    "@types/polylabel": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/polylabel/-/polylabel-1.0.5.tgz",
+      "integrity": "sha512-gnaNmo1OJiYNBFAZMZdqLZ3hKx2ee4ksAzqhKWBxuQ61PmhINHMcvIqsGmyCD1WFKCkwRt9NFhMSmKE6AgYY+w=="
+    },
+    "@types/svg-arc-to-cubic-bezier": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@types/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz",
+      "integrity": "sha512-3h04sJhF2rjOq8zUhyomORyKdr0RUts7FAz/JajBKGpTF0JSXjaj9fjWtAqj+pU1fwsGsHzcm3Neew3t/McUXA=="
+    },
+    "@typescript-eslint/eslint-plugin": {
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz",
+      "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/scope-manager": "5.29.0",
+        "@typescript-eslint/type-utils": "5.29.0",
+        "@typescript-eslint/utils": "5.29.0",
+        "debug": "^4.3.4",
+        "functional-red-black-tree": "^1.0.1",
+        "ignore": "^5.2.0",
+        "regexpp": "^3.2.0",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      }
+    },
+    "@typescript-eslint/parser": {
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz",
+      "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/scope-manager": "5.29.0",
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/typescript-estree": "5.29.0",
+        "debug": "^4.3.4"
+      }
+    },
+    "@typescript-eslint/scope-manager": {
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz",
+      "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/visitor-keys": "5.29.0"
+      }
+    },
+    "@typescript-eslint/type-utils": {
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz",
+      "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/utils": "5.29.0",
+        "debug": "^4.3.4",
+        "tsutils": "^3.21.0"
+      }
+    },
+    "@typescript-eslint/types": {
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz",
+      "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==",
+      "dev": true
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz",
+      "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/visitor-keys": "5.29.0",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      }
+    },
+    "@typescript-eslint/utils": {
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz",
+      "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.9",
+        "@typescript-eslint/scope-manager": "5.29.0",
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/typescript-estree": "5.29.0",
+        "eslint-scope": "^5.1.1",
+        "eslint-utils": "^3.0.0"
+      }
+    },
+    "@typescript-eslint/visitor-keys": {
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz",
+      "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.29.0",
+        "eslint-visitor-keys": "^3.3.0"
+      }
+    },
+    "@vitejs/plugin-vue": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz",
+      "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==",
+      "dev": true
+    },
+    "@volar/code-gen": {
+      "version": "0.35.2",
+      "resolved": "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.35.2.tgz",
+      "integrity": "sha512-MoZHuNnPfUWnCNkQUI5+U+gvLTxrU+XlCTusdNOTFYUUAa+M68MH0RxFIS9Ybj4uAUWTcZx0Ow1q5t/PZozo+Q==",
+      "dev": true,
+      "requires": {
+        "@volar/source-map": "0.35.2"
+      }
+    },
+    "@volar/source-map": {
+      "version": "0.35.2",
+      "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-0.35.2.tgz",
+      "integrity": "sha512-PFHh9wN/qMkOWYyvmB8ckvIzolrpNOvK5EBdxxdTpiPJhfYjW82rMDBnYf6RxCe7yQxrUrmve6BWVO7flxWNVQ==",
+      "dev": true
+    },
+    "@volar/vue-code-gen": {
+      "version": "0.35.2",
+      "resolved": "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.35.2.tgz",
+      "integrity": "sha512-8H6P8EtN06eSVGjtcJhGqZzFIg6/nWoHVOlnhc5vKqC7tXwpqPbyMQae0tO7pLBd5qSb/dYU5GQcBAHsi2jgyA==",
+      "dev": true,
+      "requires": {
+        "@volar/code-gen": "0.35.2",
+        "@volar/source-map": "0.35.2",
+        "@vue/compiler-core": "^3.2.36",
+        "@vue/compiler-dom": "^3.2.36",
+        "@vue/shared": "^3.2.36"
+      }
+    },
+    "@volar/vue-typescript": {
+      "version": "0.35.2",
+      "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-0.35.2.tgz",
+      "integrity": "sha512-PZI6Urb+Vr5Dvgf9xysM8X7TP09inWDy1wjDtprBoBhxS7r0Dg3V0qZuJa7sSGz7M0QMa5R/CBaZPhlxFCfJBw==",
+      "dev": true,
+      "requires": {
+        "@volar/code-gen": "0.35.2",
+        "@volar/source-map": "0.35.2",
+        "@volar/vue-code-gen": "0.35.2",
+        "@vue/compiler-sfc": "^3.2.36",
+        "@vue/reactivity": "^3.2.36"
+      }
+    },
+    "@vue/compiler-core": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
+      "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==",
+      "requires": {
+        "@babel/parser": "^7.16.4",
+        "@vue/shared": "3.2.37",
+        "estree-walker": "^2.0.2",
+        "source-map": "^0.6.1"
+      }
+    },
+    "@vue/compiler-dom": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz",
+      "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==",
+      "requires": {
+        "@vue/compiler-core": "3.2.37",
+        "@vue/shared": "3.2.37"
+      }
+    },
+    "@vue/compiler-sfc": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz",
+      "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==",
+      "requires": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.37",
+        "@vue/compiler-dom": "3.2.37",
+        "@vue/compiler-ssr": "3.2.37",
+        "@vue/reactivity-transform": "3.2.37",
+        "@vue/shared": "3.2.37",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7",
+        "postcss": "^8.1.10",
+        "source-map": "^0.6.1"
+      }
+    },
+    "@vue/compiler-ssr": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz",
+      "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==",
+      "requires": {
+        "@vue/compiler-dom": "3.2.37",
+        "@vue/shared": "3.2.37"
+      }
+    },
+    "@vue/devtools-api": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
+      "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
+    },
+    "@vue/eslint-config-prettier": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz",
+      "integrity": "sha512-/CTc6ML3Wta1tCe1gUeO0EYnVXfo3nJXsIhZ8WJr3sov+cGASr6yuiibJTL6lmIBm7GobopToOuB3B6AWyV0Iw==",
+      "dev": true,
+      "requires": {
+        "eslint-config-prettier": "^8.3.0",
+        "eslint-plugin-prettier": "^4.0.0"
+      }
+    },
+    "@vue/eslint-config-typescript": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-10.0.0.tgz",
+      "integrity": "sha512-F94cL8ug3FaYXlCfU5/wiGjk1qeadmoBpRGAOBq+qre3Smdupa59dd6ZJrsfRODpsMPyTG7330juMDsUvpZ3Rw==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/eslint-plugin": "^5.0.0",
+        "@typescript-eslint/parser": "^5.0.0",
+        "vue-eslint-parser": "^8.0.0"
+      }
+    },
+    "@vue/reactivity": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz",
+      "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==",
+      "requires": {
+        "@vue/shared": "3.2.37"
+      }
+    },
+    "@vue/reactivity-transform": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz",
+      "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==",
+      "requires": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.37",
+        "@vue/shared": "3.2.37",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7"
+      }
+    },
+    "@vue/runtime-core": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz",
+      "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==",
+      "requires": {
+        "@vue/reactivity": "3.2.37",
+        "@vue/shared": "3.2.37"
+      }
+    },
+    "@vue/runtime-dom": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz",
+      "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==",
+      "requires": {
+        "@vue/runtime-core": "3.2.37",
+        "@vue/shared": "3.2.37",
+        "csstype": "^2.6.8"
+      }
+    },
+    "@vue/server-renderer": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.37.tgz",
+      "integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==",
+      "requires": {
+        "@vue/compiler-ssr": "3.2.37",
+        "@vue/shared": "3.2.37"
+      }
+    },
+    "@vue/shared": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz",
+      "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw=="
+    },
+    "@zeit/schemas": {
+      "version": "2.29.0",
+      "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz",
+      "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA=="
+    },
+    "accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+      "requires": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      }
+    },
+    "acorn": {
+      "version": "8.10.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+      "dev": true
+    },
+    "acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true
+    },
+    "acorn-node": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+      "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+      "requires": {
+        "acorn": "^7.0.0",
+        "acorn-walk": "^7.0.0",
+        "xtend": "^4.0.2"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+        }
+      }
+    },
+    "acorn-walk": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
+    },
+    "aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "dev": true,
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      }
+    },
+    "ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
+      "optional": true
+    },
+    "ansi-align": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+      "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+      "requires": {
+        "string-width": "^4.1.0"
+      },
+      "dependencies": {
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        }
+      }
+    },
+    "ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.21.3"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.21.3",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+          "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+          "dev": true
+        }
+      }
+    },
+    "ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+    },
+    "ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "requires": {
+        "color-convert": "^2.0.1"
+      }
+    },
+    "anymatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      }
+    },
+    "arch": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+      "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ=="
+    },
+    "arg": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+      "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
+    },
+    "argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
+    },
+    "array-from": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
+      "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg=="
+    },
+    "array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true
+    },
+    "ast-transform": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz",
+      "integrity": "sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A==",
+      "requires": {
+        "escodegen": "~1.2.0",
+        "esprima": "~1.0.4",
+        "through": "~2.3.4"
+      },
+      "dependencies": {
+        "escodegen": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz",
+          "integrity": "sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA==",
+          "requires": {
+            "esprima": "~1.0.4",
+            "estraverse": "~1.5.0",
+            "esutils": "~1.0.0",
+            "source-map": "~0.1.30"
+          }
+        },
+        "esprima": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz",
+          "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA=="
+        },
+        "estraverse": {
+          "version": "1.5.1",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz",
+          "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ=="
+        },
+        "esutils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz",
+          "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg=="
+        },
+        "source-map": {
+          "version": "0.1.43",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+          "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==",
+          "optional": true,
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "ast-types": {
+      "version": "0.7.8",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz",
+      "integrity": "sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q=="
+    },
+    "astral-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "10.4.13",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
+      "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.21.4",
+        "caniuse-lite": "^1.0.30001426",
+        "fraction.js": "^4.2.0",
+        "normalize-range": "^0.1.2",
+        "picocolors": "^1.0.0",
+        "postcss-value-parser": "^4.2.0"
+      }
+    },
+    "axios": {
+      "version": "1.6.5",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.5.tgz",
+      "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==",
+      "dev": true,
+      "requires": {
+        "follow-redirects": "^1.15.4",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "base64-js": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+    },
+    "binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+      "dev": true
+    },
+    "boxen": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz",
+      "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==",
+      "requires": {
+        "ansi-align": "^3.0.1",
+        "camelcase": "^7.0.0",
+        "chalk": "^5.0.1",
+        "cli-boxes": "^3.0.0",
+        "string-width": "^5.1.2",
+        "type-fest": "^2.13.0",
+        "widest-line": "^4.0.1",
+        "wrap-ansi": "^8.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="
+        },
+        "ansi-styles": {
+          "version": "6.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+          "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="
+        },
+        "chalk": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+          "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="
+        },
+        "strip-ansi": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+          "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+          "requires": {
+            "ansi-regex": "^6.0.1"
+          }
+        },
+        "type-fest": {
+          "version": "2.19.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+          "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="
+        },
+        "wrap-ansi": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+          "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+          "requires": {
+            "ansi-styles": "^6.1.0",
+            "string-width": "^5.0.1",
+            "strip-ansi": "^7.0.1"
+          }
+        }
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "brfs": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brfs/-/brfs-2.0.2.tgz",
+      "integrity": "sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==",
+      "requires": {
+        "quote-stream": "^1.0.1",
+        "resolve": "^1.1.5",
+        "static-module": "^3.0.2",
+        "through2": "^2.0.0"
+      }
+    },
+    "brotli": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
+      "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
+      "requires": {
+        "base64-js": "^1.1.2"
+      }
+    },
+    "browser-resolve": {
+      "version": "1.11.3",
+      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+      "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
+      "requires": {
+        "resolve": "1.1.7"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.1.7",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+          "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg=="
+        }
+      }
+    },
+    "browserify-optional": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz",
+      "integrity": "sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==",
+      "requires": {
+        "ast-transform": "0.0.0",
+        "ast-types": "^0.7.0",
+        "browser-resolve": "^1.8.1"
+      }
+    },
+    "browserslist": {
+      "version": "4.21.5",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+      "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30001449",
+        "electron-to-chromium": "^1.4.284",
+        "node-releases": "^2.0.8",
+        "update-browserslist-db": "^1.0.10"
+      }
+    },
+    "buffer-equal": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
+      "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA=="
+    },
+    "buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="
+    },
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true
+    },
+    "camelcase": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
+      "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw=="
+    },
+    "camelcase-css": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+      "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+      "dev": true
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001450",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz",
+      "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==",
+      "dev": true
+    },
+    "chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      }
+    },
+    "chalk-template": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz",
+      "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==",
+      "requires": {
+        "chalk": "^4.1.2"
+      }
+    },
+    "chart.js": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.8.0.tgz",
+      "integrity": "sha512-cr8xhrXjLIXVLOBZPkBZVF6NDeiVIrPLHcMhnON7UufudL+CNeRrD+wpYanswlm8NpudMdrt3CHoLMQMxJhHRg=="
+    },
+    "chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "requires": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "dependencies": {
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        }
+      }
+    },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true
+    },
+    "cleave.js": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/cleave.js/-/cleave.js-1.6.0.tgz",
+      "integrity": "sha512-ivqesy3j5hQVG3gywPfwKPbi/7ZSftY/UNp5uphnqjr25yI2CP8FS2ODQPzuLXXnNLi29e2+PgPkkiKUXLs/Nw==",
+      "dev": true
+    },
+    "cli-boxes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+      "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="
+    },
+    "cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^3.1.0"
+      }
+    },
+    "cli-truncate": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
+      "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+      "dev": true,
+      "requires": {
+        "slice-ansi": "^5.0.0",
+        "string-width": "^5.0.0"
+      }
+    },
+    "clipboardy": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz",
+      "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==",
+      "requires": {
+        "arch": "^2.2.0",
+        "execa": "^5.1.1",
+        "is-wsl": "^2.2.0"
+      },
+      "dependencies": {
+        "execa": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+          "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+          "requires": {
+            "cross-spawn": "^7.0.3",
+            "get-stream": "^6.0.0",
+            "human-signals": "^2.1.0",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.1",
+            "onetime": "^5.1.2",
+            "signal-exit": "^3.0.3",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "human-signals": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+          "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+        },
+        "is-stream": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "strip-final-newline": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+          "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+        }
+      }
+    },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="
+    },
+    "color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "colorette": {
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+      "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
+      "dev": true
+    },
+    "colortranslator": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/colortranslator/-/colortranslator-1.10.2.tgz",
+      "integrity": "sha512-+vAnjWTdI0Vh6fT3I+dA6DAtnLfo91TzYKjewYeZ2dHdhF8Yo5OMo47inNJdJOXwjJ9lPD0LkNeQOLU/8yyfZA==",
+      "dev": true
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "9.3.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz",
+      "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+      "requires": {
+        "mime-db": ">= 1.43.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA=="
+    },
+    "convert-source-map": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+      "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
+    "core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
+    },
+    "crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
+    },
+    "csscolorparser": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz",
+      "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w=="
+    },
+    "cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "dev": true
+    },
+    "csstype": {
+      "version": "2.6.20",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
+      "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA=="
+    },
+    "d": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+      "requires": {
+        "es5-ext": "^0.10.50",
+        "type": "^1.0.1"
+      }
+    },
+    "d3": {
+      "version": "7.6.1",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.6.1.tgz",
+      "integrity": "sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==",
+      "requires": {
+        "d3-array": "3",
+        "d3-axis": "3",
+        "d3-brush": "3",
+        "d3-chord": "3",
+        "d3-color": "3",
+        "d3-contour": "4",
+        "d3-delaunay": "6",
+        "d3-dispatch": "3",
+        "d3-drag": "3",
+        "d3-dsv": "3",
+        "d3-ease": "3",
+        "d3-fetch": "3",
+        "d3-force": "3",
+        "d3-format": "3",
+        "d3-geo": "3",
+        "d3-hierarchy": "3",
+        "d3-interpolate": "3",
+        "d3-path": "3",
+        "d3-polygon": "3",
+        "d3-quadtree": "3",
+        "d3-random": "3",
+        "d3-scale": "4",
+        "d3-scale-chromatic": "3",
+        "d3-selection": "3",
+        "d3-shape": "3",
+        "d3-time": "3",
+        "d3-time-format": "4",
+        "d3-timer": "3",
+        "d3-transition": "3",
+        "d3-zoom": "3"
+      }
+    },
+    "d3-array": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz",
+      "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==",
+      "requires": {
+        "internmap": "1 - 2"
+      }
+    },
+    "d3-axis": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
+      "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="
+    },
+    "d3-brush": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
+      "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+      "requires": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "3",
+        "d3-transition": "3"
+      }
+    },
+    "d3-chord": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
+      "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+      "requires": {
+        "d3-path": "1 - 3"
+      }
+    },
+    "d3-color": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+      "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
+    },
+    "d3-contour": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.0.tgz",
+      "integrity": "sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==",
+      "requires": {
+        "d3-array": "^3.2.0"
+      }
+    },
+    "d3-delaunay": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz",
+      "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==",
+      "requires": {
+        "delaunator": "5"
+      }
+    },
+    "d3-dispatch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+      "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="
+    },
+    "d3-drag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
+      "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+      "requires": {
+        "d3-dispatch": "1 - 3",
+        "d3-selection": "3"
+      }
+    },
+    "d3-dsv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
+      "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
+      "requires": {
+        "commander": "7",
+        "iconv-lite": "0.6",
+        "rw": "1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+          "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
+        }
+      }
+    },
+    "d3-ease": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+      "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
+    },
+    "d3-fetch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
+      "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
+      "requires": {
+        "d3-dsv": "1 - 3"
+      }
+    },
+    "d3-force": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
+      "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+      "requires": {
+        "d3-dispatch": "1 - 3",
+        "d3-quadtree": "1 - 3",
+        "d3-timer": "1 - 3"
+      }
+    },
+    "d3-format": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+      "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
+    },
+    "d3-geo": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz",
+      "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==",
+      "requires": {
+        "d3-array": "2.5.0 - 3"
+      }
+    },
+    "d3-hierarchy": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+      "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="
+    },
+    "d3-interpolate": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+      "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+      "requires": {
+        "d3-color": "1 - 3"
+      }
+    },
+    "d3-path": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz",
+      "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w=="
+    },
+    "d3-polygon": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
+      "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="
+    },
+    "d3-quadtree": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+      "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="
+    },
+    "d3-random": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
+      "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="
+    },
+    "d3-sankey": {
+      "version": "0.12.3",
+      "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz",
+      "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==",
+      "requires": {
+        "d3-array": "1 - 2",
+        "d3-shape": "^1.2.0"
+      },
+      "dependencies": {
+        "d3-array": {
+          "version": "2.12.1",
+          "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",
+          "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
+          "requires": {
+            "internmap": "^1.0.0"
+          }
+        },
+        "d3-path": {
+          "version": "1.0.9",
+          "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+          "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
+        },
+        "d3-shape": {
+          "version": "1.3.7",
+          "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+          "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+          "requires": {
+            "d3-path": "1"
+          }
+        },
+        "internmap": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",
+          "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="
+        }
+      }
+    },
+    "d3-scale": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+      "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+      "requires": {
+        "d3-array": "2.10.0 - 3",
+        "d3-format": "1 - 3",
+        "d3-interpolate": "1.2.0 - 3",
+        "d3-time": "2.1.1 - 3",
+        "d3-time-format": "2 - 4"
+      }
+    },
+    "d3-scale-chromatic": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz",
+      "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==",
+      "requires": {
+        "d3-color": "1 - 3",
+        "d3-interpolate": "1 - 3"
+      }
+    },
+    "d3-selection": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
+      "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="
+    },
+    "d3-shape": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz",
+      "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==",
+      "requires": {
+        "d3-path": "1 - 3"
+      }
+    },
+    "d3-time": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz",
+      "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==",
+      "requires": {
+        "d3-array": "2 - 3"
+      }
+    },
+    "d3-time-format": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+      "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+      "requires": {
+        "d3-time": "1 - 3"
+      }
+    },
+    "d3-timer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+      "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="
+    },
+    "d3-transition": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
+      "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
+      "requires": {
+        "d3-color": "1 - 3",
+        "d3-dispatch": "1 - 3",
+        "d3-ease": "1 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-timer": "1 - 3"
+      }
+    },
+    "d3-voronoi-map": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/d3-voronoi-map/-/d3-voronoi-map-2.1.1.tgz",
+      "integrity": "sha512-mCXfz/kD9IQxjHaU2IMjkO8fSo4J6oysPR2iL+omDsCy1i1Qn6BQ/e4hEAW8C6ms2kfuHwqtbNom80Hih94YsA==",
+      "requires": {
+        "d3-dispatch": "2.*",
+        "d3-polygon": "2.*",
+        "d3-timer": "2.*",
+        "d3-weighted-voronoi": "1.*"
+      },
+      "dependencies": {
+        "d3-dispatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz",
+          "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA=="
+        },
+        "d3-polygon": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz",
+          "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ=="
+        },
+        "d3-timer": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz",
+          "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA=="
+        }
+      }
+    },
+    "d3-voronoi-treemap": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/d3-voronoi-treemap/-/d3-voronoi-treemap-1.1.2.tgz",
+      "integrity": "sha512-7odu9HdG/yLPWwzDteJq4yd9Q/NwgQV7IE/u36VQtcCK7k1sZwDqbkHCeMKNTBsq5mQjDwolTsrXcU0j8ZEMCA==",
+      "requires": {
+        "d3-voronoi-map": "2.*"
+      }
+    },
+    "d3-weighted-voronoi": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/d3-weighted-voronoi/-/d3-weighted-voronoi-1.1.3.tgz",
+      "integrity": "sha512-C3WdvSKl9aqhAy+f3QT3PPsQG6V+ajDfYO3BSclQDSD+araW2xDBFIH67aKzsSuuuKaX8K2y2dGq1fq/dWTVig==",
+      "requires": {
+        "d3-array": "2",
+        "d3-polygon": "2"
+      },
+      "dependencies": {
+        "d3-array": {
+          "version": "2.12.1",
+          "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",
+          "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
+          "requires": {
+            "internmap": "^1.0.0"
+          }
+        },
+        "d3-polygon": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz",
+          "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ=="
+        },
+        "internmap": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",
+          "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="
+        }
+      }
+    },
+    "d3-zoom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
+      "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
+      "requires": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "2 - 3",
+        "d3-transition": "2 - 3"
+      }
+    },
+    "dash-ast": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz",
+      "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ=="
+    },
+    "debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "requires": {
+        "ms": "2.1.2"
+      }
+    },
+    "deep-equal": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+      "requires": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      }
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+    },
+    "deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+    },
+    "define-properties": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+      "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+      "requires": {
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "defined": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
+      "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
+      "dev": true
+    },
+    "delaunator": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz",
+      "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==",
+      "requires": {
+        "robust-predicates": "^3.0.0"
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true
+    },
+    "detective": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
+      "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
+      "dev": true,
+      "requires": {
+        "acorn-node": "^1.8.2",
+        "defined": "^1.0.0",
+        "minimist": "^1.2.6"
+      }
+    },
+    "dfa": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
+      "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="
+    },
+    "didyoumean": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+      "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+      "dev": true
+    },
+    "dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "dev": true,
+      "requires": {
+        "path-type": "^4.0.0"
+      }
+    },
+    "dlv": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+      "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+      "dev": true
+    },
+    "doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "duplexer2": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+      "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+      "requires": {
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "earcut": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.3.tgz",
+      "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug=="
+    },
+    "eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
+    },
+    "electron-to-chromium": {
+      "version": "1.4.286",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz",
+      "integrity": "sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==",
+      "dev": true
+    },
+    "emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+    },
+    "epic-spinners": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/epic-spinners/-/epic-spinners-2.0.0.tgz",
+      "integrity": "sha512-nU7xF7NoXrObmIGdXYwj1hfE3EH3jDVQ8oi1S5wG0yutrQILMJ3Xs0ZQEdGIjBQnFveDrAs/61m8/vm5SMvObA=="
+    },
+    "es5-ext": {
+      "version": "0.10.61",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz",
+      "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==",
+      "requires": {
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.3",
+        "next-tick": "^1.1.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "es6-map": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+      "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
+        "es6-set": "~0.1.5",
+        "es6-symbol": "~3.1.1",
+        "event-emitter": "~0.3.5"
+      }
+    },
+    "es6-set": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+      "integrity": "sha512-7S8YXIcUfPMOr3rqJBVMePAbRsD1nWeSMQ86K/lDI76S3WKXz+KWILvTIPbTroubOkZTGh+b+7/xIIphZXNYbA==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "~0.3.5"
+      },
+      "dependencies": {
+        "es6-symbol": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+          "integrity": "sha512-exfuQY8UGtn/N+gL1iKkH8fpNd5sJ760nJq6mmZAHldfxMD5kX07lbQuYlspoXsuknXNv9Fb7y2GsPOnQIbxHg==",
+          "requires": {
+            "d": "1",
+            "es5-ext": "~0.10.14"
+          }
+        }
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+      "requires": {
+        "d": "^1.0.1",
+        "ext": "^1.1.2"
+      }
+    },
+    "esbuild": {
+      "version": "0.18.16",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz",
+      "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==",
+      "dev": true,
+      "requires": {
+        "@esbuild/android-arm": "0.18.16",
+        "@esbuild/android-arm64": "0.18.16",
+        "@esbuild/android-x64": "0.18.16",
+        "@esbuild/darwin-arm64": "0.18.16",
+        "@esbuild/darwin-x64": "0.18.16",
+        "@esbuild/freebsd-arm64": "0.18.16",
+        "@esbuild/freebsd-x64": "0.18.16",
+        "@esbuild/linux-arm": "0.18.16",
+        "@esbuild/linux-arm64": "0.18.16",
+        "@esbuild/linux-ia32": "0.18.16",
+        "@esbuild/linux-loong64": "0.18.16",
+        "@esbuild/linux-mips64el": "0.18.16",
+        "@esbuild/linux-ppc64": "0.18.16",
+        "@esbuild/linux-riscv64": "0.18.16",
+        "@esbuild/linux-s390x": "0.18.16",
+        "@esbuild/linux-x64": "0.18.16",
+        "@esbuild/netbsd-x64": "0.18.16",
+        "@esbuild/openbsd-x64": "0.18.16",
+        "@esbuild/sunos-x64": "0.18.16",
+        "@esbuild/win32-arm64": "0.18.16",
+        "@esbuild/win32-ia32": "0.18.16",
+        "@esbuild/win32-x64": "0.18.16"
+      }
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true
+    },
+    "escodegen": {
+      "version": "1.14.3",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+      "requires": {
+        "esprima": "^4.0.1",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "levn": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+          "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+          "requires": {
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2"
+          }
+        },
+        "optionator": {
+          "version": "0.8.3",
+          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+          "requires": {
+            "deep-is": "~0.1.3",
+            "fast-levenshtein": "~2.0.6",
+            "levn": "~0.3.0",
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2",
+            "word-wrap": "~1.2.3"
+          }
+        },
+        "prelude-ls": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+          "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="
+        },
+        "type-check": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+          "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+          "requires": {
+            "prelude-ls": "~1.1.2"
+          }
+        }
+      }
+    },
+    "eslint": {
+      "version": "8.18.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz",
+      "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==",
+      "dev": true,
+      "requires": {
+        "@eslint/eslintrc": "^1.3.0",
+        "@humanwhocodes/config-array": "^0.9.2",
+        "ajv": "^6.10.0",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.3.2",
+        "doctrine": "^3.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^7.1.1",
+        "eslint-utils": "^3.0.0",
+        "eslint-visitor-keys": "^3.3.0",
+        "espree": "^9.3.2",
+        "esquery": "^1.4.0",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^6.0.1",
+        "globals": "^13.15.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^4.1.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.1",
+        "regexpp": "^3.2.0",
+        "strip-ansi": "^6.0.1",
+        "strip-json-comments": "^3.1.0",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      },
+      "dependencies": {
+        "eslint-scope": {
+          "version": "7.1.1",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+          "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.3.0",
+            "estraverse": "^5.2.0"
+          }
+        },
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-config-prettier": {
+      "version": "8.5.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
+      "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
+      "dev": true
+    },
+    "eslint-plugin-prettier": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
+      "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
+      "dev": true,
+      "requires": {
+        "prettier-linter-helpers": "^1.0.0"
+      }
+    },
+    "eslint-plugin-vue": {
+      "version": "8.7.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
+      "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+      "dev": true,
+      "requires": {
+        "eslint-utils": "^3.0.0",
+        "natural-compare": "^1.4.0",
+        "nth-check": "^2.0.1",
+        "postcss-selector-parser": "^6.0.9",
+        "semver": "^7.3.5",
+        "vue-eslint-parser": "^8.0.1"
+      }
+    },
+    "eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^2.0.0"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+          "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+      "dev": true
+    },
+    "espree": {
+      "version": "9.3.2",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
+      "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+      "dev": true,
+      "requires": {
+        "acorn": "^8.7.1",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.3.0"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+    },
+    "esquery": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+    },
+    "estree-is-function": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz",
+      "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA=="
+    },
+    "estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
+    },
+    "execa": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz",
+      "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.1",
+        "human-signals": "^3.0.1",
+        "is-stream": "^3.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^5.1.0",
+        "onetime": "^6.0.0",
+        "signal-exit": "^3.0.7",
+        "strip-final-newline": "^3.0.0"
+      }
+    },
+    "ext": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
+      "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
+      "requires": {
+        "type": "^2.5.0"
+      },
+      "dependencies": {
+        "type": {
+          "version": "2.6.0",
+          "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz",
+          "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ=="
+        }
+      }
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "fast-diff": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "3.2.12",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+      "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      },
+      "dependencies": {
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        }
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+    },
+    "fast-url-parser": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
+      "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==",
+      "requires": {
+        "punycode": "^1.3.2"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="
+        }
+      }
+    },
+    "fastq": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^3.0.4"
+      }
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "flag-icons": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmjs.org/flag-icons/-/flag-icons-6.6.4.tgz",
+      "integrity": "sha512-hRRXKw3f5F2OCcDTOTXO0tc3ODqBx/ttA61V9mqy/hVbnFXzW+7tJMLQ+xd77+BXwdUzQAMLW2G4RZqqvaN3Mg=="
+    },
+    "flat-cache": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+      "dev": true,
+      "requires": {
+        "flatted": "^3.1.0",
+        "rimraf": "^3.0.2"
+      }
+    },
+    "flatpickr": {
+      "version": "4.6.13",
+      "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz",
+      "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw=="
+    },
+    "flatted": {
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+      "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+      "dev": true
+    },
+    "follow-redirects": {
+      "version": "1.15.4",
+      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.4.tgz",
+      "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
+      "dev": true
+    },
+    "form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dev": true,
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "fraction.js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+      "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+      "dev": true
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+      "dev": true
+    },
+    "functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
+    },
+    "geojson-vt": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz",
+      "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg=="
+    },
+    "get-assigned-identifiers": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
+      "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ=="
+    },
+    "get-intrinsic": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
+      "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.3"
+      }
+    },
+    "get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+    },
+    "gl-matrix": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
+      "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
+    },
+    "glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "requires": {
+        "is-glob": "^4.0.3"
+      }
+    },
+    "globals": {
+      "version": "13.15.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
+      "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.20.2"
+      }
+    },
+    "globby": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+      "dev": true,
+      "requires": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.2.9",
+        "ignore": "^5.2.0",
+        "merge2": "^1.4.1",
+        "slash": "^3.0.0"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+    },
+    "has-property-descriptors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+      "requires": {
+        "get-intrinsic": "^1.1.1"
+      }
+    },
+    "has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+    },
+    "has-tostringtag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+      "requires": {
+        "has-symbols": "^1.0.2"
+      }
+    },
+    "human-signals": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz",
+      "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==",
+      "dev": true
+    },
+    "husky": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz",
+      "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      }
+    },
+    "ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+    },
+    "ignore": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+      "dev": true
+    },
+    "immutable": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
+      "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ=="
+    },
+    "import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+    },
+    "internmap": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+      "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
+    },
+    "ionicons": {
+      "version": "4.6.3",
+      "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-4.6.3.tgz",
+      "integrity": "sha512-cgP+VIr2cTJpMfFyVHTerq6n2jeoiGboVoe3GlaAo5zoSBDAEXORwUZhv6m+lCyxlsHCS3nqPUE+MKyZU71t8Q=="
+    },
+    "is-arguments": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "requires": {
+        "binary-extensions": "^2.0.0"
+      }
+    },
+    "is-core-module": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+      "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
+    },
+    "is-fullwidth-code-point": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+      "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+    },
+    "is-port-reachable": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz",
+      "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig=="
+    },
+    "is-regex": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+      "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "requires": {
+        "is-docker": "^2.0.0"
+      }
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+    },
+    "js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "requires": {
+        "argparse": "^2.0.1"
+      }
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true
+    },
+    "jsonc-eslint-parser": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz",
+      "integrity": "sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.4.1",
+        "eslint-utils": "^2.1.0",
+        "eslint-visitor-keys": "^1.3.0",
+        "espree": "^6.0.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+          "dev": true
+        },
+        "eslint-utils": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+          "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+          "dev": true,
+          "requires": {
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
+        },
+        "espree": {
+          "version": "6.2.1",
+          "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+          "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+          "dev": true,
+          "requires": {
+            "acorn": "^7.1.1",
+            "acorn-jsx": "^5.2.0",
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+          "dev": true
+        }
+      }
+    },
+    "jsonc-parser": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+      "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+      "dev": true
+    },
+    "kdbush": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz",
+      "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew=="
+    },
+    "leaflet": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.8.0.tgz",
+      "integrity": "sha512-gwhMjFCQiYs3x/Sf+d49f10ERXaEFCPr+nVTryhAW8DWbMGqJqt9G4XuIaHmFW08zYvhgdzqXGr8AlW8v8dQkA=="
+    },
+    "leaflet-map": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/leaflet-map/-/leaflet-map-0.2.1.tgz",
+      "integrity": "sha512-jswbDoLc1aRtBAA3KETqFkG6+d/W7SGI2XAuA5Ch1gNiCJEXebrcH3btdVnu1AdMmL0kUPNHL387Maji4HhNHg==",
+      "requires": {
+        "leaflet": "^0.7.3"
+      },
+      "dependencies": {
+        "leaflet": {
+          "version": "0.7.7",
+          "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-0.7.7.tgz",
+          "integrity": "sha512-H1lR7J5VxhvQJQHlW2UywtxO63zilLrnwVsDvjKeyfntffj63Ml94gCk9YPYWBkiQgxisdiA8aJ30Zoou4VhEA=="
+        }
+      }
+    },
+    "levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      }
+    },
+    "lilconfig": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
+      "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
+      "dev": true
+    },
+    "lint-staged": {
+      "version": "13.0.3",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz",
+      "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==",
+      "dev": true,
+      "requires": {
+        "cli-truncate": "^3.1.0",
+        "colorette": "^2.0.17",
+        "commander": "^9.3.0",
+        "debug": "^4.3.4",
+        "execa": "^6.1.0",
+        "lilconfig": "2.0.5",
+        "listr2": "^4.0.5",
+        "micromatch": "^4.0.5",
+        "normalize-path": "^3.0.0",
+        "object-inspect": "^1.12.2",
+        "pidtree": "^0.6.0",
+        "string-argv": "^0.3.1",
+        "yaml": "^2.1.1"
+      }
+    },
+    "listr2": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz",
+      "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==",
+      "dev": true,
+      "requires": {
+        "cli-truncate": "^2.1.0",
+        "colorette": "^2.0.16",
+        "log-update": "^4.0.0",
+        "p-map": "^4.0.0",
+        "rfdc": "^1.3.0",
+        "rxjs": "^7.5.5",
+        "through": "^2.3.8",
+        "wrap-ansi": "^7.0.0"
+      },
+      "dependencies": {
+        "cli-truncate": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+          "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+          "dev": true,
+          "requires": {
+            "slice-ansi": "^3.0.0",
+            "string-width": "^4.2.0"
+          }
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "slice-ansi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+          "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "astral-regex": "^2.0.0",
+            "is-fullwidth-code-point": "^3.0.0"
+          }
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        }
+      }
+    },
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "log-update": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.3.0",
+        "cli-cursor": "^3.1.0",
+        "slice-ansi": "^4.0.0",
+        "wrap-ansi": "^6.2.0"
+      },
+      "dependencies": {
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "slice-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "astral-regex": "^2.0.0",
+            "is-fullwidth-code-point": "^3.0.0"
+          }
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        }
+      }
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "magic-string": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "requires": {
+        "sourcemap-codec": "^1.4.8"
+      }
+    },
+    "maplibre-gl": {
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-2.1.9.tgz",
+      "integrity": "sha512-pnWJmILeZpgA5QSI7K7xFK3yrkyYTd9srw3fCi2Ca52Phm78hsznPwUErEQcZLfxXKn/1h9t8IPdj0TH0NBNbg==",
+      "requires": {
+        "@mapbox/geojson-rewind": "^0.5.1",
+        "@mapbox/jsonlint-lines-primitives": "^2.0.2",
+        "@mapbox/mapbox-gl-supported": "^2.0.1",
+        "@mapbox/point-geometry": "^0.1.0",
+        "@mapbox/tiny-sdf": "^2.0.4",
+        "@mapbox/unitbezier": "^0.0.1",
+        "@mapbox/vector-tile": "^1.3.1",
+        "@mapbox/whoots-js": "^3.1.0",
+        "@types/geojson": "^7946.0.8",
+        "@types/mapbox__point-geometry": "^0.1.2",
+        "@types/mapbox__vector-tile": "^1.3.0",
+        "@types/pbf": "^3.0.2",
+        "csscolorparser": "~1.0.3",
+        "earcut": "^2.2.3",
+        "geojson-vt": "^3.2.1",
+        "gl-matrix": "^3.4.3",
+        "murmurhash-js": "^1.0.0",
+        "pbf": "^3.2.1",
+        "potpack": "^1.0.2",
+        "quickselect": "^2.0.0",
+        "supercluster": "^7.1.4",
+        "tinyqueue": "^2.0.3",
+        "vt-pbf": "^3.1.3"
+      }
+    },
+    "markerjs2": {
+      "version": "2.29.5",
+      "resolved": "https://registry.npmjs.org/markerjs2/-/markerjs2-2.29.5.tgz",
+      "integrity": "sha512-hg0dkVyhj+bLd0yCq+xz6ZRWG8SjKh801gUOVb54b39TvRsAVcV7ZWWM7W1p41HiPExUicwGg9xCllXbORS5DQ=="
+    },
+    "medium-editor": {
+      "version": "5.23.3",
+      "resolved": "https://registry.npmjs.org/medium-editor/-/medium-editor-5.23.3.tgz",
+      "integrity": "sha512-he9/TdjX8f8MGdXGfCs8AllrYnqXJJvjNkDKmPg3aPW/uoIrlRqtkFthrwvmd+u4QyzEiadhCCM0EwTiRdUCJw=="
+    },
+    "merge-source-map": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
+      "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==",
+      "requires": {
+        "source-map": "^0.5.6"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
+        }
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "dev": true,
+      "requires": {
+        "braces": "^3.0.2",
+        "picomatch": "^2.3.1"
+      }
+    },
+    "mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+    },
+    "mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "requires": {
+        "mime-db": "1.52.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+      "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+    },
+    "mlly": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz",
+      "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==",
+      "dev": true,
+      "requires": {
+        "acorn": "^8.9.0",
+        "pathe": "^1.1.1",
+        "pkg-types": "^1.0.3",
+        "ufo": "^1.1.2"
+      }
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "murmurhash-js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz",
+      "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw=="
+    },
+    "nanoid": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
+    },
+    "next-tick": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+    },
+    "node-releases": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+      "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
+      "dev": true
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
+      "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+      "dev": true,
+      "requires": {
+        "path-key": "^4.0.0"
+      },
+      "dependencies": {
+        "path-key": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+          "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+          "dev": true
+        }
+      }
+    },
+    "nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "dev": true,
+      "requires": {
+        "boolbase": "^1.0.0"
+      }
+    },
+    "object-hash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+      "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+      "dev": true
+    },
+    "object-inspect": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+      "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
+    },
+    "object-is": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+      "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^4.0.0"
+      }
+    },
+    "optionator": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+      "dev": true,
+      "requires": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.3"
+      }
+    },
+    "p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "dev": true,
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
+    },
+    "pako": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+      "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "path-to-regexp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz",
+      "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ=="
+    },
+    "path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true
+    },
+    "pathe": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+      "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+      "dev": true
+    },
+    "pbf": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
+      "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
+      "requires": {
+        "ieee754": "^1.1.12",
+        "resolve-protobuf-schema": "^2.1.0"
+      }
+    },
+    "pdfmake": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.5.tgz",
+      "integrity": "sha512-NlayjehMtuZEdw2Lyipf/MxOCR2vATZQ7jn8cH0/dHwsNb+mqof9/6SW4jZT5p+So4qz+0mD21KG81+dDQSEhA==",
+      "requires": {
+        "@foliojs-fork/linebreak": "^1.1.1",
+        "@foliojs-fork/pdfkit": "^0.13.0",
+        "iconv-lite": "^0.6.3",
+        "xmldoc": "^1.1.2"
+      }
+    },
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+    },
+    "pidtree": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+      "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+      "dev": true
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+      "dev": true
+    },
+    "pinia": {
+      "version": "2.0.16",
+      "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.16.tgz",
+      "integrity": "sha512-9/LMVO+/epny1NBfC77vnps4g3JRezxhhoF1xLUk8mZkUIxVnwfEAIRiAX8mYBTD/KCwZqnDMqXc8w3eU0FQGg==",
+      "requires": {
+        "@vue/devtools-api": "^6.1.4",
+        "vue-demi": "*"
+      }
+    },
+    "pkg-types": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
+      "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
+      "dev": true,
+      "requires": {
+        "jsonc-parser": "^3.2.0",
+        "mlly": "^1.2.0",
+        "pathe": "^1.1.0"
+      }
+    },
+    "png-js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
+      "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
+    },
+    "polylabel": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/polylabel/-/polylabel-1.1.0.tgz",
+      "integrity": "sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==",
+      "requires": {
+        "tinyqueue": "^2.0.3"
+      }
+    },
+    "postcss": {
+      "version": "8.4.31",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+      "requires": {
+        "nanoid": "^3.3.6",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      }
+    },
+    "postcss-import": {
+      "version": "14.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
+      "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+      "dev": true,
+      "requires": {
+        "postcss-value-parser": "^4.0.0",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      }
+    },
+    "postcss-js": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
+      "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+      "dev": true,
+      "requires": {
+        "camelcase-css": "^2.0.1"
+      }
+    },
+    "postcss-load-config": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+      "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+      "dev": true,
+      "requires": {
+        "lilconfig": "^2.0.5",
+        "yaml": "^1.10.2"
+      },
+      "dependencies": {
+        "yaml": {
+          "version": "1.10.2",
+          "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+          "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-nested": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
+      "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
+      "dev": true,
+      "requires": {
+        "postcss-selector-parser": "^6.0.10"
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "6.0.10",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+      "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+      "dev": true
+    },
+    "potpack": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz",
+      "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="
+    },
+    "prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true
+    },
+    "prettier": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
+      "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+      "dev": true
+    },
+    "prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "dev": true,
+      "requires": {
+        "fast-diff": "^1.1.2"
+      }
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "protocol-buffers-schema": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
+      "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
+    },
+    "proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "dev": true
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+    },
+    "qs": {
+      "version": "6.11.2",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz",
+      "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
+      "dev": true,
+      "requires": {
+        "side-channel": "^1.0.4"
+      }
+    },
+    "queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true
+    },
+    "quick-lru": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+      "dev": true
+    },
+    "quickselect": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+      "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+    },
+    "quote-stream": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
+      "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==",
+      "requires": {
+        "buffer-equal": "0.0.1",
+        "minimist": "^1.1.3",
+        "through2": "^2.0.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A=="
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "requires": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      },
+      "dependencies": {
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+          "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="
+        }
+      }
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+      "dev": true,
+      "requires": {
+        "pify": "^2.3.0"
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "regexp.prototype.flags": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "functions-have-names": "^1.2.2"
+      }
+    },
+    "regexpp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+      "dev": true
+    },
+    "register-service-worker": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/register-service-worker/-/register-service-worker-1.7.2.tgz",
+      "integrity": "sha512-CiD3ZSanZqcMPRhtfct5K9f7i3OLCcBBWsJjLh1gW9RO/nS94sVzY59iS+fgYBOBqaBpf4EzfqUF3j9IG+xo8A=="
+    },
+    "registry-auth-token": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+      "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+      "requires": {
+        "rc": "^1.1.6",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "registry-url": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+      "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==",
+      "requires": {
+        "rc": "^1.0.1"
+      }
+    },
+    "regression": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/regression/-/regression-2.0.1.tgz",
+      "integrity": "sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ=="
+    },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+    },
+    "resolve": {
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+      "requires": {
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true
+    },
+    "resolve-protobuf-schema": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
+      "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
+      "requires": {
+        "protocol-buffers-schema": "^3.3.1"
+      }
+    },
+    "restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dev": true,
+      "requires": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      },
+      "dependencies": {
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        }
+      }
+    },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
+    "rfdc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "robust-predicates": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz",
+      "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g=="
+    },
+    "rollup": {
+      "version": "3.29.4",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
+      "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
+      "dev": true,
+      "requires": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "requires": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "rw": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+      "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
+    },
+    "rxjs": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
+      "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
+      "dev": true,
+      "requires": {
+        "tslib": "^2.1.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+          "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
+          "dev": true
+        }
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "sass": {
+      "version": "1.53.0",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz",
+      "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==",
+      "requires": {
+        "chokidar": ">=3.0.0 <4.0.0",
+        "immutable": "^4.0.0",
+        "source-map-js": ">=0.6.2 <2.0.0"
+      }
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+    },
+    "scope-analyzer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.2.tgz",
+      "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==",
+      "requires": {
+        "array-from": "^2.1.1",
+        "dash-ast": "^2.0.1",
+        "es6-map": "^0.1.5",
+        "es6-set": "^0.1.5",
+        "es6-symbol": "^3.1.1",
+        "estree-is-function": "^1.0.0",
+        "get-assigned-identifiers": "^1.1.0"
+      }
+    },
+    "seedrandom": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
+      "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
+    },
+    "semver": {
+      "version": "7.5.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
+      "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
+    },
+    "serve": {
+      "version": "14.2.0",
+      "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.0.tgz",
+      "integrity": "sha512-+HOw/XK1bW8tw5iBilBz/mJLWRzM8XM6MPxL4J/dKzdxq1vfdEWSwhaR7/yS8EJp5wzvP92p1qirysJvnEtjXg==",
+      "requires": {
+        "@zeit/schemas": "2.29.0",
+        "ajv": "8.11.0",
+        "arg": "5.0.2",
+        "boxen": "7.0.0",
+        "chalk": "5.0.1",
+        "chalk-template": "0.4.0",
+        "clipboardy": "3.0.0",
+        "compression": "1.7.4",
+        "is-port-reachable": "4.0.0",
+        "serve-handler": "6.1.5",
+        "update-check": "1.5.4"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
+          "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "json-schema-traverse": "^1.0.0",
+            "require-from-string": "^2.0.2",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "chalk": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz",
+          "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w=="
+        },
+        "json-schema-traverse": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+          "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+        }
+      }
+    },
+    "serve-handler": {
+      "version": "6.1.5",
+      "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz",
+      "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==",
+      "requires": {
+        "bytes": "3.0.0",
+        "content-disposition": "0.5.2",
+        "fast-url-parser": "1.1.3",
+        "mime-types": "2.1.18",
+        "minimatch": "3.1.2",
+        "path-is-inside": "1.0.2",
+        "path-to-regexp": "2.2.1",
+        "range-parser": "1.2.0"
+      },
+      "dependencies": {
+        "mime-db": {
+          "version": "1.33.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+          "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
+        },
+        "mime-types": {
+          "version": "2.1.18",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+          "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+          "requires": {
+            "mime-db": "~1.33.0"
+          }
+        }
+      }
+    },
+    "shallow-copy": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
+      "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw=="
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+    },
+    "side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
+      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      }
+    },
+    "signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+    },
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+      "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^6.0.0",
+        "is-fullwidth-code-point": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz",
+          "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==",
+          "dev": true
+        }
+      }
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+    },
+    "source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+    },
+    "sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+    },
+    "static-eval": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
+      "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
+      "requires": {
+        "escodegen": "^1.11.1"
+      }
+    },
+    "static-module": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz",
+      "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==",
+      "requires": {
+        "acorn-node": "^1.3.0",
+        "concat-stream": "~1.6.0",
+        "convert-source-map": "^1.5.1",
+        "duplexer2": "~0.1.4",
+        "escodegen": "^1.11.1",
+        "has": "^1.0.1",
+        "magic-string": "0.25.1",
+        "merge-source-map": "1.0.4",
+        "object-inspect": "^1.6.0",
+        "readable-stream": "~2.3.3",
+        "scope-analyzer": "^2.0.1",
+        "shallow-copy": "~0.0.1",
+        "static-eval": "^2.0.5",
+        "through2": "~2.0.3"
+      },
+      "dependencies": {
+        "magic-string": {
+          "version": "0.25.1",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz",
+          "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==",
+          "requires": {
+            "sourcemap-codec": "^1.4.1"
+          }
+        }
+      }
+    },
+    "string-argv": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
+      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+      "dev": true
+    },
+    "string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "requires": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="
+        },
+        "strip-ansi": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+          "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+          "requires": {
+            "ansi-regex": "^6.0.1"
+          }
+        }
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "requires": {
+        "ansi-regex": "^5.0.1"
+      }
+    },
+    "strip-final-newline": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+      "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+      "dev": true
+    },
+    "strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true
+    },
+    "supercluster": {
+      "version": "7.1.5",
+      "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz",
+      "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==",
+      "requires": {
+        "kdbush": "^3.0.0"
+      }
+    },
+    "supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+    },
+    "svg-arc-to-cubic-bezier": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz",
+      "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g=="
+    },
+    "tailwindcss": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz",
+      "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==",
+      "dev": true,
+      "requires": {
+        "arg": "^5.0.2",
+        "chokidar": "^3.5.3",
+        "color-name": "^1.1.4",
+        "detective": "^5.2.1",
+        "didyoumean": "^1.2.2",
+        "dlv": "^1.1.3",
+        "fast-glob": "^3.2.12",
+        "glob-parent": "^6.0.2",
+        "is-glob": "^4.0.3",
+        "lilconfig": "^2.0.6",
+        "micromatch": "^4.0.5",
+        "normalize-path": "^3.0.0",
+        "object-hash": "^3.0.0",
+        "picocolors": "^1.0.0",
+        "postcss": "^8.4.18",
+        "postcss-import": "^14.1.0",
+        "postcss-js": "^4.0.0",
+        "postcss-load-config": "^3.1.4",
+        "postcss-nested": "6.0.0",
+        "postcss-selector-parser": "^6.0.10",
+        "postcss-value-parser": "^4.2.0",
+        "quick-lru": "^5.1.1",
+        "resolve": "^1.22.1"
+      },
+      "dependencies": {
+        "lilconfig": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
+          "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
+          "dev": true
+        }
+      }
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+      "dev": true
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
+    },
+    "through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+      "requires": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "tiny-inflate": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+      "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
+    },
+    "tinyqueue": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz",
+      "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "dev": true
+    },
+    "tsutils": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      }
+    },
+    "type": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+    },
+    "type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1"
+      }
+    },
+    "type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+    },
+    "typescript": {
+      "version": "4.7.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz",
+      "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==",
+      "dev": true
+    },
+    "ufo": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz",
+      "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==",
+      "dev": true
+    },
+    "unicode-properties": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
+      "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
+      "requires": {
+        "base64-js": "^1.3.0",
+        "unicode-trie": "^2.0.0"
+      }
+    },
+    "unicode-trie": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
+      "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
+      "requires": {
+        "pako": "^0.2.5",
+        "tiny-inflate": "^1.0.0"
+      }
+    },
+    "unplugin": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz",
+      "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==",
+      "dev": true,
+      "requires": {
+        "acorn": "^8.9.0",
+        "chokidar": "^3.5.3",
+        "webpack-sources": "^3.2.3",
+        "webpack-virtual-modules": "^0.5.0"
+      }
+    },
+    "update-browserslist-db": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+      "dev": true,
+      "requires": {
+        "escalade": "^3.1.1",
+        "picocolors": "^1.0.0"
+      }
+    },
+    "update-check": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz",
+      "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==",
+      "requires": {
+        "registry-auth-token": "3.3.2",
+        "registry-url": "3.1.0"
+      }
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "v8-compile-cache": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+      "dev": true
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
+    },
+    "vite": {
+      "version": "4.4.12",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.12.tgz",
+      "integrity": "sha512-KtPlUbWfxzGVul8Nut8Gw2Qe8sBzWY+8QVc5SL8iRFnpnrcoCaNlzO40c1R6hPmcdTwIPEDkq0Y9+27a5tVbdQ==",
+      "dev": true,
+      "requires": {
+        "esbuild": "^0.18.10",
+        "fsevents": "~2.3.2",
+        "postcss": "^8.4.27",
+        "rollup": "^3.27.1"
+      }
+    },
+    "vt-pbf": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz",
+      "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==",
+      "requires": {
+        "@mapbox/point-geometry": "0.1.0",
+        "@mapbox/vector-tile": "^1.3.1",
+        "pbf": "^3.2.1"
+      }
+    },
+    "vue": {
+      "version": "3.2.37",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.37.tgz",
+      "integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==",
+      "requires": {
+        "@vue/compiler-dom": "3.2.37",
+        "@vue/compiler-sfc": "3.2.37",
+        "@vue/runtime-dom": "3.2.37",
+        "@vue/server-renderer": "3.2.37",
+        "@vue/shared": "3.2.37"
+      }
+    },
+    "vue-chartjs": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-4.1.1.tgz",
+      "integrity": "sha512-rKIQ3jPrjhwxjKdNJppnYxRuBSrx4QeM3nNHsfIxEqjX6QS4Jq6e6vnZBxh2MDpURDC2uvuI2N0eIt1cWXbBVA=="
+    },
+    "vue-demi": {
+      "version": "0.13.4",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.4.tgz",
+      "integrity": "sha512-KP4lq9uSz0KZbaqCllRhnxMV3mYRsRWJfdsAhZyt5bV5O1RTpoeDptBRV9NOa/JgOpfaA9ane88VF7OjWNK/DA=="
+    },
+    "vue-eslint-parser": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
+      "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.3.2",
+        "eslint-scope": "^7.0.0",
+        "eslint-visitor-keys": "^3.1.0",
+        "espree": "^9.0.0",
+        "esquery": "^1.4.0",
+        "lodash": "^4.17.21",
+        "semver": "^7.3.5"
+      },
+      "dependencies": {
+        "eslint-scope": {
+          "version": "7.1.1",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+          "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.3.0",
+            "estraverse": "^5.2.0"
+          }
+        },
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "vue-i18n": {
+      "version": "9.1.10",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.1.10.tgz",
+      "integrity": "sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==",
+      "requires": {
+        "@intlify/core-base": "9.1.10",
+        "@intlify/shared": "9.1.10",
+        "@intlify/vue-devtools": "9.1.10",
+        "@vue/devtools-api": "^6.0.0-beta.7"
+      }
+    },
+    "vue-router": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz",
+      "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==",
+      "requires": {
+        "@vue/devtools-api": "^6.5.0"
+      }
+    },
+    "vue-tsc": {
+      "version": "0.35.2",
+      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.35.2.tgz",
+      "integrity": "sha512-aqY16VlODHzqtKGUkqdumNpH+s5ABCkufRyvMKQlL/mua+N2DfSVnHufzSNNUMr7vmOO0YsNg27jsspBMq4iGA==",
+      "dev": true,
+      "requires": {
+        "@volar/vue-typescript": "0.35.2"
+      }
+    },
+    "vue-yandex-maps": {
+      "version": "0.12.3",
+      "resolved": "https://registry.npmjs.org/vue-yandex-maps/-/vue-yandex-maps-0.12.3.tgz",
+      "integrity": "sha512-xvj1GGavzrXCq40swfTgf7UK7uKXgb0flq45mlA70QSNPWvjiB0PXJGnc/Bz1tvu1M2nQix0AMqGfgTEesYs5w=="
+    },
+    "vuestic-ui": {
+      "version": "1.8.7",
+      "resolved": "https://registry.npmmirror.com/vuestic-ui/-/vuestic-ui-1.8.7.tgz",
+      "integrity": "sha512-rTcviYlTfQWca1AiCBXxCIL0nX/QAc7arzHr3JiJX+JDHLn8+chfgXUxB2fwKnwZnLk1B30wd//ySzfQ1uRe0g==",
+      "dev": true,
+      "requires": {
+        "@floating-ui/vue": "^1.0.1",
+        "@types/lodash": "^4.14.161",
+        "cleave.js": "^1.6.0",
+        "colortranslator": "^1.9.2",
+        "lodash": "^4.17.21"
+      }
+    },
+    "webpack-sources": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+      "dev": true
+    },
+    "webpack-virtual-modules": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+      "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+      "dev": true
+    },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "widest-line": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
+      "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
+      "requires": {
+        "string-width": "^5.0.1"
+      }
+    },
+    "word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="
+    },
+    "wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true
+    },
+    "xmldoc": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.2.0.tgz",
+      "integrity": "sha512-2eN8QhjBsMW2uVj7JHLHkMytpvGHLHxKXBy4J3fAT/HujsEtM6yU84iGjpESYGHg6XwK0Vu4l+KgqQ2dv2cCqg==",
+      "requires": {
+        "sax": "^1.2.4"
+      }
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+    },
+    "yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "yaml": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
+      "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
+      "dev": true
+    },
+    "yaml-eslint-parser": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.3.2.tgz",
+      "integrity": "sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^1.3.0",
+        "lodash": "^4.17.20",
+        "yaml": "^1.10.0"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
+        },
+        "yaml": {
+          "version": "1.10.2",
+          "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+          "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+          "dev": true
+        }
+      }
+    }
+  }
+}

+ 71 - 0
package.json

@@ -0,0 +1,71 @@
+{
+  "name": "vuestic-admin",
+  "private": true,
+  "version": "3.1.0",
+  "scripts": {
+    "prepare": "husky install",
+    "dev": "vite",
+    "build": "vite build",
+    "build:ci": "vite build",
+    "start:ci": "serve -s ./dist",
+    "prelint": "npm run format",
+    "lint": "eslint --fix \"./src/**/*.{ts,js,vue}\"",
+    "format": "prettier --write .",
+    "preview": "vite preview"
+  },
+  "lint-staged": {
+    "./src/**/*.{ts,js,vue}": [
+      "npm run lint"
+    ]
+  },
+  "dependencies": {
+    "@amcharts/amcharts5": "^5.2.19",
+    "@amcharts/amcharts5-geodata": "^5.0.3",
+    "@fortawesome/fontawesome-free": "^6.1.1",
+    "@gtm-support/vue-gtm": "^2.0.0",
+    "chart.js": "^3.8.0",
+    "epic-spinners": "^2.0.0",
+    "flag-icons": "^6.6.4",
+    "ionicons": "^4.6.3",
+    "leaflet": "^1.8.0",
+    "leaflet-map": "^0.2.1",
+    "maplibre-gl": "^2.1.9",
+    "medium-editor": "^5.23.3",
+    "pinia": "^2.0.16",
+    "register-service-worker": "^1.7.1",
+    "sass": "^1.53.0",
+    "serve": "^14.2.0",
+    "vue": "^3.2.25",
+    "vue-chartjs": "^4.1.1",
+    "vue-i18n": "^9.1.10",
+    "vue-router": "^4.2.4",
+    "vue-yandex-maps": "^0.12.3"
+  },
+  "devDependencies": {
+    "@intlify/unplugin-vue-i18n": "^0.12.2",
+    "@types/leaflet": "^1.7.11",
+    "@types/medium-editor": "^5.0.5",
+    "@types/node": "^17.0.25",
+    "@typescript-eslint/eslint-plugin": "^5.20.0",
+    "@typescript-eslint/parser": "^5.20.0",
+    "@vitejs/plugin-vue": "^4.2.3",
+    "@vue/eslint-config-prettier": "^7.0.0",
+    "@vue/eslint-config-typescript": "^10.0.0",
+    "autoprefixer": "^10.4.13",
+    "axios": "^1.6.5",
+    "eslint": "^8.13.0",
+    "eslint-plugin-prettier": "^4.0.0",
+    "eslint-plugin-vue": "^8.7.0",
+    "husky": "^8.0.1",
+    "lint-staged": "^13.0.1",
+    "postcss": "^8.4.31",
+    "prettier": "^2.6.2",
+    "qs": "^6.11.2",
+    "tailwindcss": "^3.2.4",
+    "typescript": "^4.5.4",
+    "vite": "^4.4.12",
+    "vue-eslint-parser": "^8.3.0",
+    "vue-tsc": "^0.35.0",
+    "vuestic-ui": "^1.8.7"
+  }
+}

+ 6 - 0
postcss.config.js

@@ -0,0 +1,6 @@
+module.exports = {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+}

BIN
public/favicon.ico


BIN
public/favicon.png


BIN
public/vendor/leaflet/marker-icon-2x.png


BIN
public/vendor/leaflet/marker-icon.png


BIN
public/vendor/leaflet/marker-shadow.png


BIN
public/vuestic-admin-image.jpg


BIN
public/vuestic-admin-logo.png


+ 38 - 0
src/App.vue

@@ -0,0 +1,38 @@
+<template>
+  <router-view />
+</template>
+
+<style lang="scss">
+  @import 'scss/main.scss';
+
+  #app {
+    font-family: 'Source Sans Pro', Avenir, Helvetica, Arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+  }
+
+  body {
+    margin: 0;
+  }
+  .opBtn {
+    display: inline-block;
+  }
+  .va-toast__title {
+    color: white;
+  }
+  .pagination {
+    display: flex;
+    justify-content: center;
+    margin-top: 30px;
+    margin-bottom: 10px;
+  }
+  .va-data-table .va-data-table__table .va-data-table__table-thead {
+    border-bottom: 2px solid black;
+  }
+  .va-data-table .va-data-table__table .va-data-table__table-thead th {
+    box-shadow: none;
+  }
+  .va-toast__content {
+    color: white;
+  }
+</style>

+ 130 - 0
src/api/api.js

@@ -0,0 +1,130 @@
+import axios from 'axios'
+import qs from 'qs'
+import { useToast } from 'vuestic-ui'
+import router from '../router'
+console.log(router)
+// const router = require('')
+// import Vue from 'vue'
+// console.log(Vue)
+const instance = axios.create({
+  // baseURL: 'api',
+  baseURL: '/api/',
+  timeout: 30000,
+})
+
+/*
+ *
+ * 请求的预处理 by wzd
+ * */
+instance.interceptors.request.use(
+  (config) => {
+    config.headers['Accept'] = ''
+    config.headers['X-Requested-With'] = 'XMLHttpRequest'
+    // config.headers['Authorization'] = localStorage.getItem('token')
+    return config
+  },
+  (error) => {
+    return Promise.reject(error)
+  },
+)
+
+/*
+ *
+ * 返回的预处理 by wzd
+ * */
+instance.interceptors.response.use(
+  function (response) {
+    // Do something with response data
+    return response.data
+  },
+  function (error) {
+    // console.log(error);
+    return Promise.reject(error)
+  },
+)
+
+function fetch(ourl, params = {}, methods = 'post') {
+  return new Promise((resolve, reject) => {
+    let url = ourl
+    if (methods == 'get' && qs.stringify(params)) {
+      url = ourl + '?' + qs.stringify(params)
+    }
+    instance[methods](url, params)
+      .then((res) => {
+        if (res.code == 200) {
+          resolve(res)
+        } else if (res.code == 401) {
+          useToast().init({ title: '提示', message: '登录已失效', duration: 2000, color: '#E42222', closeable: false })
+          setTimeout(() => {
+            router.push({ name: 'login' })
+          }, 1000)
+        } else {
+          reject(res)
+          useToast().init({ title: '提示', message: res.message, duration: 2000, color: '#E42222', closeable: false })
+        }
+      })
+      .catch((err) => {
+        reject(err)
+      })
+  })
+}
+
+export default {
+  login(params) {
+    return fetch('api/system/login', params)
+  },
+  getCaptcha(params) {
+    return fetch('/api/system/captcha', params, 'get')
+  },
+  getMenuPermission(params) {
+    return fetch('/api/system/getMenuTree', params, 'get')
+  },
+  getUserList(params) {
+    return fetch('/sysUser', params, 'get')
+  },
+  addUser(params) {
+    return fetch('/sysUser', params, 'post')
+  },
+  deleteUser(params) {
+    return fetch('/sysUser?id=' + params.id, params, 'delete')
+  },
+  getRoleList(params) {
+    return fetch('/sysRole', params, 'get')
+  },
+  getOrgListTree(params) {
+    return fetch('/sysOrg', params, 'get')
+  },
+  addRole(params) {
+    return fetch('/sysRole', params, 'post')
+  },
+  getMenuTree(params) {
+    return fetch('/sysMenu', params, 'get')
+  },
+  addOrg(params) {
+    return fetch('/sysOrg', params, 'post')
+  },
+  editOrg(params) {
+    return fetch('/sysOrg', params, 'put')
+  },
+  editRole(params) {
+    return fetch('/sysRole', params, 'put')
+  },
+  getOrgDetial(params) {
+    return fetch('/sysOrg/' + params.id, params, 'get')
+  },
+  getRoleDetial(params) {
+    return fetch('/sysRole/' + params.id, params, 'get')
+  },
+  getRoleMenus(params) {
+    return fetch('/sysRole/getRoleMenus', params, 'get')
+  },
+  roleMenuAdd(params) {
+    return fetch('/sysRole/roleMenuAdd', params, 'post')
+  },
+  deleteOrg(params) {
+    return fetch('/sysOrg?id=' + params.id, params, 'delete')
+  },
+  deleteRole(params) {
+    return fetch('/sysRole?id=' + params.id, params, 'delete')
+  },
+}

+ 9 - 0
src/common/dict.js

@@ -0,0 +1,9 @@
+let pageInfo = {
+  pageNum: 1,
+  pageSize: 10,
+  total: 0,
+}
+
+export default {
+  pageInfo,
+}

+ 79 - 0
src/components/VuesticLogo.vue

@@ -0,0 +1,79 @@
+<template>
+  <!--  <svg class="va-icon-vuestic" :height="height" viewBox="0 0 478 57" fill="none" xmlns="http://www.w3.org/2000/svg">-->
+  <!--    <path-->
+  <!--      d="M18.2761 56.1386L0 13.3794H10.5519L18.8968 33.3107L27.2417 13.3794H37.7936L19.5175 56.1386H18.2761ZM62.4836 40.8281V13.3794H72.5527V39.3108C72.5527 44.8281 75.1734 46.7592 78.6907 46.7592C82.5528 46.7592 84.9666 44.8281 84.9666 39.3108V13.3794H95.1047V40.8281C95.1047 50.6213 87.7942 56.1386 78.6907 56.1386C69.2423 56.1386 62.4836 50.3454 62.4836 40.8281ZM122.415 54.7593V13.3794H149.795V22.3451H132.553V29.7935H148.485V38.6211H132.553V46.0695H150.554V54.7593H122.415ZM175.933 42.6212H185.795C185.795 45.035 187.727 46.9661 190.071 46.9661C192.623 46.9661 194.209 45.5178 194.209 43.3798C194.209 40.2763 190.14 39.3798 186.761 38.2074C179.795 35.7246 175.933 32.4831 175.933 25.3796C175.933 18.0692 182.209 12.0001 190.002 12.0001C199.175 12.0001 203.52 17.8623 204.072 25.5175H194.554C194.554 23.1727 193.106 21.2416 190.278 21.2416C188.071 21.2416 185.933 22.552 185.933 25.2417C185.933 28.3452 189.727 28.8969 193.244 29.9314C200.623 32.1383 204.072 36.2763 204.072 42.7591C204.072 50.0696 197.865 56.1386 190.071 56.1386C181.037 56.1386 175.933 50.0696 175.933 42.6212ZM236.442 54.7593V22.3451H227.2V13.3794H256.028V22.3451H246.649V54.7593H236.442ZM281.408 54.7593V13.3794H291.546V54.7593H281.408ZM317.502 34.0694C317.502 21.7244 326.812 12.0001 339.916 12.0001C347.778 12.0001 353.226 14.9657 357.64 19.5864L350.675 26.2072C347.778 23.3796 344.054 21.5865 339.916 21.5865C332.536 21.5865 327.778 27.1038 327.778 34.0694C327.778 41.035 332.536 46.5523 339.916 46.5523C344.054 46.5523 347.778 44.7592 350.675 41.9315L357.433 48.5523C353.295 52.8972 347.571 56.1386 339.916 56.1386C326.812 56.1386 317.502 46.4143 317.502 34.0694Z"-->
+  <!--      fill="url(#paint0_linear)"-->
+  <!--    />-->
+  <!--    <path-->
+  <!--      d="M388.671 23.5893L388.364 24.844H391.71L391.403 23.5893C391.18 22.7157 390.957 21.7677 390.734 20.7454C390.511 19.7231 390.288 18.7565 390.065 17.8457H389.953C389.749 18.7751 389.535 19.751 389.312 20.7733C389.107 21.777 388.894 22.7157 388.671 23.5893ZM381.7 32.3999L387.221 14.2769H393.02L398.541 32.3999H393.466L392.574 28.5523H387.5L386.607 32.3999H381.7Z"-->
+  <!--      :fill="colorsComputed.start"-->
+  <!--    />-->
+  <!--    <path-->
+  <!--      d="M403.987 32.3999V14.2769H409.34C410.715 14.2769 411.97 14.4441 413.104 14.7787C414.256 15.1133 415.241 15.6431 416.059 16.368C416.877 17.0929 417.509 18.0223 417.955 19.1561C418.42 20.29 418.652 21.6562 418.652 23.2548C418.652 24.8533 418.429 26.2288 417.983 27.3812C417.537 28.5337 416.905 29.4817 416.087 30.2252C415.288 30.9687 414.331 31.517 413.215 31.8702C412.119 32.2234 410.92 32.3999 409.619 32.3999H403.987ZM408.782 28.5523H409.061C409.712 28.5523 410.325 28.4779 410.901 28.3292C411.477 28.1619 411.97 27.8831 412.379 27.4928C412.806 27.1024 413.141 26.5634 413.383 25.8756C413.624 25.1879 413.745 24.3143 413.745 23.2548C413.745 22.1953 413.624 21.3309 413.383 20.6618C413.141 19.9926 412.806 19.4721 412.379 19.1004C411.97 18.7286 411.477 18.4777 410.901 18.3476C410.325 18.1989 409.712 18.1245 409.061 18.1245H408.782V28.5523Z"-->
+  <!--      :fill="colorsComputed.start"-->
+  <!--    />-->
+  <!--    <path-->
+  <!--      d="M424.664 32.3999V14.2769H429.794L432.526 21.6934C432.694 22.1953 432.852 22.7157 433 23.2548C433.149 23.7938 433.307 24.3328 433.474 24.8719H433.586C433.753 24.3328 433.911 23.7938 434.06 23.2548C434.208 22.7157 434.366 22.1953 434.534 21.6934L437.155 14.2769H442.285V32.3999H437.935V27.0467C437.935 26.582 437.954 26.0708 437.991 25.5132C438.047 24.9555 438.103 24.3886 438.158 23.8124C438.214 23.2176 438.279 22.6414 438.354 22.0837C438.428 21.5261 438.493 21.0242 438.549 20.5781H438.437L436.932 24.9277L434.701 30.9222H432.136L429.905 24.9277L428.456 20.5781H428.344C428.4 21.0242 428.465 21.5261 428.539 22.0837C428.614 22.6414 428.679 23.2176 428.734 23.8124C428.79 24.3886 428.837 24.9555 428.874 25.5132C428.93 26.0708 428.957 26.582 428.957 27.0467V32.3999H424.664Z"-->
+  <!--      :fill="colorsComputed.start"-->
+  <!--    />-->
+  <!--    <path d="M450.028 32.3999V14.2769H454.823V32.3999H450.028Z" :fill="colorsComputed.start" />-->
+  <!--    <path-->
+  <!--      d="M462.567 32.3999V14.2769H467.474L471.489 22.3625L473.218 26.4333H473.329C473.274 25.95 473.209 25.4202 473.134 24.844C473.06 24.2678 472.995 23.6823 472.939 23.0875C472.883 22.4741 472.828 21.87 472.772 21.2752C472.735 20.6618 472.716 20.0762 472.716 19.5186V14.2769H477.289V32.3999H472.381L468.366 24.2864L466.638 20.2435H466.526C466.638 21.2845 466.768 22.4183 466.917 23.6451C467.065 24.8719 467.14 26.0429 467.14 27.1582V32.3999H462.567Z"-->
+  <!--      :fill="colorsComputed.start"-->
+  <!--    />-->
+  <!--    <defs>-->
+  <!--      <linearGradient id="paint0_linear" x1="0" y1="56.1386" x2="357.64" y2="56.1386" gradientUnits="userSpaceOnUse">-->
+  <!--        <stop :stop-color="colorsComputed.end" />-->
+  <!--        <stop offset="1" :stop-color="colorsComputed.start" />-->
+  <!--      </linearGradient>-->
+  <!--    </defs>-->
+  <!--  </svg>-->
+  <svg
+    t="1704679620392"
+    class="icon"
+    viewBox="0 0 1328 1024"
+    version="1.1"
+    xmlns="http://www.w3.org/2000/svg"
+    p-id="2951"
+    width="30"
+    height="30"
+  >
+    <path
+      d="M983.4851876 861.58181621H730.8140583a40.70963408 40.70963408 0 0 1 0-81.41926816h252.58066348a40.70963408 40.70963408 0 1 1 0.09046582 81.41926817zM372.29787881 785.5000332h-17.00758037a134.34179326 134.34179326 0 0 1-134.16086162-134.16086073V374.42319365a134.34179326 134.34179326 0 0 1 134.16086162-134.16086162h17.00758037a134.34179326 134.34179326 0 0 1 134.16086162 134.16086162v276.91597881A134.34179326 134.34179326 0 0 1 372.29787881 785.5000332z m-17.00758037-463.81843301a52.8320584 52.8320584 0 0 0-52.74159258 52.74159346v276.91597881a52.8320584 52.8320584 0 0 0 52.74159258 52.74159257h17.00758037a52.8320584 52.8320584 0 0 0 52.74159257-52.74159257V374.42319365a52.8320584 52.8320584 0 0 0-52.74159257-52.74159345h-17.00758037z"
+      fill="#0071BC"
+      p-id="2952"
+    ></path>
+    <path
+      d="M1188.29988125 961.99891455h-178.67006191a40.70963408 40.70963408 0 0 1-39.3526459-30.48699287l-61.33584902-235.21121983H774.96139443a40.70963408 40.70963408 0 0 1-39.35264589-51.20367362l83.68091454-313.64511592a40.70963408 40.70963408 0 0 1 39.35264679-30.21559454 40.70963408 40.70963408 0 0 1 39.26218007 30.486992l80.15274668 307.58390332a40.43823662 40.43823662 0 0 1 3.25677129 12.39382265l59.70746337 229.15000811h92.7275001L930.29126592 196.11499502a73.00594424 73.00594424 0 0 0-140.0411417 0L679.06758974 566.12033809c-6.0612126 24.60671192-50.02761709 200.47233252-79.06715683 261.62724902-38.9003168 81.50973398-135.24645146 134.25132744-245.16246358 134.25132744A292.83796933 292.83796933 0 0 1 62.27139746 669.43234268V355.15396602a292.38564023 292.38564023 0 0 1 542.79512402-150.35424873 40.72772724 40.72772724 0 1 1-69.74917382 42.06662226 210.96637119 210.96637119 0 0 0-392.07901113 108.55902392v314.36884249a211.32823447 211.32823447 0 0 0 211.5996328 210.78543955c78.97669013 0 146.46421758-34.55795654 171.88512188-88.02327569 21.98320224-46.22805176 60.79305411-194.04925664 73.8201375-247.1527125l0.54279492-1.99024892 111.45393194-370.91000127a154.4252124 154.4252124 0 0 1 296.09473974 0l218.9273669 737.0253123a40.70963408 40.70963408 0 0 1-39.26218096 52.47019512zM827.97438535 614.790967h59.70746338l-29.49186884-113.26324922z"
+      fill="#0071BC"
+      p-id="2953"
+    ></path>
+    <path
+      d="M704.12663076 961.99891455a40.70963408 40.70963408 0 0 1-39.35264589-51.20367363l27.13975576-100.41709746a40.70963408 40.70963408 0 1 1 78.70529267 20.8976124l-27.13975577 100.41709746a40.70963408 40.70963408 0 0 1-39.35264677 30.30606123z"
+      fill="#0071BC"
+      p-id="2954"
+    ></path>
+  </svg>
+</template>
+
+<script setup lang="ts">
+  import { computed } from 'vue'
+  import { useColors } from 'vuestic-ui'
+  const { getColor, shiftHSLAColor } = useColors()
+
+  const props = withDefaults(
+    defineProps<{
+      height?: number | string
+      color?: string
+    }>(),
+    {
+      height: 16,
+      color: 'primary',
+    },
+  )
+
+  const colorsComputed = computed(() => {
+    const color = getColor(props.color, 'primary')
+    return { start: color, end: shiftHSLAColor(color, { l: -20 }) }
+  })
+</script>

+ 40 - 0
src/components/icons/VaIconCleanCode.vue

@@ -0,0 +1,40 @@
+<template>
+  <svg class="va-icon-clean-code" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.02 50.34">
+    <defs />
+    <title>overview_icon_4</title>
+    <g id="Layer_2" data-name="Layer 2">
+      <g id="Layer_1-2" data-name="Layer 1">
+        <path class="cls-1" d="M38.23,16.17a10,10,0,1,0-17.67,6.42V47.5l7.33-5,8,5V22.58A10,10,0,0,0,38.23,16.17Z" />
+        <path
+          class="cls-2"
+          d="M28.23,0a13.15,13.15,0,0,0-9.17,22.6V50.34l8.87-6,9.46,5.92V22.6A13.15,13.15,0,0,0,28.23,0ZM34.4,44.79l-6.54-4.08-5.8,4V24.79a13.11,13.11,0,0,0,12.33,0ZM28.23,23.33A10.17,10.17,0,1,1,38.4,13.17,10.18,10.18,0,0,1,28.23,23.33Z"
+        />
+        <path
+          class="cls-2"
+          d="M28.23,5.67a7.5,7.5,0,1,0,7.5,7.5A7.51,7.51,0,0,0,28.23,5.67Zm0,12a4.5,4.5,0,1,1,4.5-4.5A4.5,4.5,0,0,1,28.23,17.67Z"
+        />
+        <polygon class="cls-2" points="9.51 15.11 0 24.61 9.51 34.12 11.63 32 4.24 24.61 11.63 17.23 9.51 15.11" />
+        <polygon
+          class="cls-2"
+          points="46.52 15.11 44.39 17.23 51.78 24.61 44.39 32 46.52 34.12 56.02 24.61 46.52 15.11"
+        />
+      </g>
+    </g>
+  </svg>
+</template>
+
+<style lang="scss">
+  .va-icon-clean-code {
+    display: inline-block;
+    width: 56px;
+    height: 50px;
+
+    .cls-1 {
+      fill: #4ae387;
+    }
+
+    .cls-2 {
+      fill: #34495e;
+    }
+  }
+</style>

+ 38 - 0
src/components/icons/VaIconColor.vue

@@ -0,0 +1,38 @@
+<template>
+  <svg
+    class="va-icon-color"
+    :fill="color"
+    xmlns="http://www.w3.org/2000/svg"
+    width="24"
+    height="24"
+    viewBox="0 0 24 24"
+  >
+    <path fill="none" d="M0 0h24v24H0V0z" />
+    <path
+      d="M12 22C6.49 22 2 17.51 2 12S6.49 2 12 2s10 4.04 10 9c0 3.31-2.69 6-6 6h-1.77c-.28 0-.5.22-.5.5 0 .12.05.23.13.33.41.47.64 1.06.64 1.67 0 1.38-1.12 2.5-2.5 2.5zm0-18c-4.41 0-8 3.59-8 8s3.59 8 8 8c.28 0 .5-.22.5-.5 0-.16-.08-.28-.14-.35-.41-.46-.63-1.05-.63-1.65 0-1.38 1.12-2.5 2.5-2.5H16c2.21 0 4-1.79 4-4 0-3.86-3.59-7-8-7z"
+    />
+    <circle cx="6.5" cy="11.5" r="1.5" />
+    <circle cx="9.5" cy="7.5" r="1.5" />
+    <circle cx="14.5" cy="7.5" r="1.5" />
+    <circle cx="17.5" cy="11.5" r="1.5" />
+  </svg>
+</template>
+
+<script setup lang="ts">
+  withDefaults(
+    defineProps<{
+      color?: string
+    }>(),
+    {
+      color: 'inherit',
+    },
+  )
+</script>
+
+<style lang="scss">
+  .va-icon-color {
+    display: inline-block;
+    width: 24px;
+    height: 24px;
+  }
+</style>

+ 33 - 0
src/components/icons/VaIconFaster.vue

@@ -0,0 +1,33 @@
+<template>
+  <svg
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    class="va-icon-faster"
+    viewBox="0 0 24 24"
+    version="1.1"
+    xmlns="http://www.w3.org/2000/svg"
+  >
+    <!-- Generator: sketchtool 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
+    <title>62EBC3B8-A55C-4B01-95A2-52FB8EDD4150</title>
+    <defs />
+    <g id="symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+      <g id="icon-faster" fill="#34495E">
+        <g>
+          <path
+            id="A"
+            d="M17.748,19 L16.956,16.3 L12.942,16.3 L12.168,19 L8.928,19 L13.302,6.13 L16.614,6.13 L20.988,19 L17.748,19 Z M14.976,9.064 L14.94,9.064 C14.94,9.064 14.652,10.468 14.418,11.278 L13.68,13.78 L16.218,13.78 L15.498,11.278 C15.264,10.468 14.976,9.064 14.976,9.064 Z"
+          />
+          <rect id="Rectangle-4" x="3" y="11" width="5" height="2" rx="1" />
+          <rect id="Rectangle-4-Copy" x="4" y="7" width="6" height="2" rx="1" />
+          <rect id="Rectangle-4" x="2" y="15" width="4" height="2" rx="1" />
+        </g>
+      </g>
+    </g>
+  </svg>
+</template>
+
+<style lang="scss">
+  .va-icon-faster {
+    width: 24px;
+    height: 24px;
+  }
+</style>

+ 46 - 0
src/components/icons/VaIconFree.vue

@@ -0,0 +1,46 @@
+<template>
+  <svg class="va-icon-free" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44.99 51.04">
+    <defs />
+    <title>overview_icon_2</title>
+    <g id="Layer_2" data-name="Layer 2">
+      <g id="Layer_1-2" data-name="Layer 1">
+        <path
+          class="cls-1"
+          d="M1.08,28.21C1.08,13.62,8.38,6.29,19,6.29S37,13.69,37,28.21,29.66,50.54,19,50.54,1.08,42.8,1.08,28.21Zm23.56,0c0-11.3-2.58-16.9-5.62-16.9s-5.62,5.6-5.62,16.9S16,41.66,19,41.66,24.65,39.51,24.65,28.21Z"
+        />
+        <line class="cls-2" x1="39.83" y1="47.62" x2="39.83" y2="50.96" />
+        <path
+          class="cls-3"
+          d="M18.73,9.64c-4.9,0-6.9,4.54-6.9,15.66,0,11.29,2.06,16.1,6.9,16.1s6.9-4.81,6.9-16.1C25.63,14.17,23.63,9.64,18.73,9.64Zm0,28.76c-1.07,0-3.9,0-3.9-13.1,0-12.66,2.64-12.66,3.9-12.66s3.9,0,3.9,12.66C22.63,38.4,19.8,38.4,18.73,38.4Z"
+        />
+        <path
+          class="cls-3"
+          d="M42.9,43.74A3.76,3.76,0,0,1,40.17,45c-1.95,0-3.24-1.57-3.24-4.4s1.53-4.35,3.29-4.35a3.67,3.67,0,0,1,2.5,1.11l2.08-2.55A6.8,6.8,0,0,0,41.33,33V31h-3v2.12a7.09,7.09,0,0,0-1.64.63,43.71,43.71,0,0,0,.77-8.41c0-15.84-7-25.3-18.73-25.3S0,9.46,0,25.3,7.18,51,18.73,51A16.4,16.4,0,0,0,33.12,43.1,6.77,6.77,0,0,0,40,48.46a6.35,6.35,0,0,0,5-2.22ZM18.73,48C8.88,48,3,39.54,3,25.3S8.73,3,18.73,3s15.73,8.13,15.73,22.3S28.58,48,18.73,48Z"
+        />
+      </g>
+    </g>
+  </svg>
+</template>
+
+<style lang="scss">
+  .va-icon-free {
+    display: inline-block;
+    width: 55px;
+    height: 47.8px;
+
+    .cls-1 {
+      fill: #4ae387;
+    }
+
+    .cls-2 {
+      fill: none;
+      stroke: #34495e;
+      stroke-miterlimit: 10;
+      stroke-width: 3px;
+    }
+
+    .cls-3 {
+      fill: #34495e;
+    }
+  }
+</style>

+ 34 - 0
src/components/icons/VaIconFresh.vue

@@ -0,0 +1,34 @@
+<template>
+  <svg class="va-icon-fresh" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50.98 47.66">
+    <defs />
+    <title>overview_icon_5</title>
+    <g id="Layer_2" data-name="Layer 2">
+      <g id="Layer_1-2" data-name="Layer 1">
+        <path
+          class="cls-1"
+          d="M6,19C11,12.66,26.33,3,46.33,6c-3.67,17-8.67,26-8.67,26s-7,14-19.67-3.67C5.67,26.33,9,22.33,6,19Z"
+        />
+        <path
+          class="cls-2"
+          d="M48.33.49l-.77,0c-11.22-1.88-30.21,1.46-39,9-3.38,2.89-5,6.11-4.69,9.59a11.06,11.06,0,0,0,4.77,8,11,11,0,0,0,6.24,1.82q.53,0,1.09,0A55.51,55.51,0,0,0,13.2,39.21C9.48,33.07,2.35,30.83,0,30.83v3c.12,0,12.18,1.95,12.5,13.54h0c0,.1,0,.19,0,.29h3a50.57,50.57,0,0,1,3.12-17.21c2.48,5.09,6.36,8,10.91,8.13,5.3.07,10.1-3.85,11.91-9.81.94-3.12,1.88-6.37,2.78-9.51C46.32,11.9,48.31,5,49.62,2.76L51,.49ZM10.28,24.61a8.06,8.06,0,0,1-3.45-5.73c-.19-2.47,1-4.85,3.65-7.08,5.9-5,17.25-8.12,27-8.7-8.35,4-15.7,12.31-20.23,22.51l-.38.1h0A8.82,8.82,0,0,1,10.28,24.61Zm31-6.18c-.9,3.13-1.82,6.37-2.76,9.47-1.4,4.62-4.95,7.69-8.86,7.69h-.13c-4-.07-7.45-3.43-9.33-9.09C25.83,14.27,35.67,4.94,45.92,3.65,44.6,7,43.06,12.39,41.33,18.42Z"
+        />
+      </g>
+    </g>
+  </svg>
+</template>
+
+<style lang="scss">
+  .va-icon-fresh {
+    display: inline-block;
+    width: 51px;
+    height: 48px;
+
+    .cls-1 {
+      fill: #4ae387;
+    }
+
+    .cls-2 {
+      fill: #34495e;
+    }
+  }
+</style>

+ 30 - 0
src/components/icons/VaIconMenu.vue

@@ -0,0 +1,30 @@
+<template>
+  <svg class="va-icon-menu" xmlns="http://www.w3.org/2000/svg" width="23" height="18" viewBox="0 0 24 18">
+    <g fill="none" fill-rule="nonzero" transform="translate(1 -3)">
+      <path d="M0 0h24v24H0z" />
+      <rect width="20" height="2" x="2" y="3" :fill="color" rx="1" />
+      <path :fill="color" d="M11 11h10a1 1 0 0 1 0 2H11a1 1 0 0 1 0-2zM1 11h5a1 1 0 0 1 0 2H1a1 1 0 0 1 0-2z" />
+      <rect width="20" height="2" x="2" y="19" :fill="color" rx="1" />
+      <path :stroke="color" stroke-width="2" d="M4 9l-3 3 3 3" />
+    </g>
+  </svg>
+</template>
+
+<script setup lang="ts">
+  withDefaults(
+    defineProps<{
+      color?: string
+    }>(),
+    {
+      color: 'inherit',
+    },
+  )
+</script>
+
+<style lang="scss">
+  .va-icon-menu {
+    display: inline-block;
+    width: 24px;
+    height: 24px;
+  }
+</style>

+ 32 - 0
src/components/icons/VaIconMenuCollapsed.vue

@@ -0,0 +1,32 @@
+<template>
+  <svg class="va-icon-menu-collapsed" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g fill="none" fill-rule="nonzero">
+      <path d="M0 0h24v24H0z" />
+      <rect width="20" height="2" x="2" y="3" :fill="color" rx="1" />
+      <path
+        :fill="color"
+        d="M3 11h10a1 1 0 0 1 0 2H3a1 1 0 0 1 0-2zM20.993 11l-2.7-2.7-1.414 1.414L18.164 11H16a1 1 0 0 0 0 2h2.179l-1.3 1.3 1.414 1.414L21.007 13A1 1 0 0 0 21 11h-.007z"
+      />
+      <rect width="20" height="2" x="2" y="19" :fill="color" rx="1" />
+    </g>
+  </svg>
+</template>
+
+<script setup lang="ts">
+  withDefaults(
+    defineProps<{
+      color?: string
+    }>(),
+    {
+      color: 'inherit',
+    },
+  )
+</script>
+
+<style lang="scss">
+  .va-icon-menu-collapsed {
+    display: inline-block;
+    width: 24px;
+    height: 24px;
+  }
+</style>

+ 27 - 0
src/components/icons/VaIconMessage.vue

@@ -0,0 +1,27 @@
+<template>
+  <svg xmlns="http://www.w3.org/2000/svg" width="20" height="16" viewBox="0 0 20 16" :fill="color">
+    <path
+      fill-rule="nonzero"
+      d="M20 2c0-1.1-.9-2-2-2H2C.9 0 0 .9 0 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V2zm-2 0l-8 5-8-5h16zm0 12H2V4l8 5 8-5v10z"
+    />
+  </svg>
+</template>
+
+<script setup lang="ts">
+  withDefaults(
+    defineProps<{
+      color?: string
+    }>(),
+    {
+      color: 'inherit',
+    },
+  )
+</script>
+
+<style lang="scss">
+  .va-icon-message {
+    display: inline-block;
+    width: 24px;
+    height: 24px;
+  }
+</style>

+ 27 - 0
src/components/icons/VaIconNotification.vue

@@ -0,0 +1,27 @@
+<template>
+  <svg class="va-icon-notification" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+    <path
+      :fill="color"
+      d="M10 20c1.1 0 2-.9 2-2H8c0 1.1.9 2 2 2zm6-6V9c0-3.07-1.63-5.64-4.5-6.32V2c0-.83-.67-1.5-1.5-1.5S8.5 1.17 8.5 2v.68C5.64 3.36 4 5.92 4 9v5l-2 2v1h16v-1l-2-2zm-2 1H6V9c0-2.48 1.51-4.5 4-4.5s4 2.02 4 4.5v6zM5.58 2.08L4.15.65C1.75 2.48.17 5.3.03 8.5h2a8.445 8.445 0 0 1 3.55-6.42zM17.97 8.5h2c-.15-3.2-1.73-6.02-4.12-7.85l-1.42 1.43a8.495 8.495 0 0 1 3.54 6.42z"
+    />
+  </svg>
+</template>
+
+<script setup lang="ts">
+  withDefaults(
+    defineProps<{
+      color?: string
+    }>(),
+    {
+      color: 'inherit',
+    },
+  )
+</script>
+
+<style lang="scss">
+  .va-icon-notification {
+    display: inline-block;
+    width: 24px;
+    height: 24px;
+  }
+</style>

+ 29 - 0
src/components/icons/VaIconResponsive.vue

@@ -0,0 +1,29 @@
+<template>
+  <svg class="va-icon-responsive" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 47.5 49">
+    <defs />
+    <title>overview_icon_3</title>
+    <g id="Layer_2" data-name="Layer 2">
+      <g id="Layer_1-2" data-name="Layer 1">
+        <polygon class="cls-1" points="37 26 37 7 11 7 11 18 3 18 3 46 11 46 15 46 30 46 37 46 45 46 45 26 37 26" />
+        <path class="cls-2" d="M40,19V0H8V11H0V49H47.5V19ZM3,46V14H8V46Zm34,0H11V3H37Zm7.5,0H40V22h4.5Z" />
+        <circle class="cls-2" cx="24" cy="41" r="2.67" />
+      </g>
+    </g>
+  </svg>
+</template>
+
+<style lang="scss">
+  .va-icon-responsive {
+    display: inline-block;
+    width: 47.5px;
+    height: 49px;
+
+    .cls-1 {
+      fill: #4ae387;
+    }
+
+    .cls-2 {
+      fill: #34495e;
+    }
+  }
+</style>

+ 40 - 0
src/components/icons/VaIconRich.vue

@@ -0,0 +1,40 @@
+<template>
+  <svg class="va-icon-rich" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.99 55">
+    <defs />
+    <title>overview_icon_6</title>
+    <g id="Layer_2" data-name="Layer 2">
+      <g id="Layer_1-2" data-name="Layer 1">
+        <rect class="cls-1" x="10.31" y="30.5" width="37.33" height="23" />
+        <path
+          class="cls-2"
+          d="M57,41.18l-7.85-16V24H8.81v1.11L0,41.11l2.63,1.45L8.81,31.33V55H49.15V32L54.3,42.5ZM46.15,52H11.81V27H46.15Z"
+        />
+        <polygon class="cls-2" points="35.3 1.8 32.9 0 28.12 6.39 26.16 4.63 24.16 6.87 28.56 10.8 35.3 1.8" />
+        <polygon
+          class="cls-2"
+          points="22.3 12.46 19.9 10.67 15.12 17.05 13.16 15.3 11.16 17.54 15.56 21.47 22.3 12.46"
+        />
+        <polygon
+          class="cls-2"
+          points="38.89 21.14 45.64 12.13 43.23 10.33 38.45 16.72 36.49 14.97 34.49 17.2 38.89 21.14"
+        />
+      </g>
+    </g>
+  </svg>
+</template>
+
+<style lang="scss">
+  .va-icon-rich {
+    display: inline-block;
+    width: 57px;
+    height: 55px;
+
+    .cls-1 {
+      fill: #4ae387;
+    }
+
+    .cls-2 {
+      fill: #34495e;
+    }
+  }
+</style>

+ 33 - 0
src/components/icons/VaIconSlower.vue

@@ -0,0 +1,33 @@
+<template>
+  <svg
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    class="va-icon-slower"
+    viewBox="0 0 24 24"
+    version="1.1"
+    xmlns="http://www.w3.org/2000/svg"
+  >
+    <!-- Generator: sketchtool 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
+    <title>67046716-A590-445C-AC65-1EEF69089C00</title>
+    <defs />
+    <g id="symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+      <g id="icon-slower" fill="#34495E">
+        <g>
+          <path
+            id="A"
+            d="M16.82,18.87 L16.028,16.17 L12.014,16.17 L11.24,18.87 L8,18.87 L12.374,6 L15.686,6 L20.06,18.87 L16.82,18.87 Z M14.048,8.934 L14.012,8.934 C14.012,8.934 13.724,10.338 13.49,11.148 L12.752,13.65 L15.29,13.65 L14.57,11.148 C14.336,10.338 14.048,8.934 14.048,8.934 Z"
+          />
+          <rect id="Rectangle-4" x="5" y="11" width="2" height="2" rx="1" />
+          <rect id="Rectangle-4-Copy" x="6" y="7" width="3" height="2" rx="1" />
+          <rect id="Rectangle-4" x="4" y="15" width="2" height="2" rx="1" />
+        </g>
+      </g>
+    </g>
+  </svg>
+</template>
+
+<style lang="scss">
+  .va-icon-slower {
+    width: 24px;
+    height: 24px;
+  }
+</style>

+ 34 - 0
src/components/icons/VaIconVue.vue

@@ -0,0 +1,34 @@
+<template>
+  <svg class="va-icon-vue" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.05 47.8">
+    <defs />
+    <title>overview_icon_1</title>
+    <g id="Layer_2" data-name="Layer 2">
+      <g id="Layer_1-2" data-name="Layer 1">
+        <polygon
+          class="cls-1"
+          points="27.75 21.19 18.48 6.18 4.78 6.18 27.75 42.92 50.89 6.18 36.13 6.18 27.75 21.19"
+        />
+        <path
+          class="cls-2"
+          d="M33.08,0,27.44,9.76,21.84,0H0L27.43,47.8,55,0ZM27.43,15.77,34.81,3h4.6l-12,20.72L15.55,3h4.55ZM5.18,3h6.91L27.43,29.73,42.88,3h7L27.44,41.78Z"
+        />
+      </g>
+    </g>
+  </svg>
+</template>
+
+<style lang="scss">
+  .va-icon-vue {
+    display: inline-block;
+    width: 55px;
+    height: 47.8px;
+
+    .cls-1 {
+      fill: #4ae387;
+    }
+
+    .cls-2 {
+      fill: #34495e;
+    }
+  }
+</style>

+ 47 - 0
src/components/icons/VaIconVuestic.vue

@@ -0,0 +1,47 @@
+<template>
+  <svg xmlns="http://www.w3.org/2000/svg" class="va-icon-vuestic" width="304" height="31" viewBox="0 0 304 31">
+    <defs>
+      <linearGradient :id="'ORIGINAL'" x1="0%" y1="50%" y2="50%">
+        <stop offset="0%" stop-color="#4AE387" />
+        <stop offset="100%" stop-color="#C8EA13" />
+      </linearGradient>
+      <linearGradient :id="'CORPORATE'" x1="0%" y1="50%" y2="50%">
+        <stop offset="0%" stop-color="#74BBFF" />
+        <stop offset="100%" stop-color="#6E85E8" />
+      </linearGradient>
+    </defs>
+    <g fill="none" fill-rule="evenodd" transform="scale(2)">
+      <path
+        :fill="`url(#${themeGradientId})`"
+        fill-rule="nonzero"
+        d="M6.36,15.36 L-7.10542736e-15,0.48 L3.672,0.48 L6.576,7.416 L9.48,0.48 L13.152,0.48 L6.792,15.36 L6.36,15.36 Z M21.744,10.032 L21.744,0.48 L25.248,0.48 L25.248,9.504 C25.248,11.424 26.16,12.096 27.384,12.096 C28.728,12.096 29.568,11.424 29.568,9.504 L29.568,0.48 L33.096,0.48 L33.096,10.032 C33.096,13.44 30.552,15.36 27.384,15.36 C24.096,15.36 21.744,13.344 21.744,10.032 Z M42.6,14.88 L42.6,0.48 L52.128,0.48 L52.128,3.6 L46.128,3.6 L46.128,6.192 L51.672,6.192 L51.672,9.264 L46.128,9.264 L46.128,11.856 L52.392,11.856 L52.392,14.88 L42.6,14.88 Z M61.224,10.656 L64.656,10.656 C64.656,11.496 65.328,12.168 66.144,12.168 C67.032,12.168 67.584,11.664 67.584,10.92 C67.584,9.84 66.168,9.528 64.992,9.12 C62.568,8.256 61.224,7.128 61.224,4.656 C61.224,2.112 63.408,7.10542736e-15 66.12,7.10542736e-15 C69.312,7.10542736e-15 70.824,2.04 71.016,4.704 L67.704,4.704 C67.704,3.888 67.2,3.216 66.216,3.216 C65.448,3.216 64.704,3.672 64.704,4.608 C64.704,5.688 66.024,5.88 67.248,6.24 C69.816,7.008 71.016,8.448 71.016,10.704 C71.016,13.248 68.856,15.36 66.144,15.36 C63,15.36 61.224,13.248 61.224,10.656 Z M82.896,14.88 L82.896,3.6 L79.68,3.6 L79.68,0.48 L89.712,0.48 L89.712,3.6 L86.448,3.6 L86.448,14.88 L82.896,14.88 Z M98.544,14.88 L98.544,0.48 L102.072,0.48 L102.072,14.88 L98.544,14.88 Z M111.72,7.68 C111.72,3.384 114.96,7.10542736e-15 119.52,7.10542736e-15 C122.256,7.10542736e-15 124.152,1.032 125.688,2.64 L123.264,4.944 C122.256,3.96 120.96,3.336 119.52,3.336 C116.952,3.336 115.296,5.256 115.296,7.68 C115.296,10.104 116.952,12.024 119.52,12.024 C120.96,12.024 122.256,11.4 123.264,10.416 L125.616,12.72 C124.176,14.232 122.184,15.36 119.52,15.36 C114.96,15.36 111.72,11.976 111.72,7.68 Z"
+      />
+      <path
+        :fill="textColor"
+        d="M139.712,7.88 L139.712,6.152 L138.44,6.152 C138.272,6.152 138.066,6.162 137.822,6.182 C137.578,6.202 137.36,6.224 137.168,6.248 C137.424,5.984 137.682,5.704 137.942,5.408 C138.202,5.112 138.436,4.808 138.644,4.496 C138.852,4.184 139.022,3.87 139.154,3.554 C139.286,3.238 139.352,2.928 139.352,2.624 C139.352,2.248 139.288,1.906 139.16,1.598 C139.032,1.29 138.852,1.028 138.62,0.812 C138.388,0.596 138.112,0.428 137.792,0.308 C137.472,0.188 137.12,0.128 136.736,0.128 C136.456,0.128 136.198,0.152 135.962,0.2 C135.726,0.248 135.502,0.322 135.29,0.422 C135.078,0.522 134.876,0.65 134.684,0.806 C134.492,0.962 134.296,1.144 134.096,1.352 L134.096,1.352 L135.2,2.456 C135.384,2.272 135.574,2.106 135.77,1.958 C135.966,1.81 136.192,1.736 136.448,1.736 C136.728,1.736 136.954,1.818 137.126,1.982 C137.298,2.146 137.384,2.4 137.384,2.744 C137.384,3 137.302,3.274 137.138,3.566 C136.974,3.858 136.748,4.166 136.46,4.49 C136.172,4.814 135.834,5.16 135.446,5.528 C135.058,5.896 134.64,6.288 134.192,6.704 L134.192,6.704 L134.192,7.88 L139.712,7.88 Z M142.56,8.024 C142.912,8.024 143.2,7.904 143.424,7.664 C143.648,7.424 143.76,7.128 143.76,6.776 C143.76,6.424 143.648,6.128 143.424,5.888 C143.2,5.648 142.912,5.528 142.56,5.528 C142.208,5.528 141.92,5.648 141.696,5.888 C141.472,6.128 141.36,6.424 141.36,6.776 C141.36,7.128 141.472,7.424 141.696,7.664 C141.92,7.904 142.208,8.024 142.56,8.024 Z M150.736,7.88 L150.736,6.224 L149.368,6.224 L149.368,0.272 L147.856,0.272 C147.568,0.456 147.272,0.604 146.968,0.716 C146.664,0.828 146.296,0.928 145.864,1.016 L145.864,1.016 L145.864,2.288 L147.304,2.288 L147.304,6.224 L145.672,6.224 L145.672,7.88 L150.736,7.88 Z"
+      />
+    </g>
+  </svg>
+</template>
+<script>
+  export default {
+    name: 'VaIconVuestic',
+    inject: ['contextConfig'],
+    computed: {
+      themeGradientId() {
+        return this.contextConfig.invertedColor ? 'CORPORATE' : 'ORIGINAL'
+      },
+      textColor() {
+        return this.contextConfig.invertedColor ? '#6E85E8' : '#E4FF32'
+      },
+    },
+  }
+</script>
+
+<style lang="scss">
+  .va-icon-vuestic {
+    .st0 {
+      fill: #4ae387;
+    }
+  }
+</style>

+ 279 - 0
src/components/maps/LineMap.vue

@@ -0,0 +1,279 @@
+<template>
+  <div ref="mapRef" class="line-map" />
+</template>
+
+<script setup lang="ts">
+  import { ref, toRef, computed, onMounted, onBeforeUnmount, watch, shallowRef, onUpdated } from 'vue'
+  import * as am5 from '@amcharts/amcharts5'
+  import * as am5map from '@amcharts/amcharts5/map'
+  import am5geodata_worldLow from '@amcharts/amcharts5-geodata/worldLow'
+  import am5themes_Animated from '@amcharts/amcharts5/themes/Animated'
+  import { useColors } from 'vuestic-ui'
+
+  import {
+    planeSVG,
+    useMapData,
+    CityItem,
+    getGeoBounds,
+    generateLineSeriesData,
+    compareStrings,
+  } from '../../data/maps/lineMapData'
+
+  const generateLabelText = (city?: string) => (city ? `Flights from ${city}` : '')
+
+  const generateButtonText = (city: string) => `Show flights from ${city}`
+
+  const props = withDefaults(
+    defineProps<{
+      mapData: CityItem[]
+      homeCity: string
+      modelValue: string
+    }>(),
+    {
+      homeCity: 'New York',
+      modelValue: 'New York',
+    },
+  )
+
+  const emit = defineEmits<{
+    (e: 'update:modelValue', value: string): void
+  }>()
+
+  const { colors } = useColors()
+  const mapRef = ref()
+  const mapRoot = shallowRef()
+  const mapChart = shallowRef()
+  const mapPolygonSeries = shallowRef()
+  const mapPointSeries = shallowRef()
+  const mapLineSeries = shallowRef()
+  const mapZoomControl = shallowRef()
+  const mapLabelText = shallowRef()
+  const mapLabelSvg = shallowRef()
+  const mapHomeCityButton = shallowRef()
+
+  const mainCity = computed({
+    get() {
+      return props.modelValue
+    },
+    set(value) {
+      emit('update:modelValue', value)
+    },
+  })
+
+  const mapPointSeriesData = useMapData(toRef(props, 'mapData'))
+
+  const mapLineSeriesData = computed(() => {
+    const item = getItemByMainCityTitle()
+    return generateLineSeriesData(item)
+  })
+
+  const getItemByMainCityTitle = () =>
+    mapPointSeriesData.value.find(({ title }) => compareStrings(title, mainCity.value))
+
+  const zoomToGeoBounds = () => {
+    const item = getItemByMainCityTitle()
+    const geoBounds = getGeoBounds(item)
+
+    if (geoBounds) {
+      mapChart.value.zoomToGeoBounds(geoBounds)
+    }
+  }
+
+  const createMap = () => {
+    const root = am5.Root.new(mapRef.value)
+
+    root.setThemes([am5themes_Animated.new(root)])
+
+    const chart = root.container.children.push(
+      am5map.MapChart.new(root, {
+        minZoomLevel: 1,
+        maxZoomLevel: 10,
+      }),
+    )
+
+    const zoomControl = chart.set('zoomControl', am5map.ZoomControl.new(root, {}))
+
+    // polygon series
+    const polygonSeries = chart.series.push(
+      am5map.MapPolygonSeries.new(root, {
+        geoJSON: am5geodata_worldLow,
+        exclude: ['AQ'],
+      }),
+    )
+
+    polygonSeries.mapPolygons.template.setAll({
+      fill: am5.color(colors.secondary),
+      fillOpacity: 0.4,
+      strokeWidth: 0.5,
+    })
+
+    polygonSeries.events.on('datavalidated', zoomToGeoBounds)
+
+    // point series
+    const pointSeries = chart.series.push(
+      am5map.MapPointSeries.new(root, {
+        latitudeField: 'latitude',
+        longitudeField: 'longitude',
+      }),
+    )
+
+    // point series bullets
+    const bulletTemplate = am5.Template.new({}) as am5.Template<am5.Graphics>
+    bulletTemplate.events.on('click', (ev) => {
+      mainCity.value = (ev as any).target._dataItem.dataContext.title
+    })
+
+    pointSeries.bullets.push((root, series, dataItem) => {
+      const itemData = dataItem.dataContext as CityItem
+      const isMainCity = compareStrings(itemData.title, mainCity.value)
+
+      return am5.Bullet.new(root, {
+        sprite: am5.Graphics.new(
+          root,
+          {
+            svgPath: itemData.svgPath,
+            x: am5.percent(50),
+            y: am5.percent(50),
+            centerX: am5.percent(50),
+            centerY: am5.percent(50),
+            fill: am5.color(isMainCity ? colors.primary : itemData.color),
+            scale: isMainCity ? 1.5 : 1,
+            tooltipText: '{title}',
+          },
+          bulletTemplate,
+        ),
+      })
+    })
+
+    // line series
+    const lineSeries = chart.series.push(am5map.MapLineSeries.new(root, {}))
+
+    lineSeries.mapLines.template.setAll({
+      stroke: am5.color(colors.primary),
+      strokeWidth: 2,
+      strokeOpacity: 0.5,
+    })
+
+    // set map data
+    pointSeries.data.setAll(mapPointSeriesData.value)
+    lineSeries.data.setAll(mapLineSeriesData.value as unknown[])
+
+    // label 'Flights from ...'
+    const labelContainer = chart.children.push(
+      am5.Container.new(root, {
+        x: 15,
+        y: 15,
+        layout: root.horizontalLayout,
+      }),
+    )
+
+    const labelSvg = labelContainer.children.push(
+      am5.Graphics.new(root, {
+        svgPath: planeSVG,
+        fill: am5.color(colors.info),
+      }),
+    )
+
+    const labelText = labelContainer.children.push(
+      am5.Label.new(root, {
+        text: generateLabelText(getItemByMainCityTitle()?.title),
+        fill: am5.color(colors.info),
+        fontSize: 22,
+        lineHeight: am5.p100,
+      }),
+    )
+
+    // button 'Show flights from homeCity'
+    const homeCityButton = chart.children.push(
+      am5.Button.new(root, {
+        x: 15,
+        y: 45,
+        label: am5.Label.new(root, {
+          text: generateButtonText(props.homeCity),
+          paddingTop: 0,
+          marginRight: 0,
+          paddingBottom: 0,
+          marginLeft: 0,
+        }),
+        visible: false,
+      }),
+    )
+
+    homeCityButton.events.on('click', () => {
+      mainCity.value = props.homeCity
+      homeCityButton.hide()
+    })
+
+    // assign objects to refs
+    mapRoot.value = root
+    mapChart.value = chart
+    mapZoomControl.value = zoomControl
+    mapPointSeries.value = pointSeries
+    mapLineSeries.value = lineSeries
+    mapPolygonSeries.value = polygonSeries
+    mapLabelSvg.value = labelSvg
+    mapLabelText.value = labelText
+    mapHomeCityButton.value = homeCityButton
+  }
+
+  const setPointSeriesData = () => {
+    mapPointSeries.value.data.setAll(mapPointSeriesData.value)
+  }
+
+  const setLineSeriesData = () => {
+    mapLineSeries.value.data.setAll(mapLineSeriesData.value ?? [])
+  }
+
+  const updateInteractiveElements = () => {
+    mapLabelText.value.set('text', generateLabelText(getItemByMainCityTitle()?.title))
+    mapHomeCityButton.value[compareStrings(props.homeCity, mainCity.value) ? 'hide' : 'show']?.()
+  }
+
+  const updateChartDataOnChangeTheme = () => {
+    if (mapRoot.value) {
+      mapPolygonSeries.value.mapPolygons.template.setAll({
+        fill: am5.color(colors.secondary),
+      })
+
+      mapLineSeries.value.mapLines.template.setAll({
+        stroke: am5.color(colors.primary),
+      })
+
+      mapLabelText.value.set('fill', am5.color(colors.info))
+      mapLabelSvg.value.set('fill', am5.color(colors.info))
+
+      setPointSeriesData()
+    }
+  }
+
+  const updateChartDataOnUpdateProps = () => {
+    if (mapRoot.value) {
+      setPointSeriesData()
+      setLineSeriesData()
+      updateInteractiveElements()
+      zoomToGeoBounds()
+    }
+  }
+
+  const disposeMap = () => {
+    if (mapRoot.value) {
+      mapRoot.value.dispose()
+    }
+  }
+
+  onMounted(createMap)
+  onUpdated(updateChartDataOnUpdateProps)
+  watch(colors, updateChartDataOnChangeTheme)
+  onBeforeUnmount(disposeMap)
+</script>
+
+<style lang="scss" scoped>
+  .line-map {
+    border-radius: inherit;
+
+    :deep(div),
+    :deep(canvas) {
+      border-radius: inherit;
+    }
+  }
+</style>

+ 108 - 0
src/components/navbar/Navbar.vue

@@ -0,0 +1,108 @@
+<template>
+  <va-navbar class="app-layout-navbar">
+    <template #left>
+      <div class="left">
+        <va-icon-menu-collapsed
+          :class="{ 'x-flip': isSidebarMinimized }"
+          class="va-navbar__item"
+          :color="colors.primary"
+          @click="isSidebarMinimized = !isSidebarMinimized"
+        />
+        <router-link to="/">
+          <vuestic-logo class="logo" />
+        </router-link>
+      </div>
+    </template>
+    <!--    <div class="app-navbar-center">-->
+    <!--      <span class="hidden md:block mr-2">{{ t('navbar.messageUs') }}</span>-->
+    <!--      <a class="hidden md:block mr-2" href="mailto:hello@epicmax.co" target="_blank" :style="{ color: colors.primary }">-->
+    <!--        hello@epicmax.co-->
+    <!--      </a>-->
+    <!--      <va-button-->
+    <!--        href="https://github.com/epicmaxco/vuestic-admin"-->
+    <!--        color="#000000"-->
+    <!--        class="hidden lg:block"-->
+    <!--        icon="github"-->
+    <!--        target="_blank"-->
+    <!--      >-->
+    <!--        {{ t('navbar.repository') }}-->
+    <!--      </va-button>-->
+    <!--    </div>-->
+    <template #right>
+      <app-navbar-actions class="app-navbar__actions" :user-name="userName" />
+    </template>
+  </va-navbar>
+</template>
+
+<script setup>
+  import { computed } from 'vue'
+  import { storeToRefs } from 'pinia'
+  import { useGlobalStore } from '../../stores/global-store'
+  import { useI18n } from 'vue-i18n'
+  import { useColors } from 'vuestic-ui'
+  import VuesticLogo from '../VuesticLogo.vue'
+  import VaIconMenuCollapsed from '../icons/VaIconMenuCollapsed.vue'
+  import AppNavbarActions from './components/AppNavbarActions.vue'
+
+  const GlobalStore = useGlobalStore()
+  const { t } = useI18n()
+
+  const { isSidebarMinimized, userName } = storeToRefs(GlobalStore)
+
+  const { getColors } = useColors()
+  const colors = computed(() => getColors())
+</script>
+
+<style lang="scss" scoped>
+  .va-navbar {
+    box-shadow: var(--va-box-shadow);
+    z-index: 2;
+
+    @media screen and (max-width: 950px) {
+      .left {
+        width: 100%;
+      }
+
+      .app-navbar__actions {
+        width: 100%;
+        display: flex;
+        justify-content: space-between;
+      }
+    }
+  }
+
+  .left {
+    display: flex;
+    align-items: center;
+
+    & > * {
+      margin-right: 1.5rem;
+    }
+
+    & > *:last-child {
+      margin-right: 0;
+    }
+  }
+
+  .x-flip {
+    transform: scaleX(-100%);
+  }
+
+  .app-navbar-center {
+    display: flex;
+    align-items: center;
+    height: 1rem;
+
+    @media screen and (max-width: 1200px) {
+      &__github-button {
+        display: none;
+      }
+    }
+
+    @media screen and (max-width: 950px) {
+      &__text {
+        display: none;
+      }
+    }
+  }
+</style>

+ 97 - 0
src/components/navbar/components/AppNavbarActions.vue

@@ -0,0 +1,97 @@
+<template>
+  <div class="app-navbar-actions">
+    <color-dropdown class="app-navbar-actions__item" />
+    <message-dropdown class="app-navbar-actions__item" />
+    <!--    <notification-dropdown class="app-navbar-actions__item" />-->
+    <!-- <settings-dropdown class="app-navbar-actions__item" /> -->
+    <!--    <language-dropdown class="app-navbar-actions__item" />-->
+    <profile-dropdown class="app-navbar-actions__item app-navbar-actions__item--profile">
+      <span>{{ userName }}</span>
+    </profile-dropdown>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import LanguageDropdown from './dropdowns/LanguageDropdown.vue'
+  import ProfileDropdown from './dropdowns/ProfileDropdown.vue'
+  import NotificationDropdown from './dropdowns/NotificationDropdown.vue'
+  import MessageDropdown from './dropdowns/MessageDropdown.vue'
+  import ColorDropdown from './dropdowns/ColorDropdown.vue'
+
+  withDefaults(
+    defineProps<{
+      userName?: string
+      isTopBar?: boolean
+    }>(),
+    {
+      userName: '',
+      isTopBar: false,
+    },
+  )
+
+  defineEmits<{
+    (e: 'update:isTopBar', isTopBar: boolean): void
+  }>()
+
+  // const isTopBarProxy = computed({
+  //   get() {
+  //     return props.isTopBar
+  //   },
+  //
+  //   set(isTopBar: boolean) {
+  //     emit('update:isTopBar', isTopBar)
+  //   },
+  // })
+</script>
+
+<style lang="scss">
+  .app-navbar-actions {
+    display: flex;
+    align-items: center;
+
+    .va-dropdown__anchor {
+      color: var(--va-primary);
+      fill: var(--va-primary);
+    }
+
+    &__item {
+      padding: 0;
+      margin-left: 1.25rem;
+      margin-right: 1.25rem;
+
+      svg {
+        height: 24px;
+      }
+
+      &:last-of-type {
+        margin-right: 0;
+      }
+
+      &--profile {
+        display: flex;
+        justify-content: center;
+        margin: auto 0 auto 1.25rem;
+      }
+
+      .va-dropdown-content {
+        background-color: var(--va-white);
+      }
+
+      @media screen and (max-width: 640px) {
+        margin-right: 0;
+
+        &:first-of-type {
+          margin-left: 0;
+        }
+
+        &--profile {
+          position: absolute;
+          right: 0.75rem;
+          top: 1.25rem;
+          height: fit-content;
+          margin: auto;
+        }
+      }
+    }
+  }
+</style>

+ 74 - 0
src/components/navbar/components/dropdowns/ColorDropdown.vue

@@ -0,0 +1,74 @@
+<template>
+  <va-dropdown class="color-dropdown pointer" :offset="[13, 0]" stick-to-edges>
+    <template #anchor>
+      <va-icon-color />
+    </template>
+
+    <va-dropdown-content class="color-dropdown__content pl-8 pr-8 pt-2 pb-2">
+      <va-button-toggle
+        v-model="currentTheme"
+        class="color-dropdown__toggle"
+        :options="themeOptions"
+        outline
+        round
+        grow
+        size="small"
+      />
+
+      <table class="w-full my-4">
+        <color-dropdown-item
+          v-for="colorName in colorNames"
+          :key="colorName"
+          class="color-picker-dropdown"
+          :color-name="colorName"
+        />
+      </table>
+    </va-dropdown-content>
+  </va-dropdown>
+</template>
+
+<script setup lang="ts">
+  import VaIconColor from '../../../icons/VaIconColor.vue'
+  import ColorDropdownItem from './ColorDropdownItem.vue'
+  import { useColors } from 'vuestic-ui'
+  import { ref, watchEffect } from 'vue'
+
+  const { presets, applyPreset, colors } = useColors()
+
+  const currentTheme = ref('light')
+
+  watchEffect(() => {
+    applyPreset(currentTheme.value)
+  })
+
+  const themeOptions = Object.keys(presets.value).map((themeName) => ({
+    value: themeName,
+    label: themeName,
+  }))
+  const colorNames = Object.keys(colors)
+</script>
+
+<style lang="scss" scoped>
+  .color-dropdown {
+    &__icon {
+      position: relative;
+      display: flex;
+      align-items: center;
+    }
+
+    .va-dropdown__anchor {
+      display: inline-block;
+    }
+
+    &__toggle {
+      width: 100%;
+      display: flex;
+      justify-content: stretch;
+    }
+  }
+
+  .button-restore {
+    display: flex;
+    margin: 0.375rem auto;
+  }
+</style>

+ 44 - 0
src/components/navbar/components/dropdowns/ColorDropdownItem.vue

@@ -0,0 +1,44 @@
+<template>
+  <tr>
+    <td class="color">
+      <va-color-indicator :color="theme[colorName]" />
+    </td>
+    <td>
+      {{ colorName }}
+    </td>
+  </tr>
+</template>
+
+<script setup lang="ts">
+  import { computed } from 'vue'
+  import { useColors } from 'vuestic-ui'
+  const { getColors } = useColors()
+
+  defineProps<{
+    colorName: string
+  }>()
+
+  const theme = computed(() => {
+    return getColors()
+  })
+</script>
+
+<style lang="scss" scoped>
+  .color {
+    width: 16px;
+    height: 16px;
+    &-bordered {
+      border: 1px solid var(--va-gray);
+      border-radius: 50%;
+    }
+  }
+  td {
+    color: var(--va-gray);
+    padding: 0.25rem 0.5rem;
+    box-sizing: border-box;
+    vertical-align: middle;
+    &:first-child {
+      padding-right: 0;
+    }
+  }
+</style>

+ 105 - 0
src/components/navbar/components/dropdowns/LanguageDropdown.vue

@@ -0,0 +1,105 @@
+<template>
+  <va-dropdown class="language-dropdown" :offset="[13, 0]" stick-to-edges>
+    <template #anchor>
+      <va-icon :name="getFlagIcon(locale, 'large')" />
+    </template>
+
+    <va-dropdown-content class="language-dropdown__content pl-8 pr-8 pt-2 pb-2">
+      <div
+        v-for="(option, id) in options"
+        :key="id"
+        class="language-dropdown__item flex flex-1 flex-wrap items-center pt-1 pb-1 mt-2 mb-2"
+        :class="{ active: option.code === locale }"
+        @click="locale = option.code"
+      >
+        <va-icon :name="getFlagIcon(option.code, 'small')" />
+        <span class="dropdown-item__text">
+          {{ t(`language.${option.name}`) }}
+        </span>
+      </div>
+    </va-dropdown-content>
+  </va-dropdown>
+</template>
+
+<script setup lang="ts">
+  import { useI18n } from 'vue-i18n'
+
+  const { t, locale } = useI18n()
+
+  withDefaults(
+    defineProps<{
+      options?: { code: string; name: string }[]
+    }>(),
+    {
+      options: () => [
+        {
+          code: 'gb',
+          name: 'english',
+        },
+        {
+          code: 'es',
+          name: 'spanish',
+        },
+        {
+          code: 'br',
+          name: 'brazilian_portuguese',
+        },
+        {
+          code: 'cn',
+          name: 'simplified_chinese',
+        },
+        {
+          code: 'ir',
+          name: 'persian',
+        },
+      ],
+    },
+  )
+
+  function getFlagIcon(code: string, size: string) {
+    return `flag-icon-${code} ${size}`
+  }
+</script>
+
+<style lang="scss" scoped>
+  @import 'flag-icons/css/flag-icons.css';
+
+  .language-dropdown {
+    cursor: pointer;
+
+    &__content {
+      .fi-size-small {
+        min-width: 1.5rem;
+        min-height: 1.5rem;
+        margin-right: 0.5rem;
+      }
+    }
+
+    &__item {
+      cursor: pointer;
+      flex-wrap: nowrap;
+
+      &:last-of-type {
+        padding-bottom: 0 !important;
+      }
+
+      &:hover {
+        color: var(--va-primary);
+      }
+    }
+
+    .fi::before {
+      content: '';
+    }
+
+    .fi-size-large {
+      display: block;
+      width: 32px;
+      height: 24px;
+    }
+
+    .va-dropdown__anchor {
+      display: inline-block;
+    }
+  }
+</style>

+ 151 - 0
src/components/navbar/components/dropdowns/MessageDropdown.vue

@@ -0,0 +1,151 @@
+<template>
+  <va-dropdown class="message-dropdown" :offset="[13, 0]" stick-to-edges>
+    <template #anchor>
+      <va-icon-message class="message-dropdown__icon" :class="{ 'message-dropdown__icon--unread': !allRead }" />
+    </template>
+
+    <va-dropdown-content class="message-dropdown__content pl-8 pr-8 pt-2 pb-2">
+      <div
+        v-for="message in messagesProxy"
+        :key="message.id"
+        class="message-dropdown__item flex flex-1 flex-wrap pt-1 pb-1 mt-2 mb-2"
+        :class="{ 'message-dropdown__item--unread': message.unread }"
+        @click="message.unread = false"
+      >
+        <img :src="message.details.avatar" class="message-dropdown__item__avatar mr-2" alt="" />
+        <span class="ellipsis" style="max-width: 85%">{{
+          t(`messages.${message.name}`, { name: message.details.name })
+        }}</span>
+      </div>
+      <div class="grid grid-cols-2 justify-between mt-1">
+        <va-button class="mr-2" size="small">{{ t('messages.all') }}</va-button>
+        <va-button size="small" preset="outline" border-color="primary" :disabled="allRead" @click="markAllAsRead">{{
+          t('messages.mark_as_read')
+        }}</va-button>
+      </div>
+    </va-dropdown-content>
+  </va-dropdown>
+</template>
+
+<script setup lang="ts">
+  import { computed, ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
+
+  import VaIconMessage from '../../../icons/VaIconMessage.vue'
+
+  const { t } = useI18n()
+
+  interface IMessage {
+    name: string
+    details: {
+      name: string
+      avatar: string
+    }
+    unread: boolean
+    id: number
+  }
+
+  const props = withDefaults(
+    defineProps<{
+      messages?: IMessage[]
+    }>(),
+    {
+      messages: () => [
+        {
+          name: 'new',
+          details: {
+            name: 'Oleg M',
+            avatar: 'https://picsum.photos/24?image=1083',
+          },
+          unread: true,
+          id: 1,
+        },
+        {
+          name: 'new',
+          details: {
+            name: 'Andrei H',
+            avatar: 'https://picsum.photos/24?image=1025',
+          },
+          unread: true,
+          id: 2,
+        },
+      ],
+    },
+  )
+
+  const messagesProxy = ref<IMessage[]>([...props.messages])
+
+  const allRead = computed(() => {
+    return messagesProxy.value.every((message) => !message.unread)
+  })
+
+  function markAllAsRead() {
+    messagesProxy.value = messagesProxy.value.map((message) => ({
+      ...message,
+      unread: false,
+    }))
+  }
+</script>
+
+<style lang="scss" scoped>
+  .message-dropdown {
+    cursor: pointer;
+
+    .message-dropdown__icon {
+      position: relative;
+      display: flex;
+      align-items: center;
+
+      &--unread::before {
+        content: '';
+        position: absolute;
+        right: 0;
+        left: 0;
+        top: -0.5rem;
+        background-color: var(--va-danger);
+        height: 0.375rem;
+        width: 0.375rem;
+        margin: 0 auto;
+        border-radius: 0.187rem;
+      }
+    }
+
+    &__item {
+      cursor: pointer;
+      margin-bottom: 0.75rem;
+      position: relative;
+      flex-wrap: nowrap;
+
+      &--unread {
+        color: var(--va-gray);
+
+        &::after {
+          content: '';
+          position: absolute;
+          right: -0.25rem;
+          top: 0;
+          bottom: 0.5rem;
+          height: 0.375rem;
+          width: 0.375rem;
+          background-color: var(--va-danger);
+          margin: auto;
+          border-radius: 0.187rem;
+        }
+      }
+
+      &:hover {
+        color: var(--va-primary);
+      }
+
+      &__avatar {
+        border-radius: 50%;
+        min-width: 1.5rem;
+        height: 1.5rem;
+      }
+    }
+
+    .va-dropdown__anchor {
+      display: inline-block;
+    }
+  }
+</style>

+ 170 - 0
src/components/navbar/components/dropdowns/NotificationDropdown.vue

@@ -0,0 +1,170 @@
+<template>
+  <va-dropdown class="notification-dropdown" :offset="[13, 0]" stick-to-edges>
+    <template #anchor>
+      <va-icon-notification
+        class="notification-dropdown__icon"
+        :class="{ 'notification-dropdown__icon--unread': !allRead }"
+      />
+    </template>
+    <va-dropdown-content class="notification-dropdown__content pl-4 pt-4 pt-2 pb-2">
+      <div
+        v-for="notification in notificationsProxy"
+        :key="notification.id"
+        class="notification-dropdown__item flex flex-1 flex-wrap pt-1 pb-1 mt-2 mb-2"
+        :class="{ 'notification-dropdown__item--unread': notification.unread }"
+        @click="notification.unread = false"
+      >
+        <img
+          v-if="notification.details.avatar"
+          class="mr-2 notification-dropdown__item__avatar"
+          :src="notification.details.avatar"
+          alt=""
+        />
+        <span class="ellipsis" style="max-width: 85%">
+          <span v-if="notification.details.name" class="font-bold">{{ notification.details.name }}</span>
+          {{ t(`notifications.${notification.name}`, { type: notification.details.type }) }}
+        </span>
+      </div>
+      <div class="grid grid-cols-2 justify-between mt-1">
+        <va-button class="mr-2" size="small">{{ t('notifications.all') }}</va-button>
+        <va-button
+          class=""
+          size="small"
+          preset="outline"
+          border-color="primary"
+          :disabled="allRead"
+          @click="markAllAsRead"
+          >{{ t('notifications.mark_as_read') }}</va-button
+        >
+      </div>
+    </va-dropdown-content>
+  </va-dropdown>
+</template>
+
+<script setup lang="ts">
+  import { ref, computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
+  import VaIconNotification from '../../../icons/VaIconNotification.vue'
+
+  const { t } = useI18n()
+
+  interface INotification {
+    name: string
+    details: {
+      name: string
+      avatar: string
+      type?: string
+    }
+    unread: boolean
+    id: number
+  }
+
+  const props = withDefaults(
+    defineProps<{
+      notifications?: INotification[]
+    }>(),
+    {
+      notifications: () => [
+        {
+          name: 'sentMessage',
+          details: { name: 'Vasily S', avatar: 'https://picsum.photos/123' },
+          unread: true,
+          id: 1,
+        },
+        {
+          name: 'uploadedZip',
+          details: {
+            name: 'Oleg M',
+            avatar: 'https://picsum.photos/100',
+            type: 'typography component',
+          },
+          unread: true,
+          id: 2,
+        },
+        {
+          name: 'startedTopic',
+          details: { name: 'Andrei H', avatar: 'https://picsum.photos/24' },
+          unread: true,
+          id: 3,
+        },
+      ],
+    },
+  )
+  const notificationsProxy = ref<INotification[]>([...props.notifications])
+
+  const allRead = computed(() => {
+    return notificationsProxy.value.every((notification) => !notification.unread)
+  })
+
+  function markAllAsRead() {
+    notificationsProxy.value = notificationsProxy.value.map((notification) => ({
+      ...notification,
+      unread: false,
+    }))
+  }
+</script>
+
+<style lang="scss" scoped>
+  .notification-dropdown {
+    cursor: pointer;
+
+    .notification-dropdown__icon {
+      position: relative;
+      display: flex;
+      align-items: center;
+
+      &--unread::before {
+        content: '';
+        position: absolute;
+        right: 0;
+        left: 0;
+        top: -0.5rem;
+        // background-color: $brand-danger;
+        height: 0.375rem;
+        width: 0.375rem;
+        margin: 0 auto;
+        border-radius: 0.187rem;
+      }
+    }
+
+    &__content {
+      max-width: 20rem;
+    }
+
+    &__item {
+      cursor: pointer;
+      margin-bottom: 0.75rem;
+      flex-wrap: nowrap;
+      position: relative;
+
+      &--unread {
+        &::after {
+          content: '';
+          position: absolute;
+          right: 0;
+          top: 0;
+          bottom: 0;
+          height: 0.375rem;
+          width: 0.375rem;
+          margin: auto;
+          border-radius: 0.187rem;
+        }
+      }
+
+      &:hover {
+        color: var(--va-primary);
+      }
+
+      &__avatar {
+        border-radius: 50%;
+        width: 1.5rem;
+        height: 1.5rem;
+        min-width: 1.5rem;
+      }
+    }
+
+    .va-dropdown__anchor {
+      display: inline-block;
+    }
+  }
+</style>

+ 68 - 0
src/components/navbar/components/dropdowns/ProfileDropdown.vue

@@ -0,0 +1,68 @@
+<template>
+  <div class="profile-dropdown-wrapper">
+    <va-dropdown v-model="isShown" class="profile-dropdown" stick-to-edges :offset="[13, 0]">
+      <template #anchor>
+        <span class="profile-dropdown__anchor">
+          <slot />
+          <va-icon class="px-2" :name="isShown ? 'angle_up' : 'angle_down'" :color="colors.primary" />
+        </span>
+      </template>
+      <va-dropdown-content class="profile-dropdown__content">
+        <va-list-item v-for="option in options" :key="option.name" class="p-2">
+          <router-link :to="{ name: option.redirectTo }" class="profile-dropdown__item">
+            {{ t(`user.${option.name}`) }}
+          </router-link>
+        </va-list-item>
+      </va-dropdown-content>
+    </va-dropdown>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
+  import { useColors } from 'vuestic-ui'
+
+  const { t } = useI18n()
+  const { colors } = useColors()
+
+  withDefaults(
+    defineProps<{
+      options?: { name: string; redirectTo: string }[]
+    }>(),
+    {
+      options: () => [
+        {
+          name: 'profile',
+          redirectTo: '',
+        },
+        {
+          name: 'logout',
+          redirectTo: 'login',
+        },
+      ],
+    },
+  )
+
+  const isShown = ref(false)
+</script>
+
+<style lang="scss" scoped>
+  .profile-dropdown {
+    cursor: pointer;
+
+    &__anchor {
+      display: inline-block;
+    }
+
+    &__item {
+      display: block;
+      color: var(--va-gray);
+
+      &:hover,
+      &:active {
+        color: var(--va-primary);
+      }
+    }
+  }
+</style>

+ 79 - 0
src/components/navbar/components/dropdowns/SettingsDropdown.vue

@@ -0,0 +1,79 @@
+<template>
+  <va-dropdown class="settings-dropdown" position="bottom" boundary-body :offset="[13, 0]">
+    <template #anchor>
+      <va-icon name="vuestic-iconset-settings flex text-[1.4rem]" class="settings-dropdown__icon" />
+    </template>
+
+    <va-dropdown-content class="settings-dropdown__content pl-8 pr-8 pt-2 pb-2">
+      <div class="settings-dropdown__content-label mt-2 mb-4" :style="{ color: colors.primary }">
+        {{ t('dashboard.navigationLayout') }}
+      </div>
+      <va-button-toggle
+        v-model="isTopBarProxy"
+        outline
+        :options="options"
+        class="settings-dropdown__control mb-2"
+        size="small"
+      />
+    </va-dropdown-content>
+  </va-dropdown>
+</template>
+
+<script setup lang="ts">
+  import { computed, ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
+  import { useColors } from 'vuestic-ui'
+
+  const { colors } = useColors()
+  const { t } = useI18n()
+
+  const props = defineProps<{
+    isTopBar: boolean
+  }>()
+
+  const emit = defineEmits<{
+    (e: 'update:isTopBar', value: boolean): void
+  }>()
+
+  const options = ref([
+    { label: t('dashboard.sideBarButton'), value: String(false) }, // NOTE: boolean is unsupported for va-dropdown
+    { label: t('dashboard.topBarButton'), value: String(true) },
+  ])
+
+  const isTopBarProxy = computed({
+    get() {
+      return String(props.isTopBar)
+    },
+    set() {
+      emit('update:isTopBar', props.isTopBar)
+    },
+  })
+</script>
+
+<style lang="scss">
+  .settings-dropdown {
+    cursor: pointer;
+
+    &__icon {
+      position: relative;
+      display: flex;
+      align-items: center;
+    }
+
+    &__content {
+      &-label {
+        margin-bottom: 0.5rem;
+      }
+    }
+
+    &__control {
+      .va-button-group {
+        margin: 0;
+      }
+    }
+
+    .va-dropdown__anchor {
+      display: inline-block;
+    }
+  }
+</style>

+ 257 - 0
src/components/sidebar/NavigationRoutes.ts

@@ -0,0 +1,257 @@
+export interface INavigationRoute {
+  name: string
+  displayName: string
+  meta: { icon: string }
+  children?: INavigationRoute[]
+}
+
+export default {
+  root: {
+    name: '/',
+    title: 'navigationRoutes.home',
+  },
+  routes: [
+    {
+      name: 'dashboard',
+      title: '首页',
+      icon: 'vuestic-iconset-dashboard',
+    },
+    {
+      name: 'system',
+      title: '系统管理',
+      icon: 'vuestic-iconset-ui-elements',
+      disabled: true,
+      children: [
+        {
+          name: 'userManage',
+          title: '用户管理',
+        },
+        {
+          name: 'orgManage',
+          title: '部门管理',
+        },
+        {
+          name: 'roleManage',
+          title: '角色管理',
+        },
+      ],
+    },
+    {
+      name: 'attendanceSetting',
+      title: '考勤系统',
+      icon: 'vuestic-iconset-forms',
+      disabled: true,
+      children: [
+        {
+          name: 'attendanceRecord',
+          title: '考勤记录',
+        },
+        {
+          name: 'attendanceReport',
+          title: '考勤报表',
+        },
+      ],
+    },
+    // {
+    //   name: 'statistics',
+    //   displayName: 'menu.statistics',
+    //   meta: {
+    //     icon: 'vuestic-iconset-statistics',
+    //   },
+    //   disabled: true,
+    //   children: [
+    //     {
+    //       name: 'charts',
+    //       displayName: 'menu.charts',
+    //     },
+    //     {
+    //       name: 'progress-bars',
+    //       displayName: 'menu.progressBars',
+    //     },
+    //   ],
+    // },
+    // {
+    //   name: 'forms',
+    //   displayName: 'menu.forms',
+    //   meta: {
+    //     icon: 'vuestic-iconset-forms',
+    //   },
+    //   disabled: true,
+    //   children: [
+    //     {
+    //       name: 'form-elements',
+    //       displayName: 'menu.formElements',
+    //     },
+    //     {
+    //       name: 'medium-editor',
+    //       displayName: 'menu.mediumEditor',
+    //     },
+    //   ],
+    // },
+    // {
+    //   name: 'tables',
+    //   displayName: 'menu.tables',
+    //   meta: {
+    //     icon: 'vuestic-iconset-tables',
+    //   },
+    //   children: [
+    //     {
+    //       name: 'markup',
+    //       displayName: 'menu.markupTables',
+    //     },
+    //     // {
+    //     //   name: 'data',
+    //     //   displayName: 'menu.dataTables',
+    //     // },
+    //   ],
+    // },
+    // {
+    //   name: 'ui',
+    //   displayName: 'menu.uiElements',
+    //   meta: {
+    //     icon: 'vuestic-iconset-ui-elements',
+    //   },
+    //   disabled: true,
+    //   children: [
+    //     {
+    //       name: 'buttons',
+    //       displayName: 'menu.buttons',
+    //     },
+    //     {
+    //       name: 'cards',
+    //       displayName: 'menu.cards',
+    //     },
+    //     {
+    //       name: 'chat',
+    //       displayName: 'menu.chat',
+    //     },
+    //     {
+    //       name: 'chips',
+    //       displayName: 'menu.chips',
+    //     },
+    //     {
+    //       name: 'collapses',
+    //       displayName: 'menu.collapses',
+    //     },
+    //     {
+    //       name: 'colors',
+    //       displayName: 'menu.colors',
+    //     },
+    //     {
+    //       name: 'color-pickers',
+    //       displayName: 'menu.colorPickers',
+    //     },
+    //     {
+    //       name: 'file-upload',
+    //       displayName: 'menu.fileUpload',
+    //     },
+    //     {
+    //       name: 'icon-sets',
+    //       displayName: 'menu.icons',
+    //       children: [
+    //         {
+    //           displayName: 'concrete',
+    //           name: 'icon-set',
+    //         },
+    //       ],
+    //     },
+    //     {
+    //       name: 'lists',
+    //       displayName: 'menu.lists',
+    //     },
+    //     {
+    //       name: 'modals',
+    //       displayName: 'menu.modals',
+    //     },
+    //     {
+    //       name: 'notifications',
+    //       displayName: 'menu.notifications',
+    //     },
+    //     {
+    //       name: 'popovers',
+    //       displayName: 'menu.popovers',
+    //     },
+    //     {
+    //       name: 'rating',
+    //       displayName: 'menu.rating',
+    //     },
+    //     {
+    //       name: 'sliders',
+    //       displayName: 'menu.sliders',
+    //     },
+    //     {
+    //       name: 'spinners',
+    //       displayName: 'menu.spinners',
+    //     },
+    //     {
+    //       name: 'tabs',
+    //       displayName: 'menu.tabs',
+    //     },
+    //     // {
+    //     //   name: "timelines",
+    //     //   displayName: "menu.timelines",
+    //     // },
+    //     {
+    //       name: 'tree-view',
+    //       displayName: 'menu.treeView',
+    //     },
+    //     {
+    //       name: 'typography',
+    //       displayName: 'menu.typography',
+    //     },
+    //   ],
+    // },
+    // {
+    //   name: 'maps',
+    //   displayName: 'menu.maps',
+    //   meta: {
+    //     icon: 'vuestic-iconset-maps',
+    //   },
+    //   disabled: true,
+    //   children: [
+    //     {
+    //       name: 'maplibre-maps',
+    //       displayName: 'menu.maplibre-maps',
+    //     },
+    //     {
+    //       name: 'yandex-maps',
+    //       displayName: 'menu.yandex-maps',
+    //     },
+    //     {
+    //       name: 'leaflet-maps',
+    //       displayName: 'menu.leaflet-maps',
+    //     },
+    //     {
+    //       name: 'bubble-maps',
+    //       displayName: 'menu.bubble-maps',
+    //     },
+    //     {
+    //       name: 'line-maps',
+    //       displayName: 'menu.line-maps',
+    //     },
+    //   ],
+    // },
+    // {
+    //   name: 'pages',
+    //   displayName: 'menu.pages',
+    //   meta: {
+    //     icon: 'vuestic-iconset-files',
+    //   },
+    //   disabled: true,
+    //   children: [
+    //     {
+    //       name: 'login',
+    //       displayName: 'menu.login-singup',
+    //     },
+    //     {
+    //       name: '404-pages',
+    //       displayName: 'menu.404-pages',
+    //     },
+    //     {
+    //       name: 'faq',
+    //       displayName: 'menu.faq',
+    //     },
+    //   ],
+    // },
+  ] as INavigationRoute[],
+}

+ 66 - 0
src/components/sidebar/Sidebar.vue

@@ -0,0 +1,66 @@
+<template>
+  <va-sidebar :width="width" :minimized="minimized" :minimized-width="minimizedWidth" :animated="animated">
+    <menu-minimized v-if="minimized" :items="items" />
+    <menu-accordion v-else :items="items" />
+  </va-sidebar>
+</template>
+
+<script setup lang="ts">
+  import { ref, getCurrentInstance } from 'vue'
+  const { proxy } = getCurrentInstance()
+  const { $api } = proxy
+  import NavigationRoutes from './NavigationRoutes'
+  import MenuAccordion from './menu/MenuAccordion.vue'
+  import MenuMinimized from './menu/MenuMinimized.vue'
+  function removeChildren(obj) {
+    if (obj.children.length == 0) {
+      delete obj.children
+    } else {
+      obj.children.forEach((x) => {
+        removeChildren(x)
+      })
+    }
+  }
+  withDefaults(
+    defineProps<{
+      width?: string
+      color?: string
+      animated?: boolean
+      minimized?: boolean
+      minimizedWidth?: string
+    }>(),
+    {
+      width: '16rem',
+      color: 'secondary',
+      animated: true,
+      minimized: true,
+      minimizedWidth: undefined,
+    },
+  )
+  // const items = ref(NavigationRoutes.routes)
+  const items = ref([])
+  $api.getMenuPermission().then((res) => {
+    res.result.forEach((x) => {
+      removeChildren(x)
+    })
+    items.value = res.result
+  })
+</script>
+
+<style lang="scss">
+  .va-sidebar {
+    &__menu {
+      padding: 2rem 0;
+    }
+
+    &-item {
+      &__icon {
+        width: 1.5rem;
+        height: 1.5rem;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+      }
+    }
+  }
+</style>

+ 74 - 0
src/components/sidebar/menu/MenuAccordion.vue

@@ -0,0 +1,74 @@
+<template>
+  <va-accordion v-model="accordionValue" class="sidebar-accordion va-sidebar__menu__inner" multiple>
+    <va-collapse v-for="(route, idx) in items" :key="idx">
+      <template #header>
+        <va-sidebar-item :active="isRouteActive(route)" :to="route.children ? undefined : { name: route.menuName }">
+          <va-sidebar-item-content>
+            <va-icon :name="route.menuIcon" class="va-sidebar-item__icon" />
+
+            <va-sidebar-item-title>
+              {{ route.menuTitle }}
+            </va-sidebar-item-title>
+
+            <va-icon v-if="route.children" :name="accordionValue[idx] ? 'expand_less' : 'expand_more'" />
+          </va-sidebar-item-content>
+        </va-sidebar-item>
+      </template>
+      <template v-for="(child, index) in route.children" :key="index">
+        <va-sidebar-item :active="isRouteActive(child)" :to="{ name: child.menuName }">
+          <va-sidebar-item-content>
+            <div class="va-sidebar-item__icon" />
+
+            <va-sidebar-item-title>
+              {{ child.menuTitle }}
+            </va-sidebar-item-title>
+          </va-sidebar-item-content>
+        </va-sidebar-item>
+      </template>
+    </va-collapse>
+  </va-accordion>
+</template>
+
+<script setup lang="ts">
+  import { onMounted, ref } from 'vue'
+  import { INavigationRoute } from '../NavigationRoutes'
+  import { useRoute } from 'vue-router'
+  import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+
+  const props = withDefaults(
+    defineProps<{
+      items?: INavigationRoute[]
+    }>(),
+    {
+      items: () => [],
+    },
+  )
+
+  const accordionValue = ref<boolean[]>([])
+
+  onMounted(() => {
+    accordionValue.value = props.items.map((item) => isItemExpanded(item))
+  })
+
+  // function isGroup(item: INavigationRoute) {
+  //   return !!item.children
+  // }
+
+  function isRouteActive(item: INavigationRoute) {
+    return item.menuName === useRoute().name
+  }
+
+  function isItemExpanded(item: INavigationRoute): boolean {
+    if (!item.children) {
+      return false
+    }
+
+    const isCurrentItemActive = isRouteActive(item)
+    const isChildActive = !!item.children.find((child) =>
+      child.children ? isItemExpanded(child) : isRouteActive(child),
+    )
+
+    return isCurrentItemActive || isChildActive
+  }
+</script>

+ 107 - 0
src/components/sidebar/menu/MenuMinimized.vue

@@ -0,0 +1,107 @@
+<template>
+  <va-dropdown
+    v-for="(route, idx) in items"
+    :key="idx"
+    v-model="dropdownsValue[idx]"
+    placement="right-start"
+    prevent-overflow
+    :offset="[1, 0]"
+  >
+    <template #anchor>
+      <va-sidebar-item :active="isItemChildsActive(route)" :to="route.children ? undefined : { name: route.menuName }">
+        <va-sidebar-item-content>
+          <va-icon :name="route.menuIcon" class="va-sidebar-item__icon" />
+          <va-icon
+            v-if="route.children"
+            class="more_icon"
+            :name="dropdownsValue[idx] ? 'chevron_left' : 'chevron_right'"
+          />
+        </va-sidebar-item-content>
+      </va-sidebar-item>
+    </template>
+    <div class="sidebar-item__children">
+      <template v-for="(child, index) in route.children" :key="index">
+        <va-sidebar-item :active="isRouteActive(child)" :to="{ name: child.menuName }">
+          <va-sidebar-item-content>
+            <va-sidebar-item-title>
+              {{ child.menuTitle }}
+            </va-sidebar-item-title>
+          </va-sidebar-item-content>
+        </va-sidebar-item>
+      </template>
+    </div>
+  </va-dropdown>
+</template>
+
+<script setup lang="ts">
+  import { INavigationRoute } from '../NavigationRoutes'
+  import { ref } from 'vue'
+  import { useRoute } from 'vue-router'
+  import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+
+  withDefaults(
+    defineProps<{
+      items?: INavigationRoute[]
+    }>(),
+    {
+      items: () => [],
+    },
+  )
+
+  const dropdownsValue = ref([])
+
+  // function isGroup(item: INavigationRoute) {
+  //   return !!item.children
+  // }
+
+  function isRouteActive(item: INavigationRoute) {
+    return item.menuName === useRoute().name
+  }
+
+  function isItemChildsActive(item: INavigationRoute): boolean {
+    if (!item.children) {
+      return false
+    }
+
+    const isCurrentItemActive = isRouteActive(item)
+
+    let isChildActive = false
+    if (item.children) {
+      isChildActive = !!item.children.find((child) =>
+        child.children ? isItemChildsActive(child) : isRouteActive(child),
+      )
+    }
+
+    return isCurrentItemActive || isChildActive
+  }
+</script>
+
+<style lang="scss">
+  .sidebar-item {
+    &__children {
+      max-height: 60vh;
+      overflow-y: auto;
+      overflow-x: visible;
+      width: 16rem;
+      color: var(--va-gray);
+      background: var(--va-white, #fff);
+      box-shadow: var(--va-box-shadow);
+    }
+  }
+
+  .va-sidebar-item {
+    &-content {
+      position: relative;
+
+      .more_icon {
+        text-align: center;
+        position: absolute;
+        bottom: 0.5rem;
+        top: 50%;
+        right: 0;
+        transform: translateY(-50%);
+      }
+    }
+  }
+</style>

+ 46 - 0
src/components/va-charts/VaChart.vue

@@ -0,0 +1,46 @@
+<template>
+  <component :is="chartComponent" ref="chart" class="va-chart" :chart-options="chartOptions" :chart-data="data" />
+</template>
+
+<script setup lang="ts">
+  import { computed, ref } from 'vue'
+  import type { TChartOptions } from 'vue-chartjs/dist/types'
+  import { defaultConfig, chartTypesMap } from './vaChartConfigs'
+  import { TChartData } from '../../data/types'
+
+  const props = defineProps<{
+    data: TChartData
+    options?: TChartOptions<'line' | 'bar' | 'bubble' | 'doughnut' | 'pie'>
+    type: keyof typeof chartTypesMap
+  }>()
+
+  const chart = ref()
+
+  const chartComponent = computed(() => chartTypesMap[props.type])
+
+  const chartOptions = computed(() => ({
+    ...defaultConfig,
+    ...props.options,
+  }))
+</script>
+
+<style lang="scss">
+  .va-chart {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    > * {
+      height: 100%;
+      width: 100%;
+    }
+
+    canvas {
+      width: 100%;
+      height: auto;
+      min-height: 320px;
+    }
+  }
+</style>

+ 17 - 0
src/components/va-charts/chart-types/BarChart.vue

@@ -0,0 +1,17 @@
+<template>
+  <Bar :chart-options="chartOptions" :chart-data="props.chartData" />
+</template>
+
+<script setup lang="ts">
+  import { Bar } from 'vue-chartjs'
+  import type { TChartOptions } from 'vue-chartjs/dist/types'
+  import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, LinearScale, CategoryScale } from 'chart.js'
+  import { TBarChartData } from '../../../data/types'
+
+  ChartJS.register(Title, Tooltip, Legend, BarElement, LinearScale, CategoryScale)
+
+  const props = defineProps<{
+    chartData: TBarChartData
+    chartOptions?: TChartOptions<'bar'>
+  }>()
+</script>

+ 17 - 0
src/components/va-charts/chart-types/BubbleChart.vue

@@ -0,0 +1,17 @@
+<template>
+  <Bubble :chart-options="chartOptions" :chart-data="props.chartData" />
+</template>
+
+<script setup lang="ts">
+  import { Bubble } from 'vue-chartjs'
+  import type { TChartOptions } from 'vue-chartjs/dist/types'
+  import { Chart as ChartJS, Title, Tooltip, Legend, PointElement, LinearScale } from 'chart.js'
+  import { TBubbleChartData } from '../../../data/types'
+
+  ChartJS.register(Title, Tooltip, Legend, PointElement, LinearScale)
+
+  const props = defineProps<{
+    chartData: TBubbleChartData
+    chartOptions?: TChartOptions<'bubble'>
+  }>()
+</script>

+ 17 - 0
src/components/va-charts/chart-types/DoughnutChart.vue

@@ -0,0 +1,17 @@
+<template>
+  <Doughnut :chart-options="chartOptions" :chart-data="props.chartData" />
+</template>
+
+<script setup lang="ts">
+  import { Doughnut } from 'vue-chartjs'
+  import type { TChartOptions } from 'vue-chartjs/dist/types'
+  import { Chart as ChartJS, Title, Tooltip, Legend, ArcElement, CategoryScale } from 'chart.js'
+  import { TDoughnutChartData } from '../../../data/types'
+
+  ChartJS.register(Title, Tooltip, Legend, ArcElement, CategoryScale)
+
+  const props = defineProps<{
+    chartData: TDoughnutChartData
+    chartOptions?: TChartOptions<'doughnut'>
+  }>()
+</script>

+ 26 - 0
src/components/va-charts/chart-types/HorizontalBarChart.vue

@@ -0,0 +1,26 @@
+<template>
+  <Bar :chart-options="{ ...chartOptions, ...horizontalBarOptions }" :chart-data="props.chartData" />
+</template>
+
+<script setup lang="ts">
+  import { Bar } from 'vue-chartjs'
+  import type { TChartOptions } from 'vue-chartjs/dist/types'
+  import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, LinearScale, CategoryScale } from 'chart.js'
+  import { TBarChartData } from '../../../data/types'
+
+  ChartJS.register(Title, Tooltip, Legend, BarElement, LinearScale, CategoryScale)
+
+  const horizontalBarOptions = {
+    indexAxis: 'y' as 'x' | 'y',
+    elements: {
+      bar: {
+        borderWidth: 1,
+      },
+    },
+  }
+
+  const props = defineProps<{
+    chartData: TBarChartData
+    chartOptions?: TChartOptions<'bar'>
+  }>()
+</script>

+ 27 - 0
src/components/va-charts/chart-types/LineChart.vue

@@ -0,0 +1,27 @@
+<template>
+  <Line :chart-options="chartOptions" :chart-data="props.chartData" />
+</template>
+
+<script setup lang="ts">
+  import { Line } from 'vue-chartjs'
+  import type { TChartOptions } from 'vue-chartjs/dist/types'
+  import {
+    Chart as ChartJS,
+    Title,
+    Tooltip,
+    Legend,
+    LineElement,
+    LinearScale,
+    PointElement,
+    CategoryScale,
+    Filler,
+  } from 'chart.js'
+  import { TLineChartData } from '../../../data/types'
+
+  ChartJS.register(Title, Tooltip, Legend, LineElement, LinearScale, PointElement, CategoryScale, Filler)
+
+  const props = defineProps<{
+    chartData: TLineChartData
+    chartOptions?: TChartOptions<'line'>
+  }>()
+</script>

+ 17 - 0
src/components/va-charts/chart-types/PieChart.vue

@@ -0,0 +1,17 @@
+<template>
+  <Pie :chart-options="chartOptions" :chart-data="props.chartData" />
+</template>
+
+<script setup lang="ts">
+  import { Pie } from 'vue-chartjs'
+  import type { TChartOptions } from 'vue-chartjs/dist/types'
+  import { Chart as ChartJS, Title, Tooltip, Legend, ArcElement, CategoryScale } from 'chart.js'
+  import { TPieChartData } from '../../../data/types'
+
+  ChartJS.register(Title, Tooltip, Legend, ArcElement, CategoryScale)
+
+  const props = defineProps<{
+    chartData: TPieChartData
+    chartOptions?: TChartOptions<'pie'>
+  }>()
+</script>

+ 48 - 0
src/components/va-charts/vaChartConfigs.js

@@ -0,0 +1,48 @@
+import { defineAsyncComponent } from 'vue'
+
+export const defaultConfig = {
+  plugins: {
+    legend: {
+      position: 'bottom',
+      labels: {
+        font: {
+          color: '#34495e',
+          family: 'sans-serif',
+          size: 14,
+        },
+        usePointStyle: true,
+      },
+    },
+    tooltip: {
+      bodyFont: {
+        size: 14,
+        family: 'sans-serif',
+      },
+      boxPadding: 4,
+    },
+  },
+  datasets: {
+    line: {
+      fill: 'origin',
+      tension: 0.3,
+      borderColor: 'transparent',
+    },
+    bubble: {
+      borderColor: 'transparent',
+    },
+    bar: {
+      borderColor: 'transparent',
+    },
+  },
+  maintainAspectRatio: false,
+  animation: true,
+}
+
+export const chartTypesMap = {
+  pie: defineAsyncComponent(() => import('./chart-types/PieChart.vue')),
+  doughnut: defineAsyncComponent(() => import('./chart-types/DoughnutChart.vue')),
+  bubble: defineAsyncComponent(() => import('./chart-types/BubbleChart.vue')),
+  line: defineAsyncComponent(() => import('./chart-types/LineChart.vue')),
+  bar: defineAsyncComponent(() => import('./chart-types/BarChart.vue')),
+  'horizontal-bar': defineAsyncComponent(() => import('./chart-types/HorizontalBarChart.vue')),
+}

+ 189 - 0
src/components/va-medium-editor/VaMediumEditor.vue

@@ -0,0 +1,189 @@
+<template>
+  <div ref="editorElement" class="va-medium-editor content">
+    <slot />
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { ref, Ref, onMounted, onBeforeUnmount } from 'vue'
+  import MediumEditor from 'medium-editor'
+
+  const props = withDefaults(
+    defineProps<{
+      editorOptions?: {
+        buttonLabels: string
+        autoLink: boolean
+        toolbar: {
+          buttons: string[]
+        }
+      }
+    }>(),
+    {
+      editorOptions: () => ({
+        buttonLabels: 'fontawesome',
+        autoLink: true,
+        toolbar: {
+          buttons: ['bold', 'italic', 'underline', 'anchor', 'h1', 'h2', 'h3'],
+        },
+      }),
+    },
+  )
+
+  const emit = defineEmits<{
+    (e: 'initialized', editor: typeof MediumEditor): void
+  }>()
+
+  const editorElement: Ref<null | HTMLElement> = ref(null)
+  let editor: typeof MediumEditor | null = null
+
+  onMounted(() => {
+    if (!editorElement.value) {
+      return
+    }
+
+    editor = new MediumEditor(editorElement.value, props.editorOptions)
+    emit('initialized', editor)
+  })
+
+  onBeforeUnmount(() => {
+    if (editor) {
+      editor.destroy()
+    }
+  })
+</script>
+
+<style lang="scss">
+  @import 'medium-editor/src/sass/medium-editor';
+  @import 'variables';
+
+  $medium-editor-shadow: var(--va-box-shadow);
+  $medium-editor-background-color: var(--va-divider);
+  $medium-editor-text-color: var(--va-dark);
+  $medium-editor-active-background-color: var(--va-primary);
+  $medium-editor-active-text-color: var(--va-white);
+
+  .va-medium-editor {
+    margin-bottom: var(--va-medium-editor-margin-bottom);
+    min-width: var(--va-medium-editor-min-width);
+    max-width: var(--va-medium-editor-max-width);
+
+    &:focus {
+      outline: none;
+    }
+
+    &.content {
+      i {
+        font-style: italic;
+      }
+    }
+  }
+
+  // isn't a part of the .va-medium-editor, so can't be places inside it
+  .medium-editor-toolbar,
+  .medium-editor-toolbar-form,
+  .medium-editor-toolbar-actions,
+  .medium-editor-toolbar-anchor-preview {
+    box-shadow: $medium-editor-shadow;
+    background-color: $medium-editor-background-color;
+    border-radius: 1.5rem;
+    height: 44px;
+    line-height: 42px;
+  }
+
+  .medium-editor-toolbar-anchor-preview {
+    a {
+      padding: 0 2rem;
+      margin: 0;
+      line-height: 44px;
+    }
+  }
+
+  .medium-editor-toolbar {
+    box-shadow: $medium-editor-shadow;
+
+    .medium-editor-toolbar-actions {
+      overflow: hidden;
+      height: 44px;
+    }
+
+    .medium-editor-action {
+      margin: 0;
+      border: 0;
+      padding: 0.375rem 1rem;
+      height: 44px;
+      background-color: $medium-editor-background-color;
+      box-shadow: none;
+      border-radius: 0;
+
+      i {
+        color: $medium-editor-text-color;
+      }
+
+      &.medium-editor-button-active {
+        background-color: $medium-editor-active-background-color;
+        color: $medium-editor-active-text-color;
+        i {
+          color: $medium-editor-active-text-color;
+        }
+      }
+    }
+
+    & > .medium-editor-action:not(:last-child) {
+      border-top-right-radius: 0;
+      border-bottom-right-radius: 0;
+      border-right: 0;
+    }
+
+    & > .medium-editor-action + .medium-editor-action {
+      border-top-left-radius: 0;
+      border-bottom-left-radius: 0;
+      border-left: 0;
+    }
+  }
+
+  .medium-editor-toolbar-form {
+    color: $medium-editor-text-color;
+    overflow: hidden;
+
+    a {
+      color: $medium-editor-text-color;
+      transform: translateY(1px);
+    }
+
+    input {
+      margin-left: 4px !important;
+      transform: translateY(-2px);
+      border-radius: 13px;
+    }
+
+    .medium-editor-toolbar-close {
+      margin-right: 1rem;
+    }
+  }
+
+  .medium-toolbar-arrow-under::after {
+    border-color: $medium-editor-background-color transparent transparent transparent;
+    top: 100%;
+  }
+
+  .medium-toolbar-arrow-over::before {
+    border-color: transparent transparent var(--va-primary) transparent;
+  }
+
+  .medium-editor-toolbar-anchor-preview {
+    // @include va-button($btn-padding-y-nrm, $btn-padding-x-nrm, $btn-font-size-nrm, $btn-line-height-nrm, $btn-border-radius-nrm);
+
+    .medium-editor-toolbar-anchor-preview {
+      margin: 0;
+    }
+  }
+
+  .medium-editor-anchor-preview {
+    max-width: 50%;
+
+    a {
+      color: $medium-editor-text-color;
+      text-decoration: none;
+    }
+  }
+</style>

+ 9 - 0
src/components/va-medium-editor/_variables.scss

@@ -0,0 +1,9 @@
+:root {
+  --va-medium-editor-margin-bottom: 2.25rem;
+  --va-medium-editor-min-width: 6rem;
+  --va-medium-editor-max-width: 600px;
+
+  /* Toolbar */
+  --va-medium-editor-toolbar-max-width: 90%;
+  --va-medium-editor-toolbar-box-shadow: none;
+}

+ 243 - 0
src/data/CountriesList.ts

@@ -0,0 +1,243 @@
+export default [
+  'Afghanistan',
+  'Albania',
+  'Algeria',
+  'American Samoa',
+  'Andorra',
+  'Angola',
+  'Anguilla',
+  'Antarctica',
+  'Antigua and Barbuda',
+  'Argentina',
+  'Armenia',
+  'Aruba',
+  'Australia',
+  'Austria',
+  'Azerbaijan',
+  'Bahamas',
+  'Bahrain',
+  'Bangladesh',
+  'Barbados',
+  'Belarus',
+  'Belgium',
+  'Belize',
+  'Benin',
+  'Bermuda',
+  'Bhutan',
+  'Bolivia',
+  'Bosnia and Herzegowina',
+  'Botswana',
+  'Bouvet Island',
+  'Brazil',
+  'British Indian Ocean Territory',
+  'Brunei Darussalam',
+  'Bulgaria',
+  'Burkina Faso',
+  'Burundi',
+  'Cambodia',
+  'Cameroon',
+  'Canada',
+  'Cape Verde',
+  'Cayman Islands',
+  'Central African Republic',
+  'Chad',
+  'Chile',
+  'China',
+  'Christmas Island',
+  'Cocos (Keeling) Islands',
+  'Colombia',
+  'Comoros',
+  'Congo',
+  'Congo, the Democratic Republic of the',
+  'Cook Islands',
+  'Costa Rica',
+  "Cote d'Ivoire",
+  'Croatia (Hrvatska)',
+  'Cuba',
+  'Cyprus',
+  'Czech Republic',
+  'Denmark',
+  'Djibouti',
+  'Dominica',
+  'Dominican Republic',
+  'East Timor',
+  'Ecuador',
+  'Egypt',
+  'El Salvador',
+  'Equatorial Guinea',
+  'Eritrea',
+  'Estonia',
+  'Ethiopia',
+  'Falkland Islands (Malvinas)',
+  'Faroe Islands',
+  'Fiji',
+  'Finland',
+  'France',
+  'France Metropolitan',
+  'French Guiana',
+  'French Polynesia',
+  'French Southern Territories',
+  'Gabon',
+  'Gambia',
+  'Georgia',
+  'Germany',
+  'Ghana',
+  'Gibraltar',
+  'Greece',
+  'Greenland',
+  'Grenada',
+  'Guadeloupe',
+  'Guam',
+  'Guatemala',
+  'Guinea',
+  'Guinea-Bissau',
+  'Guyana',
+  'Haiti',
+  'Heard and Mc Donald Islands',
+  'Holy See (Vatican City State)',
+  'Honduras',
+  'Hong Kong',
+  'Hungary',
+  'Iceland',
+  'India',
+  'Indonesia',
+  'Iran (Islamic Republic of)',
+  'Iraq',
+  'Ireland',
+  'Israel',
+  'Italy',
+  'Jamaica',
+  'Japan',
+  'Jordan',
+  'Kazakhstan',
+  'Kenya',
+  'Kiribati',
+  "Korea, Democratic People's Republic of",
+  'Korea, Republic of',
+  'Kuwait',
+  'Kyrgyzstan',
+  "Lao, People's Democratic Republic",
+  'Latvia',
+  'Lebanon',
+  'Lesotho',
+  'Liberia',
+  'Libyan Arab Jamahiriya',
+  'Liechtenstein',
+  'Lithuania',
+  'Luxembourg',
+  'Macau',
+  'Macedonia, The Former Yugoslav Republic of',
+  'Madagascar',
+  'Malawi',
+  'Malaysia',
+  'Maldives',
+  'Mali',
+  'Malta',
+  'Marshall Islands',
+  'Martinique',
+  'Mauritania',
+  'Mauritius',
+  'Mayotte',
+  'Mexico',
+  'Micronesia, Federated States of',
+  'Moldova, Republic of',
+  'Monaco',
+  'Mongolia',
+  'Montserrat',
+  'Morocco',
+  'Mozambique',
+  'Myanmar',
+  'Namibia',
+  'Nauru',
+  'Nepal',
+  'Netherlands',
+  'Netherlands Antilles',
+  'New Caledonia',
+  'New Zealand',
+  'Nicaragua',
+  'Niger',
+  'Nigeria',
+  'Niue',
+  'Norfolk Island',
+  'Northern Mariana Islands',
+  'Norway',
+  'Oman',
+  'Pakistan',
+  'Palau',
+  'Panama',
+  'Papua New Guinea',
+  'Paraguay',
+  'Peru',
+  'Philippines',
+  'Pitcairn',
+  'Poland',
+  'Portugal',
+  'Puerto Rico',
+  'Qatar',
+  'Reunion',
+  'Romania',
+  'Russian Federation',
+  'Rwanda',
+  'Saint Kitts and Nevis',
+  'Saint Lucia',
+  'Saint Vincent and the Grenadines',
+  'Samoa',
+  'San Marino',
+  'Sao Tome and Principe',
+  'Saudi Arabia',
+  'Senegal',
+  'Serbia',
+  'Seychelles',
+  'Sierra Leone',
+  'Singapore',
+  'Slovakia (Slovak Republic)',
+  'Slovenia',
+  'Solomon Islands',
+  'Somalia',
+  'South Africa',
+  'South Georgia and the South Sandwich Islands',
+  'Spain',
+  'Sri Lanka',
+  'St. Helena',
+  'St. Pierre and Miquelon',
+  'Sudan',
+  'Suriname',
+  'Svalbard and Jan Mayen Islands',
+  'Swaziland',
+  'Sweden',
+  'Switzerland',
+  'Syrian Arab Republic',
+  'Taiwan, Province of China',
+  'Tajikistan',
+  'Tanzania, United Republic of',
+  'United States of America',
+  'Thailand',
+  'Togo',
+  'Tokelau',
+  'Tonga',
+  'Trinidad and Tobago',
+  'Tunisia',
+  'Turkey',
+  'Turkmenistan',
+  'Turks and Caicos Islands',
+  'Tuvalu',
+  'Uganda',
+  'Ukraine',
+  'United Arab Emirates',
+  'United Kingdom',
+  'United States',
+  'United States Minor Outlying Islands',
+  'Uruguay',
+  'Uzbekistan',
+  'Vanuatu',
+  'Venezuela',
+  'Vietnam',
+  'Virgin Islands (British)',
+  'Virgin Islands (U.S.)',
+  'Wallis and Futuna Islands',
+  'Western Sahara',
+  'Yemen',
+  'Yugoslavia',
+  'Zambia',
+  'Zimbabwe',
+]

+ 30 - 0
src/data/charts/barChartData.ts

@@ -0,0 +1,30 @@
+import { TBarChartData } from '../types'
+
+export const barChartData: TBarChartData = {
+  labels: [
+    'January',
+    'February',
+    'March',
+    'April',
+    'May',
+    'June',
+    'July',
+    'August',
+    'September',
+    'October',
+    'November',
+    'December',
+  ],
+  datasets: [
+    {
+      label: 'Last year',
+      backgroundColor: 'primary',
+      data: [50, 20, 12, 39, 10, 40, 39, 80, 40, 20, 12, 11],
+    },
+    {
+      label: 'Current year',
+      backgroundColor: 'info',
+      data: [50, 10, 22, 39, 15, 20, 85, 32, 60, 50, 20, 30],
+    },
+  ],
+}

+ 231 - 0
src/data/charts/bubbleChartData.ts

@@ -0,0 +1,231 @@
+import { TBubbleChartData } from '../types'
+
+export const bubbleChartData: TBubbleChartData = {
+  datasets: [
+    {
+      label: 'USA',
+      backgroundColor: 'danger',
+      data: [
+        {
+          x: 23,
+          y: 25,
+          r: 15,
+        },
+        {
+          x: 40,
+          y: 10,
+          r: 10,
+        },
+        {
+          x: 30,
+          y: 22,
+          r: 30,
+        },
+        {
+          x: 7,
+          y: 43,
+          r: 40,
+        },
+        {
+          x: 23,
+          y: 27,
+          r: 12,
+        },
+        {
+          x: 20,
+          y: 15,
+          r: 11,
+        },
+        {
+          x: 7,
+          y: 10,
+          r: 35,
+        },
+        {
+          x: 10,
+          y: 20,
+          r: 40,
+        },
+      ],
+    },
+    {
+      label: 'Russia',
+      backgroundColor: 'primary',
+      data: [
+        {
+          x: 0,
+          y: 30,
+          r: 15,
+        },
+        {
+          x: 20,
+          y: 20,
+          r: 20,
+        },
+        {
+          x: 15,
+          y: 15,
+          r: 50,
+        },
+        {
+          x: 31,
+          y: 46,
+          r: 30,
+        },
+        {
+          x: 20,
+          y: 14,
+          r: 25,
+        },
+        {
+          x: 34,
+          y: 17,
+          r: 30,
+        },
+        {
+          x: 44,
+          y: 44,
+          r: 10,
+        },
+        {
+          x: 39,
+          y: 25,
+          r: 35,
+        },
+      ],
+    },
+    {
+      label: 'Canada',
+      backgroundColor: 'warning',
+      data: [
+        {
+          x: 10,
+          y: 30,
+          r: 45,
+        },
+        {
+          x: 10,
+          y: 50,
+          r: 20,
+        },
+        {
+          x: 5,
+          y: 5,
+          r: 30,
+        },
+        {
+          x: 40,
+          y: 30,
+          r: 20,
+        },
+        {
+          x: 33,
+          y: 15,
+          r: 18,
+        },
+        {
+          x: 40,
+          y: 20,
+          r: 40,
+        },
+        {
+          x: 33,
+          y: 33,
+          r: 40,
+        },
+      ],
+    },
+    {
+      label: 'Belarus',
+      backgroundColor: 'info',
+      data: [
+        {
+          x: 35,
+          y: 30,
+          r: 45,
+        },
+        {
+          x: 25,
+          y: 40,
+          r: 35,
+        },
+        {
+          x: 5,
+          y: 5,
+          r: 30,
+        },
+        {
+          x: 5,
+          y: 20,
+          r: 40,
+        },
+        {
+          x: 10,
+          y: 40,
+          r: 15,
+        },
+        {
+          x: 3,
+          y: 10,
+          r: 10,
+        },
+        {
+          x: 15,
+          y: 40,
+          r: 40,
+        },
+        {
+          x: 7,
+          y: 15,
+          r: 10,
+        },
+      ],
+    },
+    {
+      label: 'Ukraine',
+      backgroundColor: 'success',
+      data: [
+        {
+          x: 25,
+          y: 10,
+          r: 40,
+        },
+        {
+          x: 17,
+          y: 40,
+          r: 40,
+        },
+        {
+          x: 35,
+          y: 10,
+          r: 20,
+        },
+        {
+          x: 3,
+          y: 40,
+          r: 10,
+        },
+        {
+          x: 40,
+          y: 40,
+          r: 40,
+        },
+        {
+          x: 20,
+          y: 10,
+          r: 10,
+        },
+        {
+          x: 10,
+          y: 27,
+          r: 35,
+        },
+        {
+          x: 7,
+          y: 26,
+          r: 40,
+        },
+      ],
+    },
+  ],
+}

+ 35 - 0
src/data/charts/composables/useChartColors.ts

@@ -0,0 +1,35 @@
+import { computed, ref } from '@vue/reactivity'
+import { watch } from 'vue'
+import { useColors, useGlobalConfig } from 'vuestic-ui'
+
+type chartColors = string | string[]
+
+export function useChartColors(chartColors = [] as chartColors, alfa = 0.6) {
+  const { getGlobalConfig } = useGlobalConfig()
+  const { setHSLAColor, getColor } = useColors()
+
+  const generateHSLAColors = (colors: chartColors) =>
+    typeof colors === 'string'
+      ? setHSLAColor(getColor(colors), { a: alfa })
+      : colors.map((color) => setHSLAColor(getColor(color), { a: alfa }))
+
+  const generateColors = (colors: chartColors) =>
+    typeof colors === 'string' ? getColor(colors) : colors.map((color) => getColor(color))
+
+  const generatedHSLAColors = ref(generateHSLAColors(chartColors))
+  const generatedColors = ref(generateColors(chartColors))
+
+  const theme = computed(() => getGlobalConfig().colors!)
+
+  watch(theme, () => {
+    generatedHSLAColors.value = generateHSLAColors(chartColors)
+    generatedColors.value = generateColors(chartColors)
+  })
+
+  return {
+    generateHSLAColors,
+    generateColors,
+    generatedColors,
+    generatedHSLAColors,
+  }
+}

+ 20 - 0
src/data/charts/composables/useChartData.ts

@@ -0,0 +1,20 @@
+import { computed, ComputedRef } from '@vue/reactivity'
+import { useChartColors } from './useChartColors'
+import { TChartData } from '../../types'
+
+export function useChartData<T extends TChartData>(data: T, alfa?: number): ComputedRef<T> {
+  const datasetsColors = data.datasets.map((dataset) => dataset.backgroundColor as string)
+
+  const datasetsThemesColors = datasetsColors.map(
+    (colors) => useChartColors(colors, alfa)[alfa ? 'generatedHSLAColors' : 'generatedColors'],
+  )
+
+  return computed(() => {
+    const datasets = data.datasets.map((dataset, idx) => ({
+      ...dataset,
+      backgroundColor: datasetsThemesColors[idx].value,
+    }))
+
+    return { ...data, datasets } as T
+  })
+}

+ 12 - 0
src/data/charts/doughnutChartData.ts

@@ -0,0 +1,12 @@
+import { TDoughnutChartData } from '../types'
+
+export const doughnutChartData: TDoughnutChartData = {
+  labels: ['North America', 'South America', 'Australia'],
+  datasets: [
+    {
+      label: 'Population (millions)',
+      backgroundColor: ['danger', 'info', 'primary'],
+      data: [2478, 5267, 734],
+    },
+  ],
+}

+ 30 - 0
src/data/charts/horizontalBarChartData.ts

@@ -0,0 +1,30 @@
+import { TBarChartData } from '../types'
+
+export const horizontalBarChartData: TBarChartData = {
+  labels: [
+    'January',
+    'February',
+    'March',
+    'April',
+    'May',
+    'June',
+    'July',
+    'August',
+    'September',
+    'October',
+    'November',
+    'December',
+  ],
+  datasets: [
+    {
+      label: 'Vuestic Satisfaction Score',
+      backgroundColor: 'primary',
+      data: [80, 90, 50, 70, 60, 90, 50, 90, 80, 40, 72, 93],
+    },
+    {
+      label: 'Bulma Satisfaction Score',
+      backgroundColor: 'danger',
+      data: [20, 30, 20, 40, 50, 40, 15, 60, 30, 20, 42, 53],
+    },
+  ],
+}

+ 6 - 0
src/data/charts/index.ts

@@ -0,0 +1,6 @@
+export { bubbleChartData } from './bubbleChartData'
+export { doughnutChartData } from './doughnutChartData'
+export { barChartData } from './barChartData'
+export { horizontalBarChartData } from './horizontalBarChartData'
+export { lineChartData } from './lineChartData'
+export { pieChartData } from './pieChartData'

+ 44 - 0
src/data/charts/lineChartData.ts

@@ -0,0 +1,44 @@
+import { TLineChartData } from '../types'
+
+const months = [
+  'January',
+  'February',
+  'March',
+  'April',
+  'May',
+  'June',
+  'July',
+  'August',
+  'September',
+  'October',
+  'November',
+  'December',
+]
+
+const getSize = (minSize = 5) => Math.max(minSize, new Date().getMonth())
+const size = getSize()
+
+const generateValue = () => Math.floor(Math.random() * 100)
+const generateArray = (length: number) => Array.from(Array(length), generateValue)
+
+const generateYLabels = () => {
+  const flip = !!Math.floor(Math.random() * 2)
+  return flip ? ['Debit', 'Credit'] : ['Credit', 'Debit']
+}
+const yLabels = generateYLabels()
+
+export const lineChartData: TLineChartData = {
+  labels: months.slice(0, size),
+  datasets: [
+    {
+      label: yLabels[0],
+      backgroundColor: 'primary',
+      data: generateArray(size),
+    },
+    {
+      label: yLabels[1],
+      backgroundColor: 'secondary',
+      data: generateArray(size),
+    },
+  ],
+}

+ 12 - 0
src/data/charts/pieChartData.ts

@@ -0,0 +1,12 @@
+import { TLineChartData } from '../types'
+
+export const pieChartData: TLineChartData = {
+  labels: ['Africa', 'Asia', 'Europe'],
+  datasets: [
+    {
+      label: 'Population (millions)',
+      backgroundColor: ['primary', 'warning', 'danger'],
+      data: [2478, 5267, 734],
+    },
+  ],
+}

+ 2017 - 0
src/data/maps/bubbleMapData.ts

@@ -0,0 +1,2017 @@
+export type PointGeoCoord = {
+  latitude: number
+  longitude: number
+}
+
+export type CountryItem = {
+  code: string
+  name: string
+  value: number
+  color: string
+  latitude?: number
+  longitude?: number
+  radius?: number
+}
+
+export type ValueBounds = {
+  min: number
+  max: number
+}
+
+const latLng = {
+  AD: {
+    latitude: 42.5,
+    longitude: 1.5,
+  },
+  AE: {
+    latitude: 24,
+    longitude: 54,
+  },
+  AF: {
+    latitude: 33,
+    longitude: 65,
+  },
+  AG: {
+    latitude: 17.05,
+    longitude: -61.8,
+  },
+  AI: {
+    latitude: 18.25,
+    longitude: -63.1667,
+  },
+  AL: {
+    latitude: 41,
+    longitude: 20,
+  },
+  AM: {
+    latitude: 40,
+    longitude: 45,
+  },
+  AN: {
+    latitude: 12.25,
+    longitude: -68.75,
+  },
+  AO: {
+    latitude: -12.5,
+    longitude: 18.5,
+  },
+  AP: {
+    latitude: 35,
+    longitude: 105,
+  },
+  AQ: {
+    latitude: -90,
+    longitude: 0,
+  },
+  AR: {
+    latitude: -34,
+    longitude: -64,
+  },
+  AS: {
+    latitude: -14.3333,
+    longitude: -170,
+  },
+  AT: {
+    latitude: 47.3333,
+    longitude: 13.3333,
+  },
+  AU: {
+    latitude: -27,
+    longitude: 133,
+  },
+  AW: {
+    latitude: 12.5,
+    longitude: -69.9667,
+  },
+  AZ: {
+    latitude: 40.5,
+    longitude: 47.5,
+  },
+  BA: {
+    latitude: 44,
+    longitude: 18,
+  },
+  BB: {
+    latitude: 13.1667,
+    longitude: -59.5333,
+  },
+  BD: {
+    latitude: 24,
+    longitude: 90,
+  },
+  BE: {
+    latitude: 50.8333,
+    longitude: 4,
+  },
+  BF: {
+    latitude: 13,
+    longitude: -2,
+  },
+  BG: {
+    latitude: 43,
+    longitude: 25,
+  },
+  BH: {
+    latitude: 26,
+    longitude: 50.55,
+  },
+  BI: {
+    latitude: -3.5,
+    longitude: 30,
+  },
+  BJ: {
+    latitude: 9.5,
+    longitude: 2.25,
+  },
+  BM: {
+    latitude: 32.3333,
+    longitude: -64.75,
+  },
+  BN: {
+    latitude: 4.5,
+    longitude: 114.6667,
+  },
+  BO: {
+    latitude: -17,
+    longitude: -65,
+  },
+  BR: {
+    latitude: -10,
+    longitude: -55,
+  },
+  BS: {
+    latitude: 24.25,
+    longitude: -76,
+  },
+  BT: {
+    latitude: 27.5,
+    longitude: 90.5,
+  },
+  BV: {
+    latitude: -54.4333,
+    longitude: 3.4,
+  },
+  BW: {
+    latitude: -22,
+    longitude: 24,
+  },
+  BY: {
+    latitude: 53,
+    longitude: 28,
+  },
+  BZ: {
+    latitude: 17.25,
+    longitude: -88.75,
+  },
+  CA: {
+    latitude: 54,
+    longitude: -100,
+  },
+  CC: {
+    latitude: -12.5,
+    longitude: 96.8333,
+  },
+  CD: {
+    latitude: 0,
+    longitude: 25,
+  },
+  CF: {
+    latitude: 7,
+    longitude: 21,
+  },
+  CG: {
+    latitude: -1,
+    longitude: 15,
+  },
+  CH: {
+    latitude: 47,
+    longitude: 8,
+  },
+  CI: {
+    latitude: 8,
+    longitude: -5,
+  },
+  CK: {
+    latitude: -21.2333,
+    longitude: -159.7667,
+  },
+  CL: {
+    latitude: -30,
+    longitude: -71,
+  },
+  CM: {
+    latitude: 6,
+    longitude: 12,
+  },
+  CN: {
+    latitude: 35,
+    longitude: 105,
+  },
+  CO: {
+    latitude: 4,
+    longitude: -72,
+  },
+  CR: {
+    latitude: 10,
+    longitude: -84,
+  },
+  CU: {
+    latitude: 21.5,
+    longitude: -80,
+  },
+  CV: {
+    latitude: 16,
+    longitude: -24,
+  },
+  CX: {
+    latitude: -10.5,
+    longitude: 105.6667,
+  },
+  CY: {
+    latitude: 35,
+    longitude: 33,
+  },
+  CZ: {
+    latitude: 49.75,
+    longitude: 15.5,
+  },
+  DE: {
+    latitude: 51,
+    longitude: 9,
+  },
+  DJ: {
+    latitude: 11.5,
+    longitude: 43,
+  },
+  DK: {
+    latitude: 56,
+    longitude: 10,
+  },
+  DM: {
+    latitude: 15.4167,
+    longitude: -61.3333,
+  },
+  DO: {
+    latitude: 19,
+    longitude: -70.6667,
+  },
+  DZ: {
+    latitude: 28,
+    longitude: 3,
+  },
+  EC: {
+    latitude: -2,
+    longitude: -77.5,
+  },
+  EE: {
+    latitude: 59,
+    longitude: 26,
+  },
+  EG: {
+    latitude: 27,
+    longitude: 30,
+  },
+  EH: {
+    latitude: 24.5,
+    longitude: -13,
+  },
+  ER: {
+    latitude: 15,
+    longitude: 39,
+  },
+  ES: {
+    latitude: 40,
+    longitude: -4,
+  },
+  ET: {
+    latitude: 8,
+    longitude: 38,
+  },
+  EU: {
+    latitude: 47,
+    longitude: 8,
+  },
+  FI: {
+    latitude: 62,
+    longitude: 26,
+  },
+  FJ: {
+    latitude: -18,
+    longitude: 175,
+  },
+  FK: {
+    latitude: -51.75,
+    longitude: -59,
+  },
+  FM: {
+    latitude: 6.9167,
+    longitude: 158.25,
+  },
+  FO: {
+    latitude: 62,
+    longitude: -7,
+  },
+  FR: {
+    latitude: 46,
+    longitude: 2,
+  },
+  GA: {
+    latitude: -1,
+    longitude: 11.75,
+  },
+  GB: {
+    latitude: 54,
+    longitude: -2,
+  },
+  GD: {
+    latitude: 12.1167,
+    longitude: -61.6667,
+  },
+  GE: {
+    latitude: 42,
+    longitude: 43.5,
+  },
+  GF: {
+    latitude: 4,
+    longitude: -53,
+  },
+  GH: {
+    latitude: 8,
+    longitude: -2,
+  },
+  GI: {
+    latitude: 36.1833,
+    longitude: -5.3667,
+  },
+  GL: {
+    latitude: 72,
+    longitude: -40,
+  },
+  GM: {
+    latitude: 13.4667,
+    longitude: -16.5667,
+  },
+  GN: {
+    latitude: 11,
+    longitude: -10,
+  },
+  GP: {
+    latitude: 16.25,
+    longitude: -61.5833,
+  },
+  GQ: {
+    latitude: 2,
+    longitude: 10,
+  },
+  GR: {
+    latitude: 39,
+    longitude: 22,
+  },
+  GS: {
+    latitude: -54.5,
+    longitude: -37,
+  },
+  GT: {
+    latitude: 15.5,
+    longitude: -90.25,
+  },
+  GU: {
+    latitude: 13.4667,
+    longitude: 144.7833,
+  },
+  GW: {
+    latitude: 12,
+    longitude: -15,
+  },
+  GY: {
+    latitude: 5,
+    longitude: -59,
+  },
+  HK: {
+    latitude: 22.25,
+    longitude: 114.1667,
+  },
+  HM: {
+    latitude: -53.1,
+    longitude: 72.5167,
+  },
+  HN: {
+    latitude: 15,
+    longitude: -86.5,
+  },
+  HR: {
+    latitude: 45.1667,
+    longitude: 15.5,
+  },
+  HT: {
+    latitude: 19,
+    longitude: -72.4167,
+  },
+  HU: {
+    latitude: 47,
+    longitude: 20,
+  },
+  ID: {
+    latitude: -5,
+    longitude: 120,
+  },
+  IE: {
+    latitude: 53,
+    longitude: -8,
+  },
+  IL: {
+    latitude: 31.5,
+    longitude: 34.75,
+  },
+  IN: {
+    latitude: 20,
+    longitude: 77,
+  },
+  IO: {
+    latitude: -6,
+    longitude: 71.5,
+  },
+  IQ: {
+    latitude: 33,
+    longitude: 44,
+  },
+  IR: {
+    latitude: 32,
+    longitude: 53,
+  },
+  IS: {
+    latitude: 65,
+    longitude: -18,
+  },
+  IT: {
+    latitude: 42.8333,
+    longitude: 12.8333,
+  },
+  JM: {
+    latitude: 18.25,
+    longitude: -77.5,
+  },
+  JO: {
+    latitude: 31,
+    longitude: 36,
+  },
+  JP: {
+    latitude: 36,
+    longitude: 138,
+  },
+  KE: {
+    latitude: 1,
+    longitude: 38,
+  },
+  KG: {
+    latitude: 41,
+    longitude: 75,
+  },
+  KH: {
+    latitude: 13,
+    longitude: 105,
+  },
+  KI: {
+    latitude: 1.4167,
+    longitude: 173,
+  },
+  KM: {
+    latitude: -12.1667,
+    longitude: 44.25,
+  },
+  KN: {
+    latitude: 17.3333,
+    longitude: -62.75,
+  },
+  KP: {
+    latitude: 40,
+    longitude: 127,
+  },
+  KR: {
+    latitude: 37,
+    longitude: 127.5,
+  },
+  KW: {
+    latitude: 29.3375,
+    longitude: 47.6581,
+  },
+  KY: {
+    latitude: 19.5,
+    longitude: -80.5,
+  },
+  KZ: {
+    latitude: 48,
+    longitude: 68,
+  },
+  LA: {
+    latitude: 18,
+    longitude: 105,
+  },
+  LB: {
+    latitude: 33.8333,
+    longitude: 35.8333,
+  },
+  LC: {
+    latitude: 13.8833,
+    longitude: -61.1333,
+  },
+  LI: {
+    latitude: 47.1667,
+    longitude: 9.5333,
+  },
+  LK: {
+    latitude: 7,
+    longitude: 81,
+  },
+  LR: {
+    latitude: 6.5,
+    longitude: -9.5,
+  },
+  LS: {
+    latitude: -29.5,
+    longitude: 28.5,
+  },
+  LT: {
+    latitude: 55,
+    longitude: 24,
+  },
+  LU: {
+    latitude: 49.75,
+    longitude: 6,
+  },
+  LV: {
+    latitude: 57,
+    longitude: 25,
+  },
+  LY: {
+    latitude: 25,
+    longitude: 17,
+  },
+  MA: {
+    latitude: 32,
+    longitude: -5,
+  },
+  MC: {
+    latitude: 43.7333,
+    longitude: 7.4,
+  },
+  MD: {
+    latitude: 47,
+    longitude: 29,
+  },
+  ME: {
+    latitude: 42.5,
+    longitude: 19.4,
+  },
+  MG: {
+    latitude: -20,
+    longitude: 47,
+  },
+  MH: {
+    latitude: 9,
+    longitude: 168,
+  },
+  MK: {
+    latitude: 41.8333,
+    longitude: 22,
+  },
+  ML: {
+    latitude: 17,
+    longitude: -4,
+  },
+  MM: {
+    latitude: 22,
+    longitude: 98,
+  },
+  MN: {
+    latitude: 46,
+    longitude: 105,
+  },
+  MO: {
+    latitude: 22.1667,
+    longitude: 113.55,
+  },
+  MP: {
+    latitude: 15.2,
+    longitude: 145.75,
+  },
+  MQ: {
+    latitude: 14.6667,
+    longitude: -61,
+  },
+  MR: {
+    latitude: 20,
+    longitude: -12,
+  },
+  MS: {
+    latitude: 16.75,
+    longitude: -62.2,
+  },
+  MT: {
+    latitude: 35.8333,
+    longitude: 14.5833,
+  },
+  MU: {
+    latitude: -20.2833,
+    longitude: 57.55,
+  },
+  MV: {
+    latitude: 3.25,
+    longitude: 73,
+  },
+  MW: {
+    latitude: -13.5,
+    longitude: 34,
+  },
+  MX: {
+    latitude: 23,
+    longitude: -102,
+  },
+  MY: {
+    latitude: 2.5,
+    longitude: 112.5,
+  },
+  MZ: {
+    latitude: -18.25,
+    longitude: 35,
+  },
+  NA: {
+    latitude: -22,
+    longitude: 17,
+  },
+  NC: {
+    latitude: -21.5,
+    longitude: 165.5,
+  },
+  NE: {
+    latitude: 16,
+    longitude: 8,
+  },
+  NF: {
+    latitude: -29.0333,
+    longitude: 167.95,
+  },
+  NG: {
+    latitude: 10,
+    longitude: 8,
+  },
+  NI: {
+    latitude: 13,
+    longitude: -85,
+  },
+  NL: {
+    latitude: 52.5,
+    longitude: 5.75,
+  },
+  NO: {
+    latitude: 62,
+    longitude: 10,
+  },
+  NP: {
+    latitude: 28,
+    longitude: 84,
+  },
+  NR: {
+    latitude: -0.5333,
+    longitude: 166.9167,
+  },
+  NU: {
+    latitude: -19.0333,
+    longitude: -169.8667,
+  },
+  NZ: {
+    latitude: -41,
+    longitude: 174,
+  },
+  OM: {
+    latitude: 21,
+    longitude: 57,
+  },
+  PA: {
+    latitude: 9,
+    longitude: -80,
+  },
+  PE: {
+    latitude: -10,
+    longitude: -76,
+  },
+  PF: {
+    latitude: -15,
+    longitude: -140,
+  },
+  PG: {
+    latitude: -6,
+    longitude: 147,
+  },
+  PH: {
+    latitude: 13,
+    longitude: 122,
+  },
+  PK: {
+    latitude: 30,
+    longitude: 70,
+  },
+  PL: {
+    latitude: 52,
+    longitude: 20,
+  },
+  PM: {
+    latitude: 46.8333,
+    longitude: -56.3333,
+  },
+  PR: {
+    latitude: 18.25,
+    longitude: -66.5,
+  },
+  PS: {
+    latitude: 32,
+    longitude: 35.25,
+  },
+  PT: {
+    latitude: 39.5,
+    longitude: -8,
+  },
+  PW: {
+    latitude: 7.5,
+    longitude: 134.5,
+  },
+  PY: {
+    latitude: -23,
+    longitude: -58,
+  },
+  QA: {
+    latitude: 25.5,
+    longitude: 51.25,
+  },
+  RE: {
+    latitude: -21.1,
+    longitude: 55.6,
+  },
+  RO: {
+    latitude: 46,
+    longitude: 25,
+  },
+  RS: {
+    latitude: 44,
+    longitude: 21,
+  },
+  RU: {
+    latitude: 60,
+    longitude: 100,
+  },
+  RW: {
+    latitude: -2,
+    longitude: 30,
+  },
+  SA: {
+    latitude: 25,
+    longitude: 45,
+  },
+  SB: {
+    latitude: -8,
+    longitude: 159,
+  },
+  SC: {
+    latitude: -4.5833,
+    longitude: 55.6667,
+  },
+  SD: {
+    latitude: 15,
+    longitude: 30,
+  },
+  SE: {
+    latitude: 62,
+    longitude: 15,
+  },
+  SG: {
+    latitude: 1.3667,
+    longitude: 103.8,
+  },
+  SH: {
+    latitude: -15.9333,
+    longitude: -5.7,
+  },
+  SI: {
+    latitude: 46,
+    longitude: 15,
+  },
+  SJ: {
+    latitude: 78,
+    longitude: 20,
+  },
+  SK: {
+    latitude: 48.6667,
+    longitude: 19.5,
+  },
+  SL: {
+    latitude: 8.5,
+    longitude: -11.5,
+  },
+  SM: {
+    latitude: 43.7667,
+    longitude: 12.4167,
+  },
+  SN: {
+    latitude: 14,
+    longitude: -14,
+  },
+  SO: {
+    latitude: 10,
+    longitude: 49,
+  },
+  SR: {
+    latitude: 4,
+    longitude: -56,
+  },
+  ST: {
+    latitude: 1,
+    longitude: 7,
+  },
+  SV: {
+    latitude: 13.8333,
+    longitude: -88.9167,
+  },
+  SY: {
+    latitude: 35,
+    longitude: 38,
+  },
+  SZ: {
+    latitude: -26.5,
+    longitude: 31.5,
+  },
+  TC: {
+    latitude: 21.75,
+    longitude: -71.5833,
+  },
+  TD: {
+    latitude: 15,
+    longitude: 19,
+  },
+  TF: {
+    latitude: -43,
+    longitude: 67,
+  },
+  TG: {
+    latitude: 8,
+    longitude: 1.1667,
+  },
+  TH: {
+    latitude: 15,
+    longitude: 100,
+  },
+  TJ: {
+    latitude: 39,
+    longitude: 71,
+  },
+  TK: {
+    latitude: -9,
+    longitude: -172,
+  },
+  TM: {
+    latitude: 40,
+    longitude: 60,
+  },
+  TN: {
+    latitude: 34,
+    longitude: 9,
+  },
+  TO: {
+    latitude: -20,
+    longitude: -175,
+  },
+  TR: {
+    latitude: 39,
+    longitude: 35,
+  },
+  TT: {
+    latitude: 11,
+    longitude: -61,
+  },
+  TV: {
+    latitude: -8,
+    longitude: 178,
+  },
+  TW: {
+    latitude: 23.5,
+    longitude: 121,
+  },
+  TZ: {
+    latitude: -6,
+    longitude: 35,
+  },
+  UA: {
+    latitude: 49,
+    longitude: 32,
+  },
+  UG: {
+    latitude: 1,
+    longitude: 32,
+  },
+  UM: {
+    latitude: 19.2833,
+    longitude: 166.6,
+  },
+  US: {
+    latitude: 38,
+    longitude: -97,
+  },
+  UY: {
+    latitude: -33,
+    longitude: -56,
+  },
+  UZ: {
+    latitude: 41,
+    longitude: 64,
+  },
+  VA: {
+    latitude: 41.9,
+    longitude: 12.45,
+  },
+  VC: {
+    latitude: 13.25,
+    longitude: -61.2,
+  },
+  VE: {
+    latitude: 8,
+    longitude: -66,
+  },
+  VG: {
+    latitude: 18.5,
+    longitude: -64.5,
+  },
+  VI: {
+    latitude: 18.3333,
+    longitude: -64.8333,
+  },
+  VN: {
+    latitude: 16,
+    longitude: 106,
+  },
+  VU: {
+    latitude: -16,
+    longitude: 167,
+  },
+  WF: {
+    latitude: -13.3,
+    longitude: -176.2,
+  },
+  WS: {
+    latitude: -13.5833,
+    longitude: -172.3333,
+  },
+  YE: {
+    latitude: 15,
+    longitude: 48,
+  },
+  YT: {
+    latitude: -12.8333,
+    longitude: 45.1667,
+  },
+  ZA: {
+    latitude: -29,
+    longitude: 24,
+  },
+  ZM: {
+    latitude: -15,
+    longitude: 30,
+  },
+  ZW: {
+    latitude: -20,
+    longitude: 30,
+  },
+}
+
+const data = [
+  {
+    code: 'AF',
+    name: 'Afghanistan',
+    value: 32358260,
+    color: '#eea638',
+  },
+  {
+    code: 'AL',
+    name: 'Albania',
+    value: 3215988,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'DZ',
+    name: 'Algeria',
+    value: 35980193,
+    color: '#e96e6e',
+  },
+  {
+    code: 'AO',
+    name: 'Angola',
+    value: 19618432,
+    color: '#e96e6e',
+  },
+  {
+    code: 'AR',
+    name: 'Argentina',
+    value: 40764561,
+    color: '#6be59c',
+  },
+  {
+    code: 'AM',
+    name: 'Armenia',
+    value: 3100236,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'AU',
+    name: 'Australia',
+    value: 22605732,
+    color: '#8aabb0',
+  },
+  {
+    code: 'AT',
+    name: 'Austria',
+    value: 8413429,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'AZ',
+    name: 'Azerbaijan',
+    value: 9306023,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'BH',
+    name: 'Bahrain',
+    value: 1323535,
+    color: '#eea638',
+  },
+  {
+    code: 'BD',
+    name: 'Bangladesh',
+    value: 150493658,
+    color: '#eea638',
+  },
+  {
+    code: 'BY',
+    name: 'Belarus',
+    value: 9559441,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'BE',
+    name: 'Belgium',
+    value: 10754056,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'BJ',
+    name: 'Benin',
+    value: 9099922,
+    color: '#e96e6e',
+  },
+  {
+    code: 'BT',
+    name: 'Bhutan',
+    value: 738267,
+    color: '#eea638',
+  },
+  {
+    code: 'BO',
+    name: 'Bolivia',
+    value: 10088108,
+    color: '#6be59c',
+  },
+  {
+    code: 'BA',
+    name: 'Bosnia and Herzegovina',
+    value: 3752228,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'BW',
+    name: 'Botswana',
+    value: 2030738,
+    color: '#e96e6e',
+  },
+  {
+    code: 'BR',
+    name: 'Brazil',
+    value: 196655014,
+    color: '#6be59c',
+  },
+  {
+    code: 'BN',
+    name: 'Brunei',
+    value: 405938,
+    color: '#eea638',
+  },
+  {
+    code: 'BG',
+    name: 'Bulgaria',
+    value: 7446135,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'BF',
+    name: 'Burkina Faso',
+    value: 16967845,
+    color: '#e96e6e',
+  },
+  {
+    code: 'BI',
+    name: 'Burundi',
+    value: 8575172,
+    color: '#e96e6e',
+  },
+  {
+    code: 'KH',
+    name: 'Cambodia',
+    value: 14305183,
+    color: '#eea638',
+  },
+  {
+    code: 'CM',
+    name: 'Cameroon',
+    value: 20030362,
+    color: '#e96e6e',
+  },
+  {
+    code: 'CA',
+    name: 'Canada',
+    value: 34349561,
+    color: '#f6d35b',
+  },
+  {
+    code: 'CV',
+    name: 'Cape Verde',
+    value: 500585,
+    color: '#e96e6e',
+  },
+  {
+    code: 'CF',
+    name: 'Central African Rep.',
+    value: 4486837,
+    color: '#e96e6e',
+  },
+  {
+    code: 'TD',
+    name: 'Chad',
+    value: 11525496,
+    color: '#e96e6e',
+  },
+  {
+    code: 'CL',
+    name: 'Chile',
+    value: 17269525,
+    color: '#6be59c',
+  },
+  {
+    code: 'CN',
+    name: 'China',
+    value: 1347565324,
+    color: '#eea638',
+  },
+  {
+    code: 'CO',
+    name: 'Colombia',
+    value: 46927125,
+    color: '#6be59c',
+  },
+  {
+    code: 'KM',
+    name: 'Comoros',
+    value: 753943,
+    color: '#e96e6e',
+  },
+  {
+    code: 'CD',
+    name: 'Congo, Dem. Rep.',
+    value: 67757577,
+    color: '#e96e6e',
+  },
+  {
+    code: 'CG',
+    name: 'Congo, Rep.',
+    value: 4139748,
+    color: '#e96e6e',
+  },
+  {
+    code: 'CR',
+    name: 'Costa Rica',
+    value: 4726575,
+    color: '#f6d35b',
+  },
+  {
+    code: 'CI',
+    name: "Cote d'Ivoire",
+    value: 20152894,
+    color: '#e96e6e',
+  },
+  {
+    code: 'HR',
+    name: 'Croatia',
+    value: 4395560,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'CU',
+    name: 'Cuba',
+    value: 11253665,
+    color: '#f6d35b',
+  },
+  {
+    code: 'CY',
+    name: 'Cyprus',
+    value: 1116564,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'CZ',
+    name: 'Czech Rep.',
+    value: 10534293,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'DK',
+    name: 'Denmark',
+    value: 5572594,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'DJ',
+    name: 'Djibouti',
+    value: 905564,
+    color: '#e96e6e',
+  },
+  {
+    code: 'DO',
+    name: 'Dominican Rep.',
+    value: 10056181,
+    color: '#f6d35b',
+  },
+  {
+    code: 'EC',
+    name: 'Ecuador',
+    value: 14666055,
+    color: '#6be59c',
+  },
+  {
+    code: 'EG',
+    name: 'Egypt',
+    value: 82536770,
+    color: '#e96e6e',
+  },
+  {
+    code: 'SV',
+    name: 'El Salvador',
+    value: 6227491,
+    color: '#f6d35b',
+  },
+  {
+    code: 'GQ',
+    name: 'Equatorial Guinea',
+    value: 720213,
+    color: '#e96e6e',
+  },
+  {
+    code: 'ER',
+    name: 'Eritrea',
+    value: 5415280,
+    color: '#e96e6e',
+  },
+  {
+    code: 'EE',
+    name: 'Estonia',
+    value: 1340537,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'ET',
+    name: 'Ethiopia',
+    value: 84734262,
+    color: '#e96e6e',
+  },
+  {
+    code: 'FJ',
+    name: 'Fiji',
+    value: 868406,
+    color: '#8aabb0',
+  },
+  {
+    code: 'FI',
+    name: 'Finland',
+    value: 5384770,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'FR',
+    name: 'France',
+    value: 63125894,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'GA',
+    name: 'Gabon',
+    value: 1534262,
+    color: '#e96e6e',
+  },
+  {
+    code: 'GM',
+    name: 'Gambia',
+    value: 1776103,
+    color: '#e96e6e',
+  },
+  {
+    code: 'GE',
+    name: 'Georgia',
+    value: 4329026,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'DE',
+    name: 'Germany',
+    value: 82162512,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'GH',
+    name: 'Ghana',
+    value: 24965816,
+    color: '#e96e6e',
+  },
+  {
+    code: 'GR',
+    name: 'Greece',
+    value: 11390031,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'GT',
+    name: 'Guatemala',
+    value: 14757316,
+    color: '#f6d35b',
+  },
+  {
+    code: 'GN',
+    name: 'Guinea',
+    value: 10221808,
+    color: '#e96e6e',
+  },
+  {
+    code: 'GW',
+    name: 'Guinea-Bissau',
+    value: 1547061,
+    color: '#e96e6e',
+  },
+  {
+    code: 'GY',
+    name: 'Guyana',
+    value: 756040,
+    color: '#6be59c',
+  },
+  {
+    code: 'HT',
+    name: 'Haiti',
+    value: 10123787,
+    color: '#f6d35b',
+  },
+  {
+    code: 'HN',
+    name: 'Honduras',
+    value: 7754687,
+    color: '#f6d35b',
+  },
+  {
+    code: 'HK',
+    name: 'Hong Kong, China',
+    value: 7122187,
+    color: '#eea638',
+  },
+  {
+    code: 'HU',
+    name: 'Hungary',
+    value: 9966116,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'IS',
+    name: 'Iceland',
+    value: 324366,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'IN',
+    name: 'India',
+    value: 1241491960,
+    color: '#eea638',
+  },
+  {
+    code: 'ID',
+    name: 'Indonesia',
+    value: 242325638,
+    color: '#eea638',
+  },
+  {
+    code: 'IR',
+    name: 'Iran',
+    value: 74798599,
+    color: '#eea638',
+  },
+  {
+    code: 'IQ',
+    name: 'Iraq',
+    value: 32664942,
+    color: '#eea638',
+  },
+  {
+    code: 'IE',
+    name: 'Ireland',
+    value: 4525802,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'IL',
+    name: 'Israel',
+    value: 7562194,
+    color: '#eea638',
+  },
+  {
+    code: 'IT',
+    name: 'Italy',
+    value: 60788694,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'JM',
+    name: 'Jamaica',
+    value: 2751273,
+    color: '#f6d35b',
+  },
+  {
+    code: 'JP',
+    name: 'Japan',
+    value: 126497241,
+    color: '#eea638',
+  },
+  {
+    code: 'JO',
+    name: 'Jordan',
+    value: 6330169,
+    color: '#eea638',
+  },
+  {
+    code: 'KZ',
+    name: 'Kazakhstan',
+    value: 16206750,
+    color: '#eea638',
+  },
+  {
+    code: 'KE',
+    name: 'Kenya',
+    value: 41609728,
+    color: '#e96e6e',
+  },
+  {
+    code: 'KR',
+    name: 'Korea, Dem. Rep.',
+    value: 24451285,
+    color: '#eea638',
+  },
+  {
+    code: 'KP',
+    name: 'Korea, Rep.',
+    value: 48391343,
+    color: '#eea638',
+  },
+  {
+    code: 'KW',
+    name: 'Kuwait',
+    value: 2818042,
+    color: '#eea638',
+  },
+  {
+    code: 'KG',
+    name: 'Kyrgyzstan',
+    value: 5392580,
+    color: '#eea638',
+  },
+  {
+    code: 'LA',
+    name: 'Laos',
+    value: 6288037,
+    color: '#eea638',
+  },
+  {
+    code: 'LV',
+    name: 'Latvia',
+    value: 2243142,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'LB',
+    name: 'Lebanon',
+    value: 4259405,
+    color: '#eea638',
+  },
+  {
+    code: 'LS',
+    name: 'Lesotho',
+    value: 2193843,
+    color: '#e96e6e',
+  },
+  {
+    code: 'LR',
+    name: 'Liberia',
+    value: 4128572,
+    color: '#e96e6e',
+  },
+  {
+    code: 'LY',
+    name: 'Libya',
+    value: 6422772,
+    color: '#e96e6e',
+  },
+  {
+    code: 'LT',
+    name: 'Lithuania',
+    value: 3307481,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'LU',
+    name: 'Luxembourg',
+    value: 515941,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'MK',
+    name: 'Macedonia, FYR',
+    value: 2063893,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'MG',
+    name: 'Madagascar',
+    value: 21315135,
+    color: '#e96e6e',
+  },
+  {
+    code: 'MW',
+    name: 'Malawi',
+    value: 15380888,
+    color: '#e96e6e',
+  },
+  {
+    code: 'MY',
+    name: 'Malaysia',
+    value: 28859154,
+    color: '#eea638',
+  },
+  {
+    code: 'ML',
+    name: 'Mali',
+    value: 15839538,
+    color: '#e96e6e',
+  },
+  {
+    code: 'MR',
+    name: 'Mauritania',
+    value: 3541540,
+    color: '#e96e6e',
+  },
+  {
+    code: 'MU',
+    name: 'Mauritius',
+    value: 1306593,
+    color: '#e96e6e',
+  },
+  {
+    code: 'MX',
+    name: 'Mexico',
+    value: 114793341,
+    color: '#f6d35b',
+  },
+  {
+    code: 'MD',
+    name: 'Moldova',
+    value: 3544864,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'MN',
+    name: 'Mongolia',
+    value: 2800114,
+    color: '#eea638',
+  },
+  {
+    code: 'ME',
+    name: 'Montenegro',
+    value: 632261,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'MA',
+    name: 'Morocco',
+    value: 32272974,
+    color: '#e96e6e',
+  },
+  {
+    code: 'MZ',
+    name: 'Mozambique',
+    value: 23929708,
+    color: '#e96e6e',
+  },
+  {
+    code: 'MM',
+    name: 'Myanmar',
+    value: 48336763,
+    color: '#eea638',
+  },
+  {
+    code: 'NA',
+    name: 'Namibia',
+    value: 2324004,
+    color: '#e96e6e',
+  },
+  {
+    code: 'NP',
+    name: 'Nepal',
+    value: 30485798,
+    color: '#eea638',
+  },
+  {
+    code: 'NL',
+    name: 'Netherlands',
+    value: 16664746,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'NZ',
+    name: 'New Zealand',
+    value: 4414509,
+    color: '#8aabb0',
+  },
+  {
+    code: 'NI',
+    name: 'Nicaragua',
+    value: 5869859,
+    color: '#f6d35b',
+  },
+  {
+    code: 'NE',
+    name: 'Niger',
+    value: 16068994,
+    color: '#e96e6e',
+  },
+  {
+    code: 'NG',
+    name: 'Nigeria',
+    value: 162470737,
+    color: '#e96e6e',
+  },
+  {
+    code: 'NO',
+    name: 'Norway',
+    value: 4924848,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'OM',
+    name: 'Oman',
+    value: 2846145,
+    color: '#eea638',
+  },
+  {
+    code: 'PK',
+    name: 'Pakistan',
+    value: 176745364,
+    color: '#eea638',
+  },
+  {
+    code: 'PA',
+    name: 'Panama',
+    value: 3571185,
+    color: '#f6d35b',
+  },
+  {
+    code: 'PG',
+    name: 'Papua New Guinea',
+    value: 7013829,
+    color: '#8aabb0',
+  },
+  {
+    code: 'PY',
+    name: 'Paraguay',
+    value: 6568290,
+    color: '#6be59c',
+  },
+  {
+    code: 'PE',
+    name: 'Peru',
+    value: 29399817,
+    color: '#6be59c',
+  },
+  {
+    code: 'PH',
+    name: 'Philippines',
+    value: 94852030,
+    color: '#eea638',
+  },
+  {
+    code: 'PL',
+    name: 'Poland',
+    value: 38298949,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'PT',
+    name: 'Portugal',
+    value: 10689663,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'PR',
+    name: 'Puerto Rico',
+    value: 3745526,
+    color: '#f6d35b',
+  },
+  {
+    code: 'QA',
+    name: 'Qatar',
+    value: 1870041,
+    color: '#eea638',
+  },
+  {
+    code: 'RO',
+    name: 'Romania',
+    value: 21436495,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'RU',
+    name: 'Russia',
+    value: 142835555,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'RW',
+    name: 'Rwanda',
+    value: 10942950,
+    color: '#e96e6e',
+  },
+  {
+    code: 'SA',
+    name: 'Saudi Arabia',
+    value: 28082541,
+    color: '#eea638',
+  },
+  {
+    code: 'SN',
+    name: 'Senegal',
+    value: 12767556,
+    color: '#e96e6e',
+  },
+  {
+    code: 'RS',
+    name: 'Serbia',
+    value: 9853969,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'SL',
+    name: 'Sierra Leone',
+    value: 5997486,
+    color: '#e96e6e',
+  },
+  {
+    code: 'SG',
+    name: 'Singapore',
+    value: 5187933,
+    color: '#eea638',
+  },
+  {
+    code: 'SK',
+    name: 'Slovak Republic',
+    value: 5471502,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'SI',
+    name: 'Slovenia',
+    value: 2035012,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'SB',
+    name: 'Solomon Islands',
+    value: 552267,
+    color: '#8aabb0',
+  },
+  {
+    code: 'SO',
+    name: 'Somalia',
+    value: 9556873,
+    color: '#e96e6e',
+  },
+  {
+    code: 'ZA',
+    name: 'South Africa',
+    value: 50459978,
+    color: '#e96e6e',
+  },
+  {
+    code: 'ES',
+    name: 'Spain',
+    value: 46454895,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'LK',
+    name: 'Sri Lanka',
+    value: 21045394,
+    color: '#eea638',
+  },
+  {
+    code: 'SD',
+    name: 'Sudan',
+    value: 34735288,
+    color: '#e96e6e',
+  },
+  {
+    code: 'SR',
+    name: 'Suriname',
+    value: 529419,
+    color: '#6be59c',
+  },
+  {
+    code: 'SZ',
+    name: 'Swaziland',
+    value: 1203330,
+    color: '#e96e6e',
+  },
+  {
+    code: 'SE',
+    name: 'Sweden',
+    value: 9440747,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'CH',
+    name: 'Switzerland',
+    value: 7701690,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'SY',
+    name: 'Syria',
+    value: 20766037,
+    color: '#eea638',
+  },
+  {
+    code: 'TW',
+    name: 'Taiwan',
+    value: 23072000,
+    color: '#eea638',
+  },
+  {
+    code: 'TJ',
+    name: 'Tajikistan',
+    value: 6976958,
+    color: '#eea638',
+  },
+  {
+    code: 'TZ',
+    name: 'Tanzania',
+    value: 46218486,
+    color: '#e96e6e',
+  },
+  {
+    code: 'TH',
+    name: 'Thailand',
+    value: 69518555,
+    color: '#eea638',
+  },
+  {
+    code: 'TG',
+    name: 'Togo',
+    value: 6154813,
+    color: '#e96e6e',
+  },
+  {
+    code: 'TT',
+    name: 'Trinidad and Tobago',
+    value: 1346350,
+    color: '#f6d35b',
+  },
+  {
+    code: 'TN',
+    name: 'Tunisia',
+    value: 10594057,
+    color: '#e96e6e',
+  },
+  {
+    code: 'TR',
+    name: 'Turkey',
+    value: 73639596,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'TM',
+    name: 'Turkmenistan',
+    value: 5105301,
+    color: '#eea638',
+  },
+  {
+    code: 'UG',
+    name: 'Uganda',
+    value: 34509205,
+    color: '#e96e6e',
+  },
+  {
+    code: 'UA',
+    name: 'Ukraine',
+    value: 45190180,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'AE',
+    name: 'United Arab Emirates',
+    value: 7890924,
+    color: '#eea638',
+  },
+  {
+    code: 'GB',
+    name: 'United Kingdom',
+    value: 62417431,
+    color: '#6bbfe4',
+  },
+  {
+    code: 'US',
+    name: 'United States',
+    value: 313085380,
+    color: '#f6d35b',
+  },
+  {
+    code: 'UY',
+    name: 'Uruguay',
+    value: 3380008,
+    color: '#6be59c',
+  },
+  {
+    code: 'UZ',
+    name: 'Uzbekistan',
+    value: 27760267,
+    color: '#eea638',
+  },
+  {
+    code: 'VE',
+    name: 'Venezuela',
+    value: 29436891,
+    color: '#6be59c',
+  },
+  {
+    code: 'PS',
+    name: 'West Bank and Gaza',
+    value: 4152369,
+    color: '#eea638',
+  },
+  {
+    code: 'VN',
+    name: 'Vietnam',
+    value: 88791996,
+    color: '#eea638',
+  },
+  {
+    code: 'YE',
+    name: 'Yemen, Rep.',
+    value: 24799880,
+    color: '#eea638',
+  },
+  {
+    code: 'ZM',
+    name: 'Zambia',
+    value: 13474959,
+    color: '#e96e6e',
+  },
+  {
+    code: 'ZW',
+    name: 'Zimbabwe',
+    value: 12754378,
+    color: '#e96e6e',
+  },
+]
+
+export const bubbleMapData = {
+  latLng,
+  data,
+}
+
+export const getValueBounds = (items: CountryItem[]) => {
+  const values = items.map(({ value }) => value)
+  return {
+    min: Math.min(...values),
+    max: Math.max(...values),
+  }
+}
+
+export const getItemRadius = (item: CountryItem, values: ValueBounds, squares: ValueBounds) => {
+  const square = ((item.value - values.min) / (values.max - values.min)) * (squares.max - squares.min) + squares.min
+  return Math.round(Math.sqrt((4 * square) / Math.PI) * 10) / 10
+}

+ 342 - 0
src/data/maps/lineMapData.ts

@@ -0,0 +1,342 @@
+import { computed, ComputedRef, Ref } from '@vue/reactivity'
+import { useColors } from 'vuestic-ui'
+
+type GeoBounds = {
+  bottom: number
+  left: number
+  right: number
+  top: number
+}
+
+export type PointGeoCoord = {
+  latitude: number
+  longitude: number
+}
+
+export type DataGeometry = {
+  geometry: {
+    type: string
+    coordinates: [number, number][]
+  }
+}
+
+export type CityItem = {
+  id?: string
+  title: string
+  country: string
+  latitude: number
+  longitude: number
+  svgPath: string
+  color: string
+  flights?: PointGeoCoord[]
+}
+
+const targetSVG =
+  'M9,0C4.029,0,0,4.029,0,9s4.029,9,9,9s9-4.029,9-9S13.971,0,9,0z M9,15.93 c-3.83,0-6.93-3.1-6.93-6.93S5.17,2.07,9,2.07s6.93,3.1,6.93,6.93S12.83,15.93,9,15.93 M12.5,9c0,1.933-1.567,3.5-3.5,3.5S5.5,10.933,5.5,9S7.067,5.5,9,5.5 S12.5,7.067,12.5,9z'
+
+export const planeSVG =
+  'M19.671,8.11l-2.777,2.777l-3.837-0.861c0.362-0.505,0.916-1.683,0.464-2.135c-0.518-0.517-1.979,0.278-2.305,0.604l-0.913,0.913L7.614,8.804l-2.021,2.021l2.232,1.061l-0.082,0.082l1.701,1.701l0.688-0.687l3.164,1.504L9.571,18.21H6.413l-1.137,1.138l3.6,0.948l1.83,1.83l0.947,3.598l1.137-1.137V21.43l3.725-3.725l1.504,3.164l-0.687,0.687l1.702,1.701l0.081-0.081l1.062,2.231l2.02-2.02l-0.604-2.689l0.912-0.912c0.326-0.326,1.121-1.789,0.604-2.306c-0.452-0.452-1.63,0.101-2.135,0.464l-0.861-3.838l2.777-2.777c0.947-0.947,3.599-4.862,2.62-5.839C24.533,4.512,20.618,7.163,19.671,8.11z'
+
+const london = {
+  id: 'london',
+  color: 'info',
+  svgPath: targetSVG,
+  title: 'London',
+  country: 'United Kingdom',
+  latitude: 51.5002,
+  longitude: -0.1262,
+  flights: [
+    {
+      latitude: 50.4422,
+      longitude: 30.5367,
+    },
+    {
+      latitude: 46.948,
+      longitude: 7.4481,
+    },
+    {
+      latitude: 59.3328,
+      longitude: 18.0645,
+    },
+    {
+      latitude: 40.4167,
+      longitude: -3.7033,
+    },
+    {
+      latitude: 46.0514,
+      longitude: 14.506,
+    },
+    {
+      latitude: 48.2116,
+      longitude: 17.1547,
+    },
+    {
+      latitude: 44.8048,
+      longitude: 20.4781,
+    },
+    {
+      latitude: 55.7558,
+      longitude: 37.6176,
+    },
+    {
+      latitude: 38.7072,
+      longitude: -9.1355,
+    },
+    {
+      latitude: 54.6896,
+      longitude: 25.2799,
+    },
+    {
+      latitude: 64.1353,
+      longitude: -21.8952,
+    },
+    {
+      latitude: 40.43,
+      longitude: -74.0,
+    },
+  ],
+}
+
+const vilnius = {
+  id: 'vilnius',
+  color: 'info',
+  svgPath: targetSVG,
+  title: 'Vilnius',
+  country: 'Lithuania',
+  latitude: 54.6896,
+  longitude: 25.2799,
+  flights: [
+    {
+      latitude: 50.8371,
+      longitude: 4.3676,
+    },
+    {
+      latitude: 59.9138,
+      longitude: 10.7387,
+    },
+    {
+      latitude: 40.4167,
+      longitude: -3.7033,
+    },
+    {
+      latitude: 50.0878,
+      longitude: 14.4205,
+    },
+    {
+      latitude: 48.2116,
+      longitude: 17.1547,
+    },
+    {
+      latitude: 44.8048,
+      longitude: 20.4781,
+    },
+    {
+      latitude: 55.7558,
+      longitude: 37.6176,
+    },
+    {
+      latitude: 37.9792,
+      longitude: 23.7166,
+    },
+    {
+      latitude: 51.5002,
+      longitude: -0.1262,
+    },
+    {
+      latitude: 53.3441,
+      longitude: -6.2675,
+    },
+  ],
+}
+
+const cities: CityItem[] = [
+  london,
+  vilnius,
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Brussels',
+    country: 'Belgium',
+    latitude: 50.8371,
+    longitude: 4.3676,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Prague',
+    country: 'Czech Republic',
+    latitude: 50.0878,
+    longitude: 14.4205,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Athens',
+    country: 'Greece',
+    latitude: 37.9792,
+    longitude: 23.7166,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Reykjavik',
+    country: 'Iceland',
+    latitude: 64.1353,
+    longitude: -21.8952,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Dublin',
+    country: 'Ireland',
+    latitude: 53.3441,
+    longitude: -6.2675,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Oslo',
+    country: 'Norway',
+    latitude: 59.9138,
+    longitude: 10.7387,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Lisbon',
+    country: 'Portugal',
+    latitude: 38.7072,
+    longitude: -9.1355,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Moscow',
+    country: 'Russia',
+    latitude: 55.7558,
+    longitude: 37.6176,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Belgrade',
+    country: 'Serbia',
+    latitude: 44.8048,
+    longitude: 20.4781,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Bratislava',
+    country: 'Slovakia',
+    latitude: 48.2116,
+    longitude: 17.1547,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Ljubljana',
+    country: 'Slovenia',
+    latitude: 46.0514,
+    longitude: 14.506,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Madrid',
+    country: 'Spain',
+    latitude: 40.4167,
+    longitude: -3.7033,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Stockholm',
+    country: 'Sweden',
+    latitude: 59.3328,
+    longitude: 18.0645,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Bern',
+    country: 'Switzerland',
+    latitude: 46.948,
+    longitude: 7.4481,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Kiev',
+    country: 'Ukraine',
+    latitude: 50.4422,
+    longitude: 30.5367,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'Paris',
+    country: 'France',
+    latitude: 48.8567,
+    longitude: 2.351,
+  },
+  {
+    svgPath: targetSVG,
+    color: 'info',
+    title: 'New York',
+    country: 'United States of America',
+    latitude: 40.43,
+    longitude: -74,
+  },
+]
+
+export const lineMapData = {
+  cities,
+  mainCity: london.title,
+  homeCity: london.title,
+}
+
+export const useMapData = (data: Ref<CityItem[]>): ComputedRef<CityItem[]> => {
+  const { getColor } = useColors()
+
+  return computed(() =>
+    data.value.map((item) => ({
+      ...item,
+      color: getColor(item.color),
+    })),
+  )
+}
+
+export const getGeoBounds = (item?: CityItem): GeoBounds | undefined => {
+  if (!item || !item.flights || !item.flights.length) {
+    return
+  }
+
+  const latitudes = [...item.flights.map(({ latitude }) => latitude), item.latitude]
+  const longitudes = [...item.flights.map(({ longitude }) => longitude), item.longitude]
+
+  return {
+    bottom: Math.min(...latitudes),
+    left: Math.min(...longitudes),
+    right: Math.max(...longitudes),
+    top: Math.max(...latitudes),
+  }
+}
+
+export const generateLineSeriesData = (item?: CityItem): DataGeometry[] | undefined => {
+  if (!item || !item.flights || !item.flights.length) {
+    return
+  }
+
+  return item.flights.map((point) => ({
+    geometry: {
+      type: 'LineString',
+      coordinates: [
+        [item.longitude, item.latitude],
+        [point.longitude, point.latitude],
+      ],
+    },
+  }))
+}
+
+export const compareStrings = (first: string, second: string) => first.toLowerCase() === second.toLowerCase()

+ 402 - 0
src/data/tables/markup-table/data.json

@@ -0,0 +1,402 @@
+[
+  {
+    "id": "5d3026a3a4c8c8f35689104b",
+    "name": "Mcguire Prince",
+    "email": "mcguireprince@glasstep.com",
+    "country": "Swaziland",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3e1579c30d1703632",
+    "name": "Dean Jennings",
+    "email": "deanjennings@glasstep.com",
+    "country": "Korea (North)",
+    "starred": true,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a38023a44a3b5e934d",
+    "name": "Cotton Weber",
+    "email": "cottonweber@glasstep.com",
+    "country": "Mozambique",
+    "starred": false,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a31c6b23082419e5f4",
+    "name": "Osborne Foster",
+    "email": "osbornefoster@glasstep.com",
+    "country": "US Minor Outlying Islands",
+    "starred": true,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a3b2cca1fd45746dbf",
+    "name": "William Dillard",
+    "email": "williamdillard@glasstep.com",
+    "country": "Cayman Islands",
+    "starred": true,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3486badb41f9f18b5",
+    "name": "Anna Meyers",
+    "email": "annameyers@glasstep.com",
+    "country": "Viet Nam",
+    "starred": false,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a3c614901a53477e5c",
+    "name": "Ana Barrett",
+    "email": "anabarrett@glasstep.com",
+    "country": "Rwanda",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3fcff2a76b73e6016",
+    "name": "Pam Ward",
+    "email": "pamward@glasstep.com",
+    "country": "Kuwait",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3b54fc3e9a2570ce8",
+    "name": "Hannah Holloway",
+    "email": "hannahholloway@glasstep.com",
+    "country": "Gibraltar",
+    "starred": false,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a3e2303324ae9d823f",
+    "name": "Allison Cobb",
+    "email": "allisoncobb@glasstep.com",
+    "country": "East Timor",
+    "starred": true,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3f22a52e3706ed868",
+    "name": "Terrie Hawkins",
+    "email": "terriehawkins@glasstep.com",
+    "country": "Greenland",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a32bad267623e706ec",
+    "name": "Peck Ryan",
+    "email": "peckryan@glasstep.com",
+    "country": "Belgium",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a37a50452a85d01cbb",
+    "name": "Candace Powell",
+    "email": "candacepowell@glasstep.com",
+    "country": "Yugoslavia",
+    "starred": false,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a3ce9f5acf20065037",
+    "name": "Wolfe Pitts",
+    "email": "wolfepitts@glasstep.com",
+    "country": "Bouvet Island",
+    "starred": true,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a3e3a5afe09338eca5",
+    "name": "Marietta Robbins",
+    "email": "mariettarobbins@glasstep.com",
+    "country": "Martinique",
+    "starred": true,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a33fc3196e598bdc7b",
+    "name": "Michelle Wolfe",
+    "email": "michellewolfe@glasstep.com",
+    "country": "French Guiana",
+    "starred": false,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a3364f517d8f5dbf16",
+    "name": "Katina Lindsay",
+    "email": "katinalindsay@glasstep.com",
+    "country": "Guyana",
+    "starred": true,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a313dedc3cf25404ba",
+    "name": "Bridgett Lloyd",
+    "email": "bridgettlloyd@glasstep.com",
+    "country": "Niger",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3a72281322b845f6a",
+    "name": "Letha Hamilton",
+    "email": "lethahamilton@glasstep.com",
+    "country": "Zimbabwe",
+    "starred": true,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3bd037e491b76f097",
+    "name": "Mcclain Doyle",
+    "email": "mcclaindoyle@glasstep.com",
+    "country": "Switzerland",
+    "starred": false,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a36aa5b7fda077d6ef",
+    "name": "Giles Lucas",
+    "email": "gileslucas@glasstep.com",
+    "country": "Bhutan",
+    "starred": true,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a381c974954ce9ab94",
+    "name": "Figueroa Lowery",
+    "email": "figueroalowery@glasstep.com",
+    "country": "Netherlands Antilles",
+    "starred": false,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a3c0af2698fcd2a750",
+    "name": "Valeria Justice",
+    "email": "valeriajustice@glasstep.com",
+    "country": "Moldova",
+    "starred": true,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a301d5e7c957e6d864",
+    "name": "Louise Ayala",
+    "email": "louiseayala@glasstep.com",
+    "country": "India",
+    "starred": true,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a31f6f1fd6399aeee6",
+    "name": "Kathrine Kirby",
+    "email": "kathrinekirby@glasstep.com",
+    "country": "Cook Islands",
+    "starred": false,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a3e8cb16cd2afa41dd",
+    "name": "Brandi Morris",
+    "email": "brandimorris@glasstep.com",
+    "country": "Honduras",
+    "starred": false,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a3c52ac7ffb85c892d",
+    "name": "Margaret Mckenzie",
+    "email": "margaretmckenzie@glasstep.com",
+    "country": "Jordan",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3c66670f258790358",
+    "name": "Janie Collier",
+    "email": "janiecollier@glasstep.com",
+    "country": "Samoa",
+    "starred": true,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a3108b6b1d543fb117",
+    "name": "Catherine Vance",
+    "email": "catherinevance@glasstep.com",
+    "country": "Sierra Leone",
+    "starred": false,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a325d727b6d9b85d84",
+    "name": "Kate Allen",
+    "email": "kateallen@glasstep.com",
+    "country": "France",
+    "starred": true,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a32be6debb7532cc75",
+    "name": "Jeanne Cross",
+    "email": "jeannecross@glasstep.com",
+    "country": "Anguilla",
+    "starred": true,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3cc16b4cd36e3a7b4",
+    "name": "Stewart Hanson",
+    "email": "stewarthanson@glasstep.com",
+    "country": "Western Sahara",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3d3496dd200d5f6af",
+    "name": "Beulah Castaneda",
+    "email": "beulahcastaneda@glasstep.com",
+    "country": "Malaysia",
+    "starred": true,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a3187e74fcd18a7918",
+    "name": "Carissa Taylor",
+    "email": "carissataylor@glasstep.com",
+    "country": "Burkina Faso",
+    "starred": false,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a32db20d8ce9111367",
+    "name": "Muriel Butler",
+    "email": "murielbutler@glasstep.com",
+    "country": "Pitcairn",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a35b04715a89693024",
+    "name": "Janna Anthony",
+    "email": "jannaanthony@glasstep.com",
+    "country": "Nigeria",
+    "starred": false,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a3a40b0f908cf0b831",
+    "name": "Cortez Singleton",
+    "email": "cortezsingleton@glasstep.com",
+    "country": "Morocco",
+    "starred": true,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a30ab099fe57fe76ad",
+    "name": "Acevedo Blevins",
+    "email": "acevedoblevins@glasstep.com",
+    "country": "Turkmenistan",
+    "starred": false,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a39f9244d7f7d7fe80",
+    "name": "Hamilton Lewis",
+    "email": "hamiltonlewis@glasstep.com",
+    "country": "Marshall Islands",
+    "starred": true,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a3637724139b82f9bc",
+    "name": "Marylou Wright",
+    "email": "marylouwright@glasstep.com",
+    "country": "Iraq",
+    "starred": true,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a3e5cda49e94e1f0de",
+    "name": "Lenore Bullock",
+    "email": "lenorebullock@glasstep.com",
+    "country": "El Salvador",
+    "starred": true,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a30bcb1168afa7bb26",
+    "name": "Enid Stephens",
+    "email": "enidstephens@glasstep.com",
+    "country": "Greece",
+    "starred": false,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a34b33074f1ee12e73",
+    "name": "Oneill Joyner",
+    "email": "oneilljoyner@glasstep.com",
+    "country": "Micronesia",
+    "starred": false,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a3f3f5a4121051c6bc",
+    "name": "Kristine Finley",
+    "email": "kristinefinley@glasstep.com",
+    "country": "Uganda",
+    "starred": false,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a341bb45b14a38d0ec",
+    "name": "York Carson",
+    "email": "yorkcarson@glasstep.com",
+    "country": "Cyprus",
+    "starred": true,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a32ed6a9a296e01c71",
+    "name": "Nikki Conway",
+    "email": "nikkiconway@glasstep.com",
+    "country": "Tuvalu",
+    "starred": true,
+    "status": "paid"
+  },
+  {
+    "id": "5d3026a32b3f710cb8b73bca",
+    "name": "Lindsey Burgess",
+    "email": "lindseyburgess@glasstep.com",
+    "country": "Mali",
+    "starred": false,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3fbfadf6c0b971769",
+    "name": "Love Christian",
+    "email": "lovechristian@glasstep.com",
+    "country": "Andorra",
+    "starred": false,
+    "status": "rejected"
+  },
+  {
+    "id": "5d3026a35c48c5e49f1930e0",
+    "name": "Julia Sawyer",
+    "email": "juliasawyer@glasstep.com",
+    "country": "Hungary",
+    "starred": true,
+    "status": "processing"
+  },
+  {
+    "id": "5d3026a3fc275278bd752b31",
+    "name": "Mayer Warren",
+    "email": "mayerwarren@glasstep.com",
+    "country": "Latvia",
+    "starred": false,
+    "status": "rejected"
+  }
+]

+ 13 - 0
src/data/types.ts

@@ -0,0 +1,13 @@
+import type { TChartData as ChartData } from 'vue-chartjs/dist/types'
+
+export type ColorThemes = {
+  [key: string]: string
+}
+
+export type TLineChartData = ChartData<'line'>
+export type TBarChartData = ChartData<'bar'>
+export type TBubbleChartData = ChartData<'bubble'>
+export type TDoughnutChartData = ChartData<'doughnut'>
+export type TPieChartData = ChartData<'pie'>
+
+export type TChartData = TLineChartData | TBarChartData | TBubbleChartData | TDoughnutChartData | TPieChartData

+ 386 - 0
src/data/users.json

@@ -0,0 +1,386 @@
+[
+  {
+    "id": "5d2c865e9a0bae79a6ef7cfa",
+    "firstName": "Ashley",
+    "lastName": "Mcdaniel",
+    "fullName": "Ashley Mcdaniel",
+    "email": "ashleymcdaniel@nebulean.com",
+    "country": "Cayman Islands",
+    "starred": true,
+    "hasReport": false,
+    "status": "warning",
+    "checked": false,
+    "trend": "down",
+    "color": "warning",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865ec73341e16e5f2251",
+    "firstName": "Sellers",
+    "lastName": "Todd",
+    "fullName": "Todd Sellers",
+    "email": "sellerstodd@nebulean.com",
+    "country": "Togo",
+    "starred": false,
+    "hasReport": false,
+    "status": "info",
+    "checked": false,
+    "trend": "none",
+    "color": "primary",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e38800c5ce28f2f6b",
+    "firstName": "Sherman",
+    "lastName": "Knowles",
+    "fullName": "Sherman Knowles",
+    "email": "shermanknowles@nebulean.com",
+    "country": "Central African Republic",
+    "starred": true,
+    "hasReport": true,
+    "status": "warning",
+    "checked": false,
+    "trend": "none",
+    "color": "warning",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865e957cd150b82e17a6",
+    "firstName": "Vasquez",
+    "lastName": "Lawson",
+    "fullName": "Vasquez Lawson",
+    "email": "vasquezlawson@nebulean.com",
+    "country": "Bouvet Island",
+    "starred": true,
+    "hasReport": false,
+    "status": "info",
+    "checked": false,
+    "trend": "down",
+    "color": "warning",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e9194dbe2faf99227",
+    "firstName": "April",
+    "lastName": "Sykes",
+    "fullName": "April Sykes",
+    "email": "aprilsykes@nebulean.com",
+    "country": "Saint Vincent and The Grenadines",
+    "starred": false,
+    "hasReport": true,
+    "status": "warning",
+    "checked": false,
+    "trend": "down",
+    "color": "primary",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865e1ed74d83f6b26934",
+    "firstName": "Hodges",
+    "lastName": "Garrison",
+    "fullName": "Hodges Garrison",
+    "email": "hodgesgarrison@nebulean.com",
+    "country": "Zimbabwe",
+    "starred": true,
+    "hasReport": false,
+    "status": "info",
+    "checked": false,
+    "trend": "none",
+    "color": "info",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e0ef31380880c3de5",
+    "firstName": "Therese",
+    "lastName": "Stokes",
+    "fullName": "Therese Stokes",
+    "email": "theresestokes@nebulean.com",
+    "country": "Mali",
+    "starred": true,
+    "hasReport": false,
+    "status": "info",
+    "checked": false,
+    "trend": "up",
+    "color": "warning",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865e4b5ab4727e5c8b69",
+    "firstName": "Goodwin",
+    "lastName": "Brewer",
+    "fullName": "Goodwin Brewer",
+    "email": "goodwinbrewer@nebulean.com",
+    "country": "Iraq",
+    "starred": true,
+    "hasReport": true,
+    "status": "info",
+    "checked": false,
+    "trend": "none",
+    "color": "info",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e4c4d675787cfe1c0",
+    "firstName": "Gomez",
+    "lastName": "Wise",
+    "fullName": "Gomez Wise",
+    "email": "gomezwise@nebulean.com",
+    "country": "Portugal",
+    "starred": true,
+    "hasReport": true,
+    "status": "info",
+    "checked": false,
+    "trend": "none",
+    "color": "primary",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e1017c3229017fc68",
+    "firstName": "Laverne",
+    "lastName": "Ayers",
+    "fullName": "Laverne Ayers",
+    "email": "laverneayers@nebulean.com",
+    "country": "Micronesia",
+    "starred": false,
+    "hasReport": false,
+    "status": "warning",
+    "checked": false,
+    "trend": "down",
+    "color": "info",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865ee66676fd7464f8b9",
+    "firstName": "Stewart",
+    "lastName": "Leon",
+    "fullName": "Stewart Leon",
+    "email": "stewartleon@nebulean.com",
+    "country": "Seychelles",
+    "starred": true,
+    "hasReport": false,
+    "status": "info",
+    "checked": false,
+    "trend": "up",
+    "color": "info",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e644d8acbed1e0e97",
+    "firstName": "Lindsey",
+    "lastName": "Hopkins",
+    "fullName": "Lindsey Hopkins",
+    "email": "lindseyhopkins@nebulean.com",
+    "country": "Costa Rica",
+    "starred": false,
+    "hasReport": true,
+    "status": "info",
+    "checked": false,
+    "trend": "up",
+    "color": "primary",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865ef2b732c74dc3d6a2",
+    "firstName": "Head",
+    "lastName": "Lloyd",
+    "fullName": "Head Lloyd",
+    "email": "headlloyd@nebulean.com",
+    "country": "Turkey",
+    "starred": true,
+    "hasReport": false,
+    "status": "warning",
+    "checked": false,
+    "trend": "down",
+    "color": "info",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e4ee4f09e92ead2e7",
+    "firstName": "Fisher",
+    "lastName": "Bradford",
+    "fullName": "Fisher Bradford",
+    "email": "fisherbradford@nebulean.com",
+    "country": "Ethiopia",
+    "starred": true,
+    "hasReport": true,
+    "status": "info",
+    "checked": false,
+    "trend": "up",
+    "color": "info",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865e88d46a9e9049a549",
+    "firstName": "Aurora",
+    "lastName": "Bird",
+    "fullName": "Aurora Bird",
+    "email": "aurorabird@nebulean.com",
+    "country": "Burkina Faso",
+    "starred": false,
+    "hasReport": true,
+    "status": "warning",
+    "checked": false,
+    "trend": "up",
+    "color": "info",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e44bf14ea96d6e752",
+    "firstName": "Bonita",
+    "lastName": "Shields",
+    "fullName": "Bonita Shields",
+    "email": "bonitashields@nebulean.com",
+    "country": "Cote D'Ivoire (Ivory Coast)",
+    "starred": true,
+    "hasReport": true,
+    "status": "warning",
+    "checked": false,
+    "trend": "down",
+    "color": "primary",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865e2a8be26f6ac4369c",
+    "firstName": "Ethel",
+    "lastName": "Underwood",
+    "fullName": "Ethel Underwood",
+    "email": "ethelunderwood@nebulean.com",
+    "country": "Vanuatu",
+    "starred": false,
+    "hasReport": false,
+    "status": "warning",
+    "checked": false,
+    "trend": "down",
+    "color": "info",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e5e0aea40111c37f8",
+    "firstName": "Parker",
+    "lastName": "May",
+    "fullName": "Parker May",
+    "email": "parkermay@nebulean.com",
+    "country": "Pakistan",
+    "starred": true,
+    "hasReport": false,
+    "status": "warning",
+    "checked": false,
+    "trend": "down",
+    "color": "warning",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865e7e0c05ecc2d0c186",
+    "firstName": "Hillary",
+    "lastName": "Waters",
+    "fullName": "Hillary Waters",
+    "email": "hillarywaters@nebulean.com",
+    "country": "Comoros",
+    "starred": true,
+    "hasReport": true,
+    "status": "info",
+    "checked": false,
+    "trend": "down",
+    "color": "primary",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e80a72eeda016b169",
+    "firstName": "Raquel",
+    "lastName": "Ferrell",
+    "fullName": "Raquel Ferrell",
+    "email": "raquelferrell@nebulean.com",
+    "country": "China",
+    "starred": false,
+    "hasReport": false,
+    "status": "warning",
+    "checked": false,
+    "trend": "down",
+    "color": "info",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865eafacadd378add679",
+    "firstName": "Pickett",
+    "lastName": "Page",
+    "fullName": "Pickett Page",
+    "email": "pickettpage@nebulean.com",
+    "country": "Bermuda",
+    "starred": true,
+    "hasReport": false,
+    "status": "info",
+    "checked": false,
+    "trend": "up",
+    "color": "info",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865e772b1a75bb0a07b5",
+    "firstName": "Alyson",
+    "lastName": "Bailey",
+    "fullName": "Alyson Bailey",
+    "email": "alysonbailey@nebulean.com",
+    "country": "United Arab Emirates",
+    "starred": false,
+    "hasReport": false,
+    "status": "warning",
+    "checked": false,
+    "trend": "up",
+    "color": "warning",
+    "graph": "M 5 20 C 10 5, 15 5, 30 30 S 20 20, 70 20",
+    "graphColor": "#4ae387"
+  },
+  {
+    "id": "5d2c865e137c19a76b56210c",
+    "firstName": "Farley",
+    "lastName": "Meyers",
+    "fullName": "Farley Meyers",
+    "email": "farleymeyers@nebulean.com",
+    "country": "Christmas Island",
+    "starred": false,
+    "hasReport": false,
+    "status": "info",
+    "checked": false,
+    "trend": "up",
+    "color": "warning",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  },
+  {
+    "id": "5d2c865eb0ba37a27aa9afe0",
+    "firstName": "Hinton",
+    "lastName": "Avery",
+    "fullName": "Hinton Avery",
+    "email": "hintonavery@nebulean.com",
+    "country": "Liechtenstein",
+    "starred": false,
+    "hasReport": true,
+    "status": "info",
+    "checked": false,
+    "trend": "up",
+    "color": "info",
+    "graph": "M 5 30 C 10 5, 30 10, 40 30 S 30 30, 90 40",
+    "graphColor": "#e34a4a"
+  }
+]

+ 1 - 0
src/env.d.ts

@@ -0,0 +1 @@
+/// <reference types="vite/client" />

+ 23 - 0
src/i18n/index.ts

@@ -0,0 +1,23 @@
+import { createI18n } from 'vue-i18n'
+
+const fileNameToLocaleModuleDict = import.meta.globEager('./locales/*.json')
+
+const messages: { [P: string]: Record<string, string> } = {}
+Object.entries(fileNameToLocaleModuleDict)
+  .map(([fileName, localeModule]) => {
+    const fileNameParts = fileName.split('/')
+    const fileNameWithoutPath = fileNameParts[fileNameParts.length - 1]
+    const localeName = fileNameWithoutPath.split('.json')[0]
+
+    return [localeName, localeModule.default]
+  })
+  .forEach((localeNameLocaleMessagesTuple) => {
+    messages[localeNameLocaleMessagesTuple[0]] = localeNameLocaleMessagesTuple[1]
+  })
+
+export default createI18n({
+  legacy: false,
+  locale: 'gb',
+  fallbackLocale: 'gb',
+  messages,
+})

+ 258 - 0
src/i18n/locales/br.json

@@ -0,0 +1,258 @@
+{
+  "auth": {
+    "agree": "Eu aceito.",
+    "alreadyJoined": "Já entrou.",
+    "createAccount": "Criar conta",
+    "createNewAccount": "Criar uma nova conta",
+    "email": "Email",
+    "login": "Entrar",
+    "password": "Senha",
+    "signUp": "Cadastrar-se",
+    "termsOfUse": "Termos de uso.",
+    "welcome": "Bem vindo!"
+  },
+  "buttons": {
+    "advanced": "Icones, Grupos, Dropdowns",
+    "button": "BOTÃO",
+    "colors": "Cores",
+    "disabled": "DESABILITADO",
+    "dropdown": "DROPDOWN",
+    "hover": "HOVER",
+    "main": "Primeiro & Segundo Botão",
+    "micro": "MICRO",
+    "pressed": "PRESSIONADO",
+    "small": "PEQUENO"
+  },
+  "charts": {
+    "horizontalBarChart": "Barra de Gráfico Horizontal",
+    "verticalBarChart": "Barra de Gráfico Vertical",
+    "lineChart": "Gráfico de Linha",
+    "pieChart": "Gráfico Pizza",
+    "donutChart": "Gráfico Rosca",
+    "bubbleChart": "Gráfico Bolhas"
+  },
+  "dashboard": {
+    "success": "SUCESSO",
+    "successMessage": "Você leu com sucesso esta mensagem importante de alerta.",
+    "elements": "Elementos",
+    "teamMembers": "Membros da Equipe",
+    "versions": "Versões",
+    "table": {
+      "title": "Mesa impressionante",
+      "brief": "Breve",
+      "detailed": "Detalhado",
+      "resolve": "Resolver",
+      "resolved": "Resolvido"
+    }
+  },
+  "notificationsPage": {
+    "alerts": {
+      "title": "Alertas",
+      "success": "SUCESSO",
+      "successMessage": "Você leu com sucesso esta mensagem importante de alerta.",
+      "info": "INFORMAÇÃO",
+      "infoMessage": "Esse alerta precisa da sua atenção, mas não é super importante.",
+      "warning": "AVISO",
+      "warningMessage": "Melhor verificar a si mesmo, você não está muito bem.",
+      "danger": "PERÍGO",
+      "dangerMessage": "Mude algumas coisas e tente enviar novamente."
+    },
+    "popovers": {
+      "title": "Dicas de ferramentas & Pop-Ups",
+      "popoverTitleLabel": "Título Popover",
+      "popoverTextLabel": "Texto Popover",
+      "popoverIconLabel": "Icone Popover (fontawesome)",
+      "showPopover": "Mostrar Popover",
+      "topTooltip": "top dicas de ferramentas",
+      "rightTooltip": "sugestão ao lado direito",
+      "leftTooltip": "esquerda",
+      "bottomTooltip": "abaixo"
+    },
+    "toasts": {
+      "title": "Torradas",
+      "textLabel": "Texto",
+      "durationLabel": "Duração (milisegundos)",
+      "iconLabel": "Icone (fontawesome)",
+      "fullWidthLabel": "Largura completa",
+      "launchToast": "Launch toast"
+    }
+  },
+  "forms": {
+    "controls": {
+      "title": "Checkboxes, Radios, Switches",
+      "radioDisabled": "Radio Desabilitado",
+      "radio": "Radio",
+      "subscribe": "Assine a newsletter"
+    },
+    "dateTimePicker": {
+      "title": "Seletores de data e hora",
+      "basic": "Básico",
+      "time": "Hora",
+      "range": "Alcance",
+      "multiple": "Múltiplo",
+      "manualInput": "Entrada manual",
+      "disabled": "Desabilitado"
+    },
+    "inputs": {
+      "emailValidatedSuccess": "Email (validado com sucesso)",
+      "emailValidated": "Email (validado)",
+      "inputWithIcon": "Entrada com ícone",
+      "inputWithButton": "Entrada com botão",
+      "inputWithClearButton": "Entrada com Botão Claro",
+      "inputWithRoundButton": "Entrada com Botão Redondo",
+      "textInput": "Entrada de Texto",
+      "textInputWithDescription": "Entrada de Texto (com descrição)",
+      "textArea": "Área de Texto",
+      "title": "Entrada",
+      "upload": "UPLOAD"
+    },
+    "mediumEditor": {
+      "title": "Editor Medium"
+    },
+    "selects": {
+      "country": "Selecionar Região",
+      "countryMulti": "Selecionar Multiplas Regiões",
+      "multi": "Selecionar Múltiplos",
+      "simple": "Selecionador Simples",
+      "title": "Selecionadores"
+    }
+  },
+  "grid": {
+    "desktop": "Grid Área de Trabalho",
+    "fixed": "Grid Fixo",
+    "offsets": "Offsets",
+    "responsive": "Grid Responssivo"
+  },
+  "icons": {
+    "back": "Retornar aos icones",
+    "none": "Incones não encontrados",
+    "search": "Pesquisar Icone",
+    "title": "Icones"
+  },
+  "spinners": {
+    "title": "Spinners",
+    "poweredBy": "Distribuido por"
+  },
+  "language": {
+    "brazilian_portuguese": "Português",
+    "english": "English",
+    "spanish": "Spanish",
+    "simplified_chinese": "Chinês simplificado"
+  },
+  "menu": {
+    "auth": "Autorização",
+    "buttons": "Botões",
+    "charts": "Gráficos",
+    "colorPickers": "Colhedores de Cor",
+    "dashboard": "Painel principal",
+    "formElements": "Elementos de Formulários",
+    "forms": "Formulários",
+    "mediumEditor": "Editor Medium",
+    "grid": "Grid",
+    "icons": "Icones",
+    "cards": "Cards",
+    "spinners": "Spinners",
+    "login": "Login",
+    "maps": "Mapas",
+    "modals": "Modals",
+    "notifications": "Notificações",
+    "progressBars": "Barra de progresso",
+    "signUp": "Cadastrar-se",
+    "statistics": "Estatística",
+    "lists": "Listas",
+    "tables": "Tabelas",
+    "markupTables": "Tabelas de Marcação",
+    "dataTables": "Tabelas de Dados",
+    "typography": "Tipografia",
+    "uiElements": "Elementos UI",
+    "treeView": "Árvore de visualização",
+    "dateTimePickers": "Selecionar Data e Hora",
+    "chat": "Gráficos"
+  },
+  "messages": {
+    "all": "Ver todas as menssagens",
+    "new": "Nova menssagem de {name}"
+  },
+  "modal": {
+    "cancel": "CANCELAR",
+    "close": "FECHAR",
+    "confirm": "CONFIRMAR",
+    "large": "Grande",
+    "largeTitle": "Modal Grande",
+    "medium": "Médio",
+    "mediumTitle": "Modal Médio",
+    "small": "Pequeno",
+    "smallTitle": "Modal Pequeno",
+    "static": "Estático",
+    "staticMessage": "Este é um modal é estático, clicar no pano de fundo não o fechará.",
+    "staticTitle": "Modal Estático",
+    "title": "Modals"
+  },
+  "navbar": {
+    "messageUs": "Enviar uma pergunta ou feedback para"
+  },
+  "notifications": {
+    "all": "Ver todas as notificações",
+    "sentMessage": "{name} enviou uma menssagem",
+    "uploadedZip": "{name} fez uploaded de um novo arquivo Zip com {type}",
+    "startedTopic": "{name} iniciou um novo tópico"
+  },
+  "progressBars": {
+    "circle": "Círculo",
+    "horizontal": "Horizontal",
+    "state": "Doença",
+    "colors": "Cores"
+  },
+  "lists": {
+    "customers": "Clientes",
+    "recentMessages": "Mensagens Recentes",
+    "archieved": "Arquivado",
+    "starterKit": "Kit iniciante",
+    "notifications": "Notificações"
+  },
+  "tables": {
+    "basic": "Mesa Básica",
+    "stripedHoverable": "Listrado, flutuante",
+    "labelsActions": "Etiquetas, ações como botões",
+    "sortingPaginationActionsAsIcons": "Ordenação, Paginação, Ações como Ícones",
+    "star": "Star",
+    "unstar": "Unstar",
+    "edit": "Editar",
+    "delete": "Excluir",
+    "searchByName": "Procura por nome",
+    "searchTrendsBadges": "Pesquisa, Tendências, Emblemas",
+    "perPage": "Por página",
+    "report": "Relatório",
+    "infiniteScroll": "Rolagem infinita",
+    "selectable": "Selecionável",
+    "selected": "Selecionado",
+    "serverSidePagination": "Server-Side Paginação",
+    "emptyTable": "Mesa Vazia",
+    "noDataAvailable": "Nenhum dado disponível.",
+    "noReport": "Não há dados para exibir. O relatório estará disponível em 3 de novembro de 2018.",
+    "loading": "Carregando",
+    "headings": {
+      "email": "Email",
+      "name": "Nome",
+      "firstName": "Primeiro nome",
+      "lastName": "Último nome",
+      "status": "Status",
+      "country": "País"
+    }
+  },
+  "user": {
+    "language": "Trocar Linguagem",
+    "logout": "Sair",
+    "profile": "Meu Perfil"
+  },
+  "treeView": {
+    "basic": "Básico",
+    "icons": "Icones",
+    "selectable": "Selecionável",
+    "editable": "Editável",
+    "advanced": "Advançado"
+  },
+  "chat": {
+    "title": "Gráficos"
+  }
+}

+ 323 - 0
src/i18n/locales/cn.json

@@ -0,0 +1,323 @@
+{
+  "auth": {
+    "agree": "我同意",
+    "createAccount": "创建账号",
+    "createNewAccount": "创建新账号",
+    "email": "电子邮箱",
+    "login": "登录",
+    "password": "密码",
+    "signUp": "注册",
+    "termsOfUse": "使用条款"
+  },
+  "buttons": {
+    "advanced": "图标、组、下拉菜单",
+    "button": "按钮",
+    "colors": "颜色",
+    "disabled": "禁用",
+    "dropdown": "下拉菜单",
+    "hover": "悬停状态",
+    "main": "主按钮和辅助按钮",
+    "micro": "微型的",
+    "pressed": "按下",
+    "small": "小的"
+  },
+  "charts": {
+    "horizontalBarChart": "横条图",
+    "verticalBarChart": "纵条图",
+    "lineChart": "线形图",
+    "pieChart": "饼图",
+    "donutChart": "环形图",
+    "bubbleChart": "气泡图"
+  },
+  "collapse": {
+    "accordion": "Accordion",
+    "buttons": "按钮"
+  },
+  "dashboard": {
+    "success": "成功",
+    "successMessage": "您已成功阅读此重要通知。",
+    "elements": "元素",
+    "teamMembers": "团队成员",
+    "versions": "版本"
+  },
+  "notificationsPage": {
+    "alerts": {
+      "title": "警报",
+      "success": "成功",
+      "successMessage": "您已成功阅读此重要警报消息。",
+      "info": "信息",
+      "infoMessage": "此警报需要您的注意,但这并不是特别重要。",
+      "warning": "警告",
+      "warningMessage": "最好检查一下,现在状态好像不太好。",
+      "danger": "危险",
+      "dangerMessage": "请更改一些内容并尝试再次提交。"
+    },
+    "popovers": {
+      "title": "工具提示和弹出框",
+      "popoverTitleLabel": "弹出框的标题",
+      "popoverTextLabel": "弹出框的内容",
+      "popoverIconLabel": "弹出框的图标(fontAwesome)",
+      "showPopover": "显示弹出框",
+      "topTooltip": "上侧提示",
+      "rightTooltip": "右侧提示",
+      "leftTooltip": "左侧提示",
+      "bottomTooltip": "下侧提示"
+    },
+    "toasts": {
+      "title": "提示框",
+      "textLabel": "提示文本",
+      "durationLabel": "持续时间(毫秒)",
+      "iconLabel": "图标(fontAwesome)",
+      "fullWidthLabel": "全宽",
+      "launchToast": "加载提示框"
+    }
+  },
+  "forms": {
+    "controls": {
+      "female": "女",
+      "male": "男",
+      "title": "复选框,单选框,开关",
+      "radioDisabled": "禁用的单选框",
+      "radio": "单选框",
+      "subscribe": "订阅消息",
+      "unselected": "未选中的复选框",
+      "selected": "选中的复选框",
+      "readonly": "只读的复选框",
+      "disabled": "禁用的复选框",
+      "error": "错误状态的复选框",
+      "errorMessage": "带错误信息的复选框"
+    },
+    "dateTimePicker": {
+      "title": "日期时间选择器",
+      "basic": "基本的",
+      "time": "时间",
+      "range": "范围",
+      "multiple": "多重的",
+      "manualInput": "手動輸入",
+      "disabled": "禁用",
+      "customFirstDay": "自定义起始日",
+      "customDateFormat": "自定义日期格式"
+    },
+    "inputs": {
+      "emailValidatedSuccess": "电子邮件(验证成功)",
+      "emailValidated": "电子邮件(验证失败)",
+      "inputWithIcon": "带图标的输入框",
+      "inputWithButton": "带按钮的输入框",
+      "inputWithClearButton": "带清空图标的输入框",
+      "inputWithRoundButton": "带圆形按钮的输入框",
+      "textInput": "文本输入",
+      "textInputWithDescription": "文本输入(带说明)",
+      "textArea": "多行文本框",
+      "title": "输入框",
+      "upload": "上传"
+    },
+    "mediumEditor": {
+      "title": "Medium 编辑器"
+    },
+    "selects": {
+      "country": "国家选择框",
+      "countryMulti": "国家多选框",
+      "multi": "多选框",
+      "simple": "单选框",
+      "title": "选择框"
+    }
+  },
+  "grid": {
+    "desktop": "桌面网格",
+    "fixed": "固定网格",
+    "offsets": "偏移量",
+    "responsive": "响应网格"
+  },
+  "icons": {
+    "back": "回退图标",
+    "none": "没找到图标",
+    "search": "图标搜索",
+    "title": "图标"
+  },
+  "spinners": {
+    "title": "Spinners",
+    "poweredBy": "技术支持"
+  },
+  "language": {
+    "brazilian_portuguese": "葡萄牙语",
+    "english": "英语",
+    "spanish": "西班牙语",
+    "simplified_chinese": "简体中文",
+    "persian": "波斯语"
+  },
+  "menu": {
+    "auth": "授权",
+    "buttons": "按钮",
+    "charts": "图表",
+    "colorPickers": "颜色选择器",
+    "collapse": "折叠器",
+    "timelines": "时间线",
+    "dashboard": "仪表板",
+    "formElements": "表单元素",
+    "forms": "表单",
+    "mediumEditor": "Medium Editor",
+    "grid": "网格",
+    "icons": "图标",
+    "cards": "卡片",
+    "spinners": "Spinners",
+    "login": "登录",
+    "maps": "地图",
+    "pages": "页面",
+    "modals": "模态对话框",
+    "notifications": "通知",
+    "progressBars": "进度条",
+    "signUp": "注册",
+    "statistics": "统计",
+    "tables": "表格",
+    "tags": "标签",
+    "typography": "段落",
+    "uiElements": "UI 元素",
+    "treeView": "树视图",
+    "dateTimePickers": "日期时间选择器",
+    "fileUpload": "文件上传",
+    "chat": "聊天"
+  },
+  "messages": {
+    "all": "查看全部消息",
+    "new": "来自{name}的新消息"
+  },
+  "modal": {
+    "cancel": "取消",
+    "close": "关闭",
+    "confirm": "确认",
+    "large": "大型",
+    "largeTitle": "大型模态对话框",
+    "medium": "中型",
+    "mediumTitle": "中型模态对话框",
+    "small": "小型",
+    "smallTitle": "小型模态对话框",
+    "static": "静态",
+    "staticMessage": "这是一个静态对话框,背景点击不会关闭它。",
+    "staticTitle": "静态对话框",
+    "title": "模态对话框"
+  },
+  "dropdown": {
+    "default": "默认项",
+    "withArrow": "带箭头",
+    "note": "注意",
+    "noteText": "如果屏幕上有足够的空间,下拉框将按指定方向打开,否则方向将自动更改"
+  },
+  "fileUpload": {
+    "advancedMediaGallery": "高级,媒体库",
+    "advancedUploadList": "高级,上传列表",
+    "mediaGallery": "媒体库",
+    "uploadList": "上传列表",
+    "single": "单独",
+    "dragNdropFiles": "拖放文件,或者",
+    "uploadedOn": "已上传",
+    "fileDeleted": "文件已成功删除",
+    "undo": "复原",
+    "preview": "预览",
+    "delete": "删除",
+    "deleteFile": "删除文件",
+    "uploadFile": "上传文件",
+    "uploadMedia": "上传媒体文件",
+    "addAttachment": "添加附件",
+    "modalTitle": "文件验证",
+    "modalText": "文件类型不正确!"
+  },
+  "tags": {
+    "default": "默认的",
+    "removable": "可移除",
+    "colored": "彩色的"
+  },
+  "navbar": {
+    "messageUs": "需要Web开发帮助吗?请联系我们。"
+  },
+  "notifications": {
+    "all": "查看所有通知",
+    "sentMessage": "{name} 给你发了一条消息",
+    "uploadedZip": "{name} 上传了一个新的Zip文件 {type}",
+    "startedTopic": "{name} 开始了一个新话题"
+  },
+  "timelines": {
+    "horizontalSimple": "水平简单",
+    "horizontalCards": "水平卡片",
+    "verticalSimple": "垂直简单",
+    "verticalLabel": "垂直带标签",
+    "verticalCentered": "垂直居中",
+    "firstDate": "2018年2月",
+    "secondDate": "2018年3月",
+    "thirdDate": "2018年4月",
+    "cardsSecondInfo": "它们存在于各种栖息地,比如草原。",
+    "cardsThirdInfo": "然而,各种人为因素对斑马种群产生了严重影响",
+    "verticalSimpleCardsFirstInfo": "独特的斑马条纹使它们成为人们最熟悉的动物之一。 它们出现在各种栖息地,如草原,热带稀树草原,林地,棘手的灌木丛中。",
+    "verticalSimpleCardsSecondInfo": "然而,各种人为因素对斑马种群产生了严重影响"
+  },
+  "progressBars": {
+    "basic": "基本的",
+    "basicVertical": "基本垂直",
+    "circle": "圆形",
+    "colorFulTitle": "彩色条型",
+    "thin": "窄型",
+    "thinVertical": "垂直窄型",
+    "thick": "宽型",
+    "title": "进度条"
+  },
+  "tables": {
+    "basic": "基本表格",
+    "styled": "颜色,图标,标签",
+    "advanced": "搜索和分页",
+    "headings": {
+      "city": "城市",
+      "email": "电子邮箱",
+      "name": "姓名",
+      "score": "分数"
+    },
+    "dataTable": {
+      "noDataAvailable": "无可用数据"
+    }
+  },
+  "user": {
+    "language": "修改语言",
+    "logout": "注销",
+    "profile": "个人信息"
+  },
+  "treeView": {
+    "basic": "基本型",
+    "icons": "图标",
+    "selectable": "可选择",
+    "editable": "可编辑",
+    "advanced": "高级"
+  },
+  "chat": {
+    "title": "聊天"
+  },
+  "cards": {
+    "cards": "卡片",
+    "fixed": "固定的",
+    "floating": "浮动的",
+    "contentText": "独特的斑马条纹使它们成为人们最熟悉的动物之一。",
+    "rowHeight": "行高",
+    "title": {
+      "dark": "暗色背景",
+      "bright": "亮色卡片",
+      "titleOnImageNoOverlay": "图像上的标题,但没有叠加",
+      "normal": "标准卡",
+      "overlayAndTextOnImage": "图像上有覆盖和文本的卡片",
+      "stripeNoImage": "无图像条纹卡"
+    },
+    "button": {
+      "main": "主要",
+      "cancel": "取消"
+    },
+    "link": {
+      "edit": "编辑",
+      "setAsDefault": "设为默认",
+      "delete": "删除",
+      "traveling": "Traveling",
+      "france": "法国",
+      "review": "评论",
+      "feedback": "反馈信息",
+      "readFull": "阅读全文",
+      "secondaryAction": "第二行为",
+      "action1": "行为 1",
+      "action2": "行为 2"
+    }
+  }
+}

+ 258 - 0
src/i18n/locales/es.json

@@ -0,0 +1,258 @@
+{
+  "auth": {
+    "agree": "Acepto",
+    "createAccount": "Create cuenta",
+    "createNewAccount": "Crear cuenta",
+    "email": "Email",
+    "login": "Iniciar sesión",
+    "password": "Contraseña",
+    "signUp": "Registrar",
+    "termsOfUse": "Los terminos de uso"
+  },
+  "buttons": {
+    "advanced": "Iconos, Grupos, Dropdowns",
+    "button": "BOTON",
+    "colors": "Colores",
+    "disabled": "DESHABILITADO",
+    "dropdown": "DESPLEGABLE",
+    "hover": "HOVER",
+    "main": "Botón Primario y Secundario",
+    "micro": "MICRO",
+    "pressed": "PRESIONADO",
+    "small": "PEQUEÑO"
+  },
+  "charts": {
+    "bubbleChart": "Bubble Chart",
+    "donutChart": "Donut Chart",
+    "horizontalBarChart": "Horizontal Bar Chart",
+    "lineChart": "Line Chart",
+    "pieChart": "Pie Chart",
+    "verticalBarChart": "Vertical Bar Chart"
+  },
+  "collapse": {
+    "accordion": "Acordeón",
+    "buttons": "Botones"
+  },
+  "dashboard": {
+    "elements": "Elementos",
+    "success": "ÉXITO",
+    "successMessage": "Ha leído correctamente este mensaje de alerta importante.",
+    "teamMembers": "Miembros del Equipo",
+    "versions": "Versiones",
+    "table": {
+      "title": "Mesa impresionante",
+      "brief": "Breve",
+      "detailed": "Detallado",
+      "resolve": "Resolver",
+      "resolved": "Resuelto"
+    }
+  },
+  "notificationsPage": {
+    "alerts": {
+      "title": "Alerts",
+      "success": "ÉXITO",
+      "successMessage": "Ha leído correctamente este mensaje de alerta importante.",
+      "info": "INFO",
+      "infoMessage": "Esta alerta necesita tu atención, pero no es muy importante.",
+      "warning": "ADVERTENCIA",
+      "warningMessage": "Mejor compruébalo, esto no pinta bien.",
+      "danger": "PELIGRO",
+      "dangerMessage": "Cambiar algunas cosas e enviarlo de nuevo."
+    },
+    "popovers": {
+      "title": "Tooltips & Popovers",
+      "popoverTitleLabel": "Title de Popover",
+      "popoverTextLabel": "Texto de Popover",
+      "popoverIconLabel": "Icono de Popover (fontawesome)",
+      "showPopover": "Mostrar Popover",
+      "topTooltip": "tope tooltip",
+      "rightTooltip": "derecha tooltip",
+      "leftTooltip": "izquierda",
+      "bottomTooltip": "fondo"
+    },
+    "Toasts": {
+      "title": "tostadas",
+      "textLabel": "Texto",
+      "durationLabel": "Duración (milisegundos)",
+      "iconLabel": "Icono (fontawesome)",
+      "fullWidthLabel": "Ancho total",
+      "launchToast": "Lanzar tostadas"
+    }
+  },
+  "forms": {
+    "controls": {
+      "title": "Checkboxes, Radios, Switches",
+      "radioDisabled": "Radio Desactivado",
+      "radio": "Radio",
+      "subscribe": "Suscribirse a la newsletter"
+    },
+    "inputs": {
+      "emailValidatedSuccess": "Email (validado con éxito)",
+      "emailValidated": "Email (validado)",
+      "inputWithIcon": "Input con Icono",
+      "inputWithButton": "Input con Boton",
+      "inputWithClearButton": "Input With Clear Button",
+      "inputWithRoundButton": "Input With Round Button",
+      "textInput": "Input de Texto",
+      "textInputWithDescription": "Input de Texto (con descripcion)",
+      "textArea": "Text Area",
+      "title": "Inputs",
+      "upload": "SUBIR"
+    },
+    "mediumEditor": {
+      "title": "Medium Editor"
+    },
+    "selects": {
+      "country": "País Select",
+      "countryMulti": "País Multi Select",
+      "multi": "Multi Select",
+      "simple": "Select Simple",
+      "title": "Selects"
+    }
+  },
+  "grid": {
+    "fixed": "Grid Fijo",
+    "desktop": "Desktop Grid",
+    "responsive": "Responsive Grid",
+    "offsets": "Offsets"
+  },
+  "icons": {
+    "back": "Volver a los iconos",
+    "none": "No se han encontrado iconos",
+    "search": "Búsqueda de iconos",
+    "title": "Iconos"
+  },
+  "language": {
+    "brazilian_portuguese": "Português",
+    "english": "English",
+    "spanish": "Spanish",
+    "simplified_chinese": "Versión abreviada"
+  },
+  "menu": {
+    "auth": "Autenticación",
+    "buttons": "Botones",
+    "charts": "Gráficos",
+    "collapse": "Colapso",
+    "colorPickers": "Selector de color",
+    "dashboard": "Dashboard",
+    "formElements": "Elementos de un Formulario",
+    "forms": "Formularios",
+    "mediumEditor": "Medium Editor",
+    "grid": "Grid",
+    "icons": "Iconos",
+    "cards": "Cards",
+    "login": "Iniciar sesión",
+    "maps": "Mapas",
+    "modals": "Modals",
+    "notifications": "Notificaciones",
+    "progressBars": "Barras de Progreso",
+    "signUp": "Registrar",
+    "statistics": "Estadisticas",
+    "lists": "Listas",
+    "tables": "Tablas",
+    "markupTables": "Tablas de Marcado",
+    "dataTables": "Tablas de Datos",
+    "typography": "Tipografía",
+    "uiElements": "Elementos UI",
+    "colors": "Colores",
+    "chat": "Chat"
+  },
+  "messages": {
+    "all": "Ver todos los mensajes",
+    "new": "Nuevo mensajes de {name}"
+  },
+  "modal": {
+    "cancel": "CANCELAR",
+    "close": "CERRAR",
+    "confirm": "CONFIRMAR",
+    "large": "Largo",
+    "largeTitle": "Modal Largo",
+    "medium": "Mediano",
+    "mediumTitle": "Modal Mediana",
+    "small": "Pequeño",
+    "static": "Estático",
+    "smallTitle": "Modal Pequeña",
+    "staticMessage": "Esto es un modal estático. No se cerrará haciendo clic en el fondo.",
+    "staticTitle": "Modal Estático",
+    "title": "Modals"
+  },
+  "fileUpload": {
+    "advancedMediaGallery": "Avanzado, Galería de medios",
+    "advancedUploadList": "Avanzado, lista de carga",
+    "mediaGallery": "Galería media",
+    "uploadList": "Lista de carga",
+    "single": "Soltero",
+    "dragNdropFiles": "Arrastrar y soltar archivos",
+    "uploadedOn": "Subido en",
+    "fileDeleted": "El archivo fue eliminado exitosamente",
+    "undo": "Deshacer",
+    "preview": "Avance",
+    "delete": "Borrar",
+    "deleteFile": "Borrar archivo",
+    "uploadFile": "Subir archivo",
+    "uploadMedia": "Cargar medios",
+    "addAttachment": "Añadir un adjunto",
+    "modalTitle": "Validación de archivo",
+    "modalText": "El tipo de archivo es incorrecto!"
+  },
+  "navbar": {
+    "messageUs": "Envíenos sus preguntas o comentarios a"
+  },
+  "notifications": {
+    "all": "Ver todos los notificaciones",
+    "sentMessage": "{name} te ha mandado un mensaje",
+    "uploadedZip": "{name} ha subido un archivo Zip con {type}",
+    "startedTopic": "{name} ha creado una tema nueva"
+  },
+  "progressBars": {
+    "circle": "Circulo",
+    "horizontal": "Horizontal",
+    "state": "Сondición",
+    "colors": "Colores"
+  },
+  "lists": {
+    "customers": "Clientes",
+    "recentMessages": "Mensajes recientes",
+    "archieved": "Archivado",
+    "starterKit": "Kit de inicio",
+    "notifications": "Notificaciones"
+  },
+  "tables": {
+    "basic": "Tabla basica",
+    "stripedHoverable": "Rayado, Hoverable",
+    "labelsActions": "Etiquetas, Acciones como Botones",
+    "sortingPaginationActionsAsIcons": "Clasificación, Paginación, Acciones como Iconos",
+    "star": "Star",
+    "unstar": "Unstar",
+    "edit": "Editar",
+    "delete": "Borrar",
+    "searchByName": "Buscar por nombre",
+    "searchTrendsBadges": "Búsqueda, Tendencias, Insignias",
+    "perPage": "Por página",
+    "report": "Informe",
+    "infiniteScroll": "Scroll infinito",
+    "selectable": "Seleccionable",
+    "selected": "Seleccionado",
+    "serverSidePagination": "Server-Side Paginación",
+    "emptyTable": "Mesa vacía",
+    "noDataAvailable": "Datos no disponibles.",
+    "noReport": "No hay datos para mostrar. El informe estará disponible el 3 de noviembre de 2018.",
+    "loading": "Cargando",
+    "headings": {
+      "email": "Email",
+      "name": "Nombre",
+      "firstName": "Nombre de pila",
+      "lastName": "Apellido",
+      "status": "Estado",
+      "country": "País"
+    }
+  },
+  "chat": {
+    "title": "Chat"
+  },
+  "user": {
+    "language": "Cambiar Idioma",
+    "profile": "Mi Perfil",
+    "logout": "Cerrar Sesión"
+  }
+}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác