hjr 3 tháng trước cách đây
mục cha
commit
315b31093a
67 tập tin đã thay đổi với 12785 bổ sung2 xóa
  1. 49 0
      .eslintrc.json
  2. 25 0
      .gitignore
  3. 6 0
      .prettierignore
  4. 17 0
      LICENSE.md
  5. 136 2
      README.md
  6. 7706 0
      package-lock.json
  7. 57 0
      package.json
  8. 87 0
      scripts/gen/index.js
  9. 43 0
      scripts/gen/template.ux
  10. 36 0
      scripts/selfCloseInputTag.js
  11. 17 0
      src/app.ux
  12. 17 0
      src/assets/data/book-content.js
  13. 8 0
      src/assets/data/book-list.js
  14. 87 0
      src/assets/data/comment.js
  15. 575 0
      src/assets/data/contents.js
  16. BIN
      src/assets/fonts/仓耳非白W02.ttf
  17. BIN
      src/assets/fonts/千图笔锋手写体.ttf
  18. BIN
      src/assets/fonts/字体传奇南安体.ttf
  19. BIN
      src/assets/iconfont/iconfont.ttf
  20. 1 0
      src/assets/images/back.svg
  21. BIN
      src/assets/images/cancel.png
  22. 1 0
      src/assets/images/earphone.svg
  23. BIN
      src/assets/images/honglou.jpg
  24. BIN
      src/assets/images/honglou_row.jpeg
  25. BIN
      src/assets/images/jinpingmei.jpeg
  26. BIN
      src/assets/images/jinpingmei_row.jpeg
  27. 1 0
      src/assets/images/moon.svg
  28. BIN
      src/assets/images/no-data.png
  29. BIN
      src/assets/images/sanguo.jpg
  30. BIN
      src/assets/images/sanguo_row.jpg
  31. BIN
      src/assets/images/shuihu.jpg
  32. BIN
      src/assets/images/shuihu_row.png
  33. 1 0
      src/assets/images/sun.svg
  34. BIN
      src/assets/images/xiyou.jpg
  35. BIN
      src/assets/images/xiyou_row.jpeg
  36. 1342 0
      src/assets/js/appStatistics.min_new.js
  37. 4 0
      src/assets/js/statistics.config.js
  38. BIN
      src/assets/logo.png
  39. 253 0
      src/assets/styles/common.less
  40. 79 0
      src/assets/styles/iconfont.less
  41. 4 0
      src/assets/styles/index.less
  42. 15 0
      src/assets/styles/mixins.less
  43. 32 0
      src/assets/styles/variables.less
  44. 40 0
      src/components/book-detail/comment-item-simple.ux
  45. 77 0
      src/components/book-detail/comment-item.ux
  46. 65 0
      src/components/book-detail/info.ux
  47. 128 0
      src/components/bookshelf/index.ux
  48. 38 0
      src/components/contents/contents-list.ux
  49. 166 0
      src/components/library/book-list.ux
  50. 98 0
      src/components/library/index.ux
  51. 87 0
      src/components/search-book/index.ux
  52. 47 0
      src/components/search-book/search-input-bar.ux
  53. 39 0
      src/helper/ajax.js
  54. 7 0
      src/helper/apis/common.js
  55. 11 0
      src/helper/apis/index.js
  56. 3 0
      src/helper/index.js
  57. 81 0
      src/helper/utils.js
  58. 106 0
      src/manifest.json
  59. 402 0
      src/pages/book-content/index.ux
  60. 214 0
      src/pages/book-detail/index.ux
  61. 127 0
      src/pages/comment-all/index.ux
  62. 58 0
      src/pages/comment-reply/index.ux
  63. 51 0
      src/pages/comment/index.ux
  64. 115 0
      src/pages/contents/index.ux
  65. 111 0
      src/pages/main/index.ux
  66. 109 0
      src/pages/search/index.ux
  67. 6 0
      src/sitemap.json

+ 49 - 0
.eslintrc.json

@@ -0,0 +1,49 @@
+{
+  "env": {
+    "commonjs": true,
+    "node": true,
+    "es6": true
+  },
+  "extends": "eslint:recommended",
+  "parser": "babel-eslint",
+  "parserOptions": {
+    "sourceType": "module",
+    "ecmaVersion": 6,
+    "ecmaFeatures": {
+      "experimentalObjectRestSpread": true,
+      "jsx": true
+    }
+  },
+  "globals": {
+    "loadData": false,
+    "saveData": false,
+    "history": false,
+    "console": true,
+    "setTimeout": false,
+    "clearTimeout": false,
+    "setInterval": false,
+    "clearInterval": false,
+    "TextDecoder": true,
+    "$utils": true,
+    "$shelfList": true
+  },
+  "plugins": ["hybrid"],
+  "rules": {
+    "no-console": "off",
+    "no-unused-vars": [
+      "warn",
+      {
+        "varsIgnorePattern": "prompt"
+      }
+    ],
+    "quotes": [
+      "warn",
+      "single",
+      {
+        "avoidEscape": true,
+        "allowTemplateLiterals": true
+      }
+    ],
+    "linebreak-style": ["warn", "unix"]
+  }
+}

+ 25 - 0
.gitignore

@@ -0,0 +1,25 @@
+.DS_Store
+node_modules
+/dist
+/build
+/sign
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*
+.ide
+.quickapp.preview.json

+ 6 - 0
.prettierignore

@@ -0,0 +1,6 @@
+package.json
+manifest.json
+README.md
+
+# assets/js
+src/assets/js/*.js

+ 17 - 0
LICENSE.md

@@ -0,0 +1,17 @@
+Copyright (c) Hap Team
+
+All rights reserved.
+ 
+MIT License
+
+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.

+ 136 - 2
README.md

@@ -1,3 +1,137 @@
-# novelQuick
+# 快应用 图书模版
+
+## 1、文件结构
+
+```
+├── sign                # 存储 rpk 包签名模块;
+│   ├── debug           # 调试环境证书/私钥文件
+│   └── release         # 正式环境证书/私钥文件
+└── src
+│   ├── assets          # 公用的资源(images/styles/字体...)
+│   │   ├──images       # 存储 png/jpg/svg 等公共图片资源
+│   │   └──styles       # 存放 less/css/sass 等公共样式资源
+│   │   └──js           # 存储公共 javaScript 代码资源
+│   │   └──data         # 模拟数据(开发时应使用真实接口数据)
+│   │   └──iconfont     # 存放图标字体
+│   ├── helper          # 项目自定义辅助各类工具
+│   │   ├──apis         # 存储与后台请求接口相关(已封装好)
+│   │   ├──ajax.js      # 对系统提供的 fetch api 进行链式封装
+│   │   └──utils        # 存放项目所封装的工具类方法
+│   ├── pages           # 统一存放项目页面级代码
+│   ├── app.ux          # 应用程序代码的人口文件
+│   ├── manifest.json   # 配置快应用基本信息
+│   └── components      # 组件
+└── package.json        # 定义项目需要的各种模块及配置信息
+```
+
+## 2、如果需要轻粒子统计功能服务
+
+首先需要前往轻粒子官网注册, 在创建应用之后可以获得app_key,
+然后需要在 `/src/assets/js/statistics.config.js` 文件中配置好自己的app_key。
+
+## 3、模版说明
+
+本项目为快应用图书模版。
+
+`main` 页面:
+- 书架:
+    - 编辑:点击“编辑”,可以删除收藏图书,点击“完成”确认删除,点击“取消”则取消删除操作。
+    - 点击收藏的图书,进入 `book-content` 页面。
+- 书城:
+    - 点击图书的swiper、榜单、列表,进入 `book-detail` 页面。
+    - 滚动到底部,加载更多图书。
+- 查找:
+    - 输入框:填写内容后,按 “enter” 或点查询按键,进入 `search` 页面;如果输入框为空,则提示“输入不能为空”。
+    - 大家都在搜:点击图书标签,进入 `search` 页面;点击刷新按键,更新图书标签。
+
+`book-content`页面:
+- 图书内容。
+- 点击“上一章/下一章”,切换章节。
+- 点击“目录”,进入 `contents` 页面。
+
+`book-detail` 页面:
+- 图书信息:图片、标题、评分、作者、字数、简介。
+- 章节:点击进入 `contents` 页面。
+- 热门评论:点击进入 `comment-all` 页面。
+- 相似图书推荐:点击图书,进入 `book-detail` 页面。
+- 加入书架:点击将图书加入书架,在 `main` 页面 - “书架” 可以查看加入的图书。
+- 开始阅读:点击进入 `book-content` 页面。
+
+`search` 页面:
+- 进入页面时,根据带入的初始值进行查询。
+- 输入框:填写内容后,按 “enter” 或点查询按键,展示搜索结果(只有搜索到 `src/assets/data/book-list.js` 中的图书);点击搜索出的图书,进入 `book-detail` 页面。
+
+
+`contents`页面:
+- 图书目录。
+- 点击“倒序/正序”图标,切换目录排序。
+- 点击“上一页/下一页”,切换目录页面。
+- 点击章节,进入 `book-content` 页面。
+
+`comment-all` 页面
+- 滑动到底部,加载更多评论。
+- 点击“发表评论”,进入 `comment` 页面。
+- 点击评论下的消息图标,进入 `comment-reply` 页面。
+
+`comment` 页面、`comment-reply` 页面:
+- 填写评论或回复。
+
+
+## 4、如何使用
+
+### 4.1 快应用开发工具调试(推荐 ✅✅)
+推荐下载[快应用开发工具](https://www.quickapp.cn/docCenter/IDEPublicity),可以进行扫码调试/usb调试,还有web预览、语法提示等功能。使用方法,请参见[快应用开发工具文档](https://doc.quickapp.cn/tutorial/ide/overview.html)。
+
+### 4.2 命令行调试
+```bash
+cd book-template && yarn
+yarn start # 推荐 ✅✅
+
+# 或者运行以下命令
+yarn server & yarn watch
+
+# 或者在终端一 Tab 下运行:
+yarn server
+# 在终端另一 Tab 下运行:
+yarn watch
+
+# ✨ 新增「快应用」页面
+yarn gen YourPageName
+```
+
+用一台 `Android` 手机,下载安装[「快应用」调试器](https://www.quickapp.cn/docCenter/post/69),打开后操作`扫码安装`,扫描如上命令生成的二维码,即可看到效果;更多讯息,请参见[快应用环境搭建](https://nice.lovejade.cn/zh/article/develop-quick-app-experience-notes.html#环境搭建)。
+
+
+## 5、Tips:
+
+-  **更优雅的处理数据请求**;采用 `Promise` 对系统内置请求 `@system.fetch` 进行封装,并抛出至全局,使得可以极简的进行链式调用,并能够使用  `finally`;
+
+-  **内置样式处理方案**;「快应用」支持 `less`, `sass` 的预编译;这里采取 `less` 方案,并内置了部分变量,以及常用混合方法,使得可以轻松开启样式编写、复用、修改等;
+
+-  **封装常用方法**;在 `helper/utils` 路径下,有对日期、字符串、系统等常用方法,分别进行封装,统一暴露给 `global.$utils`,使得维护方式更加合理且健壮,同时又可以便捷的使用,高效开发;当然,你也可以根据需要自行增删、抑或扩展;
+
+- **简化开始开发流程**; 注入 [Concurrently](https://github.com/kimmobrunfeldt/concurrently) 插件,使可以运行 `yarn start` 即可开始开发,而无需更多命令,从而简洁开发流程;
+
+-  **添加新增页面命令脚本**;如果需要新建页面,只需运行:`yarn gen YourPageName` ,当然,也可以根据需要,自行定定制模板:*/command/gen/template.ux*;
+
+-  **集成 [Prettier](https://prettier.io/) & [Eslint](https://eslint.org/)**;在检测代码中潜在问题的同时,统一团队代码规范、风格(`js`,`less`,`scss`等),从而促使写出高质量代码,以提升工作效率(尤其针对团队开发);
+
+-  **新增文件监听命令**:引入 [onchange](https://github.com/Qard/onchange) 依赖来监听文件变化;开发时,运行 `yarn prettier-watch` 命令,即可对所修改的 `*.ux` `*.js` 等文件,进行 **Prettier** 格式化,从而大幅度提升编写效率;
+
+-  **优化本地开发端口设定**;「快应用」默认端口为 `12306`,可自定义端口,但使用体验却不够友好;此处参考 `creat-react-app` 设定,对本地开发地址端口使用进行优化:如果指定端口(默认: `8080`)被占用,则向上递增寻找新的可用端口(如:8081 / 8082 / … );
+
+-  **浏览器打开调试主页二维码**;运行 `yarn start`,会启动 HTTP 调试服务器,并将该地址在**命令行终端**显示,手机用快应用调试器扫码,即可下载并运行 rpk 包;当终端积累的信息流多了,就造成扫码不便,故增设在浏览器打开调试主页二维码;如想不使用此功能,在 _command/server.js_ 文件中,将 `autoOpenBrowser` 设置为 `false` 即可;
+
+## 6、内置命令
+
+|  命令 | 描述  | 备注 |
+|---|---|---|
+| `yarn start`  | 开启服务(server)和监听(watch)  | 附魔[多步优化](https://nice.lovejade.cn/zh/article/quickapp-boilerplate-template.html#%E6%94%B9%E8%BF%9B%E4%BC%98%E5%8A%BF),一键开启开发|
+| `yarn server`  | 开启服务(server)  | 如不嫌麻烦,可使用,不推荐 |
+| `yarn watch`  | 开启监听(watch)  | 如不嫌麻烦,可使用,不推荐 |
+| `yarn build ` | 编译打包,生成 `rpk`包  | 对内置 `hap build` 命令的转接 |
+| `yarn release ` | 生成 `rpk`包并增加签名  | 对内置 `hap release` 命令的转接  |
+| `yarn gen `  | 新增「快应用」页面 | 助你高效生成页面,模版可自定义,推荐 ✓|
+| `yarn prettier`  | 一键美化代码(js/css/less/ux)  | 实在是团队开发好帮手,推荐 ✓ |
+| `yarn prettier-watch`  | 对变化代码文件格式、实时美化 | 极大提升代码编写效率,强烈推荐 ✔️|
 
-小说快应用原生

+ 7706 - 0
package-lock.json

@@ -0,0 +1,7706 @@
+{
+  "name": "quickapp-code-book",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "quickapp-code-book",
+      "version": "1.0.0",
+      "dependencies": {
+        "apex-ui": "latest"
+      },
+      "devDependencies": {
+        "@types/quickapp": "npm:quickapp-interface@^1.0.0",
+        "babel-eslint": "^10.1.0",
+        "eslint": "^7.13.0",
+        "eslint-plugin-hybrid": "0.0.5",
+        "husky": "^4.3.0",
+        "less": "^3.9.0",
+        "less-loader": "^4.1.0",
+        "lint-staged": "^10.5.1",
+        "onchange": "^5.2.0",
+        "prettier": "^1.15.3",
+        "prettier-plugin-ux": "^0.3.0"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz",
+      "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.27.1",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.0.tgz",
+      "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/parser": "^7.28.0",
+        "@babel/types": "^7.28.0",
+        "@jridgewell/gen-mapping": "^0.3.12",
+        "@jridgewell/trace-mapping": "^0.3.28",
+        "jsesc": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-globals": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+      "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+      "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.25.9.tgz",
+      "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "dev": true
+    },
+    "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz",
+      "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.28.0"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.27.2",
+      "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz",
+      "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.27.1",
+        "@babel/parser": "^7.27.2",
+        "@babel/types": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.0.tgz",
+      "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.27.1",
+        "@babel/generator": "^7.28.0",
+        "@babel/helper-globals": "^7.28.0",
+        "@babel/parser": "^7.28.0",
+        "@babel/template": "^7.27.2",
+        "@babel/types": "^7.28.0",
+        "debug": "^4.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.28.1",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.1.tgz",
+      "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.27.1",
+        "@babel/helper-validator-identifier": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@blakeembrey/deque": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/@blakeembrey/deque/-/deque-1.0.5.tgz",
+      "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==",
+      "dev": true
+    },
+    "node_modules/@eslint/eslintrc": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+      "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+      "dev": true,
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.1.1",
+        "espree": "^7.3.0",
+        "globals": "^13.9.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^3.13.1",
+        "minimatch": "^3.0.4",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/@humanwhocodes/config-array": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+      "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+      "deprecated": "Use @eslint/config-array instead",
+      "dev": true,
+      "dependencies": {
+        "@humanwhocodes/object-schema": "^1.2.0",
+        "debug": "^4.1.1",
+        "minimatch": "^3.0.4"
+      },
+      "engines": {
+        "node": ">=10.10.0"
+      }
+    },
+    "node_modules/@humanwhocodes/object-schema": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+      "deprecated": "Use @eslint/object-schema instead",
+      "dev": true
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.12",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
+      "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
+      "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
+      "dev": true
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.29",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
+      "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@types/parse-json": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.2.tgz",
+      "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+      "dev": true
+    },
+    "node_modules/@types/quickapp": {
+      "name": "quickapp-interface",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/quickapp-interface/-/quickapp-interface-1.0.0.tgz",
+      "integrity": "sha512-Nod9s9i5fT5rXb4LDCuug2dOhZwnXQdsRbj38ibFhmceh4Q27r4i4JbX0eb41TR5DJMycQFoR3wxhM4DDdyvlA==",
+      "dev": true
+    },
+    "node_modules/@webassemblyjs/ast": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/helper-api-error": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/helper-buffer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/helper-code-frame": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/helper-fsm": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/helper-module-context": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/helper-wasm-section": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/ieee754": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "node_modules/@webassemblyjs/leb128": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/utf8": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/wasm-edit": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/helper-wasm-section": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-opt": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-gen": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-opt": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/wast-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-code-frame": "1.9.0",
+        "@webassemblyjs/helper-fsm": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/wast-printer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/acorn": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true,
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "dev": true,
+      "dependencies": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+      "dev": true,
+      "peer": true,
+      "peerDependencies": {
+        "ajv": ">=5.0.0"
+      }
+    },
+    "node_modules/ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "dev": true,
+      "peer": true,
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/ansi-colors": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz",
+      "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
+      "dependencies": {
+        "type-fest": "^0.21.3"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ansi-escapes/node_modules/type-fest": {
+      "version": "0.21.3",
+      "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz",
+      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "dev": true,
+      "dependencies": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      }
+    },
+    "node_modules/anymatch/node_modules/braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
+      "dependencies": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch/node_modules/braces/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch/node_modules/fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch/node_modules/fill-range/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch/node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch/node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch/node_modules/is-number/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch/node_modules/micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch/node_modules/normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
+      "dev": true,
+      "dependencies": {
+        "remove-trailing-separator": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch/node_modules/to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/apex-ui": {
+      "version": "1.9.5",
+      "resolved": "https://registry.npmmirror.com/apex-ui/-/apex-ui-1.9.5.tgz",
+      "integrity": "sha512-tpEYAKljUMqm3x5y/+mpzvmDd+Xq+YF+u6pmU+5PS67NqaUZyU6Urs4WmLjYjlmkc5JqdR61nxXZWKYGbvlJjA=="
+    },
+    "node_modules/aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmmirror.com/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "node_modules/asn1.js/node_modules/bn.js": {
+      "version": "4.12.2",
+      "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz",
+      "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/assert": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/assert/-/assert-1.5.1.tgz",
+      "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "object.assign": "^4.1.4",
+        "util": "^0.10.4"
+      }
+    },
+    "node_modules/assert/node_modules/inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/assert/node_modules/util": {
+      "version": "0.10.4",
+      "resolved": "https://registry.npmmirror.com/util/-/util-0.10.4.tgz",
+      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "2.0.3"
+      }
+    },
+    "node_modules/assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/astral-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/async-each": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/async-each/-/async-each-1.0.6.tgz",
+      "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ]
+    },
+    "node_modules/atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true,
+      "bin": {
+        "atob": "bin/atob.js"
+      },
+      "engines": {
+        "node": ">= 4.5.0"
+      }
+    },
+    "node_modules/available-typed-arrays": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/babel-eslint": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmmirror.com/babel-eslint/-/babel-eslint-10.1.0.tgz",
+      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+      "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/parser": "^7.7.0",
+        "@babel/traverse": "^7.7.0",
+        "@babel/types": "^7.7.0",
+        "eslint-visitor-keys": "^1.0.0",
+        "resolve": "^1.12.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "peerDependencies": {
+        "eslint": ">= 4.12.1"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "dev": true,
+      "dependencies": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "peer": true
+    },
+    "node_modules/big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true,
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-1.13.1.tgz",
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "node_modules/bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/bn.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.2.tgz",
+      "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "dev": true,
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "node_modules/browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/browserify-rsa": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz",
+      "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bn.js": "^5.2.1",
+        "randombytes": "^2.1.0",
+        "safe-buffer": "^5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/browserify-sign": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.3.tgz",
+      "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bn.js": "^5.2.1",
+        "browserify-rsa": "^4.1.0",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.5",
+        "hash-base": "~3.0",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.7",
+        "readable-stream": "^2.3.8",
+        "safe-buffer": "^5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.12"
+      }
+    },
+    "node_modules/browserify-sign/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/browserify-sign/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "pako": "~1.0.5"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "4.9.2",
+      "resolved": "https://registry.npmmirror.com/buffer/-/buffer-4.9.2.tgz",
+      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/cacache": {
+      "version": "12.0.4",
+      "resolved": "https://registry.npmmirror.com/cacache/-/cacache-12.0.4.tgz",
+      "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bluebird": "^3.5.5",
+        "chownr": "^1.1.1",
+        "figgy-pudding": "^3.5.1",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.1.15",
+        "infer-owner": "^1.0.3",
+        "lru-cache": "^5.1.1",
+        "mississippi": "^3.0.0",
+        "mkdirp": "^0.5.1",
+        "move-concurrently": "^1.0.1",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^2.6.3",
+        "ssri": "^6.0.1",
+        "unique-filename": "^1.1.1",
+        "y18n": "^4.0.0"
+      }
+    },
+    "node_modules/cacache/node_modules/rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
+    },
+    "node_modules/cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "dev": true,
+      "dependencies": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz",
+      "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "2.1.8",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz",
+      "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+      "dev": true,
+      "dependencies": {
+        "anymatch": "^2.0.0",
+        "async-each": "^1.0.1",
+        "braces": "^2.3.2",
+        "glob-parent": "^3.1.0",
+        "inherits": "^2.0.3",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "normalize-path": "^3.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.2.1",
+        "upath": "^1.1.1"
+      },
+      "optionalDependencies": {
+        "fsevents": "^1.2.7"
+      }
+    },
+    "node_modules/chokidar/node_modules/braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
+      "dependencies": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chokidar/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chokidar/node_modules/fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chokidar/node_modules/glob-parent": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^3.1.0",
+        "path-dirname": "^1.0.0"
+      }
+    },
+    "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz",
+      "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chokidar/node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chokidar/node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chokidar/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chokidar/node_modules/to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/chrome-trace-event": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+      "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+      "dev": true
+    },
+    "node_modules/cipher-base": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.6.tgz",
+      "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "^2.0.4",
+        "safe-buffer": "^5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "dev": true,
+      "dependencies": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/class-utils/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/class-utils/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dev": true,
+      "dependencies": {
+        "restore-cursor": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cli-truncate": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz",
+      "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+      "dev": true,
+      "dependencies": {
+        "slice-ansi": "^3.0.0",
+        "string-width": "^4.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
+      "dev": true,
+      "dependencies": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/colorette": {
+      "version": "2.0.20",
+      "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz",
+      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+      "dev": true
+    },
+    "node_modules/commander": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-6.2.1.tgz",
+      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/compare-versions": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/compare-versions/-/compare-versions-3.6.0.tgz",
+      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
+      "dev": true
+    },
+    "node_modules/component-emitter": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz",
+      "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "node_modules/concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "engines": [
+        "node >= 0.8"
+      ],
+      "peer": true,
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "node_modules/concat-stream/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/concat-stream/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/concat-stream/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/console-browserify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/copy-anything": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz",
+      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+      "dev": true,
+      "dependencies": {
+        "is-what": "^3.14.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "deprecated": "This package is no longer supported.",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "aproba": "^1.1.1",
+        "fs-write-stream-atomic": "^1.0.8",
+        "iferr": "^0.1.5",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.0"
+      }
+    },
+    "node_modules/copy-concurrently/node_modules/rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
+    },
+    "node_modules/copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+      "dev": true
+    },
+    "node_modules/cosmiconfig": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+      "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+      "dev": true,
+      "dependencies": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.2.1",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.10.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/create-ecdh": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.5.3"
+      }
+    },
+    "node_modules/create-ecdh/node_modules/bn.js": {
+      "version": "4.12.2",
+      "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz",
+      "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "node_modules/create-hmac": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/crypto-browserify": {
+      "version": "3.12.1",
+      "resolved": "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz",
+      "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "browserify-cipher": "^1.0.1",
+        "browserify-sign": "^4.2.3",
+        "create-ecdh": "^4.0.4",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "diffie-hellman": "^5.0.3",
+        "hash-base": "~3.0.4",
+        "inherits": "^2.0.4",
+        "pbkdf2": "^3.1.2",
+        "public-encrypt": "^4.0.3",
+        "randombytes": "^2.1.0",
+        "randomfill": "^1.0.4"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/cyclist": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/cyclist/-/cyclist-1.0.2.tgz",
+      "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/debug": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz",
+      "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/decode-uri-component": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/dedent": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz",
+      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+      "dev": true
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/define-properties": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "define-data-property": "^1.0.1",
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/des.js": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz",
+      "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "node_modules/diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "node_modules/diffie-hellman/node_modules/bn.js": {
+      "version": "4.12.2",
+      "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz",
+      "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz",
+      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      }
+    },
+    "node_modules/dom-serializer/node_modules/domelementtype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ]
+    },
+    "node_modules/dom-serializer/node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.4",
+        "npm": ">=1.2"
+      }
+    },
+    "node_modules/domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true
+    },
+    "node_modules/domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-2.4.2.tgz",
+      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "1"
+      }
+    },
+    "node_modules/domutils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz",
+      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+      "dev": true,
+      "dependencies": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz",
+      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "node_modules/duplexify/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/duplexify/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/duplexify/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/elliptic": {
+      "version": "6.6.1",
+      "resolved": "https://registry.npmmirror.com/elliptic/-/elliptic-6.6.1.tgz",
+      "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bn.js": "^4.11.9",
+        "brorand": "^1.1.0",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.1",
+        "inherits": "^2.0.4",
+        "minimalistic-assert": "^1.0.1",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "node_modules/elliptic/node_modules/bn.js": {
+      "version": "4.12.2",
+      "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz",
+      "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
+    },
+    "node_modules/emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/end-of-stream": {
+      "version": "1.4.5",
+      "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz",
+      "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.4.0"
+      }
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+      "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.5.0",
+        "tapable": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/enhanced-resolve/node_modules/memory-fs": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.5.0.tgz",
+      "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=4.3.0 <5.0.0 || >=5.10"
+      }
+    },
+    "node_modules/enhanced-resolve/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/enhanced-resolve/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/enhanced-resolve/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/enquirer": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmmirror.com/enquirer/-/enquirer-2.4.1.tgz",
+      "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-colors": "^4.1.1",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/entities": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz",
+      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+      "dev": true
+    },
+    "node_modules/errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "dev": true,
+      "dependencies": {
+        "prr": "~1.0.1"
+      },
+      "bin": {
+        "errno": "cli.js"
+      }
+    },
+    "node_modules/error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "dependencies": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "7.32.0",
+      "resolved": "https://registry.npmmirror.com/eslint/-/eslint-7.32.0.tgz",
+      "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+      "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "7.12.11",
+        "@eslint/eslintrc": "^0.4.3",
+        "@humanwhocodes/config-array": "^0.5.0",
+        "ajv": "^6.10.0",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "enquirer": "^2.3.5",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^5.1.1",
+        "eslint-utils": "^2.1.0",
+        "eslint-visitor-keys": "^2.0.0",
+        "espree": "^7.3.1",
+        "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": "^5.1.2",
+        "globals": "^13.6.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^3.13.1",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.0.4",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.1",
+        "progress": "^2.0.0",
+        "regexpp": "^3.1.0",
+        "semver": "^7.2.1",
+        "strip-ansi": "^6.0.0",
+        "strip-json-comments": "^3.1.0",
+        "table": "^6.0.9",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-plugin-hybrid": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmmirror.com/eslint-plugin-hybrid/-/eslint-plugin-hybrid-0.0.5.tgz",
+      "integrity": "sha512-BHZn3npJCECWG7EAE3v1nYTety1RCkSbXgw6Eul8gM7HiDlnyoBwcL//VChtbYE0p03iaV2v/y2knJYRYRHGfg==",
+      "dev": true,
+      "dependencies": {
+        "htmlparser2": "3.10.0",
+        "requireindex": "~1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/eslint-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-2.1.0.tgz",
+      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+      "dev": true,
+      "dependencies": {
+        "eslint-visitor-keys": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mysticatea"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/eslint/node_modules/@babel/code-frame": {
+      "version": "7.12.11",
+      "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.12.11.tgz",
+      "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/highlight": "^7.10.4"
+      }
+    },
+    "node_modules/eslint/node_modules/eslint-visitor-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/espree": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/espree/-/espree-7.3.1.tgz",
+      "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^7.4.0",
+        "acorn-jsx": "^5.3.1",
+        "eslint-visitor-keys": "^1.3.0"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true,
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/esquery": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz",
+      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+      "dev": true,
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/esquery/node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esrecurse/node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "node_modules/execa": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz",
+      "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "get-stream": "^5.0.0",
+        "human-signals": "^1.1.1",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.0",
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2",
+        "strip-final-newline": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+      "dev": true,
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "dev": true,
+      "dependencies": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob/node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true
+    },
+    "node_modules/fast-uri": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.0.6.tgz",
+      "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fastify"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fastify"
+        }
+      ]
+    },
+    "node_modules/figgy-pudding": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmmirror.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+      "deprecated": "This module is no longer supported.",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "dev": true,
+      "dependencies": {
+        "flat-cache": "^3.0.4"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "dev": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-cache-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+      "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "commondir": "^1.0.1",
+        "make-dir": "^2.0.0",
+        "pkg-dir": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/find-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz",
+      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "locate-path": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/locate-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/p-locate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "p-limit": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/pkg-dir": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz",
+      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "find-up": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/find-versions": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/find-versions/-/find-versions-4.0.0.tgz",
+      "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==",
+      "dev": true,
+      "dependencies": {
+        "semver-regex": "^3.1.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz",
+      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+      "dev": true,
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.3",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz",
+      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+      "dev": true
+    },
+    "node_modules/flush-write-stream": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.3.6"
+      }
+    },
+    "node_modules/flush-write-stream/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/flush-write-stream/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/flush-write-stream/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/for-each": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz",
+      "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "is-callable": "^1.2.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
+      "dev": true,
+      "dependencies": {
+        "map-cache": "^0.2.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "node_modules/from2/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/from2/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/from2/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmmirror.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==",
+      "deprecated": "This package is no longer supported.",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "node_modules/fs-write-stream-atomic/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/fs-write-stream-atomic/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/fs-write-stream-atomic/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
+    },
+    "node_modules/fsevents": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+      "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "dependencies": {
+        "bindings": "^1.5.0",
+        "nan": "^2.12.1"
+      },
+      "engines": {
+        "node": ">= 4.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+      "dev": true
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-own-enumerable-property-symbols": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+      "dev": true
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "dev": true,
+      "dependencies": {
+        "pump": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "dev": true,
+      "dependencies": {
+        "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"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/globals": {
+      "version": "13.24.0",
+      "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
+      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+      "dev": true,
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
+      "dev": true,
+      "dependencies": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values/node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values/node_modules/is-number/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values/node_modules/kind-of": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz",
+      "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/hash-base": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmmirror.com/hash-base/-/hash-base-3.0.5.tgz",
+      "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "^2.0.4",
+        "safe-buffer": "^5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "node_modules/htmlparser2": {
+      "version": "3.10.0",
+      "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-3.10.0.tgz",
+      "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "^1.3.0",
+        "domhandler": "^2.3.0",
+        "domutils": "^1.5.1",
+        "entities": "^1.1.1",
+        "inherits": "^2.0.1",
+        "readable-stream": "^3.0.6"
+      }
+    },
+    "node_modules/https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/human-signals": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz",
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.12.0"
+      }
+    },
+    "node_modules/husky": {
+      "version": "4.3.8",
+      "resolved": "https://registry.npmmirror.com/husky/-/husky-4.3.8.tgz",
+      "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==",
+      "dev": true,
+      "hasInstallScript": true,
+      "dependencies": {
+        "chalk": "^4.0.0",
+        "ci-info": "^2.0.0",
+        "compare-versions": "^3.6.0",
+        "cosmiconfig": "^7.0.0",
+        "find-versions": "^4.0.0",
+        "opencollective-postinstall": "^2.0.2",
+        "pkg-dir": "^5.0.0",
+        "please-upgrade-node": "^3.2.0",
+        "slash": "^3.0.0",
+        "which-pm-runs": "^1.0.0"
+      },
+      "bin": {
+        "husky-run": "bin/run.js",
+        "husky-upgrade": "lib/upgrader/bin.js"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/husky"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "peer": true
+    },
+    "node_modules/iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmmirror.com/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/ignore": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz",
+      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+      "dev": true,
+      "optional": true,
+      "bin": {
+        "image-size": "bin/image-size.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz",
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+      "dev": true,
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "node_modules/is-accessor-descriptor": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+      "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
+      "dev": true,
+      "dependencies": {
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+      "dev": true
+    },
+    "node_modules/is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
+      "dev": true,
+      "dependencies": {
+        "binary-extensions": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "node_modules/is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.16.1",
+      "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz",
+      "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+      "dev": true,
+      "dependencies": {
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-data-descriptor": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+      "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
+      "dev": true,
+      "dependencies": {
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-descriptor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz",
+      "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "dev": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz",
+      "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-typed-array": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz",
+      "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "which-typed-array": "^1.1.16"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-what": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
+      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+      "dev": true
+    },
+    "node_modules/is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "dev": true
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/jsesc": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz",
+      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+      "dev": true,
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+      "dev": true
+    },
+    "node_modules/json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "node_modules/json5": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz",
+      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+      "dev": true,
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+      "dev": true,
+      "dependencies": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/less": {
+      "version": "3.13.1",
+      "resolved": "https://registry.npmmirror.com/less/-/less-3.13.1.tgz",
+      "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==",
+      "dev": true,
+      "dependencies": {
+        "copy-anything": "^2.0.1",
+        "tslib": "^1.10.0"
+      },
+      "bin": {
+        "lessc": "bin/lessc"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "optionalDependencies": {
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "native-request": "^1.0.5",
+        "source-map": "~0.6.0"
+      }
+    },
+    "node_modules/less-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/less-loader/-/less-loader-4.1.0.tgz",
+      "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
+      "dev": true,
+      "dependencies": {
+        "clone": "^2.1.1",
+        "loader-utils": "^1.1.0",
+        "pify": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 4.8 < 5.0.0 || >= 5.10"
+      },
+      "peerDependencies": {
+        "less": "^2.3.1 || ^3.0.0",
+        "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0"
+      }
+    },
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+      "dev": true
+    },
+    "node_modules/lint-staged": {
+      "version": "10.5.4",
+      "resolved": "https://registry.npmmirror.com/lint-staged/-/lint-staged-10.5.4.tgz",
+      "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "cli-truncate": "^2.1.0",
+        "commander": "^6.2.0",
+        "cosmiconfig": "^7.0.0",
+        "debug": "^4.2.0",
+        "dedent": "^0.7.0",
+        "enquirer": "^2.3.6",
+        "execa": "^4.1.0",
+        "listr2": "^3.2.2",
+        "log-symbols": "^4.0.0",
+        "micromatch": "^4.0.2",
+        "normalize-path": "^3.0.0",
+        "please-upgrade-node": "^3.2.0",
+        "string-argv": "0.3.1",
+        "stringify-object": "^3.3.0"
+      },
+      "bin": {
+        "lint-staged": "bin/lint-staged.js"
+      },
+      "funding": {
+        "url": "https://opencollective.com/lint-staged"
+      }
+    },
+    "node_modules/listr2": {
+      "version": "3.14.0",
+      "resolved": "https://registry.npmmirror.com/listr2/-/listr2-3.14.0.tgz",
+      "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+      "dev": true,
+      "dependencies": {
+        "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.1",
+        "through": "^2.3.8",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "enquirer": ">= 2.3.0 < 3"
+      },
+      "peerDependenciesMeta": {
+        "enquirer": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/loader-runner": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-2.4.0.tgz",
+      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=4.3.0 <5.0.0 || >=5.10"
+      }
+    },
+    "node_modules/loader-utils": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz",
+      "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+      "dev": true,
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "node_modules/lodash.truncate": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+      "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+      "dev": true
+    },
+    "node_modules/log-symbols": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/log-update": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz",
+      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+      "dev": true,
+      "dependencies": {
+        "ansi-escapes": "^4.3.0",
+        "cli-cursor": "^3.1.0",
+        "slice-ansi": "^4.0.0",
+        "wrap-ansi": "^6.2.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/log-update/node_modules/slice-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+      }
+    },
+    "node_modules/log-update/node_modules/wrap-ansi": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "dev": true,
+      "dependencies": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/make-dir/node_modules/pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/make-dir/node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
+      "dev": true,
+      "dependencies": {
+        "object-visit": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "node_modules/memory-fs/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/memory-fs/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/memory-fs/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "dev": true,
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "bin": {
+        "miller-rabin": "bin/miller-rabin"
+      }
+    },
+    "node_modules/miller-rabin/node_modules/bn.js": {
+      "version": "4.12.2",
+      "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz",
+      "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true,
+      "optional": true,
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/mississippi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/mississippi/-/mississippi-3.0.0.tgz",
+      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^3.0.0",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "dev": true,
+      "dependencies": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==",
+      "deprecated": "This package is no longer supported.",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      }
+    },
+    "node_modules/move-concurrently/node_modules/rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "dev": true
+    },
+    "node_modules/nan": {
+      "version": "2.23.0",
+      "resolved": "https://registry.npmmirror.com/nan/-/nan-2.23.0.tgz",
+      "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/native-request": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/native-request/-/native-request-1.1.2.tgz",
+      "integrity": "sha512-/etjwrK0J4Ebbcnt35VMWnfiUX/B04uwGJxyJInagxDqf2z5drSt/lsOvEMWGYunz1kaLZAFrV4NDAbOoDKvAQ==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "node_modules/node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      }
+    },
+    "node_modules/node-libs-browser/node_modules/punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/node-libs-browser/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/node-libs-browser/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/node-libs-browser/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
+      "dev": true,
+      "dependencies": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object-copy/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.4",
+      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
+      "dev": true,
+      "dependencies": {
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object.assign": {
+      "version": "4.1.7",
+      "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz",
+      "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0",
+        "has-symbols": "^1.1.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
+      "dev": true,
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/onchange": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/onchange/-/onchange-5.2.0.tgz",
+      "integrity": "sha512-kBNMF4KU1m0GkZCANckQZs3N41esf950T/gv7JIjNS6qWS8R34+iCKk/wmVRPEdaYCA+yi2aK2vNXS0RaB/V2A==",
+      "dev": true,
+      "dependencies": {
+        "@blakeembrey/deque": "^1.0.3",
+        "arrify": "^1.0.1",
+        "chokidar": "^2.0.0",
+        "cross-spawn": "^6.0.0",
+        "minimist": "^1.2.0",
+        "supports-color": "^5.5.0",
+        "tree-kill": "^1.2.0"
+      },
+      "bin": {
+        "onchange": "cli.js"
+      }
+    },
+    "node_modules/onchange/node_modules/cross-spawn": {
+      "version": "6.0.6",
+      "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.6.tgz",
+      "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
+      "dev": true,
+      "dependencies": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      },
+      "engines": {
+        "node": ">=4.8"
+      }
+    },
+    "node_modules/onchange/node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/onchange/node_modules/path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/onchange/node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/onchange/node_modules/shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/onchange/node_modules/shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/onchange/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/onchange/node_modules/which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "which": "bin/which"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/opencollective-postinstall": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
+      "dev": true,
+      "bin": {
+        "opencollective-postinstall": "index.js"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz",
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+      "dev": true,
+      "dependencies": {
+        "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.5"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "dev": true,
+      "dependencies": {
+        "aggregate-error": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/parallel-transform": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/parallel-transform/-/parallel-transform-1.2.0.tgz",
+      "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "cyclist": "^1.0.1",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "node_modules/parallel-transform/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/parallel-transform/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/parallel-transform/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse-asn1": {
+      "version": "5.1.7",
+      "resolved": "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.7.tgz",
+      "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "asn1.js": "^4.10.1",
+        "browserify-aes": "^1.2.0",
+        "evp_bytestokey": "^1.0.3",
+        "hash-base": "~3.0",
+        "pbkdf2": "^3.1.2",
+        "safe-buffer": "^5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==",
+      "dev": true
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pbkdf2": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.3.tgz",
+      "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "create-hash": "~1.1.3",
+        "create-hmac": "^1.1.7",
+        "ripemd160": "=2.0.1",
+        "safe-buffer": "^5.2.1",
+        "sha.js": "^2.4.11",
+        "to-buffer": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/pbkdf2/node_modules/create-hash": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/create-hash/-/create-hash-1.1.3.tgz",
+      "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "node_modules/pbkdf2/node_modules/hash-base": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/hash-base/-/hash-base-2.0.2.tgz",
+      "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "^2.0.1"
+      }
+    },
+    "node_modules/pbkdf2/node_modules/ripemd160": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.1.tgz",
+      "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "hash-base": "^2.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "dev": true
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pkg-dir": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-5.0.0.tgz",
+      "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
+      "dev": true,
+      "dependencies": {
+        "find-up": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/please-upgrade-node": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
+      "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+      "dev": true,
+      "dependencies": {
+        "semver-compare": "^1.0.0"
+      }
+    },
+    "node_modules/posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/possible-typed-array-names": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+      "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/prettier": {
+      "version": "1.19.1",
+      "resolved": "https://registry.npmmirror.com/prettier/-/prettier-1.19.1.tgz",
+      "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
+      "dev": true,
+      "bin": {
+        "prettier": "bin-prettier.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/prettier-plugin-ux": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/prettier-plugin-ux/-/prettier-plugin-ux-0.3.0.tgz",
+      "integrity": "sha512-qcCgB6NmfCbJd0tGkhAeV+BfeZ5a1DMPEOtiVzN7Inok5LHVzjIy5eB8YIV1+ttqFZ+H7/LdIIdVT4kDYgWzww==",
+      "dev": true
+    },
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "dev": true
+    },
+    "node_modules/progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "dev": true
+    },
+    "node_modules/public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/public-encrypt/node_modules/bn.js": {
+      "version": "4.12.2",
+      "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz",
+      "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/pump": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.3.tgz",
+      "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+      "dev": true,
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "node_modules/pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      }
+    },
+    "node_modules/pumpify/node_modules/pump": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/pump/-/pump-2.0.1.tgz",
+      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.14.0",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz",
+      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "side-channel": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.4.x"
+      }
+    },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz",
+      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/readdirp/node_modules/braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
+      "dependencies": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/readdirp/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "node_modules/readdirp/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regexpp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz",
+      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mysticatea"
+      }
+    },
+    "node_modules/remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
+      "dev": true
+    },
+    "node_modules/repeat-element": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz",
+      "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/requireindex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/requireindex/-/requireindex-1.1.0.tgz",
+      "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.5"
+      }
+    },
+    "node_modules/resolve": {
+      "version": "1.22.10",
+      "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz",
+      "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+      "dev": true,
+      "dependencies": {
+        "is-core-module": "^2.16.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
+      "deprecated": "https://github.com/lydell/resolve-url#deprecated",
+      "dev": true
+    },
+    "node_modules/restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dev": true,
+      "dependencies": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/rfdc": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+      "dev": true
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "node_modules/run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "node_modules/rxjs": {
+      "version": "7.8.2",
+      "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz",
+      "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+      "dev": true,
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/rxjs/node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "dev": true
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+      "dev": true,
+      "dependencies": {
+        "ret": "~0.1.10"
+      }
+    },
+    "node_modules/schema-utils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz",
+      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ajv": "^6.1.0",
+        "ajv-errors": "^1.0.0",
+        "ajv-keywords": "^3.1.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/semver": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz",
+      "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/semver-compare": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz",
+      "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
+      "dev": true
+    },
+    "node_modules/semver-regex": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmmirror.com/semver-regex/-/semver-regex-3.1.4.tgz",
+      "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/serialize-javascript": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/set-value/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/set-value/node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/sha.js": {
+      "version": "2.4.12",
+      "resolved": "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.12.tgz",
+      "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "^2.0.4",
+        "safe-buffer": "^5.2.1",
+        "to-buffer": "^1.2.0"
+      },
+      "bin": {
+        "sha.js": "bin.js"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz",
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3",
+        "side-channel-list": "^1.0.0",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-list": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz",
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-weakmap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3",
+        "side-channel-map": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
+    },
+    "node_modules/slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/slice-ansi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz",
+      "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "dependencies": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
+      "dependencies": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-util/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/snapdragon/node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/snapdragon/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
+      "dev": true,
+      "dependencies": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/source-map-url": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz",
+      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+      "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
+      "dev": true
+    },
+    "node_modules/split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+      "dev": true
+    },
+    "node_modules/ssri": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/ssri/-/ssri-6.0.2.tgz",
+      "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "figgy-pudding": "^3.5.1"
+      }
+    },
+    "node_modules/static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
+      "dev": true,
+      "dependencies": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/static-extend/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/static-extend/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-2.0.2.tgz",
+      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "node_modules/stream-browserify/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/stream-browserify/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/stream-browserify/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "node_modules/stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.npmmirror.com/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "node_modules/stream-http/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/stream-http/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/stream-http/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/stream-shift": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.3.tgz",
+      "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/string-argv": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.1.tgz",
+      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.6.19"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/stringify-object": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz",
+      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+      "dev": true,
+      "dependencies": {
+        "get-own-enumerable-property-symbols": "^3.0.0",
+        "is-obj": "^1.0.1",
+        "is-regexp": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/table": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmmirror.com/table/-/table-6.9.0.tgz",
+      "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
+      "dev": true,
+      "dependencies": {
+        "ajv": "^8.0.1",
+        "lodash.truncate": "^4.4.2",
+        "slice-ansi": "^4.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/table/node_modules/ajv": {
+      "version": "8.17.1",
+      "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz",
+      "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.3",
+        "fast-uri": "^3.0.1",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/table/node_modules/json-schema-traverse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+      "dev": true
+    },
+    "node_modules/table/node_modules/slice-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+      }
+    },
+    "node_modules/tapable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz",
+      "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/terser": {
+      "version": "4.8.1",
+      "resolved": "https://registry.npmmirror.com/terser/-/terser-4.8.1.tgz",
+      "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/terser-webpack-plugin": {
+      "version": "1.4.6",
+      "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.6.tgz",
+      "integrity": "sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "cacache": "^12.0.2",
+        "find-cache-dir": "^2.1.0",
+        "is-wsl": "^1.1.0",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^4.0.0",
+        "source-map": "^0.6.1",
+        "terser": "^4.1.2",
+        "webpack-sources": "^1.4.0",
+        "worker-farm": "^1.7.0"
+      },
+      "engines": {
+        "node": ">= 6.9.0"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0"
+      }
+    },
+    "node_modules/terser/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+      "dev": true
+    },
+    "node_modules/through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz",
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+      "dev": true
+    },
+    "node_modules/through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "node_modules/through2/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/through2/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/through2/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/timers-browserify": {
+      "version": "2.0.12",
+      "resolved": "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-2.0.12.tgz",
+      "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "setimmediate": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6.0"
+      }
+    },
+    "node_modules/to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/to-buffer": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/to-buffer/-/to-buffer-1.2.1.tgz",
+      "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "isarray": "^2.0.5",
+        "safe-buffer": "^5.2.1",
+        "typed-array-buffer": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/to-buffer/node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-object-path/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "dev": true,
+      "dependencies": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+      "dev": true,
+      "bin": {
+        "tree-kill": "cli.js"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "dev": true
+    },
+    "node_modules/tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/typed-array-buffer": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-typed-array": "^1.1.14"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "dev": true,
+      "dependencies": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/union-value/node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "node_modules/unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "node_modules/unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
+      "dev": true,
+      "dependencies": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-value": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz",
+      "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
+      "dev": true,
+      "dependencies": {
+        "get-value": "^2.0.3",
+        "has-values": "^0.1.4",
+        "isobject": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+      "dev": true,
+      "dependencies": {
+        "isarray": "1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-values": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz",
+      "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+      "dev": true,
+      "engines": {
+        "node": ">=4",
+        "yarn": "*"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
+      "deprecated": "Please see https://github.com/lydell/urix#deprecated",
+      "dev": true
+    },
+    "node_modules/url": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmmirror.com/url/-/url-0.11.4.tgz",
+      "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "punycode": "^1.4.1",
+        "qs": "^6.12.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/url/node_modules/punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmmirror.com/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "inherits": "2.0.3"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "dev": true
+    },
+    "node_modules/util/node_modules/inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/v8-compile-cache": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
+      "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
+      "dev": true
+    },
+    "node_modules/vm-browserify": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/watchpack": {
+      "version": "1.7.5",
+      "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-1.7.5.tgz",
+      "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0"
+      },
+      "optionalDependencies": {
+        "chokidar": "^3.4.1",
+        "watchpack-chokidar2": "^2.0.1"
+      }
+    },
+    "node_modules/watchpack-chokidar2": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+      "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
+      "dev": true,
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "chokidar": "^2.1.8"
+      }
+    },
+    "node_modules/watchpack/node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/watchpack/node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true,
+      "optional": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/watchpack/node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.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"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/watchpack/node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "peer": true,
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/watchpack/node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/watchpack/node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/webpack": {
+      "version": "4.47.0",
+      "resolved": "https://registry.npmmirror.com/webpack/-/webpack-4.47.0.tgz",
+      "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/wasm-edit": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "acorn": "^6.4.1",
+        "ajv": "^6.10.2",
+        "ajv-keywords": "^3.4.1",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^4.5.0",
+        "eslint-scope": "^4.0.3",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.4.0",
+        "loader-utils": "^1.2.3",
+        "memory-fs": "^0.4.1",
+        "micromatch": "^3.1.10",
+        "mkdirp": "^0.5.3",
+        "neo-async": "^2.6.1",
+        "node-libs-browser": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "tapable": "^1.1.3",
+        "terser-webpack-plugin": "^1.4.3",
+        "watchpack": "^1.7.4",
+        "webpack-sources": "^1.4.1"
+      },
+      "bin": {
+        "webpack": "bin/webpack.js"
+      },
+      "engines": {
+        "node": ">=6.11.5"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependenciesMeta": {
+        "webpack-cli": {
+          "optional": true
+        },
+        "webpack-command": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-sources": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-1.4.3.tgz",
+      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      }
+    },
+    "node_modules/webpack/node_modules/acorn": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-6.4.2.tgz",
+      "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+      "dev": true,
+      "peer": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/webpack/node_modules/braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack/node_modules/eslint-scope": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-4.0.3.tgz",
+      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/webpack/node_modules/fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack/node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack/node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack/node_modules/is-number/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack/node_modules/micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack/node_modules/to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/which-pm-runs": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz",
+      "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/which-typed-array": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.19.tgz",
+      "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.4",
+        "for-each": "^0.3.5",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/worker-farm": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/worker-farm/-/worker-farm-1.7.0.tgz",
+      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "errno": "~0.1.7"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/y18n": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
+      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    }
+  }
+}

+ 57 - 0
package.json

@@ -0,0 +1,57 @@
+{
+  "name": "quickapp-code-book",
+  "version": "1.0.0",
+  "description": "快应用图书模版",
+  "scripts": {
+    "start": "hap server --watch",
+    "server": "hap server",
+    "gen": "node ./script/gen/index.js",
+    "build": "hap build",
+    "release": "hap release",
+    "watch": "hap watch",
+    "debug": "hap debug",
+    "precommit-msg": "echo '🚧 start pre-commit checks...' && exit 0",
+    "prettier": "node ./scripts/selfCloseInputTag.js && prettier --write \"src/**/*.{js,ux,less,scss,css}\"",
+    "prettier-watch": "onchange '**/*.md' \"src/**/**/*.{js,ux,less,scss,css}\" -- prettier --write {{changed}}"
+  },
+  "dependencies": {
+    "apex-ui": "latest"
+  },
+  "devDependencies": {
+    "@types/quickapp": "npm:quickapp-interface@^1.0.0",
+    "babel-eslint": "^10.1.0",
+    "eslint": "^7.13.0",
+    "eslint-plugin-hybrid": "0.0.5",
+    "husky": "^4.3.0",
+    "less": "^3.9.0",
+    "less-loader": "^4.1.0",
+    "lint-staged": "^10.5.1",
+    "onchange": "^5.2.0",
+    "prettier": "^1.15.3",
+    "prettier-plugin-ux": "^0.3.0"
+  },
+  "prettier": {
+    "singleQuote": true,
+    "semi": false,
+    "printWidth": 80,
+    "proseWrap": "never"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "yarn run precommit-msg && lint-staged"
+    }
+  },
+  "lint-staged": {
+    "**/**.{ux,js,json,pcss,md,vue}": [
+      "prettier --write",
+      "git add"
+    ]
+  },
+  "keywords": [
+    "快应用",
+    "图书"
+  ],
+  "browserslist": [
+    "chrome 65"
+  ]
+}

+ 87 - 0
scripts/gen/index.js

@@ -0,0 +1,87 @@
+/**
+ * @desc: gen script command,make a new page generated by one click.
+ * @author: nicejade
+ */
+
+const fs = require('fs')
+const path = require('path')
+const colors = require('colors')
+
+const newFolderName = process.argv[2]
+
+String.prototype.firstUpperCase = function() {
+  return this.replace(/\b(\w)/g, $1 => {
+    return $1.toLowerCase()
+  })
+}
+const resolve = dir => {
+  return path.join(__dirname, '../..', dir)
+}
+
+const successExecPrint = msg => {
+  console.log(
+    colors.green(`✓ `) +
+      colors.cyan(`${msg} `) +
+      colors.green('task has been successfully executed.')
+  )
+}
+
+function createNewPage(newFolderPath) {
+  const mReg = new RegExp('@PAGE_CLASS_NAME', 'g')
+  const pageContent = fs.readFileSync(`${__dirname}/template.ux`, 'UTF-8')
+  const rootClassName = newFolderName
+    .firstUpperCase()
+    .replace(/([A-Z])/g, '-$1')
+    .toLowerCase()
+  const newContent = pageContent.replace(mReg, rootClassName)
+
+  fs.mkdirSync(newFolderPath, 0777)
+  fs.writeFile(`${newFolderPath}/index.ux`, newContent, error => {
+    if (error) throw `Something went wrong: ${error}`
+  })
+  successExecPrint('Create New Page')
+}
+
+function saveRouter2Manifest() {
+  const manifestPath = resolve('/src/manifest.json')
+  let manifestConf = fs.readFileSync(manifestPath, 'UTF-8')
+  manifestConf = JSON.parse(manifestConf)
+  const routerPages = manifestConf.router.pages
+  routerPages[`pages/${newFolderName}`] = {
+    component: 'index'
+  }
+  manifestConf = JSON.stringify(manifestConf, null, 2)
+  fs.writeFile(manifestPath, manifestConf, error => {
+    if (error) throw `Something went wrong[@saveRouter2Manifest]: ${error}`
+  })
+  successExecPrint('Save Router Into Manifest')
+}
+
+function main() {
+  if (!newFolderName) {
+    return console.warn(
+      `⚠️  Please enter the name of the page you want to create.`.underline.red
+    )
+  }
+
+  const folderNameReg = /^[A-Z][[A-Za-z0-9]+$/
+  if (!folderNameReg.test(newFolderName)) {
+    return console.warn(
+      `⚠️  Please enter the standard Folder name. Eg: XyzAbcde.`.underline.red
+    )
+  }
+
+  const newFolderPath = path.join(__dirname, `../../src/pages/${newFolderName}`)
+  const isExist = fs.existsSync(newFolderPath)
+
+  if (isExist) {
+    return console.warn(
+      `⚠️  ${newFolderName} already exists in the /src/pages/ directory.`
+        .underline.red
+    )
+  }
+  createNewPage(newFolderPath)
+  saveRouter2Manifest()
+}
+
+main()

+ 43 - 0
scripts/gen/template.ux

@@ -0,0 +1,43 @@
+<template>
+  <div class="page-wrapper @PAGE_CLASS_NAME">
+    <div class="wrapper-padding">
+      <input
+        class="button"
+        type="button"
+        onclick="onBtnClick"
+        value="倾城之链"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  private: {},
+
+  onInit() {},
+  onReady() {},
+  onShow() {
+    APP_STATISTICS.page_show(this)
+  },
+  onHide() {
+    APP_STATISTICS.page_hide(this)
+  },
+  onMenuPress() {
+    this.$app.$def.showMenu()
+  },
+
+  /* -------------------SelfCustomEvent------------------ */
+  onBtnClick() {
+    $utils.route2theUrl(
+      'https://nicelinks.site/explore/all?utm_source=quickapp'
+    )
+  }
+}
+</script>
+
+<style lang="less">
+@import './../../assets/styles/style.less';
+.@PAGE_CLASS_NAME {
+}
+</style>

+ 36 - 0
scripts/selfCloseInputTag.js

@@ -0,0 +1,36 @@
+/**
+ * @file: selfCloseInputTag.js
+ * @desc: 遍历指定目录下 .ux 文件,将其中 input 标签由 <input **></input> 转换为 <input ** />
+ * @date: 2019-01-23
+ */
+
+const fs = require('fs')
+const path = require('path')
+
+const quickappCodePath = './src/'
+
+const main = codePath => {
+  const traversing = cpath => {
+    const files = fs.readdirSync(cpath)
+    files.forEach(fileName => {
+      const fPath = path.join(cpath, fileName)
+      const stats = fs.statSync(fPath)
+      stats.isDirectory() && traversing(fPath)
+      stats.isFile() && fPath.endsWith('.ux') && matchAndReplace(fPath)
+    })
+  }
+  traversing(codePath)
+}
+
+const matchAndReplace = path => {
+  const pageContent = fs.readFileSync(path, 'UTF-8')
+  const newContent = pageContent.replace(
+    /(<)([\s]*?)(input\b[^\/]*?)>[\s\S]*?<\/input>/gm,
+    '$1$3 />'
+  )
+  fs.writeFile(path, newContent, error => {
+    if (error) throw `Something went wrong: ${error}`
+  })
+}
+
+main(quickappCodePath)

+ 17 - 0
src/app.ux

@@ -0,0 +1,17 @@
+<script>
+/**
+ * @desc: 应用级别的配置、方法,供所有页面公用;
+ */
+import { $utils, $apis } from './helper'
+
+/* @desc: 注入方法至全局 global,以便页面调用 */
+const hook2global = global.__proto__ || global
+hook2global.$apis = $apis
+hook2global.$utils = $utils
+hook2global.$shelfList = []
+
+export default {
+  $apis: $apis,
+  $shelfList: hook2global.$shelfList
+}
+</script>

+ 17 - 0
src/assets/data/book-content.js

@@ -0,0 +1,17 @@
+import $ajax from '../../helper/ajax'
+
+const bookId2Url = {
+  1: 'https://raw.githubusercontent.com/luoxuhai/chinese-novel/master/resources/%E4%B8%96%E6%80%81%E4%BA%BA%E6%83%85/%E7%BA%A2%E6%A5%BC%E6%A2%A6/xxx.html',
+  2: 'https://raw.githubusercontent.com/luoxuhai/chinese-novel/master/resources/%E5%8E%86%E5%8F%B2%E6%BC%94%E4%B9%89/%E4%B8%89%E5%9B%BD%E6%BC%94%E4%B9%89/xxx.html',
+  3: 'https://raw.githubusercontent.com/luoxuhai/chinese-novel/master/resources/%E9%AC%BC%E6%80%AA%E7%A5%9E%E9%AD%94/%E8%A5%BF%E6%B8%B8%E8%AE%B0/xxx.html',
+  4: 'https://raw.githubusercontent.com/luoxuhai/chinese-novel/master/resources/%E8%8B%B1%E9%9B%84%E4%BC%A0%E5%A5%87/%E6%B0%B4%E6%B5%92%E4%BC%A0/xxx.html',
+  5: 'https://raw.githubusercontent.com/luoxuhai/chinese-novel/master/resources/%E4%B8%96%E6%80%81%E4%BA%BA%E6%83%85/%E9%87%91%E7%93%B6%E6%A2%85/xxx.html'
+}
+
+export async function getBookContent(bookId, chapterId) {
+  const url = bookId2Url[bookId].replace(/xxx/, chapterId - 1)
+  const data = (await $ajax.get(url)).data
+  //替换掉返回数据中的<br>标签
+  const content = data.replace(/<br>/g, '\n')
+  return content
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 8 - 0
src/assets/data/book-list.js


+ 87 - 0
src/assets/data/comment.js

@@ -0,0 +1,87 @@
+export const commentData = [
+  {
+    id: '440000201012179259',
+    name: '文伟',
+    comment: '下发些选见路新反龙图',
+    time: '1999-02-24',
+    resource: {
+      id: '130000197204308818',
+      name: '罗娟',
+      comment: '志太量们员用集国明县',
+      time: '2006-10-14'
+    }
+  },
+  {
+    id: '350000198510075755',
+    name: '姜丽',
+    comment: '政体外里风期强成会资它全指组类位须学华声都如这反',
+    time: '1972-12-16',
+    resource: {
+      id: '230000200510227707',
+      name: '赵娟',
+      comment: '大相军认然发志同相长究群更战置水学且六几以北酸',
+      time: '2006-08-01'
+    }
+  },
+  {
+    id: '810000201404230788',
+    name: '尹丽',
+    comment: '局为起片毛品文张程感力基头',
+    time: '1978-07-20',
+    resource: null
+  },
+  {
+    id: '71000019860811975X',
+    name: '石超',
+    comment: '公认包白真层安式我图间劳电而产整其且提',
+    time: '2018-11-24',
+    resource: null
+  },
+  {
+    id: '410000198504160239',
+    name: '邱勇',
+    comment: '收社少率为真决术青土没再技再把次',
+    time: '2018-07-17',
+    resource: null
+  },
+  {
+    id: '310000201411238018',
+    name: '董平',
+    comment: '指量广单条政全三存没',
+    time: '2001-12-31',
+    resource: {
+      id: '140000201803229434',
+      name: '高静',
+      comment: '至改确边安克受才劳走进复大容干适家其务',
+      time: '1979-09-27'
+    }
+  },
+  {
+    id: '630000197911116119',
+    name: '谭静',
+    comment: '党么学油品克标区列低铁身斗况列断合性中题维',
+    time: '1983-03-19',
+    resource: null
+  },
+  {
+    id: '1630000197911116119',
+    name: '小明',
+    comment: '空寿司斗况列断合性中题维',
+    time: '1983-03-19',
+    resource: null
+  },
+  {
+    id: '122230000197911116119',
+    name: '木增',
+    comment: '上课上课合性中题维',
+    time: '1983-08-21',
+    resource: null
+  },
+  {
+    id: '23888888888888881111',
+    name: '静香',
+    comment: '水库大开大合上手机费',
+    time: '2003-06-26',
+    resource: null
+  }
+]

+ 575 - 0
src/assets/data/contents.js

@@ -0,0 +1,575 @@
+export const contentsData = {
+  1: [
+    '第一回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀',
+    '第二回 贾夫人仙逝扬州城 冷子兴演说荣国府',
+    '第三回 贾雨村夤缘复旧职 林黛玉抛父进京都',
+    '第四回 薄命女偏逢薄命郎 葫芦僧乱判葫芦案',
+    '第五回 游幻境指迷十二钗 饮仙醪曲演红楼梦',
+    '第六回 贾宝玉初试云雨情 刘姥姥一进荣国府',
+    '第七回 送宫花贾琏戏熙凤 宴宁府宝玉会秦钟',
+    '第八回 贾宝玉奇缘识金锁 薛宝钗巧合认通灵',
+    '第九回 训劣子李贵承申饬 嗔顽童茗烟闹书房',
+    '第十回 金寡妇贪利权受辱 张太医论病细穷源',
+    '第十一回 庆寿辰宁府排家宴 见熙凤贾瑞起淫心',
+    '第十二回 王熙凤毒设相思局 贾天祥正照风月鉴',
+    '第十三回 秦可卿死封龙禁尉 王熙凤协理宁国府',
+    '第十四回 林如海灵返苏州郡 贾宝玉路谒北静王',
+    '第十五回 王凤姐弄权铁槛寺 秦鲸卿得趣馒头庵',
+    '第十六回 贾元春才选凤藻宫 秦鲸卿夭逝黄泉路',
+    '第十七回 大观园试才题对额 荣国府归省庆元宵',
+    '第十八回 皇恩重元妃省父母 天伦乐宝玉呈才藻',
+    '第十九回 情切切良宵花解语 意绵绵静日玉生香',
+    '第二十回 王熙凤正言弹妒意 林黛玉俏语谑娇音',
+    '第二十一回 贤袭人娇嗔箴宝玉 俏平儿软语救贾琏',
+    '第二十二回 听曲文宝玉悟禅机 制灯谜贾政悲谶语',
+    '第二十三回 西厢记妙词通戏语 牡丹亭艳曲警芳心',
+    '第二十四回 醉金刚轻财尚义侠 痴女儿遗帕惹相思',
+    '第二十五回 魇魔法叔嫂逢五鬼 通灵玉蒙蔽遇双真',
+    '第二十六回 蜂腰桥设言传心事 潇湘馆春困发幽情',
+    '第二十七回 滴翠亭杨妃戏彩蝶 埋香冢飞燕泣残红',
+    '第二十八回 蒋玉函情赠茜香罗 薛宝钗羞笼红麝串',
+    '第二十九回 享福人福深还祷福 多情女情重愈斟情',
+    '第三十回 宝钗借扇机带双敲 椿龄画蔷痴及局外',
+    '第三十一回 撕扇子作千金一笑 因麒麟伏白首双星',
+    '第三十二回 诉肺腑心迷活宝玉 含耻辱情烈死金钏',
+    '第三十三回 手足眈眈小动唇舌 不肖种种大承笞挞',
+    '第三十四回 情中情因情感妹妹 错里错以错劝哥哥',
+    '第三十五回 白玉钏亲尝莲叶羹 黄金莺巧结梅花络',
+    '第三十六回 绣鸳鸯梦兆绛芸轩 识分定情悟梨香院',
+    '第三十七回 秋爽斋偶结海棠社 蘅芜院夜拟菊花题',
+    '第三十八回 林潇湘魁夺菊花诗 薛蘅芜讽和螃蟹咏',
+    '第三十九回 村姥姥是信口开河 情哥哥偏寻根究底',
+    '第四十回 史太君两宴大观园 金鸳鸯三宣牙牌令',
+    '第四十一回 贾宝玉品茶栊翠庵 刘姥姥醉卧怡红院',
+    '第四十二回 蘅芜君兰言解疑癖 潇湘子雅谑补余音',
+    '第四十三回 闲取乐偶攒金庆寿 不了情暂撮土为香',
+    '第四十四回 变生不测凤姐泼醋 喜出望外平儿理妆',
+    '第四十五回 金兰契互剖金兰语 风雨夕闷制风雨词',
+    '第四十六回 尴尬人难免尴尬事 鸳鸯女誓绝鸳鸯偶',
+    '第四十七回 呆霸王调情遭苦打 冷郎君惧祸走他乡',
+    '第四十八回 滥情人情误思游艺 慕雅女雅集苦吟诗',
+    '第四十九回 琉璃世界白雪红梅 脂粉香娃割腥啖膻',
+    '第五十回 芦雪庭争联即景诗 暖香坞雅制春灯谜',
+    '第五十一回 薛小妹新编怀古诗 胡庸医乱用虎狼药',
+    '第五十二回 俏平儿情掩虾须镯 勇晴雯病补孔雀裘',
+    '第五十三回 宁国府除夕祭宗祠 荣国府元宵开夜宴',
+    '第五十四回 史太君破陈腐旧套 王熙凤效戏彩斑衣',
+    '第五十五回 辱亲女愚妾争闲气 欺幼主刁奴蓄险心',
+    '第五十六回 敏探春兴利除宿弊 贤宝钗小惠全大体',
+    '第五十七回 慧紫鹃情辞试莽玉 慈姨妈爱语慰痴颦',
+    '第五十八回 杏子阴假凤泣虚凰 茜纱窗真情揆痴理',
+    '第五十九回 柳叶渚边嗔莺叱燕 绛芸轩里召将飞符',
+    '第六十回 茉莉粉替去蔷薇硝 玫瑰露引出茯苓霜',
+    '第六十一回 投鼠忌器宝王瞒赃 判冤决狱平儿行权',
+    '第六十二回 憨湘云醉眠芍药裀 呆香菱情解石榴裙',
+    '第六十三回 寿怡红群芳开夜宴 死金丹独艳理亲丧',
+    '第六十四回 幽淑女悲题五美吟 浪荡子情遗九龙佩',
+    '第六十五回 贾二舍偷娶尤二姨 尤三姐思嫁柳二郎',
+    '第六十六回 情小妹耻情归地府 冷二郎一冷入空门',
+    '第六十七回 见土仪颦卿思故里 闻秘事凤姐讯家童',
+    '第六十八回 苦尤娘赚入大观园 酸凤姐大闹宁国府',
+    '第六十九回 弄小巧用借剑杀人 觉大限吞生金自逝',
+    '第七十回 林黛玉重建桃花社 史湘云偶填柳絮词',
+    '第七十一回 嫌隙人有心生嫌隙 鸳鸯女无意遇鸳鸯',
+    '第七十二回 王熙凤恃强羞说病 来旺妇倚势霸成亲',
+    '第七十三回 痴丫头误拾绣春囊 懦小姐不问累金凤',
+    '第七十四回 惑奸谗抄检大观园 避嫌隙杜绝宁国府',
+    '第七十五回 开夜宴异兆发悲音 赏中秋新词得佳谶',
+    '第七十六回 凸碧堂品笛感凄清 凹晶馆联诗悲寂寞',
+    '第七十七回 俏丫鬟抱屈夭风流 美优伶斩情归水月',
+    '第七十八回 老学士闲征姽婳词 痴公子杜撰芙蓉诔',
+    '第七十九回 薛文起悔娶河东吼 贾迎春误嫁中山狼',
+    '第八十回 美香菱屈受贪夫棒 王道士胡诌妒妇方',
+    '第八十一回 占旺相四美钓游鱼 奉严词两番入家塾',
+    '第八十二回 老学究讲义警顽心 病潇湘痴魂惊恶梦',
+    '第八十三回 省宫闱贾元妃染恙 闹闺阃薛宝钗吞声',
+    '第八十四回 试文字宝玉始提亲 探惊风贾环重结怨',
+    '第八十五回 贾存周报升郎中任 薛文起复惹放流刑',
+    '第八十六回 受私贿老官翻案牍 寄闲情淑女解琴书',
+    '第八十七回 感秋声抚琴悲往事 坐禅寂走火入邪魔',
+    '第八十八回 博庭欢宝玉赞孤儿 正家法贾珍鞭悍仆',
+    '第八十九回 人亡物在公子填词 蛇影杯弓颦卿绝粒',
+    '第九十回 失绵衣贫女耐嗷嘈 送果品小郎惊叵测',
+    '第九十一回 纵淫心宝蟾工设计 布疑阵宝玉妄谈禅',
+    '第九十二回 评女传巧姐慕贤良 玩母珠贾政参聚散',
+    '第九十三回 甄家仆投靠贾家门 水月庵掀翻风月案',
+    '第九十四回 宴海棠贾母赏花妖 失宝玉通灵知奇祸',
+    '第九十五回 因讹成实元妃薨逝 以假混真宝玉疯癫',
+    '第九十六回 瞒消息凤姐设奇谋 泄机关颦儿迷本性',
+    '第九十七回 林黛玉焚稿断痴情 薛宝钗出闺成大礼',
+    '第九十八回 苦绛珠魂归离恨天 病神瑛泪洒相思地',
+    '第九十九回 守官箴恶奴同破例 阅邸报老舅自担惊',
+    '第一百回 破好事香菱结深恨 悲远嫁宝玉感离情',
+    '第一百一回 大观园月夜警幽魂 散花寺神签惊异兆',
+    '第一百二回 宁国府骨肉病灾祲 大观园符水驱妖孽',
+    '第一百三回 施毒计金桂自焚身 昧真禅雨村空遇旧',
+    '第一百四回 醉金刚小鳅生大浪 痴公子余痛触前情',
+    '第一百五回 锦衣军查抄宁国府 骢马使弹劾平安州',
+    '第一百六回 王熙凤致祸抱羞惭 贾太君祷天消祸患',
+    '第一百七回 散余资贾母明大义 复世职政老沐天恩',
+    '第一百八回 强欢笑蘅芜庆生辰 死缠绵潇湘闻鬼哭',
+    '第一百九回 候芳魂五儿承错爱 还孽债迎女返真元',
+    '第一百十回 史太君寿终归地府 王凤姐力诎失人心',
+    '第一百十一回 鸳鸯女殉主登太虚 狗彘奴欺天招伙盗',
+    '第一百十二回 活冤孽妙姑遭大劫 死雠仇赵妾赴冥曹',
+    '第一百十三回 忏宿冤凤姐托村妪 释旧憾情婢感痴郎',
+    '第一百十四回 王熙凤历幻返金陵 甄应嘉蒙恩还玉阙',
+    '第一百十五回 惑偏私惜春矢素志 证同类宝玉失相知',
+    '第一百十六回 得通灵幻境悟仙缘 送慈柩故乡全孝道',
+    '第一百十七回 阻超凡佳人双护玉 欣聚党恶子独承家',
+    '第一百十八回 记微嫌舅兄欺弱女 惊谜语妻妾谏痴人',
+    '第一百十九回 中乡魁宝玉却尘缘 沐皇恩贾家延世泽',
+    '第一百二十回 甄士隐详说太虚情 贾雨村归结红楼梦'
+  ],
+  2: [
+    '第一回 宴桃园豪杰三结义 斩黄巾英雄首立功',
+    '第二回 张翼德怒鞭督邮 何国舅谋诛宦竖',
+    '第三回 议温明董卓叱丁原 馈金珠李肃说吕布',
+    '第四回 废汉帝陈留践位 谋董贼孟德献刀',
+    '第五回 发矫诏诸镇应曹公 破关兵三英战吕布',
+    '第六回 焚金阙董卓行凶 匿玉玺孙坚背约',
+    '第七回 袁绍磐河战公孙 孙坚跨江击刘表',
+    '第八回 王司徒巧使连环计 董太师大闹凤仪亭',
+    '第九回 除暴凶吕布助司徒 犯长安李傕听贾诩',
+    '第十回 勤王室马腾举义 报父仇曹操兴师',
+    '第十一回 刘皇叔北海救孔融 吕温侯濮阳破曹操',
+    '第十二回 陶恭祖三让徐州 曹孟穗大战吕布',
+    '第十三回 李傕郭汜大交兵 杨奉董承双救驾',
+    '第十四回 曹孟德移驾幸许都 吕奉先乘夜袭徐郡',
+    '第十五回 太史慈酣斗小霸王 孙伯符大战严白虎',
+    '第十六回 吕奉先射戟辕门 曹孟德败师淯水',
+    '第十七回 袁公路大起七军 曹孟德会合三将',
+    '第十八回 贾文和料敌决胜 夏侯惇拨矢啖睛',
+    '第十九回 下邳城曹操鏖兵 白门楼吕布殒命',
+    '第二十回 曹阿瞒许田打围 董国舅内阁受诏',
+    '第二十一回 曹操煮酒论英雄 关公赚城斩车胄',
+    '第二十二回 袁曹各起马步三军 关张共擒王刘二将',
+    '第二十三回 祢正平裸衣骂贼 吉太医下毒遭刑',
+    '第二十四回 国贼行凶杀贵妃 皇叔败走投袁绍',
+    '第二十五回 屯土山关公约三事 救白马曹操解重围',
+    '第二十六回 袁本初败兵折将 关云长挂印封金',
+    '第二十七回 美髯公千里走单骑 汉寿侯五关斩六将',
+    '第二十八回 斩蔡阳兄弟释疑 会古城主臣聚义',
+    '第二十九回 小霸王怒斩于吉 碧眼儿坐领江东',
+    '第三十回 战官渡本初败绩 劫乌巢孟德烧粮',
+    '第三十一回 曹操仓亭破本初 玄德荆州依刘表',
+    '第三十二回 夺冀州袁尚争锋 决漳河许攸献计',
+    '第三十三回 曹丕乘乱纳甄氏 郭嘉遗计定辽东',
+    '第三十四回 蔡夫人隔屏听密语 刘皇叔跃马过檀溪',
+    '第三十五回 玄德南漳逢隐沧 单福新野遇英主',
+    '第三十六回 玄德用计袭樊城 元直走马荐诸葛',
+    '第三十七回 司马徽再荐名士 刘玄德三顾草庐',
+    '第三十八回 定三分隆中决策 战长江孙氏报仇',
+    '第三十九回 荆州城公子三求计 博望坡军师初用兵',
+    '第四十回 蔡夫人议献荆州 诸葛亮火烧新野',
+    '第四十一回 刘玄德携民渡江 赵子龙单骑救主',
+    '第四十二回 张翼德大闹长坂桥 刘豫州败走汉津口',
+    '第四十三回 诸葛亮舌战群儒 鲁子敬力排众议',
+    '第四十四回 孔明用智激周瑜 孙权决计破曹操',
+    '第四十五回 三江口曹操折兵 群英会蒋干中计',
+    '第四十六回 用奇谋孔明借箭 献密计黄盖受刑',
+    '第四十七回 阚泽密献诈降书 庞统巧授连环计',
+    '第四十八回 宴长江曹操赋诗 锁战船北军用武',
+    '第四十九回 七星坛诸葛祭风 三江口周瑜纵火',
+    '第五十回 诸葛亮智算华容 关云长义释曹操',
+    '第五十一回 曹仁大战东吴兵 孔明一气周公瑾',
+    '第五十二回 诸葛亮智辞鲁肃 赵子龙计取桂阳',
+    '第五十三回 关云长义释黄汉升 孙仲谋大战张文远',
+    '第五十四回 吴国太佛寺看新郎 刘皇叔洞房续佳偶',
+    '第五十五回 玄德智激孙夫人 孔明二气周公瑾',
+    '第五十六回 曹操大宴铜雀台 孔明三气周公瑾',
+    '第五十七回 柴桑口卧龙吊丧 耒阳县凤雏理事',
+    '第五十八回 马孟起兴兵雪恨 曹阿瞒割须弃袍',
+    '第五十九回 许诸裸衣斗马超 曹操抹书问韩遂',
+    '第六十回 张永年反难杨修 庞士元议取西蜀',
+    '第六十一回 赵云截江夺阿斗 孙权遗书退老瞒',
+    '第六十二回 取涪关杨高授首 攻雒城黄魏争功',
+    '第六十三回 诸葛亮痛哭庞统 张翼德义释严颜',
+    '第六十四回 孔明定计捉张任 杨阜借兵破马超',
+    '第六十五回 马超大战葭萌关 刘备自领益州牧',
+    '第六十六回 关云长单刀赴会 伏皇后为国捐生',
+    '第六十七回 曹操平定汉中地 张辽威震逍遥津',
+    '第六十八回 甘宁百骑劫魏营 左慈掷杯戏曹操',
+    '第六十九回 卜周易管辂知机 讨汉贼五臣死节',
+    '第七十回 猛张飞智取瓦口隘 老黄忠计夺天荡山',
+    '第七十一回 占对山黄忠逸待劳 据汉水赵云寡胜众',
+    '第七十二回 诸葛亮智取汉中 曹阿瞒兵退斜谷',
+    '第七十三回 玄德进位汉中王 云长攻拔襄阳郡',
+    '第七十四回 庞令明抬榇决死战 关云长放水淹七军',
+    '第七十五回 关云长刮骨疗毒 吕子明白衣渡江',
+    '第七十六回 徐公明大战沔水 关云长败走麦城',
+    '第七十七回 玉泉山关公显圣 洛阳城曹操感神',
+    '第七十八回 治风疾神医身死 传遗命奸雄数终',
+    '第七十九回 兄逼弟曹植赋诗 侄陷叔刘封伏法',
+    '第八十回 曹丕废帝篡炎刘 汉王正位续大统',
+    '第八十一回 急兄仇张飞遇害 雪弟恨先主兴兵',
+    '第八十二回 孙权降魏受九锡 先主征吴赏六军',
+    '第八十三回 战猇亭先主得仇人 守江口书生拜大将',
+    '第八十四回 陆逊营烧七百里 孔明巧布八阵图',
+    '第八十五回 刘先主遗诏托孤儿 诸葛亮安居平五路',
+    '第八十六回 难张温秦宓逞天辩 破曹丕徐盛用火攻',
+    '第八十七回 征南寇丞相大兴师 抗天兵蛮王初受执',
+    '第八十八回 渡泸水再缚番王 识诈降三擒孟获',
+    '第八十九回 武乡侯四番用计 南蛮王五次遭擒',
+    '第九十回 驱巨善六破蛮兵 烧藤甲七擒孟获',
+    '第九十一回 祭泸水汉相班师 伐中原武侯上表',
+    '第九十二回 赵子龙力斩五将 诸葛亮智取三城',
+    '第九十三回 姜伯约归降孔明 武乡侯骂死王朝',
+    '第九十四回 诸葛亮乘雪破羌兵 司马懿克日擒孟达',
+    '第九十五回 马谡拒谏失街亭 武侯弹琴退仲达',
+    '第九十六回 孔明挥泪斩马谡 周鲂断发赚曹休',
+    '第九十七回 讨魏国武侯再上表 破曹兵姜维诈献书',
+    '第九十八回 追汉军王双受诛 袭陈仓武侯取胜',
+    '第九十九回 诸葛亮大破魏兵 司马懿入寇西蜀',
+    '第一百回 汉兵劫寨破曹真 武侯斗阵辱仲达',
+    '第一百一回 出陇上诸葛妆神 奔剑阁张郃中计',
+    '第一百二回 司马懿占北原渭桥 诸葛亮造木牛流马',
+    '第一百三回 上方谷司马受困 五丈原诸葛禳星',
+    '第一百四回 陨大星汉丞相归天 见木像魏都督丧胆',
+    '第一百五回 武侯预伏锦囊计 魏主拆取承露盘',
+    '第一百六回 公孙渊兵败死襄平 司马懿诈病赚曹爽',
+    '第一百七回 魏主政归司马氏 姜维兵败牛头山',
+    '第一百八回 丁奉雪中奋短兵 孙峻席间施密计',
+    '第一百九回 困司马汉将奇谋 废曹芳魏家果报',
+    '第一百十回 文鸯单骑退雄兵 姜维背水破大敌',
+    '第一百十一回 邓士载智败姜伯约 诸葛诞义讨司马昭',
+    '第一百十二回 救寿春于诠死节 取长城伯约鏖兵',
+    '第一百十三回 丁奉定计斩孙綝 姜维斗阵破邓艾',
+    '第一百十四回 曹髦驱车死南阙 姜维弃粮胜魏兵',
+    '第一百十五回 诏班师后主信谗 托屯田姜维避祸',
+    '第一百十六回 钟会分兵汉中道 武侯显圣定军山',
+    '第一百十七回 邓士载偷度阴平 诸葛瞻战死绵竹',
+    '第一百十八回 哭祖庙一王死孝 入西川二士争功',
+    '第一百十九回 假投降巧计成虚话 再受禅依样画葫芦',
+    '第一百二十回 荐杜预老将献新谋 降孙皓三分归一统'
+  ],
+  3: [
+    '第一回 灵根育孕源流出 心性修持大道生',
+    '第二回 悟彻菩提真妙理 断魔归本合元神',
+    '第三回 四海千山皆拱伏 九幽十类尽除名',
+    '第四回 官封弼马心何足 名注齐天意未宁',
+    '第五回 乱蟠桃大圣偷丹 反天宫诸神捉怪',
+    '第六回 观音赴会问原因 小圣施威降大圣',
+    '第七回 八卦炉中逃大圣 五行山下定心猿',
+    '第八回 我佛造经传极乐 观音奉旨上长安',
+    '第九回 袁守诚妙算无私曲 老龙王拙计犯天条',
+    '第十回 二将军宫门镇鬼 唐太宗地府还魂',
+    '第十一回 还受生唐王遵善果 度孤魂萧瑀正空门',
+    '第十二回 玄奘秉诚建大会 观音显象化金蝉',
+    '第十三回 陷虎穴金星解厄 双叉岭伯钦留僧',
+    '第十四回 心猿归正 六贼无踪',
+    '第十五回 蛇盘山诸神暗佑 鹰愁涧意马收缰',
+    '第十六回 观音院僧谋宝贝 黑风山怪窃袈裟',
+    '第十七回 孙行者大闹黑风山 观世音收伏熊罴怪',
+    '第十八回 观音院唐僧脱难 高老庄行者降魔',
+    '第十九回 云栈洞悟空收八戒 浮屠山玄奘受心经',
+    '第二十回 黄风岭唐僧有难 半山中八戒争先',
+    '第二十一回 护法设庄留大圣 须弥灵吉定风魔',
+    '第二十二回 八戒大战流沙河 木叉奉法收悟净',
+    '第二十三回 三藏不忘本 四圣试禅心',
+    '第二十四回 万寿山大仙留故友 五庄观行者窃人参',
+    '第二十五回 镇元仙赶捉取经僧 孙行者大闹五庄观',
+    '第二十六回 孙悟空三岛求方 观世音甘泉活树',
+    '第二十七回 尸魔三戏唐三藏 圣僧恨逐美猴王',
+    '第二十八回 花果山群妖聚义 黑松林三藏逢魔',
+    '第二十九回 脱难江流来国土 承恩八戒转山林',
+    '第三十回 邪魔侵正法 意马忆心猿',
+    '第三十一回 猪八戒义激猴王 孙行者智降妖怪',
+    '第三十二回 平顶山功曹传信 莲花洞木母逢灾',
+    '第三十三回 外道迷真性 元神助本心',
+    '第三十四回 魔王巧算困心猿 大圣腾那骗宝贝',
+    '第三十五回 外道施威欺正性 心猿获宝伏邪魔',
+    '第三十六回 心猿正处诸缘伏 劈破旁门见月明',
+    '第三十七回 鬼王夜谒唐三藏 悟空神化引婴儿',
+    '第三十八回 婴儿问母知邪正 金木参玄见假真',
+    '第三十九回 一粒金丹天上得 三年故主世间生',
+    '第四十回 婴儿戏化禅心乱 猿马刀归木母空',
+    '第四十一回 心猿遭火败 木母被魔擒',
+    '第四十二回 大圣殷勤拜南海 观音慈善缚红孩',
+    '第四十三回 黑河妖孽擒僧去 西洋龙子捉鼍回',
+    '第四十四回 法身元运逢车力 心正妖邪度脊关',
+    '第四十五回 三清观大圣留名 车迟国猴王显法',
+    '第四十六回 外道弄强欺正法 心猿显圣灭诸邪',
+    '第四十七回 圣僧夜阻通天水 金木垂慈救小童',
+    '第四十八回 魔弄寒风飘大雪 僧思拜佛履层冰',
+    '第四十九回 三藏有灾沉水宅 观音救难现鱼篮',
+    '第五十回 情乱性从因爱欲 神昏心动遇魔头',
+    '第五十一回 心猿空用千般计 水火无功难炼魔',
+    '第五十二回 悟空大闹金山兜洞 如来暗示主人公',
+    '第五十三回 禅主吞餐怀鬼孕 黄婆运水解邪胎',
+    '第五十四回 法性西来逢女国 心猿定计脱烟花',
+    '第五十五回 色邪淫戏唐三藏 性正修持不坏身',
+    '第五十六回 神狂诛草寇 道昧放心猿',
+    '第五十七回 真行者落伽山诉苦 假猴王水帘洞誊文',
+    '第五十八回 二心搅乱大乾坤 一体难修真寂灭',
+    '第五十九回 唐三藏路阻火焰山 孙行者一调芭蕉扇',
+    '第六十回 牛魔王罢战赴华筵 孙行者二调芭蕉扇',
+    '第六十一回 猪八戒助力败魔王 孙行者三调芭蕉扇',
+    '第六十二回 涤垢洗心惟扫塔 缚魔归正乃修身',
+    '第六十三回 二僧荡怪闹龙宫 群圣除邪获宝贝',
+    '第六十四回 荆棘岭悟能努力 木仙庵三藏谈诗',
+    '第六十五回 妖邪假设小雷音 四众皆遭大厄难',
+    '第六十六回 诸神遭毒手 弥勒缚妖魔',
+    '第六十七回 拯救驼罗禅性稳 脱离秽污道心清',
+    '第六十八回 朱紫国唐僧论前世 孙行者施为三折肱',
+    '第六十九回 心主夜间修药物 君王筵上论妖邪',
+    '第七十回 妖魔宝放烟沙火 悟空计盗紫金铃',
+    '第七十一回 行者假名降怪犼 观音现象伏妖王',
+    '第七十二回 盘丝洞七情迷本 濯垢泉八戒忘形',
+    '第七十三回 情因旧恨生灾毒 心主遭魔幸破光',
+    '第七十四回 长庚传报魔头狠 行者施为变化能',
+    '第七十五回 心猿钻透阴阳窍 魔王还归大道真',
+    '第七十六回 心神居舍魔归性 木母同降怪体真',
+    '第七十七回 群魔欺本性 一体拜真如',
+    '第七十八回 比丘怜子遣阴神 金殿识魔谈道德',
+    '第七十九回 寻洞擒妖逢老寿 当朝正主救婴儿',
+    '第八十回 姹女育阳求配偶 心猿护主识妖邪',
+    '第八十一回 镇海寺心猿知怪 黑松林三众寻师',
+    '第八十二回 姹女求阳 元神护道',
+    '第八十三回 心猿识得丹头 姹女还归本性',
+    '第八十四回 难灭伽持圆大觉 法王成正体天然',
+    '第八十五回 心猿妒木母 魔主计吞禅',
+    '第八十六回 木母助威征怪物 金公施法灭妖邪',
+    '第八十七回 凤仙郡冒天止雨 孙大圣劝善施霖',
+    '第八十八回 禅到玉华施法会 心猿木母授门人',
+    '第八十九回 黄狮精虚设钉钯宴 金木土计闹豹头山',
+    '第九十回 师狮授受同归一 盗道缠禅静九灵',
+    '第九十一回 金平府元夜观灯 玄英洞唐僧供状',
+    '第九十二回 三僧大战青龙山 四星挟捉犀牛怪',
+    '第九十三回 给孤园问古谈因 天竺国朝王遇偶',
+    '第九十四回 四僧宴乐御花园 一怪空怀情欲喜',
+    '第九十五回 假合真形擒玉兔 真阴归正会灵元',
+    '第九十六回 寇员外喜待高僧 唐长老不贪富贵',
+    '第九十七回 金酬外护遭魔毒 圣显幽魂救本原',
+    '第九十八回 猿熟马驯方脱壳 功成行满见真如',
+    '第九十九回 九九数完魔刬尽 三三行满道归根',
+    '第一百回 径回东土 五圣成真',
+    '附录 陈光蕊赴任逢灾 江流僧复仇报本'
+  ],
+  4: [
+    '楔子 张天师祈禳瘟疫 洪太尉误走妖魔',
+    '第一回 王教头私走延安府 九纹龙大闹史家村',
+    '第二回 史大郎夜走华阴县 鲁提辖拳打镇关西',
+    '第三回 赵员外重修文殊院 鲁智深大闹五台山',
+    '第四回 小霸王醉入销金帐 花和尚大闹桃花村',
+    '第五回 九纹龙翦径赤松林 鲁智深火烧瓦官寺',
+    '第六回 花和尚倒拔垂杨柳 豹子头误入白虎堂',
+    '第七回 林教头刺配沧州道 鲁智深大闹野猪林',
+    '第八回 柴进门招天下客 林冲棒打洪教头',
+    '第九回 林教头风雪山神庙 陆虞候火烧草料场',
+    '第十回 朱贵水亭施号箭 林冲雪夜上梁山',
+    '第十一回 梁山泊林冲落草 汴京城杨志卖刀',
+    '第十二回 青面兽北京斗武 急先锋东郭争功',
+    '第十三回  赤发鬼醉卧灵官殿 晁天王认义东溪村',
+    '第十四回  吴学究说三阮撞筹 公孙胜应七星聚义',
+    '第十五回  杨志押送金银担 吴用智取生辰网',
+    '第十六回  花和尚单打二龙山 青面兽双夺宝珠寺',
+    '第十七回  美髯公智稳插翅虎 宋公明私放晁天王',
+    '第十八回  林冲水寨大并火 晁盖梁山小夺泊',
+    '第十九回  梁山泊义士尊晁盖 郓城县月夜走刘唐',
+    '第二十回  虔婆醉打唐牛儿 宋江怒杀阎婆惜',
+    '第二十一回  阎婆大闹郓城县 朱仝义释宋公明',
+    '第二十二回  横海郡柴进留宾 景阳冈武松打虎',
+    '第二十三回  王婆贪贿说风情 郓哥不忿闹茶肆',
+    '第二十四回  王婆计啜西门庆 淫妇药鸩武大郎',
+    '第二十五回  郓哥大闹授官厅 武松斗杀西门庆',
+    '第二十六回  母夜叉孟州道卖人肉 武都头十字坡遇张青',
+    '第二十七回  武松威镇安平寨 施恩义夺快活林',
+    '第二十八回  施恩重霸孟州道 武松醉打蒋门神',
+    '第二十九回  施恩三人死囚牢 武松大闹飞云浦',
+    '第三十回  张都监血溅鸳鸯楼 武行者夜走蜈蚣岭',
+    '第三十一回  武行者醉打孔亮 锦毛虎义释宋江',
+    '第三十二回  宋江夜看小鳌山 花荣大闹清风寨',
+    '第三十三回  镇三山大闹青州道 霹雳火夜走瓦砾场',
+    '第三十四回 石将军村店寄书 小李广梁山射雁',
+    '第三十五回 梁山泊吴用举戴宗 揭阳岭宋江逢李俊',
+    '第三十六回 没遮拦追赶及时雨 船火儿夜闹浔阳江',
+    '第三十七回 及时雨会神行太保 黑旋风展浪里白条',
+    '第三十八回 浔阳楼宋江吟反诗 梁山泊戴宗传假信',
+    '第三十九回 梁山泊好汉劫法场 白龙庙英雄小聚义',
+    '第四十回 宋江智取无为军 张顺活捉黄文炳',
+    '第四十一回 还道村受三卷天书 宋公明遇九天玄女',
+    '第四十二回 假李逵剪径劫单身 黑旋风沂岭杀四虎',
+    '第四十三回 锦豹子小径逢戴宗 病关索长街遇石秀',
+    '第四十四回 杨雄醉骂潘巧云 石秀智杀裴如海',
+    '第四十五回 病关索大翠屏山 拚命三火烧祝家店',
+    '第四十六回 扑天雕两修生死书 宋公明一打祝家庄',
+    '第四十七回 一丈青单捉王矮虎 宋公明二打祝家庄',
+    '第四十八回 解珍解宝双越狱 孙立孙新大劫牢',
+    '第四十九回 吴学究双掌连环计 宋公明三打祝家庄',
+    '第五十回 插翅虎枷打白秀英 美髯公误失小衙内',
+    '第五十一回 李逵打死殷天赐 柴进失陷高唐州',
+    '第五十二回 戴宗二取公孙胜 李逵独劈罗真人',
+    '第五十三回 入云龙斗法破高廉 黑旋风下井救柴进',
+    '第五十四回 高太尉大兴三路兵 呼延灼摆布连环马',
+    '第五十五回 吴用使时迁偷甲 汤隆赚徐宁上山',
+    '第五十六回 徐宁教使钩镰枪 宋江大破连环马',
+    '第五十七回 三山聚义打青州 众虎同心归水泊',
+    '第五十八回 吴用赚金铃吊挂 宋江闹西岳华山',
+    '第五十九回 公孙胜芒砀山降魔 晁天王曾头市中箭',
+    '第六十回 吴用智赚玉麒麟 张顺夜闹金沙渡',
+    '第六十一回 放冷箭燕青救主 劫法场石秀跳楼',
+    '第六十二回 宋江兵打大名城 关胜议取梁山泊',
+    '第六十三回 呼延灼月夜赚关胜 宋公明雪天擒索超',
+    '第六十四回 托塔天王梦中显圣 浪里白条水上报冤',
+    '第六十五回 时迁火烧翠云楼 吴用智取大名府',
+    '第六十六回 宋江赏步三军 关胜降水火二将',
+    '第六十七回 宋公明夜打曾头市 卢俊义活捉史文恭',
+    '第六十八回 东平府误陷九纹龙 宋公明义释双枪将',
+    '第六十九回 没羽箭飞石打英雄 宋公明弃粮擒壮士',
+    '第七十回 忠义堂石碣受天文 梁山泊英雄惊恶梦',
+    '第七十一回 梁山泊英雄排座次 宋公明慷慨话宿愿',
+    '第七十二回 柴进簪花入禁院 李逵元夜闹东京',
+    '第七十三回 黑旋风乔捉鬼 梁山泊双献头',
+    '第七十四回 燕青智扑擎天柱 李逵寿张乔坐衙',
+    '第七十五回 活阎罗倒船偷御酒 黑旋风扯诏骂钦差',
+    '第七十六回 吴加亮布四斗五方旗 宋公明排九宫八卦阵',
+    '第七十七回 梁山泊十面埋伏 宋公明两赢童贯',
+    '第七十八回 十节度议取梁山泊 宋公明一败高太尉',
+    '第七十九回 刘唐放火烧战船 宋江两败高太尉',
+    '第八十回 张顺凿漏海鳅船 宋江三败高太尉',
+    '第八十一回 燕青月夜遇道君 戴宗定计出乐和',
+    '第八十二回 梁山泊分金大买市 宋公明全夥受招安',
+    '第八十三回 宋公明奉诏破大辽 陈桥驿滴泪斩小卒',
+    '第八十四回 宋公明兵打蓟州城 卢俊义大战玉田县',
+    '第八十五回 宋公明夜度益津关 吴学究智取文安县',
+    '第八十六回 宋公明大战独鹿山 卢俊义兵陷青石峪',
+    '第八十七回 宋公明大战幽州 呼延灼力擒番将',
+    '第八十八回 颜统军阵列混天象 宋公明梦授玄女法',
+    '第八十九回 宋公明破阵成功 宿太尉颁恩降诏',
+    '第九十回 五台山宋江参禅 双林镇燕青遇故',
+    '第九十一回 宋公明兵渡黄河 卢俊义赚城黑夜',
+    '第九十二回 振军威小李广神箭 打盖郡智多星密筹',
+    '第九十三回 李逵梦闹天池 宋江兵分两路',
+    '第九十四回 关胜义降三将 李逵莽陷众人',
+    '第九十五回 宋公明忠感后土 乔道清术败宋兵',
+    '第九十六回 幻魔君术窘五龙山 入云龙兵围百谷岭',
+    '第九十七回 陈 谏官升安抚 琼英处女做先锋',
+    '第九十八回 张清缘配琼英 吴用计鸩邬梨',
+    '第九十九回 花和尚解脱缘缠井 混江龙水灌太原城',
+    '第一百回 张清琼英双建功 陈瓘宋江同奏捷',
+    '第一百零一回 谋坟地阴险产逆 蹈春阳妖艳生奸',
+    '第一百零二回 王庆因奸 官司 龚端被打师军犯',
+    '第一百零三回 张管营因妾弟丧身 范节级为表兄医脸',
+    '第一百零四回 段家庄重招新女婿 房山寨双并旧强人',
+    '第一百零五回 宋公明避暑疗军兵 乔道清回风烧贼寇',
+    '第一百零六回 书生谈笑却强敌 水军汨没破坚城',
+    '第一百零七回 宋江大胜纪山军 朱武打破六花阵',
+    '第一百零八回 乔道清兴雾取城 小旋风藏炮击贼',
+    '第一百零九回 王庆渡江被捉 宋江剿寇成功',
+    '第一百一十回 燕青秋林渡射雁 宋江东京城献俘',
+    '第一百一十一回 张顺夜伏金山寺 宋江智取润州城',
+    '第一百一十二回 卢俊义分兵宣州道 宋公明大战毗陵郡',
+    '第一百一十三回 混江龙太湖小结义 宋公明苏州大会垓',
+    '第一百一十四回 宁海军宋江吊孝 涌金门张顺归神',
+    '第一百一十五回 张顺魂捉方天定 宋江智取宁海军',
+    '第一百一十六回 卢俊义分兵歙州道 宋公明大战乌龙岭',
+    '第一百一十七回 睦州城箭射邓元觉 乌龙岭神助宋公明',
+    '第一百一十八回 卢俊义大战昱岭关 宋公明智取清溪洞',
+    '第一百一十九回 鲁智深浙江坐化 宋公明衣锦还乡',
+    '第一百二十回 宋公明神聚蓼儿 徽宗帝梦游梁山泊'
+  ],
+  5: [
+    '金瓶梅序',
+    '第一回 西门庆热结十弟兄 武二郎冷遇亲哥嫂',
+    '第二回 俏潘娘帘下勾情 老王婆茶坊说技',
+    '第三回 定挨光王婆受贿 设圈套浪子私挑',
+    '第四回 赴巫山潘氏幽欢 闹茶坊郓哥义愤',
+    '第五回 捉奸情郓哥定计 饮鸩药武大遭殃',
+    '第六回 何九受贿瞒天 王婆帮闲遇雨',
+    '第七回 薛媒婆说娶孟三儿 杨姑娘气骂张四舅',
+    '第八回 盼情郎佳人占鬼卦 烧夫灵和尚听淫声',
+    '第九回 西门庆偷娶潘金莲 武都头误打李皂隶',
+    '第十回 义士充配孟州道 妻妾玩赏芙蓉亭',
+    '第十一回 潘金莲激打孙雪娥 西门庆梳笼李桂姐',
+    '第十二回 潘金莲私仆受辱 刘理星魇胜求财',
+    '第十三回 李瓶姐墙头密约 迎春儿隙底私窥',
+    '第十四回 花子虚因气丧身 李瓶儿迎奸赴会',
+    '第十五回 佳人笑赏玩灯楼 狎客帮嫖丽春院',
+    '第十六回 西门庆择吉佳期 应伯爵追欢喜庆',
+    '第十七回 宇给事劾倒杨提督 李瓶儿许嫁蒋竹山',
+    '第十八回 赂相府西门脱祸 见娇娘敬济销魂',
+    '第十九回 草里蛇逻打蒋竹山 李瓶儿情感西门庆',
+    '第二十回 傻帮闲趋奉闹华筵 痴子弟争锋毁花院',
+    '第二十一回 吴月娘扫雪烹茶 应伯爵替花邀酒',
+    '第二十二回 蕙莲儿偷期蒙爱 春梅姐正色闲邪',
+    '第二十三回 赌棋枰瓶儿输钞 觑藏春潘氏潜踪',
+    '第二十四回 敬济元夜戏娇姿 惠祥怒詈来旺妇',
+    '第二十五回 吴月娘春昼秋千 来旺儿醉中谤仙',
+    '第二十六回 来旺儿递解徐州 宋蕙莲含羞自缢',
+    '第二十七回 李瓶儿私语翡翠轩 潘金莲醉闹葡萄架',
+    '第二十八回 陈敬济徼幸得金 莲西门庆糊涂打铁棍',
+    '第二十九回 吴神仙冰鉴定终身 潘金莲兰汤邀午战',
+    '第三十回 蔡太师擅恩锡爵 西门庆生子加官',
+    '第三十一回 琴童儿藏壶构衅 西门庆开宴为欢',
+    '第三十二回 李桂姐趋炎认女 潘金莲怀妒惊儿',
+    '第三十三回 陈敬济失钥 罚唱韩道国纵妇争锋',
+    '第三十四回 献芳樽内室乞恩 受私贿后庭说事',
+    '第三十五回 西门庆为男宠报仇 书童儿作女妆媚客',
+    '第三十六回 翟管家寄书寻女子 蔡状元留饮借盘缠',
+    '第三十七回 冯妈妈说嫁韩爱姐 西门庆包占王六儿',
+    '第三十八回 王六儿棒槌打捣鬼 潘金莲雪夜弄琵琶',
+    '第三十九回 寄法名官哥穿道服 散生日敬济拜冤家',
+    '第四十回 抱孩童瓶儿希宠 妆丫鬟金莲市爱',
+    '第四十一回 两孩儿联姻共笑嬉 二佳人愤深同气苦',
+    '第四十二回 逞豪华门前放烟火 赏元宵楼上醉花灯',
+    '第四十三回 争宠爱金莲惹气 卖富贵吴月攀亲',
+    '第四十四回 避马房侍女偷金 下象棋佳人消夜',
+    '第四十五回 应伯爵劝当铜锣 李瓶儿解衣银姐',
+    '第四十六回 元夜游行遇雪雨 妻妾戏笑卜龟儿',
+    '第四十七回 苗青贪财害主 西门枉法受赃',
+    '第四十八回 弄私情戏赠一枝桃 走捷径探归七件事',
+    '第四十九回 请巡按屈体求荣 遇胡僧现身施药',
+    '第五十回 琴童潜听燕莺欢 玳安嬉游蝴蝶巷',
+    '第五十一回 打猫儿金莲品玉 斗叶子敬济输金',
+    '第五十二回 应伯爵山洞戏春娇 潘金莲花园调爱婿',
+    '第五十三回 潘金莲惊散幽欢 吴月娘拜求子息',
+    '第五十四回 应伯爵隔花戏金钏 任医官垂帐诊瓶儿',
+    '第五十五回 西门庆两番庆寿旦 苗员外一诺送歌童',
+    '第五十六回 西门庆捐金助朋友 常峙节得钞傲妻儿',
+    '第五十七回 开缘簿千金喜舍 戏雕栏一笑回嗔',
+    '第五十八回 潘金莲打狗伤人 孟玉楼周贫磨镜',
+    '第五十九回 西门庆露阳惊爱月 李瓶儿睹物哭官哥',
+    '第六十回 李瓶儿病缠死孽 西门庆官作生涯',
+    '第六十一回 西门庆乘醉烧阴户 李瓶儿带病宴重阳',
+    '第六十二回 潘道士法遣黄巾士 西门庆大哭李瓶儿',
+    '第六十三回 韩画士传真作遗爱 西门庆观戏动深悲',
+    '第六十四回 玉箫跪受三章约 书童私挂一帆风',
+    '第六十五回 愿同穴一时丧礼盛 守孤灵半夜口脂香',
+    '第六十六回 翟管家寄书致赙 黄真人发牒荐亡',
+    '第六十七回 西门庆书房赏雪 李瓶儿梦诉幽情',
+    '第六十八回 应伯爵戏衔玉臂 玳安儿密访蜂媒',
+    '第六十九回 招宣府初调林太太 丽春院惊走王三官',
+    '第七十回 老太监引酌朝房 二提刑庭参太尉',
+    '第七十一回 李瓶儿何家托梦 提刑官引奏朝仪',
+    '第七十二回 潘金莲抠打如意儿 王三官义拜西门庆',
+    '第七十三回 潘金莲不愤忆吹箫 西门庆新试白绫带',
+    '第七十四回 潘金莲香腮偎玉 薛姑子佛口谈经',
+    '第七十五回 因抱恙玉姐含酸 为护短金莲泼醋',
+    '第七十六回 春梅娇撒西门庆 画童哭躲温葵轩',
+    '第七十七回 西门庆踏雪访爱月 贲四嫂带水战情郎',
+    '第七十八回 林太太鸳帏再战 如意儿茎露独尝',
+    '第七十九回 西门庆贪欲丧命 吴月娘失偶生儿',
+    '第八十回 潘金莲售色赴东床 李娇儿盗财归丽院',
+    '第八十一回 韩道国拐财远遁 汤来保欺主背恩',
+    '第八十二回 陈敬济弄一得双 潘金莲热心冷面',
+    '第八十三回 秋菊含恨泄幽情 春梅寄柬谐佳会',
+    '第八十四回 吴月娘大闹碧霞宫 曾静师化缘雪涧洞',
+    '第八十五回 吴月娘识破奸情 春梅姐不垂别泪',
+    '第八十六回 雪娥唆打陈敬济 金莲解渴王潮儿',
+    '第八十七回 王婆子贪财忘祸 武都头杀嫂祭兄',
+    '第八十八回 陈敬济感旧祭金莲 庞大姐埋尸托张胜',
+    '第八十九回 清明节寡妇上新坟 永福寺夫人逢故主',
+    '第九十回 来旺偷拐孙雪娥 雪娥受辱守备府',
+    '第九十一回 孟玉楼爱嫁李衙内 李衙内怒打玉簪儿',
+    '第九十二回 陈敬济被陷严州府 吴月娘大闹授官厅',
+    '第九十三回 王杏庵义恤贫儿 金道士娈淫少弟',
+    '第九十四回 大酒楼刘二撒泼 洒家店雪娥为娼',
+    '第九十五回 玳安儿窃玉成婚 吴典恩负心被辱',
+    '第九十六回 春梅姐游旧家池馆 杨光彦作当面豺狼',
+    '第九十七回 假弟妹暗续鸾胶 真夫妇明谐花烛',
+    '第九十八回 陈敬济临清逢旧识 韩爱姐翠馆遇情郎',
+    '第九十九回 刘二醉骂王六儿 张胜窃听张敬济',
+    '第一百回 韩爱姐路遇二捣鬼 普静师幻度孝哥儿'
+  ]
+}

BIN
src/assets/fonts/仓耳非白W02.ttf


BIN
src/assets/fonts/千图笔锋手写体.ttf


BIN
src/assets/fonts/字体传奇南安体.ttf


BIN
src/assets/iconfont/iconfont.ttf


+ 1 - 0
src/assets/images/back.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1626331682115" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2000" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M967.111111 455.111111v113.777778H170.666667V455.111111z" fill="#ffffff" p-id="2001"></path><path d="M477.866667 955.733333L34.133333 517.688889l443.733334-443.733333 79.644444 79.644444-364.088889 364.088889 364.088889 358.4z" fill="#ffffff" p-id="2002"></path></svg>

BIN
src/assets/images/cancel.png


+ 1 - 0
src/assets/images/earphone.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1626427599321" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4397" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M895.009815 1024h-191.772869a63.92429 63.92429 0 0 1-63.924289-63.92429v-319.621448a63.92429 63.92429 0 0 1 63.924289-63.92429h191.772869v-50.500189a393.134381 393.134381 0 0 0-333.045549-393.773624A383.545738 383.545738 0 0 0 127.918339 512.605683v63.924289h191.772869a63.92429 63.92429 0 0 1 63.92429 63.92429v319.621448a63.92429 63.92429 0 0 1-63.92429 63.92429H127.918339a127.848579 127.848579 0 0 1-127.848579-127.848579V530.504484A522.900689 522.900689 0 0 1 476.305718 1.211365 511.394317 511.394317 0 0 1 1022.858395 512.605683v383.545738a127.848579 127.848579 0 0 1-127.84858 127.848579z m-127.848579-127.848579h127.848579v-191.772869h-127.848579zM127.918339 896.151421h127.84858v-191.772869H127.918339z" fill="#ffffff" p-id="4398"></path></svg>

BIN
src/assets/images/honglou.jpg


BIN
src/assets/images/honglou_row.jpeg


BIN
src/assets/images/jinpingmei.jpeg


BIN
src/assets/images/jinpingmei_row.jpeg


+ 1 - 0
src/assets/images/moon.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1626406398080" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2204" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M505.4 878.6c-196.7 0-358-150.9-374.9-343.1 1-18.6 16.1-33.4 34.9-33.4 10.8 0 20.5 4.8 26.9 12.4 0.2 0.3 0.5 0.1 0.5-0.7 41.6 44.2 100.5 71.9 166.1 71.9 127.1 0 230.1-103 230.1-230.1 0-66.1-28-125.1-72.6-166.8 0.1-0.1 0.5-0.1 0.3-0.3-7-6.5-11.4-15.7-11.4-26.1 0-19 14.9-34.1 33.7-35.3 192.1 17.1 342.9 178.3 342.9 375 0 208-168.5 376.5-376.5 376.5z" p-id="2205" fill="#ffffff"></path></svg>

BIN
src/assets/images/no-data.png


BIN
src/assets/images/sanguo.jpg


BIN
src/assets/images/sanguo_row.jpg


BIN
src/assets/images/shuihu.jpg


BIN
src/assets/images/shuihu_row.png


+ 1 - 0
src/assets/images/sun.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1626406451846" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3375" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M450.6 64.9h125.6v125.6H450.6zM150.065 239.09l88.81-88.81 88.812 88.81-88.811 88.812zM60.9 449.2h125.6v125.6H60.9zM146.305 786.482l88.811-88.811 88.811 88.81-88.811 88.812zM445.2 838.9h125.6v125.6H445.2zM693.696 790.241l88.81-88.81 88.812 88.81-88.811 88.811zM834.9 454.6h125.6v125.6H834.9zM697.385 242.921l88.81-88.81 88.812 88.81-88.811 88.811zM513 261c-139.9 0-253.2 113.4-253.2 253.2S373.1 767.5 513 767.5s253.2-113.4 253.2-253.2S652.9 261 513 261z" p-id="3376" fill="#ffffff"></path></svg>

BIN
src/assets/images/xiyou.jpg


BIN
src/assets/images/xiyou_row.jpeg


+ 1342 - 0
src/assets/js/appStatistics.min_new.js

@@ -0,0 +1,1342 @@
+const config = { url: 'http://log.ktj.wankacn.com' }
+var CryptoJS =
+  CryptoJS ||
+  (function(e, t) {
+    var r = {},
+      i = (r.lib = {}),
+      n = function() {},
+      s = (i.Base = {
+        extend: function(e) {
+          n.prototype = this
+          var t = new n()
+          return (
+            e && t.mixIn(e),
+            t.hasOwnProperty('init') ||
+              (t.init = function() {
+                t.$super.init.apply(this, arguments)
+              }),
+            (t.init.prototype = t),
+            (t.$super = this),
+            t
+          )
+        },
+        create: function() {
+          var e = this.extend()
+          return e.init.apply(e, arguments), e
+        },
+        init: function() {},
+        mixIn: function(e) {
+          for (var t in e) e.hasOwnProperty(t) && (this[t] = e[t])
+          e.hasOwnProperty('toString') && (this.toString = e.toString)
+        },
+        clone: function() {
+          return this.init.prototype.extend(this)
+        }
+      }),
+      o = (i.WordArray = s.extend({
+        init: function(e, t) {
+          ;(e = this.words = e || []),
+            (this.sigBytes = null != t ? t : 4 * e.length)
+        },
+        toString: function(e) {
+          return (e || c).stringify(this)
+        },
+        concat: function(e) {
+          var t = this.words,
+            r = e.words,
+            i = this.sigBytes
+          if (((e = e.sigBytes), this.clamp(), i % 4))
+            for (var n = 0; n < e; n++)
+              t[(i + n) >>> 2] |=
+                ((r[n >>> 2] >>> (24 - (n % 4) * 8)) & 255) <<
+                (24 - ((i + n) % 4) * 8)
+          else if (65535 < r.length)
+            for (n = 0; n < e; n += 4) t[(i + n) >>> 2] = r[n >>> 2]
+          else t.push.apply(t, r)
+          return (this.sigBytes += e), this
+        },
+        clamp: function() {
+          var t = this.words,
+            r = this.sigBytes
+          ;(t[r >>> 2] &= 4294967295 << (32 - (r % 4) * 8)),
+            (t.length = e.ceil(r / 4))
+        },
+        clone: function() {
+          var e = s.clone.call(this)
+          return (e.words = this.words.slice(0)), e
+        },
+        random: function(t) {
+          for (var r = [], i = 0; i < t; i += 4)
+            r.push((4294967296 * e.random()) | 0)
+          return new o.init(r, t)
+        }
+      })),
+      a = (r.enc = {}),
+      c = (a.Hex = {
+        stringify: function(e) {
+          var t = e.words
+          e = e.sigBytes
+          for (var r = [], i = 0; i < e; i++) {
+            var n = (t[i >>> 2] >>> (24 - (i % 4) * 8)) & 255
+            r.push((n >>> 4).toString(16)), r.push((15 & n).toString(16))
+          }
+          return r.join('')
+        },
+        parse: function(e) {
+          for (var t = e.length, r = [], i = 0; i < t; i += 2)
+            r[i >>> 3] |= parseInt(e.substr(i, 2), 16) << (24 - (i % 8) * 4)
+          return new o.init(r, t / 2)
+        }
+      }),
+      u = (a.Latin1 = {
+        stringify: function(e) {
+          var t = e.words
+          e = e.sigBytes
+          for (var r = [], i = 0; i < e; i++)
+            r.push(
+              String.fromCharCode((t[i >>> 2] >>> (24 - (i % 4) * 8)) & 255)
+            )
+          return r.join('')
+        },
+        parse: function(e) {
+          for (var t = e.length, r = [], i = 0; i < t; i++)
+            r[i >>> 2] |= (255 & e.charCodeAt(i)) << (24 - (i % 4) * 8)
+          return new o.init(r, t)
+        }
+      }),
+      h = (a.Utf8 = {
+        stringify: function(e) {
+          try {
+            return decodeURIComponent(escape(u.stringify(e)))
+          } catch (e) {
+            throw Error('Malformed UTF-8 data')
+          }
+        },
+        parse: function(e) {
+          return u.parse(unescape(encodeURIComponent(e)))
+        }
+      }),
+      p = (i.BufferedBlockAlgorithm = s.extend({
+        reset: function() {
+          ;(this._data = new o.init()), (this._nDataBytes = 0)
+        },
+        _append: function(e) {
+          'string' == typeof e && (e = h.parse(e)),
+            this._data.concat(e),
+            (this._nDataBytes += e.sigBytes)
+        },
+        _process: function(t) {
+          var r = this._data,
+            i = r.words,
+            n = r.sigBytes,
+            s = this.blockSize,
+            a = n / (4 * s)
+          if (
+            ((t =
+              (a = t ? e.ceil(a) : e.max((0 | a) - this._minBufferSize, 0)) *
+              s),
+            (n = e.min(4 * t, n)),
+            t)
+          ) {
+            for (var c = 0; c < t; c += s) this._doProcessBlock(i, c)
+            ;(c = i.splice(0, t)), (r.sigBytes -= n)
+          }
+          return new o.init(c, n)
+        },
+        clone: function() {
+          var e = s.clone.call(this)
+          return (e._data = this._data.clone()), e
+        },
+        _minBufferSize: 0
+      }))
+    i.Hasher = p.extend({
+      cfg: s.extend(),
+      init: function(e) {
+        ;(this.cfg = this.cfg.extend(e)), this.reset()
+      },
+      reset: function() {
+        p.reset.call(this), this._doReset()
+      },
+      update: function(e) {
+        return this._append(e), this._process(), this
+      },
+      finalize: function(e) {
+        return e && this._append(e), this._doFinalize()
+      },
+      blockSize: 16,
+      _createHelper: function(e) {
+        return function(t, r) {
+          return new e.init(r).finalize(t)
+        }
+      },
+      _createHmacHelper: function(e) {
+        return function(t, r) {
+          return new f.HMAC.init(e, r).finalize(t)
+        }
+      }
+    })
+    var f = (r.algo = {})
+    return r
+  })(Math)
+!(function() {
+  var e = CryptoJS,
+    t = e.lib.WordArray
+  e.enc.Base64 = {
+    stringify: function(e) {
+      var t = e.words,
+        r = e.sigBytes,
+        i = this._map
+      e.clamp(), (e = [])
+      for (var n = 0; n < r; n += 3)
+        for (
+          var s =
+              (((t[n >>> 2] >>> (24 - (n % 4) * 8)) & 255) << 16) |
+              (((t[(n + 1) >>> 2] >>> (24 - ((n + 1) % 4) * 8)) & 255) << 8) |
+              ((t[(n + 2) >>> 2] >>> (24 - ((n + 2) % 4) * 8)) & 255),
+            o = 0;
+          4 > o && n + 0.75 * o < r;
+          o++
+        )
+          e.push(i.charAt((s >>> (6 * (3 - o))) & 63))
+      if ((t = i.charAt(64))) for (; e.length % 4; ) e.push(t)
+      return e.join('')
+    },
+    parse: function(e) {
+      var r = e.length,
+        i = this._map
+      ;(n = i.charAt(64)) && -1 != (n = e.indexOf(n)) && (r = n)
+      for (var n = [], s = 0, o = 0; o < r; o++)
+        if (o % 4) {
+          var a = i.indexOf(e.charAt(o - 1)) << ((o % 4) * 2),
+            c = i.indexOf(e.charAt(o)) >>> (6 - (o % 4) * 2)
+          ;(n[s >>> 2] |= (a | c) << (24 - (s % 4) * 8)), s++
+        }
+      return t.create(n, s)
+    },
+    _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
+  }
+})(),
+  (function(e) {
+    function t(e, t, r, i, n, s, o) {
+      return (
+        (((e = e + ((t & r) | (~t & i)) + n + o) << s) | (e >>> (32 - s))) + t
+      )
+    }
+    function r(e, t, r, i, n, s, o) {
+      return (
+        (((e = e + ((t & i) | (r & ~i)) + n + o) << s) | (e >>> (32 - s))) + t
+      )
+    }
+    function i(e, t, r, i, n, s, o) {
+      return (((e = e + (t ^ r ^ i) + n + o) << s) | (e >>> (32 - s))) + t
+    }
+    function n(e, t, r, i, n, s, o) {
+      return (((e = e + (r ^ (t | ~i)) + n + o) << s) | (e >>> (32 - s))) + t
+    }
+    for (
+      var s = CryptoJS,
+        o = (c = s.lib).WordArray,
+        a = c.Hasher,
+        c = s.algo,
+        u = [],
+        h = 0;
+      64 > h;
+      h++
+    )
+      u[h] = (4294967296 * e.abs(e.sin(h + 1))) | 0
+    ;(c = c.MD5 = a.extend({
+      _doReset: function() {
+        this._hash = new o.init([1732584193, 4023233417, 2562383102, 271733878])
+      },
+      _doProcessBlock: function(e, s) {
+        for (var o = 0; 16 > o; o++) {
+          var a = e[(c = s + o)]
+          e[c] =
+            (16711935 & ((a << 8) | (a >>> 24))) |
+            (4278255360 & ((a << 24) | (a >>> 8)))
+        }
+        o = this._hash.words
+        var c = e[s + 0],
+          h = ((a = e[s + 1]), e[s + 2]),
+          p = e[s + 3],
+          f = e[s + 4],
+          d = e[s + 5],
+          _ = e[s + 6],
+          l = e[s + 7],
+          g = e[s + 8],
+          y = e[s + 9],
+          m = e[s + 10],
+          v = e[s + 11],
+          k = e[s + 12],
+          S = e[s + 13],
+          w = e[s + 14],
+          B = e[s + 15],
+          C = t((C = o[0]), (P = o[1]), (x = o[2]), (b = o[3]), c, 7, u[0]),
+          b = t(b, C, P, x, a, 12, u[1]),
+          x = t(x, b, C, P, h, 17, u[2]),
+          P = t(P, x, b, C, p, 22, u[3])
+        ;(C = t(C, P, x, b, f, 7, u[4])),
+          (b = t(b, C, P, x, d, 12, u[5])),
+          (x = t(x, b, C, P, _, 17, u[6])),
+          (P = t(P, x, b, C, l, 22, u[7])),
+          (C = t(C, P, x, b, g, 7, u[8])),
+          (b = t(b, C, P, x, y, 12, u[9])),
+          (x = t(x, b, C, P, m, 17, u[10])),
+          (P = t(P, x, b, C, v, 22, u[11])),
+          (C = t(C, P, x, b, k, 7, u[12])),
+          (b = t(b, C, P, x, S, 12, u[13])),
+          (x = t(x, b, C, P, w, 17, u[14])),
+          (C = r(C, (P = t(P, x, b, C, B, 22, u[15])), x, b, a, 5, u[16])),
+          (b = r(b, C, P, x, _, 9, u[17])),
+          (x = r(x, b, C, P, v, 14, u[18])),
+          (P = r(P, x, b, C, c, 20, u[19])),
+          (C = r(C, P, x, b, d, 5, u[20])),
+          (b = r(b, C, P, x, m, 9, u[21])),
+          (x = r(x, b, C, P, B, 14, u[22])),
+          (P = r(P, x, b, C, f, 20, u[23])),
+          (C = r(C, P, x, b, y, 5, u[24])),
+          (b = r(b, C, P, x, w, 9, u[25])),
+          (x = r(x, b, C, P, p, 14, u[26])),
+          (P = r(P, x, b, C, g, 20, u[27])),
+          (C = r(C, P, x, b, S, 5, u[28])),
+          (b = r(b, C, P, x, h, 9, u[29])),
+          (x = r(x, b, C, P, l, 14, u[30])),
+          (C = i(C, (P = r(P, x, b, C, k, 20, u[31])), x, b, d, 4, u[32])),
+          (b = i(b, C, P, x, g, 11, u[33])),
+          (x = i(x, b, C, P, v, 16, u[34])),
+          (P = i(P, x, b, C, w, 23, u[35])),
+          (C = i(C, P, x, b, a, 4, u[36])),
+          (b = i(b, C, P, x, f, 11, u[37])),
+          (x = i(x, b, C, P, l, 16, u[38])),
+          (P = i(P, x, b, C, m, 23, u[39])),
+          (C = i(C, P, x, b, S, 4, u[40])),
+          (b = i(b, C, P, x, c, 11, u[41])),
+          (x = i(x, b, C, P, p, 16, u[42])),
+          (P = i(P, x, b, C, _, 23, u[43])),
+          (C = i(C, P, x, b, y, 4, u[44])),
+          (b = i(b, C, P, x, k, 11, u[45])),
+          (x = i(x, b, C, P, B, 16, u[46])),
+          (C = n(C, (P = i(P, x, b, C, h, 23, u[47])), x, b, c, 6, u[48])),
+          (b = n(b, C, P, x, l, 10, u[49])),
+          (x = n(x, b, C, P, w, 15, u[50])),
+          (P = n(P, x, b, C, d, 21, u[51])),
+          (C = n(C, P, x, b, k, 6, u[52])),
+          (b = n(b, C, P, x, p, 10, u[53])),
+          (x = n(x, b, C, P, m, 15, u[54])),
+          (P = n(P, x, b, C, a, 21, u[55])),
+          (C = n(C, P, x, b, g, 6, u[56])),
+          (b = n(b, C, P, x, B, 10, u[57])),
+          (x = n(x, b, C, P, _, 15, u[58])),
+          (P = n(P, x, b, C, S, 21, u[59])),
+          (C = n(C, P, x, b, f, 6, u[60])),
+          (b = n(b, C, P, x, v, 10, u[61])),
+          (x = n(x, b, C, P, h, 15, u[62])),
+          (P = n(P, x, b, C, y, 21, u[63]))
+        ;(o[0] = (o[0] + C) | 0),
+          (o[1] = (o[1] + P) | 0),
+          (o[2] = (o[2] + x) | 0),
+          (o[3] = (o[3] + b) | 0)
+      },
+      _doFinalize: function() {
+        var t = this._data,
+          r = t.words,
+          i = 8 * this._nDataBytes,
+          n = 8 * t.sigBytes
+        r[n >>> 5] |= 128 << (24 - (n % 32))
+        var s = e.floor(i / 4294967296)
+        for (
+          r[15 + (((n + 64) >>> 9) << 4)] =
+            (16711935 & ((s << 8) | (s >>> 24))) |
+            (4278255360 & ((s << 24) | (s >>> 8))),
+            r[14 + (((n + 64) >>> 9) << 4)] =
+              (16711935 & ((i << 8) | (i >>> 24))) |
+              (4278255360 & ((i << 24) | (i >>> 8))),
+            t.sigBytes = 4 * (r.length + 1),
+            this._process(),
+            r = (t = this._hash).words,
+            i = 0;
+          4 > i;
+          i++
+        )
+          (n = r[i]),
+            (r[i] =
+              (16711935 & ((n << 8) | (n >>> 24))) |
+              (4278255360 & ((n << 24) | (n >>> 8))))
+        return t
+      },
+      clone: function() {
+        var e = a.clone.call(this)
+        return (e._hash = this._hash.clone()), e
+      }
+    })),
+      (s.MD5 = a._createHelper(c)),
+      (s.HmacMD5 = a._createHmacHelper(c))
+  })(Math),
+  (function() {
+    var e,
+      t = CryptoJS,
+      r = (e = t.lib).Base,
+      i = e.WordArray,
+      n = ((e = t.algo).EvpKDF = r.extend({
+        cfg: r.extend({ keySize: 4, hasher: e.MD5, iterations: 1 }),
+        init: function(e) {
+          this.cfg = this.cfg.extend(e)
+        },
+        compute: function(e, t) {
+          for (
+            var r = (a = this.cfg).hasher.create(),
+              n = i.create(),
+              s = n.words,
+              o = a.keySize,
+              a = a.iterations;
+            s.length < o;
+
+          ) {
+            c && r.update(c)
+            var c = r.update(e).finalize(t)
+            r.reset()
+            for (var u = 1; u < a; u++) (c = r.finalize(c)), r.reset()
+            n.concat(c)
+          }
+          return (n.sigBytes = 4 * o), n
+        }
+      }))
+    t.EvpKDF = function(e, t, r) {
+      return n.create(r).compute(e, t)
+    }
+  })(),
+  CryptoJS.lib.Cipher ||
+    (function(e) {
+      var t = (d = CryptoJS).lib,
+        r = t.Base,
+        i = t.WordArray,
+        n = t.BufferedBlockAlgorithm,
+        s = d.enc.Base64,
+        o = d.algo.EvpKDF,
+        a = (t.Cipher = n.extend({
+          cfg: r.extend(),
+          createEncryptor: function(e, t) {
+            return this.create(this._ENC_XFORM_MODE, e, t)
+          },
+          createDecryptor: function(e, t) {
+            return this.create(this._DEC_XFORM_MODE, e, t)
+          },
+          init: function(e, t, r) {
+            ;(this.cfg = this.cfg.extend(r)),
+              (this._xformMode = e),
+              (this._key = t),
+              this.reset()
+          },
+          reset: function() {
+            n.reset.call(this), this._doReset()
+          },
+          process: function(e) {
+            return this._append(e), this._process()
+          },
+          finalize: function(e) {
+            return e && this._append(e), this._doFinalize()
+          },
+          keySize: 4,
+          ivSize: 4,
+          _ENC_XFORM_MODE: 1,
+          _DEC_XFORM_MODE: 2,
+          _createHelper: function(e) {
+            return {
+              encrypt: function(t, r, i) {
+                return ('string' == typeof r ? _ : f).encrypt(e, t, r, i)
+              },
+              decrypt: function(t, r, i) {
+                return ('string' == typeof r ? _ : f).decrypt(e, t, r, i)
+              }
+            }
+          }
+        }))
+      t.StreamCipher = a.extend({
+        _doFinalize: function() {
+          return this._process(!0)
+        },
+        blockSize: 1
+      })
+      var c = (d.mode = {}),
+        u = function(e, t, r) {
+          var i = this._iv
+          i ? (this._iv = void 0) : (i = this._prevBlock)
+          for (var n = 0; n < r; n++) e[t + n] ^= i[n]
+        },
+        h = (t.BlockCipherMode = r.extend({
+          createEncryptor: function(e, t) {
+            return this.Encryptor.create(e, t)
+          },
+          createDecryptor: function(e, t) {
+            return this.Decryptor.create(e, t)
+          },
+          init: function(e, t) {
+            ;(this._cipher = e), (this._iv = t)
+          }
+        })).extend()
+      ;(h.Encryptor = h.extend({
+        processBlock: function(e, t) {
+          var r = this._cipher,
+            i = r.blockSize
+          u.call(this, e, t, i),
+            r.encryptBlock(e, t),
+            (this._prevBlock = e.slice(t, t + i))
+        }
+      })),
+        (h.Decryptor = h.extend({
+          processBlock: function(e, t) {
+            var r = this._cipher,
+              i = r.blockSize,
+              n = e.slice(t, t + i)
+            r.decryptBlock(e, t), u.call(this, e, t, i), (this._prevBlock = n)
+          }
+        })),
+        (c = c.CBC = h),
+        (h = (d.pad = {}).Pkcs7 = {
+          pad: function(e, t) {
+            for (
+              var r,
+                n =
+                  ((r = (r = 4 * t) - (e.sigBytes % r)) << 24) |
+                  (r << 16) |
+                  (r << 8) |
+                  r,
+                s = [],
+                o = 0;
+              o < r;
+              o += 4
+            )
+              s.push(n)
+            ;(r = i.create(s, r)), e.concat(r)
+          },
+          unpad: function(e) {
+            e.sigBytes -= 255 & e.words[(e.sigBytes - 1) >>> 2]
+          }
+        }),
+        (t.BlockCipher = a.extend({
+          cfg: a.cfg.extend({ mode: c, padding: h }),
+          reset: function() {
+            a.reset.call(this)
+            var e = (t = this.cfg).iv,
+              t = t.mode
+            if (this._xformMode == this._ENC_XFORM_MODE)
+              var r = t.createEncryptor
+            else (r = t.createDecryptor), (this._minBufferSize = 1)
+            this._mode = r.call(t, this, e && e.words)
+          },
+          _doProcessBlock: function(e, t) {
+            this._mode.processBlock(e, t)
+          },
+          _doFinalize: function() {
+            var e = this.cfg.padding
+            if (this._xformMode == this._ENC_XFORM_MODE) {
+              e.pad(this._data, this.blockSize)
+              var t = this._process(!0)
+            } else (t = this._process(!0)), e.unpad(t)
+            return t
+          },
+          blockSize: 4
+        }))
+      var p = (t.CipherParams = r.extend({
+          init: function(e) {
+            this.mixIn(e)
+          },
+          toString: function(e) {
+            return (e || this.formatter).stringify(this)
+          }
+        })),
+        f =
+          ((c = (d.format = {}).OpenSSL = {
+            stringify: function(e) {
+              var t = e.ciphertext
+              return ((e = e.salt)
+                ? i
+                    .create([1398893684, 1701076831])
+                    .concat(e)
+                    .concat(t)
+                : t
+              ).toString(s)
+            },
+            parse: function(e) {
+              var t = (e = s.parse(e)).words
+              if (1398893684 == t[0] && 1701076831 == t[1]) {
+                var r = i.create(t.slice(2, 4))
+                t.splice(0, 4), (e.sigBytes -= 16)
+              }
+              return p.create({ ciphertext: e, salt: r })
+            }
+          }),
+          (t.SerializableCipher = r.extend({
+            cfg: r.extend({ format: c }),
+            encrypt: function(e, t, r, i) {
+              i = this.cfg.extend(i)
+              var n = e.createEncryptor(r, i)
+              return (
+                (t = n.finalize(t)),
+                (n = n.cfg),
+                p.create({
+                  ciphertext: t,
+                  key: r,
+                  iv: n.iv,
+                  algorithm: e,
+                  mode: n.mode,
+                  padding: n.padding,
+                  blockSize: e.blockSize,
+                  formatter: i.format
+                })
+              )
+            },
+            decrypt: function(e, t, r, i) {
+              return (
+                (i = this.cfg.extend(i)),
+                (t = this._parse(t, i.format)),
+                e.createDecryptor(r, i).finalize(t.ciphertext)
+              )
+            },
+            _parse: function(e, t) {
+              return 'string' == typeof e ? t.parse(e, this) : e
+            }
+          }))),
+        d = ((d.kdf = {}).OpenSSL = {
+          execute: function(e, t, r, n) {
+            return (
+              n || (n = i.random(8)),
+              (e = o.create({ keySize: t + r }).compute(e, n)),
+              (r = i.create(e.words.slice(t), 4 * r)),
+              (e.sigBytes = 4 * t),
+              p.create({ key: e, iv: r, salt: n })
+            )
+          }
+        }),
+        _ = (t.PasswordBasedCipher = f.extend({
+          cfg: f.cfg.extend({ kdf: d }),
+          encrypt: function(e, t, r, i) {
+            return (
+              (r = (i = this.cfg.extend(i)).kdf.execute(
+                r,
+                e.keySize,
+                e.ivSize
+              )),
+              (i.iv = r.iv),
+              (e = f.encrypt.call(this, e, t, r.key, i)).mixIn(r),
+              e
+            )
+          },
+          decrypt: function(e, t, r, i) {
+            return (
+              (i = this.cfg.extend(i)),
+              (t = this._parse(t, i.format)),
+              (r = i.kdf.execute(r, e.keySize, e.ivSize, t.salt)),
+              (i.iv = r.iv),
+              f.decrypt.call(this, e, t, r.key, i)
+            )
+          }
+        }))
+    })(),
+  (function() {
+    for (
+      var e = CryptoJS,
+        t = e.lib.BlockCipher,
+        r = e.algo,
+        i = [],
+        n = [],
+        s = [],
+        o = [],
+        a = [],
+        c = [],
+        u = [],
+        h = [],
+        p = [],
+        f = [],
+        d = [],
+        _ = 0;
+      256 > _;
+      _++
+    )
+      d[_] = 128 > _ ? _ << 1 : (_ << 1) ^ 283
+    var l = 0,
+      g = 0
+    for (_ = 0; 256 > _; _++) {
+      var y =
+        ((y = g ^ (g << 1) ^ (g << 2) ^ (g << 3) ^ (g << 4)) >>> 8) ^
+        (255 & y) ^
+        99
+      ;(i[l] = y), (n[y] = l)
+      var m = d[l],
+        v = d[m],
+        k = d[v],
+        S = (257 * d[y]) ^ (16843008 * y)
+      ;(s[l] = (S << 24) | (S >>> 8)),
+        (o[l] = (S << 16) | (S >>> 16)),
+        (a[l] = (S << 8) | (S >>> 24)),
+        (c[l] = S),
+        (S = (16843009 * k) ^ (65537 * v) ^ (257 * m) ^ (16843008 * l)),
+        (u[y] = (S << 24) | (S >>> 8)),
+        (h[y] = (S << 16) | (S >>> 16)),
+        (p[y] = (S << 8) | (S >>> 24)),
+        (f[y] = S),
+        l ? ((l = m ^ d[d[d[k ^ m]]]), (g ^= d[d[g]])) : (l = g = 1)
+    }
+    var w = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]
+    r = r.AES = t.extend({
+      _doReset: function() {
+        for (
+          var e = (r = this._key).words,
+            t = r.sigBytes / 4,
+            r = 4 * ((this._nRounds = t + 6) + 1),
+            n = (this._keySchedule = []),
+            s = 0;
+          s < r;
+          s++
+        )
+          if (s < t) n[s] = e[s]
+          else {
+            var o = n[s - 1]
+            s % t
+              ? 6 < t &&
+                4 == s % t &&
+                (o =
+                  (i[o >>> 24] << 24) |
+                  (i[(o >>> 16) & 255] << 16) |
+                  (i[(o >>> 8) & 255] << 8) |
+                  i[255 & o])
+              : ((o =
+                  (i[(o = (o << 8) | (o >>> 24)) >>> 24] << 24) |
+                  (i[(o >>> 16) & 255] << 16) |
+                  (i[(o >>> 8) & 255] << 8) |
+                  i[255 & o]),
+                (o ^= w[(s / t) | 0] << 24)),
+              (n[s] = n[s - t] ^ o)
+          }
+        for (e = this._invKeySchedule = [], t = 0; t < r; t++)
+          (s = r - t),
+            (o = t % 4 ? n[s] : n[s - 4]),
+            (e[t] =
+              4 > t || 4 >= s
+                ? o
+                : u[i[o >>> 24]] ^
+                  h[i[(o >>> 16) & 255]] ^
+                  p[i[(o >>> 8) & 255]] ^
+                  f[i[255 & o]])
+      },
+      encryptBlock: function(e, t) {
+        this._doCryptBlock(e, t, this._keySchedule, s, o, a, c, i)
+      },
+      decryptBlock: function(e, t) {
+        var r = e[t + 1]
+        ;(e[t + 1] = e[t + 3]),
+          (e[t + 3] = r),
+          this._doCryptBlock(e, t, this._invKeySchedule, u, h, p, f, n),
+          (r = e[t + 1]),
+          (e[t + 1] = e[t + 3]),
+          (e[t + 3] = r)
+      },
+      _doCryptBlock: function(e, t, r, i, n, s, o, a) {
+        for (
+          var c = this._nRounds,
+            u = e[t] ^ r[0],
+            h = e[t + 1] ^ r[1],
+            p = e[t + 2] ^ r[2],
+            f = e[t + 3] ^ r[3],
+            d = 4,
+            _ = 1;
+          _ < c;
+          _++
+        ) {
+          var l =
+              i[u >>> 24] ^
+              n[(h >>> 16) & 255] ^
+              s[(p >>> 8) & 255] ^
+              o[255 & f] ^
+              r[d++],
+            g =
+              i[h >>> 24] ^
+              n[(p >>> 16) & 255] ^
+              s[(f >>> 8) & 255] ^
+              o[255 & u] ^
+              r[d++],
+            y =
+              i[p >>> 24] ^
+              n[(f >>> 16) & 255] ^
+              s[(u >>> 8) & 255] ^
+              o[255 & h] ^
+              r[d++]
+          ;(f =
+            i[f >>> 24] ^
+            n[(u >>> 16) & 255] ^
+            s[(h >>> 8) & 255] ^
+            o[255 & p] ^
+            r[d++]),
+            (u = l),
+            (h = g),
+            (p = y)
+        }
+        ;(l =
+          ((a[u >>> 24] << 24) |
+            (a[(h >>> 16) & 255] << 16) |
+            (a[(p >>> 8) & 255] << 8) |
+            a[255 & f]) ^
+          r[d++]),
+          (g =
+            ((a[h >>> 24] << 24) |
+              (a[(p >>> 16) & 255] << 16) |
+              (a[(f >>> 8) & 255] << 8) |
+              a[255 & u]) ^
+            r[d++]),
+          (y =
+            ((a[p >>> 24] << 24) |
+              (a[(f >>> 16) & 255] << 16) |
+              (a[(u >>> 8) & 255] << 8) |
+              a[255 & h]) ^
+            r[d++]),
+          (f =
+            ((a[f >>> 24] << 24) |
+              (a[(u >>> 16) & 255] << 16) |
+              (a[(h >>> 8) & 255] << 8) |
+              a[255 & p]) ^
+            r[d++]),
+          (e[t] = l),
+          (e[t + 1] = g),
+          (e[t + 2] = y),
+          (e[t + 3] = f)
+      },
+      keySize: 8
+    })
+    e.AES = t._createHelper(r)
+  })(),
+  (CryptoJS.pad.ZeroPadding = {
+    pad: function(e, t) {
+      var r = 4 * t
+      e.clamp(), (e.sigBytes += r - (e.sigBytes % r || r))
+    },
+    unpad: function(e) {
+      for (
+        var t = e.words, r = e.sigBytes - 1;
+        !((t[r >>> 2] >>> (24 - (r % 4) * 8)) & 255);
+
+      )
+        r--
+      e.sigBytes = r + 1
+    }
+  })
+import storage from '@system.storage'
+import nativeFetch from '@system.fetch'
+import device from '@system.device'
+import network from '@system.network'
+import account from '@service.account'
+import shortcut from '@system.shortcut'
+import md5 from 'md5'
+import app from '@system.app'
+import router from '@system.router'
+import APP_CONFIG from './statistics.config'
+!(function(e, t) {
+  'object' == typeof exports && 'undefined' != typeof module
+    ? (module.exports = t())
+    : 'function' == typeof define && define.amd
+    ? define(t)
+    : (e.APP_STATISTICS = t())
+})(this, function() {
+  'use strict'
+  function e(e) {
+    let t = ''
+    for (let r in e) t += r + '=' + e[r] + '&'
+    return (t = t.substring(0, t.length - 1))
+  }
+  function t(e) {
+    return JSON.stringify(e)
+  }
+  function r(e, t) {
+    let r = md5('huanju@quickapp' + t)
+        .substring(16)
+        .toLowerCase(),
+      i = CryptoJS.enc.Latin1.parse(r),
+      n = CryptoJS.enc.Latin1.parse('2018080716102000')
+    return CryptoJS.AES.encrypt(e, i, {
+      iv: n,
+      mode: CryptoJS.mode.CBC,
+      padding: CryptoJS.pad.ZeroPadding
+    }).toString()
+  }
+  function i() {
+    return ((268435456 * (1 + Math.random())) | 0).toString(16)
+  }
+  function n(e) {
+    let t = /^[0-9a-zA-Z_\u4e00-\u9fa5]{0,255}$/,
+      r = 0
+    if ('string' == typeof e && t.test(e)) return !0
+    if (
+      (function(e) {
+        if ('object' != typeof e || null == e) return !1
+        if (null === Object.getPrototypeOf(e)) return !0
+        let t = e
+        for (; null !== Object.getPrototypeOf(t); ) t = Object.getPrototypeOf(t)
+        return Object.getPrototypeOf(e) === t
+      })(e)
+    ) {
+      for (let i in e) {
+        let n = e[i]
+        if (
+          ('string' != typeof i && 'number' != typeof i) ||
+          !/^[0-9a-zA-Z_\u4e00-\u9fa5]{1,255}$/.test(i)
+        )
+          return !1
+        if (('string' != typeof n && 'number' != typeof n) || !t.test(n))
+          return !1
+        r++
+      }
+      return !(r > 100)
+    }
+    return !1
+  }
+  const s = {
+    get: function(e) {
+      let { url: t, timeout: r } = e,
+        i = new Promise((e, r) => {
+          try {
+            nativeFetch.fetch({
+              url: config.url + t,
+              success: function(t) {
+                e(t)
+              },
+              fail: function(t, r) {
+                e(t)
+              }
+            })
+          } catch (e) {}
+        }),
+        n = new Promise((e, t) => {
+          setTimeout(() => {
+            e({ code: 204, massage: 'Request timed out' })
+          }, r || 3e3)
+        })
+      return Promise.race([n, i])
+    }
+  }
+  function o(e) {
+    return s.get({ url: '/a.gif?' + e })
+  }
+  function a(...e) {
+    return new Promise((t, r) => {
+      try {
+        storage.set({
+          key: e[0],
+          value: e[1] || '',
+          success: function(e) {
+            t(!0)
+          },
+          fail: function(e) {
+            t(!1)
+          }
+        })
+      } catch (e) {
+        t(!1)
+      }
+    })
+  }
+  function c(e) {
+    return new Promise((t, r) => {
+      try {
+        storage.get({
+          key: e,
+          success: function(e) {
+            t(e)
+          },
+          fail: function(e, r) {
+            t(!1)
+          }
+        })
+      } catch (e) {
+        t(!1)
+      }
+    })
+  }
+  const u = {
+      deviceIds: () =>
+        new Promise((e, t) => {
+          try {
+            device.getId({
+              type: ['device', 'mac'],
+              success: function(t) {
+                e(t)
+              },
+              fail: function(t, r) {
+                e({})
+              }
+            })
+          } catch (t) {
+            e({})
+          }
+        }),
+      getUserId: () =>
+        new Promise((e, t) => {
+          try {
+            device.getUserId({
+              success: function(t) {
+                e(t)
+              },
+              fail: function(t, r) {
+                e({})
+              }
+            })
+          } catch (t) {
+            e({})
+          }
+        }),
+      deviceInfos: () =>
+        new Promise((e, t) => {
+          try {
+            device.getInfo({
+              success: function(t) {
+                e(t)
+              },
+              fail: function() {
+                e({})
+              }
+            })
+          } catch (t) {
+            e({})
+          }
+        }),
+      netType: () =>
+        new Promise((e, t) => {
+          try {
+            network.getType({
+              success: function(t) {
+                e(t)
+              },
+              fail: function() {
+                e({})
+              }
+            })
+          } catch (t) {
+            e({})
+          }
+        }),
+      has_shortcut: () =>
+        new Promise((e, t) => {
+          try {
+            shortcut.hasInstalled({
+              success: function(t) {
+                e({ has_icon: t ? 1 : 0 })
+              },
+              fail: function() {
+                e({ has_icon: 0 })
+              }
+            })
+          } catch (t) {
+            e({ has_icon: 0 })
+          }
+        })
+    },
+    h = { sdk_version: '1.3.0.0', debug: 0 },
+    p = '_SD_BD_CUID_',
+    f = '_SD_BD_ERR_MSG_INFO_',
+    d = {
+      has_init: !1,
+      has_cuid_storage: !1,
+      has_request_id_storage: !1,
+      has_open_log: !1
+    }
+  const _ = {
+      device: (e, t) => ({
+        package: e.package || '',
+        channel: e.channel || '',
+        name: e.name || '',
+        svr: e.versionName || '',
+        client_id: r(e.device || '', t),
+        info_ma: r(e.mac || '', t),
+        os_id: r(e.userId || '', t),
+        make: (e.brand || '').toLowerCase(),
+        manufacturer: (e.manufacturer || '').toLowerCase(),
+        model: (e.model || '').toLowerCase(),
+        product: (e.product || '').toLowerCase(),
+        os_type: e.osType || '',
+        ovr: e.osVersionName || '',
+        pla_ver: e.platformVersionName || '',
+        lan: (e.language || '').toLowerCase(),
+        region: (e.region || '').toLowerCase(),
+        px: `${e.screenWidth || ''}*${e.screenHeight || ''}`,
+        net: e.type || '',
+        has_icon: e.has_icon || 0
+      }),
+      page: (e = {}) => ({
+        page_name: '',
+        page_path: '',
+        sta_time: '',
+        end_time: '',
+        duration: '',
+        is_entry: 0,
+        ...e
+      }),
+      public: e => ({
+        app_id: APP_CONFIG.app_key || '',
+        cuid: e.cuid,
+        req_id: e.req,
+        en_code: 'cuid',
+        action: 2
+      })
+    },
+    l = new (class {
+      constructor() {
+        ;(this.state = {
+          data: null,
+          page: null,
+          is_entry: 1,
+          cuid: '',
+          req: '',
+          log_list: []
+        }),
+          (this.init = this.init.bind(this)),
+          (this.page_stat = this.page_stat.bind(this)),
+          (this.page_end = this.page_end.bind(this)),
+          (this.merge_datas = this.merge_datas.bind(this)),
+          (this.save_to_queue = this.save_to_queue.bind(this)),
+          (this.handle_submit = this.handle_submit.bind(this)),
+          (this.send_queue = this.send_queue.bind(this)),
+          (this.event_log = this.event_log.bind(this)),
+          (this.err_report = this.err_report.bind(this))
+      }
+      init(e) {
+        d.has_init = !0
+        let r = {},
+          n = e || { _def: {} }
+        n._def = n._def || { manifest: {} }
+        let s,
+          {
+            _def: { manifest: o }
+          } = n
+        try {
+          s = app.getInfo()
+        } catch (e) {
+          let r = { err_msg: t(e.stack) || '', err_site: 'app.getInfo' }
+          l.err_report(r)
+        }
+        ;(r.package = o.package || s.packageName),
+          (r.versionName = o.versionName || s.versionName),
+          (r.minPlatformVersion = o.minPlatformVersion || ''),
+          (r.name = o.name || s.name)
+        try {
+          r.channel = account.getProvider()
+        } catch (e) {
+          let r = { err_msg: t(e.stack) || '', err_site: 'account.getProvider' }
+          l.err_report(r)
+        }
+        Promise.all([
+          u.deviceInfos(),
+          u.getUserId(),
+          u.netType(),
+          u.has_shortcut()
+        ]).then(e => {
+          let t = Object.assign(r, ...e),
+            n = {}
+          c(p).then(e => {
+            e
+              ? (n.cuid = e)
+              : ((n.cuid = (function(e) {
+                  let t = e || i()
+                  return md5(
+                    Date.now() + '-' + i() + '-' + i() + '-' + i() + '-' + t
+                  )
+                })(t.userId || '')),
+                a(p, n.cuid).then(e => {
+                  e && (d.has_cuid_storage = !0)
+                })),
+              (this.state.cuid = n.cuid),
+              (n.req = this.state.req = (function(e) {
+                let t = Date.now() + i() + i() + (e || i())
+                return md5(t)
+              })(n.cuid)),
+              (this.state.data = {
+                ..._.device(t, this.state.cuid),
+                ..._.public(n)
+              })
+          })
+        })
+      }
+      page_stat(e) {
+        let r, i
+        try {
+          let e = router.getState() || {}
+          ;(r = e.name), (i = e.path)
+        } catch (e) {
+          let r = { err_msg: t(e.stack) || '', err_site: 'router.getState' }
+          l.err_report(r)
+        }
+        ;(this.state.page = _.page({
+          sta_time: Date.now(),
+          page_name: r || '',
+          page_path: i || '',
+          is_entry: this.state.is_entry || 0
+        })),
+          (this.state.is_entry = 0),
+          (d.has_open_log = !0)
+      }
+      page_end(e) {
+        if (!this.state.cuid || !this.state.data) return
+        let t = Date.now()
+        if (this.state.page)
+          (this.state.page.duration = t - this.state.page.sta_time),
+            (this.state.page.end_time = t),
+            this.handle_submit()
+        else {
+          let e = {
+            err_msg: `this.state.page is ${this.state.page}`,
+            err_site: 'get_page_data'
+          }
+          l.err_report(e)
+        }
+      }
+      merge_datas() {
+        return { ...(this.state.data || {}), ...(this.state.page || {}), ...h }
+      }
+      handle_submit(t = {}) {
+        let r = e({ ...this.merge_datas(), ...t })
+        o(r)
+          .then(e => {
+            200 == e.code ? this.send_queue() : this.save_to_queue(r)
+          })
+          .catch(e => {
+            this.save_to_queue(r)
+          })
+      }
+      save_to_queue(e) {
+        let t = this.state.log_list && this.state.log_list.length
+        return (
+          t && t < 50 && this.state.log_list.push(`${e}&retry=1`),
+          this.state.log_list
+        )
+      }
+      send_queue() {
+        let e = [...this.state.log_list]
+        ;(this.state.log_list = []),
+          e.forEach(e => {
+            o(e)
+              .then(t => {
+                200 != t.code && this.save_to_queue(e)
+              })
+              .catch(t => {
+                this.save_to_queue(e)
+              })
+          })
+      }
+      event_log(e) {
+        this.handle_submit({ ...e, action: '3' })
+      }
+      err_report(r) {
+        let i = e({
+          ...this.merge_datas(),
+          ...r,
+          app_id: APP_CONFIG.app_key || '',
+          action: '9'
+        })
+        c(f)
+          .then(e => {
+            let r = e,
+              n = new Date().getDate(),
+              o = 0
+            if (r)
+              try {
+                r = JSON.parse(r) && JSON.parse(r)
+              } catch (e) {
+                r = { day: n, len: 0 }
+              }
+            ;(r && r.day) == n && (o = Number(r.len) + 1),
+              o <= 50 &&
+                (function(e) {
+                  return s.get({ url: '/e.gif?' + e })
+                })(i).then(e => {
+                  a(f, t({ day: n, len: o })).then()
+                })
+          })
+          .catch()
+      }
+    })()
+  const g = {
+      open_app(e) {
+        try {
+          if (!APP_CONFIG.app_key)
+            return void console.error('Not configured app_key!')
+          l.init(e)
+        } catch (e) {
+          let r = { err_msg: t(e.stack) || '', err_site: 'open_app' }
+          l.err_report(r)
+        }
+      },
+      page_show(e) {
+        try {
+          d.has_init && l.page_stat(e)
+        } catch (e) {
+          let r = { err_msg: t(e.stack) || '', err_site: 'page_show' }
+          l.err_report(r)
+        }
+      },
+      page_hide(e) {
+        try {
+          d.has_init && d.has_open_log && l.page_end(e)
+        } catch (e) {
+          let r = { err_msg: t(e.stack) || '', err_site: 'open_app' }
+          l.err_report(r)
+        }
+        d.has_open_log = !1
+      },
+      track_event(e, r) {
+        try {
+          if (!APP_CONFIG.app_key)
+            return void console.error('Not configured app_key!')
+          let i = null == r ? '' : r
+          if (
+            !(function(e) {
+              return (
+                'string' == typeof e &&
+                '' !== e &&
+                /^[0-9a-zA-Z_\u4e00-\u9fa5]{1,255}$/.test(e)
+              )
+            })(e)
+          )
+            return void console.error(
+              '"event error": please check track_event id. id should be "string" and not null.'
+            )
+          if (!n(i))
+            return void console.error(
+              '"event error":  please check track_event parameter. parameter should be "string" or "object"'
+            )
+          l.event_log({
+            ev_id: e,
+            ev_args: 'string' == typeof i ? i : JSON.stringify(i)
+          })
+        } catch (e) {
+          console.log('err', e)
+          let r = { err_msg: t(e.stack) || '', err_site: 'track_event' }
+          l.err_report(r)
+        }
+      }
+    },
+    y = global.__proto__ || global
+  return (
+    (y.APP_STATISTICS = {
+      app_sta_init: g.open_app,
+      page_show: g.page_show,
+      page_hide: g.page_hide,
+      track_event: g.track_event
+    }),
+    (y.Custom_page = function(e) {
+      let t = e.onShow,
+        r = e.onHide
+      return (
+        (e.onShow = function() {
+          g.page_show(this), t && t.call(this)
+        }),
+        (e.onHide = function() {
+          g.page_hide(this), r && r.call(this)
+        }),
+        e
+      )
+    }),
+    {
+      app_sta_init: g.open_app,
+      page_show: g.page_show,
+      page_hide: g.page_hide,
+      track_event: g.track_event
+    }
+  )
+})

+ 4 - 0
src/assets/js/statistics.config.js

@@ -0,0 +1,4 @@
+export default {
+  /* @Fixed: 使用此模板,此处需要替换为你所申请的快应用 KEY */
+  app_key: ''
+}

BIN
src/assets/logo.png


+ 253 - 0
src/assets/styles/common.less

@@ -0,0 +1,253 @@
+// page
+.page-wrapper {
+  width: 100%;
+  flex-direction: column;
+  color: @text-black;
+  background-color: @bg-grey;
+}
+.page-container {
+  flex: 1;
+  .page-column;
+}
+.page-container-white {
+  flex: 1;
+  width: 100%;
+  flex-direction: column;
+  background-color: @white;
+}
+.page-column {
+  width: 100%;
+  flex-direction: column;
+}
+
+// text
+.text {
+  font-size: 6 * @size-factor;
+}
+.text-black {
+  font-size: 6 * @size-factor;
+  color: @text-black;
+}
+.text-warning {
+  font-size: 6 * @size-factor;
+  color: @warning;
+}
+.text-primary {
+  font-size: 6 * @size-factor;
+  color: @brand;
+}
+.text-remark {
+  font-size: 5 * @size-factor;
+  color: @text-grey;
+}
+.text-remark-black {
+  font-size: 5 * @size-factor;
+  color: @text-black;
+}
+.text-remark-primary {
+  font-size: 5 * @size-factor;
+  color: @brand;
+}
+.text-remark-big {
+  font-size: 6 * @size-factor;
+  color: @text-grey;
+}
+.text-remark-warning {
+  font-size: 6 * @size-factor;
+  color: @warning;
+}
+.text-title {
+  font-size: 7 * @size-factor;
+  color: @text-black;
+}
+.title {
+  font-size: 10 * @size-factor;
+  color: @text-black;
+  font-weight: bold;
+}
+.list-title {
+  width: 100%;
+  align-content: center;
+  padding: @gap-3 0;
+  .text-title;
+  .border-bottom-mixins();
+}
+
+// button
+.button {
+  height: 10 * @size-factor;
+  width: 100%;
+  background-color: #e2efff;
+  padding: 0 3 * @size-factor;
+  color: @brand;
+  font-size: 5 * @size-factor;
+  text-align: center;
+  border-radius: 1 * @size-factor;
+}
+
+// flex
+.flex-1 {
+  flex: 1;
+}
+.space-between-line {
+  width: 100%;
+  .flex-box-mixins(row, space-between, flex-start);
+}
+
+// section
+.section-container {
+  width: 100%;
+  flex-direction: column;
+}
+.section {
+  flex-direction: column;
+  padding-bottom: @gap-3;
+  background-color: @white;
+}
+.section-title {
+  width: 100%;
+  align-content: center;
+  padding: @gap-3 @gap-4;
+  .flex-box-mixins(row, space-between, center);
+  .section-title-line {
+    width: 6px;
+    background-color: @brand;
+    margin: 8px @gap-1 8px 0;
+  }
+}
+.section-title-bordered {
+  .section-title;
+  background-color: @white;
+  .border-bottom-mixins();
+}
+.section-content {
+  flex-wrap: wrap;
+  padding: 0 @gap-3;
+}
+.section-label {
+  font-size: 25px;
+  border-radius: 6px;
+  height: 80px;
+  width: 300px;
+  text-align: center;
+  margin: @gap-1;
+  background-color: @bg-grey;
+}
+.section-item-text {
+  font-size: 25px;
+  height: 60px;
+  text-align: center;
+}
+
+// list
+.list-container {
+  background-color: @white;
+  width: 100%;
+  flex: 1;
+  padding: 0 @gap-4;
+}
+.list-item {
+  width: 100%;
+  padding: @gap-3 0;
+  border-bottom-width: 1px;
+  border-bottom-color: @border-grey;
+  border-style: solid;
+  .list-rank {
+    width: 50px;
+    height: 50px;
+    background-color: @bg-grey;
+    border-radius: 25px;
+    margin-right: @gap-1;
+    .list-rank-text {
+      width: 100%;
+      text-align: center;
+      color: @text-grey;
+    }
+  }
+}
+.load-status {
+  padding: @gap-2;
+  justify-content: center;
+  .load-status-text {
+    color: @text-grey;
+    font-size: 6 * @size-factor;
+  }
+}
+
+// titlebar, search
+.title-bar {
+  background-color: @white;
+  padding: @gap-3 @gap-4;
+  .flex-box-mixins(row, space-between, flex-start);
+  .border-bottom-mixins();
+}
+.title-bar-noline {
+  background-color: @white;
+  padding: @gap-3 @gap-4;
+  .flex-box-mixins(row, space-between, flex-start);
+}
+.search {
+  background-color: @input-grey;
+  flex: 1;
+  height: 70px;
+  padding: 0 @gap-2;
+  border-radius: 8px;
+  justify-content: center;
+  align-content: center;
+  .search-icon {
+    width: 40px;
+    height: 70px;
+    font-size: 25px;
+    color: @brand;
+  }
+  .search-input {
+    flex: 1;
+    font-size: 30px;
+  }
+}
+
+// bottom-bar, btn
+.bottom-bar {
+  padding: @gap-3 @gap-4;
+  .flex-box-mixins(row, space-between, center);
+}
+.btn-primary {
+  color: @brand;
+  border: 1px solid @brand;
+  border-radius: 5px;
+  padding: 15px 0;
+  width: 200px;
+  text-align: center;
+}
+.btn-disabled {
+  color: @text-grey;
+  border-color: @text-grey;
+}
+
+// comment-page
+.comment-page {
+  .textarea {
+    width: 100%;
+    height: 300px;
+    border: 1px solid @border-grey;
+    padding: @gap-2;
+    font-size: 6 * @size-factor;
+  }
+  .text-line {
+    padding: 0 @gap-4;
+    width: 100%;
+  }
+  .btn-line {
+    padding: @gap-4;
+    width: 100%;
+    justify-content: flex-end;
+  }
+  .publish-btn {
+    width: 150px;
+    height: 80px;
+    color: @white;
+    background-color: @brand;
+    border-radius: 4px;
+    text-align: center;
+  }
+}

+ 79 - 0
src/assets/styles/iconfont.less

@@ -0,0 +1,79 @@
+@font-face {
+  font-family: 'iconfont';
+  src: url('/assets/iconfont/iconfont.ttf');
+}
+
+.iconfont {
+  font-family: 'iconfont';
+}
+
+/* 
+
+// 快应用不支持伪类,需要用unicode的方式实现iconfont,对应的Unicode为'&#x' + content中‘\’后的内容
+// 例如.icon-search,content中‘\’后的内容为‘e661’,对应的Unicode就是'&#xe661',应用实例为:<text>&#xe661;</text>
+// 该项目的iconfont对应的unicode如下:
+
+.icon-search:before {
+  content: "\e661";
+}
+
+.icon-arrow-left:before {
+  content: "\e606";
+}
+
+.icon-user:before {
+  content: "\e643";
+}
+
+.icon-menu:before {
+  content: "\e60c";
+}
+
+.icon-edit:before {
+  content: "\e641";
+}
+
+.icon-message:before {
+  content: "\e60e";
+}
+
+.icon-shelf:before {
+  content: "\e601";
+}
+
+.icon-shelf-line:before {
+  content: "\e602";
+}
+
+.icon-search-book-line:before {
+  content: "\e603";
+}
+
+.icon-search-book:before {
+  content: "\e604";
+}
+
+.icon-refresh:before {
+  content: "\e607";
+}
+
+.icon-order:before {
+  content: "\e624";
+}
+
+.icon-order-reverse:before {
+  content: "\e6d6";
+}
+
+.icon-library:before {
+  content: "\e67d";
+}
+
+.icon-library-line:before {
+  content: "\e681";
+}
+
+.icon-arrow-right:before {
+  content: "\e6d7";
+}
+*/

+ 4 - 0
src/assets/styles/index.less

@@ -0,0 +1,4 @@
+@import './variables.less';
+@import './mixins.less';
+@import './common.less';
+@import './iconfont.less';

+ 15 - 0
src/assets/styles/mixins.less

@@ -0,0 +1,15 @@
+.flex-box-mixins (@column, @justify, @align) {
+  flex-direction: @column;
+  justify-content: @justify;
+  align-items: @align;
+}
+.border-bottom-mixins (@width: 1px, @color: @border-grey) {
+  border-bottom-width: @width;
+  border-bottom-color: @color;
+  border-style: solid;
+}
+.border-top-mixins (@width: 1px, @color: @border-grey) {
+  border-top-width: @width;
+  border-top-color: @color;
+  border-style: solid;
+}

+ 32 - 0
src/assets/styles/variables.less

@@ -0,0 +1,32 @@
+@brand: #20a0ff;
+@jade: #2edfa3;
+@warning: #e78121;
+@white: #ffffff;
+@black: #000000;
+@text-black: #1a1a1a;
+@grey: #7a8ba9;
+@border-grey: #eaeaea;
+@white-grey: #f4f6fa;
+@text-grey: #919394;
+@input-grey: #f4f6fa;
+@bg-grey: #f4f6fa;
+@layer-bg: #141414;
+
+@size-factor: 5px;
+@gap-1: 10px;
+@gap-2: 20px;
+@gap-3: 30px;
+@gap-4: 40px;
+
+@font-face {
+  font-family: font1;
+  src: url(/assets/fonts/仓耳非白W02.ttf);
+}
+@font-face {
+  font-family: font2;
+  src: url(/assets/fonts/千图笔锋手写体.ttf);
+}
+@font-face {
+  font-family: font3;
+  src: url(/assets/fonts/字体传奇南安体.ttf);
+}

+ 40 - 0
src/components/book-detail/comment-item-simple.ux

@@ -0,0 +1,40 @@
+<template>
+  <div class="comment-container">
+    <text class="iconfont comment-left">&#xe643;</text>
+    <div class="comment-right">
+      <text class="text-remark">{{ item.name }}</text>
+      <text class="text-black">{{ item.comment }}</text>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: ['item']
+  /* -------------------SelfCustomEvent------------------ */
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.comment-container {
+  padding: @gap-4 @gap-4 0 @gap-4;
+  background-color: @white;
+  width: 100%;
+  .flex-box-mixins(row, flex-start, flex-start);
+}
+.comment-left {
+  width: 60px;
+  font-size: 40px;
+  padding-right: @gap-2;
+}
+.comment-right {
+  flex: 1;
+  flex-direction: column;
+  .border-bottom-mixins();
+  .text-remark,
+  .text-black {
+    margin-bottom: @gap-4;
+  }
+}
+</style>

+ 77 - 0
src/components/book-detail/comment-item.ux

@@ -0,0 +1,77 @@
+<template>
+  <div class="comment-container">
+    <text class="iconfont comment-left">&#xe643;</text>
+    <div class="comment-right">
+      <text class="text-remark">{{ item.name }}</text>
+      <text class="text-black">{{ item.comment }}</text>
+      <div class="comment-resource" if="{{item.resource}}">
+        <div class="space-between-line">
+          <text class="text-remark-black">{{ item.resource.name }}</text>
+          <text class="text-remark">{{ item.resource.time }}</text>
+        </div>
+        <text class="text-remark-big">{{ item.resource.comment }}</text>
+      </div>
+      <div class="space-between-line reply">
+        <text class="text-remark">{{ item.time }}</text>
+        <text class="iconfont" onclick="replyComment(item)">&#xe60e;</text>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: ['item'],
+  /* -------------------SelfCustomEvent------------------ */
+  replyComment(item) {
+    this.$emit('replyComment', { comment: item })
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.comment-container {
+  padding: @gap-3 @gap-3 0 @gap-3;
+  background-color: @white;
+  width: 100%;
+  .flex-box-mixins(row, flex-start, flex-start);
+}
+.comment-left {
+  width: 60px;
+  font-size: 40px;
+  padding-right: @gap-2;
+}
+.comment-right {
+  flex: 1;
+  flex-direction: column;
+  .border-bottom-mixins();
+  .text-remark,
+  .text-black {
+    margin-bottom: @gap-3;
+  }
+}
+.comment-resource {
+  background-color: @bg-grey;
+  padding: 26px;
+  .flex-box-mixins(column, flex-start, flex-start);
+  .space-between-line {
+    padding-bottom: 26px;
+  }
+  .text-remark {
+    margin-bottom: 0px;
+  }
+}
+.reply {
+  .text-remark {
+    padding: @gap-2 0;
+    margin-bottom: 0px;
+  }
+  .iconfont {
+    padding: @gap-2 0;
+    margin-bottom: 0px;
+    width: 100px;
+    text-align: right;
+  }
+}
+</style>

+ 65 - 0
src/components/book-detail/info.ux

@@ -0,0 +1,65 @@
+<template>
+  <div class="info">
+    <image class="info-left" src="{{ info.image }}"></image>
+    <div class="info-right">
+      <text class="text-title">{{ info.title }}</text>
+      <rating
+        class="rate"
+        numstars="5"
+        rating="{{Number(info.score)}}"
+        indicator="true"
+      ></rating>
+      <text class="text-remark">{{ info.author }}</text>
+      <text class="text-remark">{{ info.words }}万字</text>
+      <!-- <text class="button" onclick="onBtnClick">{{ 到书城查看更多好书 }}</text> -->
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    info: {
+      type: Object,
+      default() {
+        return {
+          id: '',
+          image: '',
+          title: '',
+          author: '',
+          description: '',
+          count: '',
+          score: ''
+        }
+      }
+    }
+  }
+  /* -------------------SelfCustomEvent------------------ */
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.info {
+  padding: @gap-4;
+  width: 100%;
+  height: 330px;
+  margin-bottom: @gap-2;
+  background-color: @white;
+  .info-left {
+    width: 28%;
+    height: 100%;
+    border-radius: 5px;
+  }
+  .info-right {
+    width: 60%;
+    padding: @gap-2 @gap-4;
+    .flex-box-mixins(column, space-between, flex-start);
+    .rate {
+      width: 200px;
+      height: 40px;
+      .flex-box-mixins(row, flex-start, center);
+    }
+  }
+}
+</style>

+ 128 - 0
src/components/bookshelf/index.ux

@@ -0,0 +1,128 @@
+<template>
+  <div class="page-column">
+    <div class="title-bar" show="{{!editStatus}}">
+      <text class="text-black">共收藏{{ shelfList.length }}本</text>
+      <div @click="switchToEdit" if="{{ shelfList.length }}">
+        <text class="text-primary iconfont">&#xe641;</text>
+        <text class="text-primary">编辑</text>
+      </div>
+    </div>
+    <div class="title-bar" show="{{editStatus}}">
+      <text class="text-black">已删除{{ deleteList.length }}本</text>
+      <div>
+        <text class="text-cancel" @click="cancelEdit">取消</text>
+        <text class="text-primary" @click="finishEdit">完成</text>
+      </div>
+    </div>
+    <div class="bookshelf-list">
+      <div
+        class="bookshelf-item"
+        for="{{shelfList}}"
+        show="{{deleteList.indexOf($item.id)===-1}}"
+      >
+        <stack class="bookshelf-img">
+          <div class="img-container">
+            <image src="{{$item.image}}" @click="clickImg($item)"></image>
+          </div>
+          <div class="delete-icon" @click="deleteBook($item)">
+            <image
+              src="../../assets/images/cancel.png"
+              show="{{editStatus}}"
+            ></image>
+          </div>
+        </stack>
+        <text class="bookshelf-title">{{ $item.title }}</text>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: ['shelfList'],
+  data: {
+    img: '/assets/images/pic_1.jpg',
+    editStatus: false,
+    deleteList: []
+  },
+  onInit() {},
+  /* -------------------SelfCustomEvent------------------ */
+  clickImg(item) {
+    if (!this.editStatus) {
+      this.gotoBookContent(item)
+    } else {
+      this.deleteBook(item)
+    }
+  },
+  gotoBookContent(item) {
+    $utils.route2theUrl('pages/book-content', {
+      bookId: item.id,
+      bookTitle: item.title,
+      total: item.count
+    })
+  },
+  deleteBook(item) {
+    this.deleteList.push(item.id)
+  },
+  switchToEdit() {
+    this.editStatus = true
+  },
+  finishEdit() {
+    let shelfList = this.shelfList.filter(book => {
+      return this.deleteList.indexOf(book.id) === -1
+    })
+    this.$emit('updateShelf', { shelfList })
+    this.editStatus = false
+    this.deleteList = []
+  },
+  cancelEdit() {
+    this.editStatus = false
+    this.deleteList = []
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+
+.text-cancel {
+  color: @text-grey;
+  margin-right: @gap-4;
+}
+.bookshelf-list {
+  width: 100%;
+  padding: 20px;
+  flex-wrap: wrap;
+  .flex-box-mixins(row, flex-start, flex-start);
+  .bookshelf-item {
+    width: 28%;
+    margin: 20px;
+    .flex-box-mixins(column, flex-start, flex-start);
+    .bookshelf-title {
+      width: 100%;
+      text-align: center;
+    }
+  }
+  .bookshelf-img {
+    width: 100%;
+    height: 270px;
+    .flex-box-mixins(row, flex-end, flex-end);
+    .img-container {
+      width: 100%;
+      height: 100%;
+      flex: 1;
+    }
+    .delete-icon {
+      width: 60px;
+      height: 60px;
+      padding: @gap-1;
+    }
+    image {
+      border-radius: 5px;
+      width: 100%;
+      height: 100%;
+      flex: 1;
+    }
+  }
+}
+</style>

+ 38 - 0
src/components/contents/contents-list.ux

@@ -0,0 +1,38 @@
+<template>
+  <list class="contents-list">
+    <list-item
+      type="contents-Item"
+      class="contents-item"
+      for="{{list}}"
+      onclick="detail($item)"
+    >
+      <text class="text-black">{{ $item }}</text>
+    </list-item>
+  </list>
+</template>
+
+<script>
+export default {
+  props: {
+    list: {}
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  detail(item) {
+    this.$emit('detail', { item })
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+
+.contents-list {
+  padding-left: @gap-3;
+  background-color: @white;
+}
+.contents-item {
+  width: 100%;
+  padding: @gap-4 @gap-1;
+  .border-bottom-mixins();
+}
+</style>

+ 166 - 0
src/components/library/book-list.ux

@@ -0,0 +1,166 @@
+<import name="my-load-more" src="apex-ui/components/load-more/index"></import>
+
+<template>
+  <list class="list-container" onscrollbottom="loadMore">
+    <list-item type="custom">
+      <slot></slot>
+    </list-item>
+    <list-item type="title">
+      <text class="rank-title">收藏榜单</text>
+    </list-item>
+    <list-item type="rank-item" for="{{rankList}}">
+      <stack class="rank-item {{`rank-${$idx}`}}" onclick="goToDetail($item)">
+        <div class="rank-bg"></div>
+        <div class="rank-icon">
+          <text>{{ $idx + 1 }}</text>
+        </div>
+        <div class="rank-text">
+          <text>{{ $item.title }}</text>
+          <text>{{ $item.author }}</text>
+        </div>
+      </stack>
+    </list-item>
+    <list-item type="title">
+      <text class="list-title">图书列表</text>
+    </list-item>
+    <list-item
+      type="book-item"
+      class="book-item"
+      for="{{list}}"
+      onclick="goToDetail($item)"
+    >
+      <div class="list-image">
+        <image src="{{$item.image}}"></image>
+      </div>
+      <div class="list-text">
+        <text class="book-title text-title">{{ $item.title }}</text>
+        <text class="book-author text-remark">{{ $item.author }}</text>
+        <text class="book-description text-remark-black">{{
+          $item.description
+        }}</text>
+        <text class="book-count text-remark">{{ $item.words }}万字</text>
+      </div>
+    </list-item>
+    <list-item type="loadMore" class="load-status" if="showLoad">
+      <my-load-more tip="加载更多"></my-load-more>
+    </list-item>
+    <list-item type="noMore" class="load-status" if="!showLoad">
+      <my-load-more tip="没有更多内容了" loading="{{ false }}"></my-load-more>
+    </list-item>
+  </list>
+</template>
+
+<script>
+export default {
+  props: {
+    list: {},
+    showLoad: {
+      default: true
+    },
+    title: {
+      default: '图书列表'
+    },
+    rankList: {
+      default: []
+    }
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  goToDetail(item) {
+    // 根据id查询详情
+    console.log(item.id)
+    $utils.route2theUrl('pages/book-detail', { info: item })
+  },
+  loadMore() {
+    this.$emit('loadMore')
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+
+.rank-title {
+  margin-bottom: @gap-1;
+  .list-title;
+}
+.rank-item {
+  width: 100%;
+  margin: @gap-2 0;
+  .rank-icon {
+    height: 60px;
+    width: 60px;
+    border-radius: 30px;
+    .flex-box-mixins(row, center, center);
+  }
+  .rank-bg {
+    border-radius: 30px;
+    height: 60px;
+    width: 100%;
+  }
+  .rank-text {
+    width: 100%;
+    padding-left: 80px;
+    padding-right: 30px;
+    .flex-box-mixins(row, space-between, center);
+  }
+  text {
+    color: @white;
+  }
+}
+.rank-0 {
+  .rank-icon {
+    background-color: #4f586e;
+  }
+  .rank-bg {
+    background-color: #77819c;
+  }
+}
+.rank-1 {
+  .rank-icon {
+    background-color: #2048af;
+  }
+  .rank-bg {
+    background-color: #5873bd;
+  }
+}
+.rank-2 {
+  .rank-icon {
+    background-color: #306df1;
+  }
+  .rank-bg {
+    background-color: #6695fa;
+  }
+}
+
+.book-item {
+  height: 300px;
+  .list-item;
+  .flex-box-mixins(row, space-between, flex-start);
+  .list-text {
+    flex: 1;
+    height: 100%;
+    .flex-box-mixins(column, flex-start, flex-start);
+    .book-title {
+      lines: 1;
+    }
+    .book-description {
+      lines: 2;
+    }
+    text {
+      margin-bottom: @gap-1;
+    }
+  }
+  .list-image {
+    width: 180px;
+    height: 240px;
+    margin-right: @gap-3;
+    background-color: @white-grey;
+    border-radius: 8px;
+    image {
+      width: 100%;
+      height: 100%;
+      border-radius: 8px;
+    }
+  }
+}
+</style>

+ 98 - 0
src/components/library/index.ux

@@ -0,0 +1,98 @@
+<import name="book-list" src="./book-list"></import>
+
+<template>
+  <div class="page-container">
+    <book-list
+      list="{{library.list}}"
+      show-load="{{library.load}}"
+      onload-more="queryLibraryList"
+      rank-list="{{rankList}}"
+    >
+      <div class="sub-container">
+        <swiper autoplay="true" class="swiper">
+          <image
+            class="swiper-image"
+            src="{{$item.swiper}}"
+            for="swiperList"
+            onclick="goToDetail($item)"
+          ></image>
+        </swiper>
+      </div>
+    </book-list>
+  </div>
+</template>
+
+<script>
+import { bookListData } from '../../assets/data/book-list.js'
+export default {
+  props: [],
+  data: {
+    library: {
+      list: [],
+      pageNo: 1,
+      pageSize: 5,
+      total: null,
+      load: true
+    },
+    swiperList: bookListData,
+    rankList: bookListData.slice(0, 3)
+  },
+  onInit() {
+    this.queryLibraryList(1)
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  queryLibraryList(pageNo) {
+    if (!isNaN(pageNo) && pageNo !== this.library.pageNo) {
+      return
+    }
+    if (
+      this.library.total &&
+      (this.library.pageNo - 1) * this.library.pageSize >= this.library.total
+    ) {
+      this.library.load = false
+      return
+    }
+    this.queryFn()
+  },
+  queryFn() {
+    /* 
+    开发时,根据pageNo和pageSize查询列表
+    返回total和对应pageNo的list
+    */
+    this.library.total = 5
+    // 模拟查询
+    let total = this.library.pageNo * this.library.pageSize
+    let end = this.library.total < total ? this.library.total : total
+    let start = total - this.library.pageSize
+    let concatList = bookListData.slice(start, end)
+    // 更新列表
+    this.library.list = this.library.list.concat(concatList)
+    this.library.pageNo++
+  },
+  goToDetail(item) {
+    console.log(item)
+    // 根据id查询详情
+    $utils.route2theUrl('pages/book-detail', { info: JSON.stringify(item) })
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+
+.sub-container {
+  width: 100%;
+  .flex-box-mixins(column, flex-start, flex-start);
+}
+.swiper {
+  indicator-selected-color: rgba(255, 255, 255, 1);
+  indicator-color: rgba(255, 255, 255, 0.5);
+  indicator-size: 12.5px;
+  width: 100%;
+  height: 400px;
+  margin: @gap-4 0;
+  .swiper-image {
+    border-radius: 10px;
+  }
+}
+</style>

+ 87 - 0
src/components/search-book/index.ux

@@ -0,0 +1,87 @@
+<import name="search-input-bar" src="./search-input-bar"></import>
+<template>
+  <div class="page-column">
+    <search-input-bar onsearch="search"></search-input-bar>
+    <div class="search-hot">
+      <div class="search-title">
+        <text class="text-black">大家都在搜</text>
+        <text class="search-refresh" @click="refreshHostList">&#xe607;</text>
+      </div>
+      <div class="hot-list">
+        <text class="hot-item" for="hotList" @click="toSearch($item.title)">{{
+          $item.title
+        }}</text>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { bookListData } from '../../assets/data/book-list.js'
+export default {
+  props: [],
+  data: {
+    hotList: [],
+    page: 1
+  },
+  onReady() {
+    this.refreshHostList()
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  changeTab(e) {
+    let index = e.index || 0
+    this.selectedTab = this.tabList[index]
+  },
+  search(info) {
+    let searchText = info.detail
+    this.toSearch(searchText)
+  },
+  toSearch(text) {
+    $utils.route2theUrl('pages/search', { initValue: text })
+  },
+  refreshHostList() {
+    if (this.page === 1) {
+      this.hotList = bookListData.slice(0, 5)
+      this.page = 2
+    } else if (this.page === 2) {
+      this.hotList = bookListData.slice(0, 5)
+      this.page = 1
+    }
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+
+.search-hot {
+  background-color: @white;
+  width: 100%;
+  padding: @gap-4;
+  margin-bottom: 20px;
+  margin-top: 20px;
+  .flex-box-mixins(column, flex-start, flex-start);
+  .search-title {
+    width: 100%;
+    margin-bottom: @gap-4;
+    .flex-box-mixins(row, space-between, center);
+  }
+  .hot-list {
+    width: 100%;
+    flex-wrap: wrap;
+  }
+  .hot-item {
+    width: 200px;
+    padding: @gap-1 0;
+    text-align: center;
+    border: 1px solid @grey;
+    border-radius: 30px;
+    margin: 15px @gap-4 15px 0;
+  }
+}
+.search-refresh {
+  .text-primary;
+  .iconfont;
+  padding: 0 @gap-3;
+}
+</style>

+ 47 - 0
src/components/search-book/search-input-bar.ux

@@ -0,0 +1,47 @@
+<template>
+  <div class="title-bar-noline">
+    <div class="search">
+      <input
+        type="text"
+        id="search-input"
+        class="search-input"
+        placeholder="请输入书名或作者"
+        value="{{searchText}}"
+        onchange="change"
+        onenterkeyclick="search"
+      />
+      <text class="iconfont search-icon" onclick="search()">&#xe661;</text>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    initValue: {
+      default: ''
+    }
+  },
+  data: {
+    searchText: ''
+  },
+  onReady() {
+    this.searchText = this.initValue
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  change(e) {
+    this.searchText = e.value
+  },
+  search() {
+    if (!this.searchText) {
+      $utils.showToast('输入不能为空')
+      return
+    }
+    this.$emit('search', this.searchText)
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+</style>

+ 39 - 0
src/helper/ajax.js

@@ -0,0 +1,39 @@
+import $fetch from '@system.fetch'
+import $utils from './utils'
+
+function requestHandle(params) {
+  console.log(`🤖 当前正在发起请求的 Url 是: ${params.url}`)
+  return new Promise((resolve, reject) => {
+    $fetch.fetch({
+      url: params.url,
+      method: params.method,
+      data: params.data,
+      success: data => {
+        resolve(data)
+      },
+      fail: (data, code) => {
+        console.log(`🐛 request fail, code = ${code} `, data)
+        reject(data)
+      },
+      complete: data => {
+        reject(data)
+      }
+    })
+  })
+}
+
+export default {
+  post: function(url, params, op) {
+    return requestHandle({
+      method: 'post',
+      url: url,
+      data: params
+    })
+  },
+  get: function(url, params = {}, op) {
+    return requestHandle({
+      method: 'get',
+      url: $utils.queryString(url, params)
+    })
+  }
+}

+ 7 - 0
src/helper/apis/common.js

@@ -0,0 +1,7 @@
+import $ajax from '../ajax'
+
+export default {
+  getPositionByLocation(data) {
+    return $ajax.get('https://apis.map.qq.com/ws/geocoder/v1/', data)
+  }
+}

+ 11 - 0
src/helper/apis/index.js

@@ -0,0 +1,11 @@
+const files = require.context('.', true, /\.js/)
+const modules = {}
+
+files.keys().forEach(key => {
+  if (key === './index.js') {
+    return
+  }
+  modules[key.replace(/(^\.\/|\.js$)/g, '')] = files(key).default
+})
+
+export default modules

+ 3 - 0
src/helper/index.js

@@ -0,0 +1,3 @@
+export const $utils = require('./utils').default
+export const $ajax = require('./ajax').default
+export const $apis = require('./apis').default

+ 81 - 0
src/helper/utils.js

@@ -0,0 +1,81 @@
+const prompt = require('@system.prompt')
+const router = require('@system.router')
+const storage = require('@system.storage')
+const hook2global = global.__proto__ || global
+
+function queryString(url, query) {
+  let str = []
+  for (let key in query) {
+    str.push(key + '=' + query[key])
+  }
+  let paramStr = str.join('&')
+  return paramStr ? `${url}?${paramStr}` : url
+}
+
+function setStorage(key, value) {
+  // 设置storage
+  storage.set({
+    key,
+    value: value,
+    fail(data, code) {
+      console.log(`setStorage fail, code = ${code}`)
+    }
+  })
+}
+
+function getStorage(key) {
+  return new Promise((resolve, reject) => {
+    // 获取storage
+    storage.get({
+      key,
+      success(data) {
+        if (data) {
+          resolve(data)
+        } else {
+          resolve('')
+        }
+      },
+      fail(data, code) {
+        console.log(`getStorage fail, code = ${code}`)
+        reject({ data, code })
+      }
+    })
+  })
+}
+
+export default {
+  queryString,
+  setStorage,
+  getStorage,
+  showToast(message = '', duration = 0) {
+    if (!message) return
+    prompt.showToast({
+      message: message,
+      duration
+    })
+  },
+  route2theUrl(url, params, clear = false) {
+    router.push({
+      uri: url,
+      params: params
+    })
+    if (clear) {
+      router.clear()
+    }
+  },
+  routeReplacetheUrl(url, params) {
+    router.replace({
+      uri: url,
+      params: params
+    })
+  },
+  routerBack() {
+    router.back()
+  },
+  setShelfList(list, storage = false) {
+    hook2global.$shelfList = list
+    if (storage) {
+      setStorage('bookshelf', JSON.stringify(list))
+    }
+  }
+}

+ 106 - 0
src/manifest.json

@@ -0,0 +1,106 @@
+{
+  "package": "com.example.demo",
+  "name": "demo",
+  "versionName": "1.0.0",
+  "versionCode": 1,
+  "minPlatformVersion": 1070,
+  "icon": "/assets/logo.png",
+  "features": [
+    {
+      "name": "system.prompt"
+    },
+    {
+      "name": "system.router"
+    },
+    {
+      "name": "system.shortcut"
+    },
+    {
+      "name": "system.webview"
+    },
+    {
+      "name": "service.share"
+    },
+    {
+      "name": "system.fetch"
+    },
+    {
+      "name": "system.storage"
+    },
+    {
+      "name": "service.texttoaudio"
+    }
+  ],
+  "permissions": [
+    {
+      "origin": "*"
+    }
+  ],
+  "template/official": "book",
+  "config": {
+    "logLevel": "debug",
+    "designWidth": 800
+  },
+  "router": {
+    "entry": "pages/main",
+    "pages": {
+      "pages/main": {
+        "component": "index"
+      },
+      "pages/search": {
+        "component": "index"
+      },
+      "pages/book-detail": {
+        "component": "index"
+      },
+      "pages/book-content": {
+        "component": "index"
+      },
+      "pages/comment": {
+        "component": "index"
+      },
+      "pages/comment-reply": {
+        "component": "index"
+      },
+      "pages/comment-all": {
+        "component": "index"
+      },
+      "pages/contents": {
+        "component": "index"
+      }
+    }
+  },
+  "display": {
+    "titleBar": true,
+    "titleBarBackgroundColor": "#f4f6fa",
+    "titleBarTextColor": "#333333",
+    "menu": true,
+    "pages": {
+      "pages/main": {
+        "titleBarText": "阅读"
+      },
+      "pages/search": {
+        "titleBarText": "查找"
+      },
+      "pages/book-detail": {
+        "titleBarText": "图书详情"
+      },
+      "pages/book-content": {
+        "titleBar": false,
+        "fullScreen": true
+      },
+      "pages/comment": {
+        "titleBarText": ""
+      },
+      "pages/comment-reply": {
+        "titleBarText": ""
+      },
+      "pages/comment-all": {
+        "titleBarText": "评论列表"
+      },
+      "pages/contents": {
+        "titleBarText": "目录"
+      }
+    }
+  }
+}

+ 402 - 0
src/pages/book-content/index.ux

@@ -0,0 +1,402 @@
+<template>
+  <div class="stack-wrapper">
+    <stack class="stack-wrapper">
+      <list
+        id="list"
+        class="book-content"
+        onclick="showOrHidePop"
+        style="background-color: {{ bgColor }};"
+      >
+        <list-item type="title">
+          <text class="book-title" style="{{titleStyle}}">{{
+            chapterTitle
+          }}</text>
+        </list-item>
+        <list-item type="content" show="{{!!content}}">
+          <text class="book-text" style="{{contentStyle}}">{{ content }}</text>
+        </list-item>
+        <list-item type="btns">
+          <div class="bottom-bar">
+            <text
+              @click="switchChapter('last')"
+              class="btn-bottom {{chapterId === 1 ? 'btn-bottom-disabled' : ''}}"
+            >
+              上一章
+            </text>
+            <text @click="goToContents" class="btn-bottom btn-margin"
+              >目录</text
+            >
+            <text
+              @click="switchChapter('next')"
+              class="btn-bottom {{chapterId === total ? 'btn-bottom-disabled' : ''}}"
+            >
+              下一章
+            </text>
+          </div>
+        </list-item>
+      </list>
+      <div class="pop-layer" show="{{showPop}}">
+        <div class="header">
+          <image src="/assets/images/back.svg" onclick="back"></image>
+          <text>{{ bookTitle }}</text>
+        </div>
+        <div class="middle" onclick="showOrHidePop">
+          <div
+            class="float-btn"
+            onclick="changeNightMode"
+            style="bottom: 50px;"
+          >
+            <image
+              src="/assets/images/sun.svg"
+              if="{{userSetting.nightMode}}"
+            ></image>
+            <image src="/assets/images/moon.svg" else></image>
+          </div>
+          <div class="float-btn" style="bottom: 180px;" onclick="text2Audio">
+            <image src="/assets/images/earphone.svg"></image>
+          </div>
+        </div>
+        <div class="footer">
+          <div class="font-change">
+            <text
+              class="font-item {{$item.font === userSetting.fontFamily ? 'selected' : ''}}"
+              for="{{fonts}}"
+              onclick="fontChange($item)"
+            >
+              {{ $item.name }}
+            </text>
+          </div>
+          <div class="bg-color-change">
+            <div
+              class="color-item {{$item === userSetting.bgColor ? 'selected' : ''}}"
+              for="{{colors}}"
+              style="background-color: {{$item}};"
+              onclick="bgcolorChange($item)"
+            ></div>
+          </div>
+          <div class="font-size-change">
+            <text
+              class="btn"
+              onclick="sizeChange('minus')"
+              disabled="{{userSetting.fontsize <= 30}}"
+              >A-</text
+            >
+            <text class="size">{{ userSetting.fontsize }}</text>
+            <text
+              class="btn"
+              onclick="sizeChange('plus')"
+              disabled="{{userSetting.fontsize >= 70}}"
+              >A+</text
+            >
+          </div>
+          <div class="bottom-bar">
+            <text
+              @click="switchChapter('last')"
+              class="btn-bottom {{chapterId === 1 ? 'btn-bottom-disabled' : ''}}"
+            >
+              上一章
+            </text>
+            <text @click="goToContents" class="btn-bottom btn-margin"
+              >目录</text
+            >
+            <text
+              @click="switchChapter('next')"
+              class="btn-bottom {{chapterId === total ? 'btn-bottom-disabled' : ''}}"
+            >
+              下一章
+            </text>
+          </div>
+        </div>
+      </div>
+    </stack>
+  </div>
+</template>
+
+<script>
+import texttoaudio from '@service.texttoaudio'
+import { getBookContent } from '../../assets/data/book-content.js'
+import { contentsData } from '../../assets/data/contents.js'
+export default {
+  public: {
+    bookId: 1,
+    bookTitle: '红楼梦',
+    chapterId: 1,
+    total: 120
+  },
+  private: {
+    content: '',
+    chapterTitle: '',
+    showPop: false,
+    userSetting: {
+      fontsize: 40,
+      bgColor: '#EAEAEF',
+      nightMode: false,
+      fontFamily: 'default'
+    },
+    colors: ['#EAEAEF', '#FAF9DE', '#E3EDCD', '#DCE2F1', '#FFF2E2'],
+    fonts: [
+      {
+        name: '系统字体',
+        font: 'default'
+      },
+      {
+        name: '仓耳非白W02',
+        font: 'font1'
+      },
+      {
+        name: '千图笔锋手写体',
+        font: 'font2'
+      },
+      {
+        name: '字体传奇南安体',
+        font: 'font3'
+      }
+    ]
+  },
+  computed: {
+    bgColor() {
+      if (this.userSetting.nightMode) return 'rgb(29,29,31)'
+      else return this.userSetting.bgColor
+    },
+    titleStyle() {
+      return {
+        fontFamily: this.userSetting.fontFamily,
+        color: this.userSetting.nightMode ? 'rgb(126,129,134)' : '#000000'
+      }
+    },
+    contentStyle() {
+      return {
+        fontFamily: this.userSetting.fontFamily,
+        color: this.userSetting.nightMode ? 'rgb(126,129,134)' : '#000000',
+        fontSize: this.userSetting.fontsize
+      }
+    }
+  },
+  async onInit() {
+    //搜索优化
+    this.$page.setMeta({
+      title: this.bookTitle,
+      description: this.bookTitle,
+      keywords: 'bookId,bookTitle,chapterId,total'
+    })
+    /* 
+    调用接口,用bookId和chapterId查询页面的内容,更新content和title。
+    以下代码为模拟查询。
+    */
+    console.log('bookId', this.bookId)
+    // 参数传入时会变成string类型,需要转换类型
+    this.chapterId = Number(this.chapterId)
+    this.chapterTitle = contentsData[this.bookId][this.chapterId - 1]
+    this.content = await getBookContent(this.bookId, this.chapterId)
+  },
+  async onReady() {
+    //获取用户自定义的样式,不存在自定义样式时使用默认样式
+    const data = await $utils.getStorage('user-setting')
+    if (!!data) this.userSetting = JSON.parse(data)
+  },
+  onBackPress() {
+    console.info(`触发:onBackPress`)
+    if (texttoaudio.isSpeaking()) {
+      texttoaudio.stop()
+      $utils.showToast('您已退出听书模式')
+    } else {
+      $utils.routerBack()
+    }
+    return true
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  async switchChapter(type, e) {
+    e.stopPropagation()
+    if (
+      (type === 'next' && this.chapterId === this.total) ||
+      (type === 'last' && this.chapterId === 1)
+    ) {
+      return
+    }
+    if (!!this.showPop) this.showPop = false
+    // 调用接口,用bookId和chapterId查询下一页的内容,更新content和title。以下代码为模拟翻页。
+    this.chapterId = type === 'next' ? this.chapterId + 1 : this.chapterId - 1
+    this.content = await getBookContent(this.bookId, this.chapterId)
+    this.chapterTitle = contentsData[this.bookId][this.chapterId - 1]
+    this.$element('list').scrollTo({ index: 0 })
+  },
+  goToContents() {
+    $utils.route2theUrl('pages/contents', {
+      bookId: this.bookId,
+      bookTitle: this.bookTitle
+    })
+  },
+  showOrHidePop() {
+    this.showPop = !this.showPop
+  },
+  back() {
+    $utils.routerBack()
+  },
+  sizeChange(type) {
+    if (type === 'plus') this.userSetting.fontsize++
+    else this.userSetting.fontsize--
+    this.saveUserSettings()
+  },
+  bgcolorChange(color) {
+    this.userSetting.bgColor = color
+    this.saveUserSettings()
+  },
+  fontChange(item) {
+    this.userSetting.fontFamily = item.font
+    this.saveUserSettings()
+  },
+  changeNightMode(e) {
+    e.stopPropagation()
+    this.userSetting.nightMode = !this.userSetting.nightMode
+    this.saveUserSettings()
+  },
+  saveUserSettings() {
+    $utils.setStorage('user-setting', JSON.stringify(this.userSetting))
+  },
+  text2Audio() {
+    if (texttoaudio.isSpeaking()) {
+      texttoaudio.stop()
+      $utils.showToast('您已退出听书模式')
+    } else {
+      texttoaudio.speak({
+        lang: 'zh_CN',
+        content: `${this.chapterTitle} ${this.content}`,
+        pitch: 1,
+        rate: 1,
+        success: function(data) {
+          console.log(`handling success, utteranceId = ${data.utteranceId}`)
+        },
+        fail: function(data, code) {
+          console.log(`handling fail, code = ${code}`)
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.stack-wrapper {
+  width: 100%;
+  height: 100%;
+}
+.book-content {
+  padding: 0 @gap-4;
+  width: 100%;
+  flex: 1;
+  .flex-box-mixins(column, flex-start, flex-start);
+  .book-title {
+    .title;
+    margin: 60px 0 @gap-4 0;
+  }
+  .g22kjdgy{
+    color: #ffffff;
+  }
+  .book-text {
+    margin: @gap-3 0;
+  }
+}
+.btn-bottom {
+  .btn-primary;
+  flex: 1;
+  text-align: center;
+}
+.btn-margin {
+  margin: 0 @gap-4;
+}
+.btn-bottom-disabled {
+  .btn-disabled;
+}
+.pop-layer {
+  .page-column;
+  .header {
+    .flex-box-mixins(row, flex-start, center);
+    width: 100%;
+    height: 30 * @size-factor;
+    background-color: @layer-bg;
+    padding: 0 @gap-4;
+    image {
+      width: 10 * @size-factor;
+      height: 10 * @size-factor;
+      margin-right: @gap-4;
+    }
+    text {
+      font-size: 8 * @size-factor;
+      color: @white;
+    }
+  }
+  .footer {
+    padding-top: @gap-3;
+    .flex-box-mixins(column, flex-start, center);
+    width: 100%;
+    background-color: @layer-bg;
+    .font-size-change {
+      width: 90%;
+      padding: @gap-1 @gap-4;
+      .flex-box-mixins(row, space-between, center);
+      .btn {
+        font-size: 10 * @size-factor;
+        color: @white;
+      }
+      .btn:disabled {
+        opacity: 0.5;
+      }
+      .size {
+        font-size: 8 * @size-factor;
+        color: @white;
+      }
+    }
+    .bg-color-change {
+      width: 90%;
+      padding: @gap-1 @gap-4;
+      .flex-box-mixins(row, space-between, center);
+      .color-item {
+        width: 20 * @size-factor;
+        height: 10 * @size-factor;
+        border-radius: 8px;
+      }
+      .selected {
+        border: 5px solid @brand;
+      }
+    }
+
+    .font-change {
+      width: 90%;
+      padding: @gap-1 @gap-4;
+      .flex-box-mixins(row, space-between, center);
+      flex-wrap: wrap;
+      .font-item {
+        .btn-primary;
+        color: @grey;
+        border-color: @grey;
+        width: 45%;
+        margin-bottom: 2 * @size-factor;
+      }
+      .selected {
+        color: @brand;
+        border-color: @brand;
+        border-width: 3px;
+      }
+    }
+  }
+  .middle {
+    width: 100%;
+    height: 100%;
+    flex: 1;
+    .float-btn {
+      position: absolute;
+      right: 10 * @size-factor;
+      .flex-box-mixins(row, center, center);
+      width: 20 * @size-factor;
+      height: 20 * @size-factor;
+      background-color: @layer-bg;
+      border-radius: 100%;
+      image {
+        width: 10 * @size-factor;
+        height: 10 * @size-factor;
+      }
+    }
+  }
+}
+</style>

+ 214 - 0
src/pages/book-detail/index.ux

@@ -0,0 +1,214 @@
+<import name="info" src="../../components/book-detail/info"></import>
+<import
+  name="comment-item-simple"
+  src="../../components/book-detail/comment-item-simple"
+></import>
+<import name="my-toast" src="apex-ui/components/toast/index"></import>
+
+<template>
+  <div class="page-wrapper">
+    <list>
+      <list-item type="info"> <info info="{{bookInfo}}"></info> </list-item>
+      <list-item type="description" class="description">
+        <text class="description-title">作品简介</text>
+        <text class="text-remark">{{ bookInfo.description }}</text>
+      </list-item>
+      <list-item type="sub-title" class="sub-title">
+        <text class="text-title">共{{ bookInfo.count }}章</text>
+        <div @click="goToContents">
+          <text class="text-remark">2019-7-23更新</text>
+          <text class="text-remark iconfont">&#xe6d7;</text>
+        </div>
+      </list-item>
+      <list-item type="sub-title" class="detail-title">
+        <text class="text-title">热门评论</text>
+        <div @click="goToComment">
+          <text class="text-remark">30人正在讨论</text>
+          <text class="text-remark iconfont">&#xe6d7;</text>
+        </div>
+      </list-item>
+      <list-item type="comment" for="{{commentList}}">
+        <comment-item-simple
+          item="{{$item}}"
+          onreply-comment="replyComment"
+        ></comment-item-simple>
+      </list-item>
+      <list-item type="detail-title" class="detail-title">
+        <text class="text-title">相似图书推荐</text>
+      </list-item>
+      <list-item type="image-list" class="book-image-list">
+        <div
+          class="book-image-item"
+          for="{{recommandBook}}"
+          @click="goToDetail($item)"
+        >
+          <image src="{{$item.image}}"></image>
+          <text class="book-image-title">{{ $item.title }}</text>
+          <text class="text-remark">{{ $item.author }}</text>
+        </div>
+      </list-item>
+    </list>
+    <div class="detail-bottom-bar">
+      <text
+        class="btn btn-shelf {{isInShelf ? 'btn-shelf-disabled' : ''}}"
+        @click="addToShelf"
+      >
+        {{ isInShelf ? '已加入书架' : '加入书架' }}
+      </text>
+      <text class="btn-read" @click="goToContent">开始阅读</text>
+    </div>
+    <my-toast id="toast"></my-toast>
+  </div>
+</template>
+
+<script>
+import { bookListData } from '../../assets/data/book-list.js'
+import { commentData } from '../../assets/data/comment.js'
+export default {
+  public: {
+    info: ''
+  },
+  private: {
+    bookInfo: {},
+    commentList: commentData.slice(0, 3),
+    recommandBook: bookListData.slice(0, 3),
+    isInShelf: false,
+    shelfList: []
+  },
+  onInit() {
+    // 此处直接将图书内容传进来,实际开发中也可以传入id查询图书信息
+    this.bookInfo = this.info ? JSON.parse(this.info) : {}
+    // $shelfList:全局变量
+    this.shelfList = $shelfList
+    this.isInShelf = !!this.shelfList.filter(book => {
+      return book.id === this.bookInfo.id
+    }).length
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  goToComment() {
+    $utils.route2theUrl('pages/comment-all', this.bookInfo)
+  },
+  goToContents() {
+    $utils.route2theUrl('pages/contents', {
+      bookId: this.bookInfo.id,
+      bookTitle: this.bookInfo.title
+    })
+  },
+  goToDetail(item) {
+    console.log(item)
+    // 根据id查询详情,跳转到另一个图书的详情页,用router.replace,无法返回当前页
+    $utils.routeReplacetheUrl('pages/book-detail', {
+      info: JSON.stringify(item)
+    })
+  },
+  goToContent() {
+    $utils.route2theUrl('pages/book-content', {
+      bookId: this.bookInfo.id,
+      bookTitle: this.bookInfo.title,
+      total: this.bookInfo.count
+    })
+  },
+  addToShelf() {
+    if (this.isInShelf) {
+      return
+    }
+    if (!this.bookInfo.id) {
+      this.$child('toast').showToast({
+        content: '图书信息有误',
+        icon: 'warning'
+      })
+      return
+    }
+    this.isInShelf = true
+    this.shelfList.push(this.bookInfo)
+    $utils.setShelfList(this.shelfList, true) // 保存到全局变量和storage
+    this.$child('toast').showToast({
+      content: '已加入书架',
+      icon: 'thumbs-up'
+    })
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.description {
+  padding: @gap-4;
+  width: 100%;
+  background-color: @white;
+  .flex-box-mixins(column, flex-start, flex-start);
+  .description-title {
+    .text-title;
+    margin-bottom: @gap-2;
+  }
+}
+.sub-title {
+  .detail-title;
+  padding: @gap-4;
+}
+.detail-title {
+  background-color: @white;
+  padding: @gap-4 @gap-4 @gap-2 @gap-4;
+  margin-top: @gap-2;
+  .text-title;
+  .flex-box-mixins(row, space-between, center);
+}
+.comment-more {
+  margin-right: @gap-3;
+}
+
+.book-image-list {
+  width: 100%;
+  padding: 0 @gap-2 @gap-2 @gap-2;
+  background-color: @white;
+  margin-bottom: @gap-2;
+  flex-wrap: wrap;
+  .flex-box-mixins(row, flex-start, flex-start);
+  .g22kjdgy{
+    color: #ffffff;
+  }
+  .book-image-item {
+    width: 28%;
+    margin: @gap-2;
+    .flex-box-mixins(column, flex-start, flex-start);
+    image {
+      border-radius: 5px;
+      width: 100%;
+      height: 270px;
+      flex: 1;
+    }
+    .book-image-title {
+      .text-remark-black;
+      margin: @gap-1 0 5px 0;
+    }
+  }
+}
+
+.detail-bottom-bar {
+  padding: @gap-3 @gap-4;
+  background-color: @bg-grey;
+  .border-top-mixins();
+  .flex-box-mixins(row, space-between, center);
+}
+.btn-shelf {
+  color: @brand;
+  border: 1px solid @brand;
+  border-radius: 5px;
+  padding: 15px 0;
+  flex: 1;
+  text-align: center;
+  margin-right: @gap-2;
+}
+.btn-read {
+  color: @white;
+  border: 1px solid @brand;
+  background-color: @brand;
+  border-radius: 5px;
+  padding: 15px 0;
+  flex: 1;
+  text-align: center;
+}
+.btn-shelf-disabled {
+  .btn-disabled;
+}
+</style>

+ 127 - 0
src/pages/comment-all/index.ux

@@ -0,0 +1,127 @@
+<import
+  name="comment-item"
+  src="../../components/book-detail/comment-item"
+></import>
+<import name="my-load-more" src="apex-ui/components/load-more/index"></import>
+
+<template>
+  <div class="page-wrapper comment-all-wrapper">
+    <list id="book" onscrollbottom="queryList">
+      <list-item type="comment-title" class="section-title-bordered">
+        <text class="text-title">{{ title }}</text>
+        <text class="text-primary" onclick="publishComment">发表评论</text>
+      </list-item>
+      <list-item type="comment" for="{{comment.list}}">
+        <comment-item
+          item="{{$item}}"
+          onreply-comment="replyComment"
+        ></comment-item>
+      </list-item>
+      <list-item type="loadMore" class="load-status" if="{{comment.load}}">
+        <my-load-more tip="加载更多"></my-load-more>
+      </list-item>
+      <list-item type="noMore" class="load-status" if="{{!comment.load}}">
+        <my-load-more tip="没有更多内容了" loading="{{ false }}"></my-load-more>
+      </list-item>
+    </list>
+  </div>
+</template>
+
+<script>
+import { commentData } from '../../assets/data/comment.js'
+export default {
+  public: {
+    id: '',
+    image: '',
+    title: '',
+    author: '',
+    description: '',
+    count: '',
+    score: ''
+  },
+  private: {
+    bookInfo: {},
+    comment: {
+      list: [],
+      pageNo: 1,
+      pageSize: 10,
+      total: null,
+      load: true
+    }
+  },
+  onInit() {
+    // this.bookInfo = this.info ? JSON.parse(this.info) : {}
+    console.log('info')
+    // 查询评论列表
+    this.queryList(1)
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  queryList(pageNo) {
+    if (!isNaN(pageNo) && pageNo !== this.comment.pageNo) {
+      return
+    }
+    if (
+      this.comment.total &&
+      (this.comment.pageNo - 1) * this.comment.pageSize >= this.comment.total
+    ) {
+      this.comment.load = false
+      return
+    }
+    this.queryFn()
+  },
+  queryFn() {
+    /* 
+    开发时,根据pageNo和pageSize查询列表
+    返回total和对应pageNo的list
+    */
+    this.comment.total = 30
+    this.comment.list = this.comment.list.concat(commentData)
+    this.comment.pageNo++
+  },
+  publishComment() {
+    $utils.route2theUrl('pages/comment', {
+      title: this.title,
+      id: this.id
+    })
+  },
+  replyComment(parameter) {
+    let comment = parameter.detail.comment
+    $utils.route2theUrl('pages/comment-reply', {
+      title: this.title,
+      id: this.id,
+      commentId: comment.id,
+      commentText: comment.comment,
+      commentName: comment.name
+    })
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.comment-all-wrapper {
+  background-color: @white;
+}
+
+.description {
+  padding: @gap-4;
+  width: 100%;
+  margin-bottom: @gap-2;
+  background-color: @white;
+  .flex-box-mixins(column, flex-start, flex-start);
+  .description-title {
+    .text-title;
+    margin-bottom: @gap-2;
+  }
+  .g22kjdgy{
+    color: #ffffff;
+  }
+}
+
+.comment-title {
+  .flex-box-mixins(column, flex-start, flex-start);
+}
+.comment-more {
+  margin-right: @gap-3;
+}
+</style>

+ 58 - 0
src/pages/comment-reply/index.ux

@@ -0,0 +1,58 @@
+<template>
+  <div class="page-wrapper comment-page">
+    <div class="page-container-white">
+      <text class="comment-title">{{ title }}</text>
+      <text class="text-remark-big resource-title">{{ commentName }}:</text>
+      <text class="text-black resource-text">{{ commentText }}</text>
+      <div class="text-line">
+        <textarea class="textarea" placeholder="回复" onchange="changeReply"></textarea>
+      </div>
+      <div class="btn-line">
+        <text class="publish-btn" onclick="onBtnClick">发布</text>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  public: {
+    title: '',
+    id: '',
+    commentId: '',
+    commentText: '',
+    commentName: ''
+  },
+  private: {
+    reply: ''
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  changeReply(param) {
+    this.reply = param.value
+  },
+  onBtnClick() {
+    console.log(this.reply)
+    // 评论成功后,跳转回原来页面
+    router.back()
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.comment-title {
+  font-size: 9 * @size-factor;
+  color: @text-black;
+  font-weight: bold;
+  padding: @gap-4;
+  .g22kjdgy{
+    color: #ffffff;
+  }
+}
+.resource-title {
+  padding: @gap-4 @gap-4 @gap-2 @gap-4;
+}
+.resource-text {
+  padding: 0 @gap-4 @gap-4 @gap-4;
+}
+</style>

+ 51 - 0
src/pages/comment/index.ux

@@ -0,0 +1,51 @@
+<template>
+  <div class="page-wrapper comment-page">
+    <div class="page-container-white">
+      <text class="comment-title">{{ title }}</text>
+      <div class="text-line">
+        <textarea class="textarea" placeholder="发表评论" onchange="changeComment"></textarea>
+      </div>
+      <div class="btn-line">
+        <text class="publish-btn" onclick="onBtnClick">发布</text>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  public: {
+    title: '',
+    id: ''
+  },
+  private: {
+    comment: ''
+  },
+  onInit() {
+    console.log(this.title, this.id)
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  changeComment(param) {
+    this.comment = param.value
+  },
+  onBtnClick() {
+    // 发送comment到后台
+    console.log(this.comment)
+    // 评论成功后,跳转回原来页面
+    router.back()
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.comment-title {
+  font-size: 9 * @size-factor;
+  color: @text-black;
+  font-weight: bold;
+  padding: @gap-4;
+}
+.g22kjdgy{
+    color: #ffffff;
+  }
+</style>

+ 115 - 0
src/pages/contents/index.ux

@@ -0,0 +1,115 @@
+<import
+  name="contents-list"
+  src="../../components/contents/contents-list.ux"
+></import>
+<template>
+  <div class="page-wrapper">
+    <div class="title-bar">
+      <text class="text-black">共{{ total }}章</text>
+      <div @click="switchOrder">
+        <text class="text-primary iconfont">{{
+          reverse ? '&#xe624;' : '&#xe6d6;'
+        }}</text>
+        <text class="text-primary">{{ reverse ? '正序' : '倒序' }}</text>
+      </div>
+    </div>
+    <contents-list list="{{contents}}" ondetail="detail"></contents-list>
+    <div class="bottom-bar">
+      <text
+        @click="switchPage('last')"
+        class="btn-primary {{pageNo === 1 ? 'btn-disabled' : ''}}"
+        >上一页</text
+      >
+      <text>{{ pageNumStart }}-{{ pageNumEnd }}章</text>
+      <text
+        @click="switchPage('next')"
+        class="btn-primary {{pageNo === pageCount ? 'btn-disabled' : ''}}"
+        >下一页</text
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import { contentsData } from '../../assets/data/contents.js'
+export default {
+  public: {
+    bookId: '',
+    bookTitle: ''
+  },
+  private: {
+    total: '',
+    pageNumStart: 1,
+    pageNumEnd: 50,
+    pageNo: 1,
+    pageCount: 2,
+    reverse: false,
+    contents: [],
+    lastList: [],
+    nextList: []
+  },
+  onInit() {
+    // 开发时应该调用接口,根据bookId,pageNo(1), reverse(false)获取章节目录,返回第一页内容contents,总章节数total,总页数pageCount,算出pageNumStart和pageNumEnd。
+    this.total = contentsData[this.bookId].length
+    this.lastList = contentsData[this.bookId].slice(0, 50)
+    this.nextList = contentsData[this.bookId].slice(50)
+    console.log('bookId', this.bookId)
+    this.contents = this.lastList
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  switchOrder() {
+    this.reverse = !this.reverse
+    this.switchList()
+  },
+  switchPage(type) {
+    if (
+      (type === 'next' && this.pageNo === this.pageCount) ||
+      (type === 'last' && this.pageNo === 1)
+    ) {
+      return
+    }
+    type === 'next' ? this.pageNo++ : this.pageNo--
+    this.switchList()
+  },
+  switchList() {
+    // 开发时应该调用接口,根据bookId,pageNo,reverse获取章节目录。此处是模拟翻页/改变顺序。
+    if (this.reverse) {
+      if (this.pageNo === 1) {
+        this.pageNumStart = contentsData[this.bookId].length
+        this.pageNumEnd = 51
+        this.contents = this.nextList.reverse()
+      } else if (this.pageNo === 2) {
+        this.pageNumStart = 50
+        this.pageNumEnd = 1
+        this.contents = this.lastList.reverse()
+      }
+    } else {
+      if (this.pageNo === 1) {
+        this.pageNumStart = 1
+        this.pageNumEnd = 50
+        this.contents = this.lastList
+      } else if (this.pageNo === 2) {
+        this.pageNumStart = 51
+        this.pageNumEnd = contentsData[this.bookId].length
+        this.contents = this.nextList
+      }
+    }
+  },
+  detail(param) {
+    let item = param.detail.item
+    $utils.route2theUrl('pages/book-content', {
+      bookId: this.bookId,
+      bookTitle: this.bookTitle,
+      chapterId: contentsData[this.bookId].indexOf(item) + 1 || 0,
+      total: contentsData[this.bookId].length
+    })
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.g22kjdgy {
+  color: #ffffff;
+}
+</style>

+ 111 - 0
src/pages/main/index.ux

@@ -0,0 +1,111 @@
+<import name="bookshelf" src="../../components/bookshelf"></import>
+<import name="library" src="../../components/library"></import>
+<import name="search-book" src="../../components/search-book"></import>
+
+<template>
+  <div class="page-wrapper">
+    <tabs index="{{selectedTab}}" onchange="changeTab">
+      <tab-content>
+        <bookshelf
+          shelf-list="{{shelfList}}"
+          onupdate-shelf="updateShelf"
+        ></bookshelf>
+        <library></library>
+        <search-book></search-book>
+      </tab-content>
+      <tab-bar mode="fixed" class="tab-bar">
+        <div class="tab-item" for="tabList">
+          <text class="iconfont">{{
+            selectedTab === $idx ? $item.activatedIcon : $item.icon
+          }}</text>
+          <text class="tab-title">{{ $item.title }}</text>
+        </div>
+      </tab-bar>
+    </tabs>
+  </div>
+</template>
+
+<script>
+import { bookListData } from '../../assets/data/book-list.js'
+export default {
+  private: {
+    tabList: [
+      {
+        title: '书架',
+        icon: '\ue602',
+        activatedIcon: '\ue601'
+      },
+      {
+        title: '书城',
+        icon: '\ue681',
+        activatedIcon: '\ue67d'
+      },
+      {
+        title: '查找',
+        icon: '\ue603',
+        activatedIcon: '\ue604'
+      },
+      {
+        title: '工具广场',
+        icon: '\ue603',
+        activatedIcon: '\ue604'
+      }
+    ],
+    selectedTab: 1,
+    defaultShelfList: bookListData.slice(0, 2),
+    shelfList: []
+  },
+  onInit() {
+    $utils.getStorage('bookshelf').then(value => {
+      // 从storage获取
+      if (!value) {
+        this.shelfList = this.defaultShelfList
+        $utils.setShelfList(this.shelfList, true) // 保存到全局变量和storage
+      } else {
+        this.shelfList = JSON.parse(value)
+        $utils.setShelfList(this.shelfList) // 保存到全局变量
+      }
+    })
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  changeTab(e) {
+    let index = e.index === undefined ? 1 : e.index
+    this.selectedTab = index
+  },
+  updateShelf(param) {
+    this.shelfList = param.detail.shelfList
+    $utils.setShelfList(this.shelfList, true) // 保存到全局变量和storage
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.tab-bar {
+  background-color: @white;
+  .border-top-mixins();
+  padding: 15px 0;
+  height: 110px;
+  .tab-item {
+    flex: 1;
+    .flex-box-mixins(column, center, center);
+    .iconfont {
+      font-size: 50px;
+      color: @text-grey;
+      &:active {
+        color: @brand;
+      }
+    }
+    .g22kjdgy {
+      color: #ffffff;
+    }
+    .tab-title {
+      font-size: 20px;
+      color: @text-grey;
+      &:active {
+        color: @brand;
+      }
+    }
+  }
+}
+</style>

+ 109 - 0
src/pages/search/index.ux

@@ -0,0 +1,109 @@
+<import
+  name="search-input-bar"
+  src="../../components/search-book/search-input-bar"
+></import>
+
+<template>
+  <div class="page-wrapper">
+    <search-input-bar
+      onsearch="search"
+      init-value="{{initValue}}"
+    ></search-input-bar>
+    <list class="list-container" if="{{searchText}}">
+      <list-item type="title">
+        <text class="list-title">搜到{{ resultList.length }}条结果</text>
+      </list-item>
+      <list-item
+        class="book-item"
+        for="{{resultList}}"
+        onclick="goToDetail($item)"
+        type="book-item"
+      >
+        <div class="list-image">
+          <image src="{{$item.image}}"></image>
+        </div>
+        <div class="list-text">
+          <text class="book-title text-black">{{ $item.title }}</text>
+          <text class="book-author text-remark">{{ $item.author }}</text>
+          <text class="book-description text-remark-black">{{
+            $item.description
+          }}</text>
+        </div>
+      </list-item>
+    </list>
+  </div>
+</template>
+
+<script>
+import { bookListData } from '../../assets/data/book-list.js'
+export default {
+  public: {
+    initValue: ''
+  },
+  private: {
+    resultList: [],
+    searchText: ''
+  },
+  onReady() {
+    this.searchText = this.initValue
+    this.queryFn()
+  },
+  /* -------------------SelfCustomEvent------------------ */
+  search(info) {
+    this.searchText = info.detail
+    this.queryFn()
+  },
+  queryFn() {
+    // 根据关键字,查询接口,返回resultList。此处模拟接口查询,只能查询到bookListData中的图书。
+    this.resultList = this.searchText
+      ? bookListData.filter(item => {
+          return item.title.indexOf(this.searchText) !== -1
+        })
+      : []
+  },
+  goToDetail(item) {
+    // 根据id查询详情
+    console.log(item.id)
+    $utils.route2theUrl('pages/book-detail', { info: item })
+  }
+}
+</script>
+
+<style lang="less">
+@import '../../assets/styles/index.less';
+.book-item {
+  height: 300px;
+  width: 100%;
+  padding: @gap-3 0;
+  .flex-box-mixins(row, space-between, flex-start);
+  .list-text {
+    flex: 1;
+    height: 100%;
+    .flex-box-mixins(column, center, flex-start);
+    .book-title {
+      lines: 1;
+    }
+    .book-description {
+      lines: 2;
+    }
+    text {
+      margin-bottom: @gap-2;
+    }
+  }
+  .g22kjdgy{
+    color: #ffffff;
+  }
+  .list-image {
+    width: 180px;
+    height: 240px;
+    margin-right: @gap-3;
+    background-color: @white-grey;
+    border-radius: 8px;
+    image {
+      width: 100%;
+      height: 100%;
+      border-radius: 8px;
+    }
+  }
+}
+</style>

+ 6 - 0
src/sitemap.json

@@ -0,0 +1,6 @@
+{
+  "rules": [
+    { "rule": "enable", "page": "pages/book-content" },
+    { "rule": "disable", "page": "*" }
+  ]
+}

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