├── frontend
├── .env.development
├── .gitignore
├── .prettierrc
├── src
│ ├── index.css
│ ├── assets
│ │ └── logo.png
│ ├── components
│ │ ├── Logo.vue
│ │ ├── Loading.vue
│ │ ├── Header.vue
│ │ └── HelloWorld.vue
│ ├── main.js
│ ├── router.js
│ ├── api
│ │ └── index.js
│ ├── App.vue
│ └── views
│ │ ├── index.vue
│ │ └── login.vue
├── public
│ └── favicon.ico
├── postcss.config.js
├── jsconfig.json
├── .editorconfig
├── tailwind.config.js
├── index.html
├── package.json
└── vite.config.js
├── test.js
├── backend
├── static
│ ├── favicon.ico
│ ├── activity.json.gz
│ ├── assets
│ │ ├── logo.03d6d6da.png
│ │ ├── index.1a8beb0e.js.gz
│ │ ├── index.fcdd9895.css.gz
│ │ ├── vendor.baa403e4.js.gz
│ │ ├── element-icons.9c88a535.woff
│ │ ├── element-icons.de5eb258.ttf
│ │ └── index.fcdd9895.css
│ ├── index.html
│ └── activity.json
├── ecosystem.config.js
├── .env.example
├── package.json
├── ql.js
├── app.js
├── .gitignore
├── utils
│ └── USER_AGENT.js
├── user.js
├── sendNotify.js
└── pnpm-lock.yaml
├── README.md
└── .gitignore
/frontend/.env.development:
--------------------------------------------------------------------------------
1 | VITE_API_BASE_URL=http://localhost:5701/api
--------------------------------------------------------------------------------
/test.js:
--------------------------------------------------------------------------------
1 | process.env.NOTIFY = false;
2 | console.log(process.env.NOTIFY || true)
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | dist
4 | dist-ssr
5 | *.local
--------------------------------------------------------------------------------
/frontend/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "semi": false,
3 | "singleQuote": true
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
--------------------------------------------------------------------------------
/backend/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/favicon.ico
--------------------------------------------------------------------------------
/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/frontend/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/frontend/src/assets/logo.png
--------------------------------------------------------------------------------
/backend/static/activity.json.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/activity.json.gz
--------------------------------------------------------------------------------
/backend/static/assets/logo.03d6d6da.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/logo.03d6d6da.png
--------------------------------------------------------------------------------
/backend/static/assets/index.1a8beb0e.js.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/index.1a8beb0e.js.gz
--------------------------------------------------------------------------------
/frontend/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/backend/static/assets/index.fcdd9895.css.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/index.fcdd9895.css.gz
--------------------------------------------------------------------------------
/backend/static/assets/vendor.baa403e4.js.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/vendor.baa403e4.js.gz
--------------------------------------------------------------------------------
/backend/static/assets/element-icons.9c88a535.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/element-icons.9c88a535.woff
--------------------------------------------------------------------------------
/backend/static/assets/element-icons.de5eb258.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/element-icons.de5eb258.ttf
--------------------------------------------------------------------------------
/backend/ecosystem.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | apps: [
3 | {
4 | name: 'ninja',
5 | script: './app.js',
6 | },
7 | ],
8 | };
9 |
--------------------------------------------------------------------------------
/frontend/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": ".",
4 | "paths": {
5 | "@/*": ["src/*"]
6 | }
7 | },
8 | "exclude": ["node_modules", "dist"]
9 | }
10 |
--------------------------------------------------------------------------------
/backend/.env.example:
--------------------------------------------------------------------------------
1 | # 是否允许添加账号 不允许添加时则只允许已有账号登录
2 | ALLOW_ADD=true
3 |
4 | #允许添加账号的最大数量
5 | ALLOW_NUM=40
6 |
7 | # Ninja 运行端口
8 | NINJA_PORT=5701
9 |
10 | # Ninja 是否发送通知
11 | NINJA_NOTIFY=true
12 |
13 | # user-agent
14 | # NINJA_UA=""
15 |
--------------------------------------------------------------------------------
/frontend/.editorconfig:
--------------------------------------------------------------------------------
1 | # editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | [*.md]
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/frontend/src/components/Logo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
16 |
--------------------------------------------------------------------------------
/frontend/tailwind.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
3 | important: '#app',
4 | darkMode: false, // or 'media' or 'class'
5 | theme: {
6 | extend: {},
7 | },
8 | variants: {
9 | extend: {},
10 | },
11 | plugins: [],
12 | }
13 |
--------------------------------------------------------------------------------
/frontend/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Ninja
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.1.1",
3 | "scripts": {
4 | "dev": "nodemon app.js"
5 | },
6 | "engines": {
7 | "node": ">=14"
8 | },
9 | "dependencies": {
10 | "@koa/cors": "^3.1.0",
11 | "@koa/router": "^10.1.0",
12 | "axios": "^0.21.1",
13 | "dotenv": "^10.0.0",
14 | "got": "^11.8.2",
15 | "koa": "^2.13.1",
16 | "koa-body": "^4.2.0",
17 | "koa-log4": "^2.3.2",
18 | "koa-static": "^5.0.0",
19 | "nodemon": "^2.0.12",
20 | "qrcode": "^1.4.4"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/frontend/src/components/Loading.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
17 |
18 |
19 |
20 |
21 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/backend/static/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Ninja
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/frontend/src/main.js:
--------------------------------------------------------------------------------
1 | import { ElButton, ElInput, ElMessage } from 'element-plus'
2 | import 'element-plus/lib/theme-chalk/base.css'
3 | import { createApp } from 'vue'
4 | import App from './App.vue'
5 | import './index.css'
6 | import router from './router'
7 |
8 | const components = [ElButton, ElInput, ElMessage]
9 | const plugins = [ElMessage]
10 |
11 | const app = createApp(App)
12 |
13 | components.forEach((component) => {
14 | app.component(component.name, component)
15 | })
16 |
17 | plugins.forEach((plugin) => {
18 | app.use(plugin)
19 | })
20 |
21 | app.use(router)
22 | app.mount('#app')
23 |
--------------------------------------------------------------------------------
/frontend/src/router.js:
--------------------------------------------------------------------------------
1 | import Index from '@/views/index.vue'
2 | import Login from '@/views/login.vue'
3 | import { createRouter, createWebHashHistory } from 'vue-router'
4 |
5 | const routes = [
6 | { path: '/', component: Index },
7 | { path: '/login', component: Login },
8 | ]
9 |
10 | const router = createRouter({
11 | history: createWebHashHistory(),
12 | routes,
13 | })
14 |
15 | // router.beforeEach((to, from, next) => {
16 | // if (!localStorage.getItem('eid') && to.path !== '/login')
17 | // next({ path: '/login' })
18 | // else next()
19 | // })
20 |
21 | export default router
22 |
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.0.0",
3 | "scripts": {
4 | "dev": "vite",
5 | "build": "vite build",
6 | "serve": "vite preview"
7 | },
8 | "dependencies": {
9 | "element-plus": "^1.0.2-beta.62",
10 | "ky": "^0.28.5",
11 | "vue": "^3.1.5",
12 | "vue-router": "^4.0.10"
13 | },
14 | "devDependencies": {
15 | "@vitejs/plugin-vue": "^1.2.5",
16 | "@vue/compiler-sfc": "^3.1.5",
17 | "autoprefixer": "^10.3.1",
18 | "postcss": "^8.3.6",
19 | "tailwindcss": "^2.2.7",
20 | "vite": "^2.4.3",
21 | "vite-plugin-async-catch": "^0.1.7",
22 | "vite-plugin-style-import": "^1.0.1"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/frontend/src/components/Header.vue:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
20 |
21 |
29 |
--------------------------------------------------------------------------------
/frontend/src/components/HelloWorld.vue:
--------------------------------------------------------------------------------
1 |
2 | {{ msg }}
3 |
4 |
5 |
6 | Vite Documentation
7 |
8 | |
9 | Vue 3 Documentation
10 |
11 |
12 |
13 |
14 | Edit
15 | components/HelloWorld.vue to test hot module replacement.
16 |
17 |
18 |
19 |
28 |
29 |
34 |
--------------------------------------------------------------------------------
/frontend/src/api/index.js:
--------------------------------------------------------------------------------
1 | import ky from 'ky'
2 |
3 | const VITE_API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api'
4 |
5 | const api = ky.create({ prefixUrl: VITE_API_BASE_URL, retry: { limit: 0 } })
6 |
7 | export function getInfoAPI() {
8 | return api.get('info').json()
9 | }
10 |
11 | export function CKLoginAPI(body) {
12 | return api.post('cklogin', { json: body }).json()
13 | }
14 |
15 | export function getQrcodeAPI() {
16 | return api.get('qrcode').json()
17 | }
18 |
19 | export function checkLoginAPI(body) {
20 | return api.post('check', { json: body }).json()
21 | }
22 |
23 | export function getUserInfoAPI(eid) {
24 | const searchParams = new URLSearchParams()
25 | searchParams.set('eid', eid)
26 | return api.get('userinfo', { searchParams: searchParams }).json()
27 | }
28 |
29 | export function delAccountAPI(body) {
30 | return api.post('delaccount', { json: body }).json()
31 | }
32 |
--------------------------------------------------------------------------------
/frontend/vite.config.js:
--------------------------------------------------------------------------------
1 | import vue from '@vitejs/plugin-vue'
2 | import path from 'path'
3 | import { defineConfig } from 'vite'
4 | import AsyncCatch from 'vite-plugin-async-catch'
5 | import styleImport from 'vite-plugin-style-import'
6 |
7 | // https://vitejs.dev/config/
8 | export default defineConfig({
9 | plugins: [
10 | vue(),
11 | AsyncCatch({ catchCode: `console.error(e)` }),
12 | styleImport({
13 | libs: [
14 | {
15 | libraryName: 'element-plus',
16 | esModule: true,
17 | ensureStyleFile: true,
18 | resolveStyle: (name) => {
19 | return `element-plus/lib/theme-chalk/${name}.css`
20 | },
21 | resolveComponent: (name) => {
22 | return `element-plus/lib/${name}`
23 | },
24 | },
25 | ],
26 | }),
27 | ],
28 | resolve: {
29 | alias: {
30 | '@': path.resolve(__dirname, 'src'),
31 | },
32 | },
33 | build: {
34 | outDir: '../backend/static',
35 | },
36 | })
37 |
--------------------------------------------------------------------------------
/backend/static/activity.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "玩一玩(可找到大多数活动)",
4 | "address": "京东 APP 首页-频道-边玩边赚",
5 | "href": "https://funearth.m.jd.com/babelDiy/Zeus/3BB1rymVZUo4XmicATEUSDUgHZND/index.html"
6 | },
7 | {
8 | "name": "宠汪汪",
9 | "address": "京东APP-首页/玩一玩/我的-宠汪汪"
10 | },
11 | {
12 | "name": "东东萌宠",
13 | "address": "京东APP-首页/玩一玩/我的-东东萌宠"
14 | },
15 | {
16 | "name": "东东农场",
17 | "address": "京东APP-首页/玩一玩/我的-东东农场"
18 | },
19 | {
20 | "name": "东东工厂",
21 | "address": "京东APP-首页/玩一玩/我的-东东工厂"
22 | },
23 | {
24 | "name": "东东超市",
25 | "address": "京东APP-首页/玩一玩/我的-东东超市"
26 | },
27 | {
28 | "name": "领现金",
29 | "address": "京东APP-首页/玩一玩/我的-领现金"
30 | },
31 | {
32 | "name": "东东健康社区",
33 | "address": "京东APP-首页/玩一玩/我的-东东健康社区"
34 | },
35 | {
36 | "name": "京喜农场",
37 | "address": "京喜APP-我的-京喜农场"
38 | },
39 | {
40 | "name": "京喜牧场",
41 | "address": "京喜APP-我的-京喜牧场"
42 | },
43 | {
44 | "name": "京喜工厂",
45 | "address": "京喜APP-我的-京喜工厂"
46 | },
47 | {
48 | "name": "京喜财富岛",
49 | "address": "京喜APP-我的-京喜财富岛"
50 | },
51 | {
52 | "name": "京东极速版红包",
53 | "address": "京东极速版APP-我的-红包"
54 | }
55 | ]
56 |
--------------------------------------------------------------------------------
/frontend/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
15 |
16 |
--------------------------------------------------------------------------------
/backend/ql.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const got = require('got');
4 | require('dotenv').config();
5 | const { readFile } = require('fs/promises');
6 | const path = require('path');
7 |
8 | const qlDir = process.env.QL_DIR || '/ql';
9 | const authFile = path.join(qlDir, 'config/auth.json');
10 |
11 | const api = got.extend({
12 | prefixUrl: process.env.QL_URL || 'http://localhost:5600',
13 | retry: { limit: 0 },
14 | });
15 |
16 | async function getToken() {
17 | const authConfig = JSON.parse(await readFile(authFile));
18 | return authConfig.token;
19 | }
20 |
21 | module.exports.getEnvs = async () => {
22 | const token = await getToken();
23 | const body = await api({
24 | url: 'api/envs',
25 | searchParams: {
26 | searchValue: 'JD_COOKIE',
27 | t: Date.now(),
28 | },
29 | headers: {
30 | Accept: 'application/json',
31 | authorization: `Bearer ${token}`,
32 | },
33 | }).json();
34 | return body.data;
35 | };
36 |
37 | module.exports.getEnvsCount = async () => {
38 | const data = await this.getEnvs();
39 | return data.length;
40 | };
41 |
42 | module.exports.addEnv = async (cookie, remarks) => {
43 | const token = await getToken();
44 | const body = await api({
45 | method: 'post',
46 | url: 'api/envs',
47 | params: { t: Date.now() },
48 | json: [{
49 | name: 'JD_COOKIE',
50 | value: cookie,
51 | remarks,
52 | }],
53 | headers: {
54 | Accept: 'application/json',
55 | authorization: `Bearer ${token}`,
56 | 'Content-Type': 'application/json;charset=UTF-8',
57 | },
58 | }).json();
59 | return body;
60 | };
61 |
62 | module.exports.updateEnv = async (cookie, eid, remarks) => {
63 | const token = await getToken();
64 | const body = await api({
65 | method: 'put',
66 | url: 'api/envs',
67 | params: { t: Date.now() },
68 | json: {
69 | name: 'JD_COOKIE',
70 | value: cookie,
71 | _id: eid,
72 | remarks,
73 | },
74 | headers: {
75 | Accept: 'application/json',
76 | authorization: `Bearer ${token}`,
77 | 'Content-Type': 'application/json;charset=UTF-8',
78 | },
79 | }).json();
80 | return body;
81 | };
82 |
83 | module.exports.delEnv = async (eid) => {
84 | const token = await getToken();
85 | const body = await api({
86 | method: 'delete',
87 | url: 'api/envs',
88 | params: { t: Date.now() },
89 | body: JSON.stringify([eid]),
90 | headers: {
91 | Accept: 'application/json',
92 | authorization: `Bearer ${token}`,
93 | 'Content-Type': 'application/json;charset=UTF-8',
94 | },
95 | }).json();
96 | return body;
97 | };
98 |
--------------------------------------------------------------------------------
/backend/app.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const Koa = require('koa');
4 | const cors = require('@koa/cors');
5 | const Router = require('@koa/router');
6 | const body = require('koa-body');
7 | const serve = require('koa-static');
8 | const User = require('./user');
9 | const packageJson = require('./package.json');
10 |
11 | // Create express instance
12 | const app = new Koa();
13 | const router = new Router();
14 |
15 | const handler = async (ctx, next) => {
16 | try {
17 | await next();
18 | if (ctx.body?.data.message) {
19 | ctx.body.message = ctx.body.data.message;
20 | ctx.body.data.message = undefined;
21 | }
22 | } catch (err) {
23 | console.log(err);
24 | ctx.status = err.statusCode || err.status || 500;
25 | ctx.body = {
26 | code: err.status || err.statusCode || 500,
27 | message: err.message,
28 | };
29 | }
30 | };
31 |
32 | app.use(serve('static'));
33 | app.use(cors());
34 | app.use(handler);
35 | app.use(router.routes()).use(router.allowedMethods());
36 |
37 | router.get('/api/status', (ctx) => {
38 | ctx.body = {
39 | code: 200,
40 | data: {
41 | version: packageJson.version,
42 | },
43 | message: 'Ninja is already.',
44 | };
45 | });
46 |
47 | router.get('/api/info', async (ctx) => {
48 | const data = await User.getPoolInfo();
49 | ctx.body = { data };
50 | });
51 |
52 | router.get('/api/qrcode', async (ctx) => {
53 | const user = new User({});
54 | await user.getQRConfig();
55 | ctx.body = {
56 | data: {
57 | token: user.token,
58 | okl_token: user.okl_token,
59 | cookies: user.cookies,
60 | QRCode: user.QRCode,
61 | ua: user.ua,
62 | },
63 | };
64 | });
65 |
66 | router.post('/api/check', body(), async (ctx) => {
67 | const body = ctx.request.body;
68 | const user = new User(body);
69 | const data = await user.checkQRLogin();
70 | ctx.body = { data };
71 | });
72 |
73 | router.post('/api/cklogin', body(), async (ctx) => {
74 | const body = ctx.request.body;
75 | const user = new User(body);
76 | const data = await user.CKLogin();
77 | ctx.body = { data };
78 | });
79 |
80 | router.get('/api/userinfo', async (ctx) => {
81 | const query = ctx.query;
82 | const eid = query.eid;
83 | const user = new User({ eid });
84 | const data = await user.getUserInfoByEid();
85 | ctx.body = { data };
86 | });
87 |
88 | router.post('/api/delaccount', body(), async (ctx) => {
89 | const body = ctx.request.body;
90 | const eid = body.eid;
91 | const user = new User({ eid });
92 | const data = await user.delUserByEid();
93 | ctx.body = { data };
94 | });
95 |
96 | router.post('/api/update/remark', body(), async (ctx) => {
97 | const body = ctx.request.body;
98 | const eid = body.eid;
99 | const remark = body.remark;
100 | const user = new User({ eid, remark });
101 | const data = await user.updateRemark();
102 | ctx.body = { data };
103 | });
104 |
105 | router.get('/api/users', async (ctx) => {
106 | if (ctx.host.startsWith('localhost')) {
107 | const data = await User.getUsers();
108 | ctx.body = { data };
109 | } else {
110 | ctx.body = {
111 | code: 401,
112 | message: '该接口仅能通过 localhost 访问',
113 | };
114 | }
115 | });
116 |
117 | const port = process.env.NINJA_PORT || 5701;
118 | console.log('Start Ninja success! listening port: ' + port);
119 | app.listen(port);
120 |
--------------------------------------------------------------------------------
/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux
3 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,windows,macos,linux
4 |
5 | ### Linux ###
6 | *~
7 |
8 | # temporary files which can be created if a process still has a handle open of a deleted file
9 | .fuse_hidden*
10 |
11 | # KDE directory preferences
12 | .directory
13 |
14 | # Linux trash folder which might appear on any partition or disk
15 | .Trash-*
16 |
17 | # .nfs files are created when an open file is removed but is still being accessed
18 | .nfs*
19 |
20 | ### macOS ###
21 | # General
22 | .DS_Store
23 | .AppleDouble
24 | .LSOverride
25 |
26 | # Icon must end with two \r
27 | Icon
28 |
29 |
30 | # Thumbnails
31 | ._*
32 |
33 | # Files that might appear in the root of a volume
34 | .DocumentRevisions-V100
35 | .fseventsd
36 | .Spotlight-V100
37 | .TemporaryItems
38 | .Trashes
39 | .VolumeIcon.icns
40 | .com.apple.timemachine.donotpresent
41 |
42 | # Directories potentially created on remote AFP share
43 | .AppleDB
44 | .AppleDesktop
45 | Network Trash Folder
46 | Temporary Items
47 | .apdisk
48 |
49 | ### Node ###
50 | # Logs
51 | logs
52 | *.log
53 | npm-debug.log*
54 | yarn-debug.log*
55 | yarn-error.log*
56 | lerna-debug.log*
57 | .pnpm-debug.log*
58 |
59 | # Diagnostic reports (https://nodejs.org/api/report.html)
60 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
61 |
62 | # Runtime data
63 | pids
64 | *.pid
65 | *.seed
66 | *.pid.lock
67 |
68 | # Directory for instrumented libs generated by jscoverage/JSCover
69 | lib-cov
70 |
71 | # Coverage directory used by tools like istanbul
72 | coverage
73 | *.lcov
74 |
75 | # nyc test coverage
76 | .nyc_output
77 |
78 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
79 | .grunt
80 |
81 | # Bower dependency directory (https://bower.io/)
82 | bower_components
83 |
84 | # node-waf configuration
85 | .lock-wscript
86 |
87 | # Compiled binary addons (https://nodejs.org/api/addons.html)
88 | build/Release
89 |
90 | # Dependency directories
91 | node_modules/
92 | jspm_packages/
93 |
94 | # Snowpack dependency directory (https://snowpack.dev/)
95 | web_modules/
96 |
97 | # TypeScript cache
98 | *.tsbuildinfo
99 |
100 | # Optional npm cache directory
101 | .npm
102 |
103 | # Optional eslint cache
104 | .eslintcache
105 |
106 | # Microbundle cache
107 | .rpt2_cache/
108 | .rts2_cache_cjs/
109 | .rts2_cache_es/
110 | .rts2_cache_umd/
111 |
112 | # Optional REPL history
113 | .node_repl_history
114 |
115 | # Output of 'npm pack'
116 | *.tgz
117 |
118 | # Yarn Integrity file
119 | .yarn-integrity
120 |
121 | # dotenv environment variables file
122 | .env
123 | .env.test
124 | .env.production
125 |
126 | # parcel-bundler cache (https://parceljs.org/)
127 | .cache
128 | .parcel-cache
129 |
130 | # Next.js build output
131 | .next
132 | out
133 |
134 | # Nuxt.js build / generate output
135 | .nuxt
136 | dist
137 |
138 | # Gatsby files
139 | .cache/
140 | # Comment in the public line in if your project uses Gatsby and not Next.js
141 | # https://nextjs.org/blog/next-9-1#public-directory-support
142 | # public
143 |
144 | # vuepress build output
145 | .vuepress/dist
146 |
147 | # Serverless directories
148 | .serverless/
149 |
150 | # FuseBox cache
151 | .fusebox/
152 |
153 | # DynamoDB Local files
154 | .dynamodb/
155 |
156 | # TernJS port file
157 | .tern-port
158 |
159 | # Stores VSCode versions used for testing VSCode extensions
160 | .vscode-test
161 |
162 | # yarn v2
163 | .yarn/cache
164 | .yarn/unplugged
165 | .yarn/build-state.yml
166 | .yarn/install-state.gz
167 | .pnp.*
168 |
169 | ### Windows ###
170 | # Windows thumbnail cache files
171 | Thumbs.db
172 | Thumbs.db:encryptable
173 | ehthumbs.db
174 | ehthumbs_vista.db
175 |
176 | # Dump file
177 | *.stackdump
178 |
179 | # Folder config file
180 | [Dd]esktop.ini
181 |
182 | # Recycle Bin used on file shares
183 | $RECYCLE.BIN/
184 |
185 | # Windows Installer files
186 | *.cab
187 | *.msi
188 | *.msix
189 | *.msm
190 | *.msp
191 |
192 | # Windows shortcuts
193 | *.lnk
194 |
195 | # End of https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux
196 |
197 | ql
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Ninja
2 |
3 | 一次对于 koa2 vue3 vite 的简单尝试
4 |
5 | ## 说明
6 |
7 | Ninja 仅供学习参考使用,请于下载后的 24 小时内删除,本人不对使用过程中出现的任何问题负责,包括但不限于 `数据丢失` `数据泄露`。
8 |
9 | Ninja 仅支持 qinglong 2.8.2+
10 |
11 | [TG 频道](https://t.me/joinchat/sHKuteb_lfdjNmZl)
12 |
13 | ## 特性
14 |
15 | - [x] 扫码,跳转登录添加/更新 cookie
16 | - [x] 添加/更新 cookie 后发送通知
17 | - [x] 扫码发送通知可关闭
18 | - [x] 添加备注并将通知中的 pt_pin nickName 修改为备注
19 | - [x] 默认备注为昵称
20 | - [x] 添加扫码推送卡片
21 | - [ ] 替换 cookie 失效通知
22 | - [ ] 登录界面展示自定义标语
23 | - [ ] 支持多容器,多面板
24 | - [ ] 采用自己的数据库,实现无视面板替换通知备注
25 | - [ ] 账号管理面板
26 |
27 | ## 文档
28 |
29 | ### 容器内
30 |
31 | 1. 容器映射 5701 端口,ninja 目录至宿主机
32 |
33 | 例(docker-compose):
34 |
35 | ```diff
36 | version: "3"
37 | services:
38 | qinglong:
39 | image: whyour/qinglong:latest
40 | container_name: qinglong
41 | restart: unless-stopped
42 | tty: true
43 | ports:
44 | - 5700:5700
45 | + - 5701:5701
46 | environment:
47 | - ENABLE_HANGUP=true
48 | - ENABLE_WEB_PANEL=true
49 | volumes:
50 | - ./config:/ql/config
51 | - ./log:/ql/log
52 | - ./db:/ql/db
53 | - ./repo:/ql/repo
54 | - ./raw:/ql/raw
55 | - ./scripts:/ql/scripts
56 | - ./jbot:/ql/jbot
57 | + - ./ninja:/ql/ninja
58 | ```
59 |
60 | 例(docker-run):
61 |
62 | ```diff
63 | docker run -dit \
64 | -v $PWD/ql/config:/ql/config \
65 | -v $PWD/ql/log:/ql/log \
66 | -v $PWD/ql/db:/ql/db \
67 | -v $PWD/ql/repo:/ql/repo \
68 | -v $PWD/ql/raw:/ql/raw \
69 | -v $PWD/ql/scripts:/ql/scripts \
70 | -v $PWD/ql/jbot:/ql/jbot \
71 | + -v $PWD/ql/ninja:/ql/ninja \
72 | -p 5700:5700 \
73 | + -p 5701:5701 \
74 | --name qinglong \
75 | --hostname qinglong \
76 | --restart unless-stopped \
77 | whyour/qinglong:latest
78 | ```
79 |
80 | 2. 进容器内执行以下命令
81 |
82 | **进容器内执行以下命令**
83 |
84 | ```bash
85 | git clone https://github.com/MoonBegonia/ninja.git /ql/ninja
86 | cd /ql/ninja/backend
87 | pnpm install
88 | pm2 start
89 | cp sendNotify.js /ql/scripts/sendNotify.js
90 | ```
91 |
92 | 3. 将以下内容粘贴到 `extra.sh`(重启后自动更新并启动 Ninja)
93 |
94 | ```bash
95 | cd /ql/ninja/backend
96 | git checkout .
97 | git pull
98 | pnpm install
99 | pm2 start
100 | cp sendNotify.js /ql/scripts/sendNotify.js
101 | ```
102 |
103 | ### 容器外
104 |
105 | 此种方式需要宿主机安装 `node` `pnpm` 等环境,不做过多介绍。
106 |
107 | 使用此种方法无法跟随青龙一起启动,**无法发送扫码通知**,请知悉。
108 |
109 | ```bash
110 | git clone git clone https://github.com/MoonBegonia/ninja.git
111 | cd ninja/backend
112 | pnpm install
113 | # 复制 sendNotify.js 到容器内 scripts 目录,`qinglong` 为容器名
114 | sudo docker cp sendNotify.js qinglong:/ql/scripts/sendNotify.js
115 | cp .env.example .env
116 | # 修改env文件
117 | vi .env
118 | node app.js
119 | ```
120 |
121 | 在 `.env` 文件中添加以下内容:
122 |
123 | ```bash
124 | QL_DIR=qinglong 容器的本地路径
125 | QL_URL=http://localhost:5700
126 | ```
127 |
128 | `node app.js` 想要在后台运行可以使用 `&` `nohup` `screen` 等命令。
129 |
130 | ### Ninja 环境变量
131 |
132 | 目前支持的环境变量有:
133 |
134 | - `ALLOW_ADD`: 是否允许添加账号 不允许添加时则只允许已有账号登录(默认 `true`)
135 | - `ALLOW_NUM`: 允许添加账号的最大数量(默认 `40`)
136 | - `NINJA_PORT`: Ninja 运行端口(默认 `5701`)
137 | - `NINJA_NOTIFY`: 是否开启通知功能(默认 `true`)
138 | - `NINJA_UA`: 自定义 UA,默认为随机
139 |
140 | 配置方式:
141 |
142 | ```bash
143 | cd /ql/ninja/backend
144 | cp .env.example .env
145 | vi .env
146 | pm2 start
147 | ```
148 |
149 | **修改完成后需要 `pm2 start` 重启生效 !!!**
150 |
151 | ### SendNotify 环境变量
152 |
153 | **此环境变量在青龙中配置!!!**
154 |
155 | - `NOTIFY_SKIP_LIST`: 通知黑名单,使用 `&` 分隔,例如 `东东乐园&东东萌宠`;
156 |
157 | ### Ninja 自定义
158 |
159 | 自定义推送二维码:将 `push.jpg` 文件添加到 `/ql/ninja/backend/static/` 目录下刷新网页即可。
160 |
161 | 自定义常见活动:修改 `/ql/backend/static/activity.json` 即可
162 |
163 | ## 注意事项
164 |
165 | - 重启后务必执行一次 `ql extra` 保证 Ninja 配置成功。
166 |
167 | - 更新 Ninja 只需要在**容器**中 `ninja/backend` 目录执行 `git pull` 然后 `pm2 start`
168 |
169 | - Qinglong 需要在登录状态(`auth.json` 中有 token)
170 |
171 | ## 常见问题
172 |
173 | Q:为什么我 `git pull` 失败?
174 | A:一般是修改过文件,先运行一次 `git checkout .` 再 `git pull`。还是不行就删了重拉。
175 |
176 | Q:为什么访问不了?
177 | A:一般为端口映射错误/失败,请自行检查配置文件。
178 |
179 | Q:为什么访问白屏?
180 | A:使用现代的浏览器,而不是古代的。
181 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux
3 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,windows,macos,linux
4 |
5 | ### Linux ###
6 | *~
7 |
8 | # temporary files which can be created if a process still has a handle open of a deleted file
9 | .fuse_hidden*
10 |
11 | # KDE directory preferences
12 | .directory
13 |
14 | # Linux trash folder which might appear on any partition or disk
15 | .Trash-*
16 |
17 | # .nfs files are created when an open file is removed but is still being accessed
18 | .nfs*
19 |
20 | ### macOS ###
21 | # General
22 | .DS_Store
23 | .AppleDouble
24 | .LSOverride
25 |
26 | # Icon must end with two \r
27 | Icon
28 |
29 |
30 | # Thumbnails
31 | ._*
32 |
33 | # Files that might appear in the root of a volume
34 | .DocumentRevisions-V100
35 | .fseventsd
36 | .Spotlight-V100
37 | .TemporaryItems
38 | .Trashes
39 | .VolumeIcon.icns
40 | .com.apple.timemachine.donotpresent
41 |
42 | # Directories potentially created on remote AFP share
43 | .AppleDB
44 | .AppleDesktop
45 | Network Trash Folder
46 | Temporary Items
47 | .apdisk
48 |
49 | ### Node ###
50 | # Logs
51 | logs
52 | *.log
53 | npm-debug.log*
54 | yarn-debug.log*
55 | yarn-error.log*
56 | lerna-debug.log*
57 | .pnpm-debug.log*
58 |
59 | # Diagnostic reports (https://nodejs.org/api/report.html)
60 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
61 |
62 | # Runtime data
63 | pids
64 | *.pid
65 | *.seed
66 | *.pid.lock
67 |
68 | # Directory for instrumented libs generated by jscoverage/JSCover
69 | lib-cov
70 |
71 | # Coverage directory used by tools like istanbul
72 | coverage
73 | *.lcov
74 |
75 | # nyc test coverage
76 | .nyc_output
77 |
78 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
79 | .grunt
80 |
81 | # Bower dependency directory (https://bower.io/)
82 | bower_components
83 |
84 | # node-waf configuration
85 | .lock-wscript
86 |
87 | # Compiled binary addons (https://nodejs.org/api/addons.html)
88 | build/Release
89 |
90 | # Dependency directories
91 | node_modules/
92 | jspm_packages/
93 |
94 | # Snowpack dependency directory (https://snowpack.dev/)
95 | web_modules/
96 |
97 | # TypeScript cache
98 | *.tsbuildinfo
99 |
100 | # Optional npm cache directory
101 | .npm
102 |
103 | # Optional eslint cache
104 | .eslintcache
105 |
106 | # Microbundle cache
107 | .rpt2_cache/
108 | .rts2_cache_cjs/
109 | .rts2_cache_es/
110 | .rts2_cache_umd/
111 |
112 | # Optional REPL history
113 | .node_repl_history
114 |
115 | # Output of 'npm pack'
116 | *.tgz
117 |
118 | # Yarn Integrity file
119 | .yarn-integrity
120 |
121 | # dotenv environment variables file
122 | .env
123 | .env.test
124 | .env.production
125 |
126 | # parcel-bundler cache (https://parceljs.org/)
127 | .cache
128 | .parcel-cache
129 |
130 | # Next.js build output
131 | .next
132 | out
133 |
134 | # Nuxt.js build / generate output
135 | .nuxt
136 | dist
137 |
138 | # Gatsby files
139 | .cache/
140 | # Comment in the public line in if your project uses Gatsby and not Next.js
141 | # https://nextjs.org/blog/next-9-1#public-directory-support
142 | # public
143 |
144 | # vuepress build output
145 | .vuepress/dist
146 |
147 | # Serverless directories
148 | .serverless/
149 |
150 | # FuseBox cache
151 | .fusebox/
152 |
153 | # DynamoDB Local files
154 | .dynamodb/
155 |
156 | # TernJS port file
157 | .tern-port
158 |
159 | # Stores VSCode versions used for testing VSCode extensions
160 | .vscode-test
161 |
162 | # yarn v2
163 | .yarn/cache
164 | .yarn/unplugged
165 | .yarn/build-state.yml
166 | .yarn/install-state.gz
167 | .pnp.*
168 |
169 | ### Windows ###
170 | # Windows thumbnail cache files
171 | Thumbs.db
172 | Thumbs.db:encryptable
173 | ehthumbs.db
174 | ehthumbs_vista.db
175 |
176 | # Dump file
177 | *.stackdump
178 |
179 | # Folder config file
180 | [Dd]esktop.ini
181 |
182 | # Recycle Bin used on file shares
183 | $RECYCLE.BIN/
184 |
185 | # Windows Installer files
186 | *.cab
187 | *.msi
188 | *.msix
189 | *.msm
190 | *.msp
191 |
192 | # Windows shortcuts
193 | *.lnk
194 |
195 | # End of https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux
196 |
197 | ql
198 |
199 | node_modules
200 | .DS_Store
201 | dist
202 | dist-ssr
203 | *.local
--------------------------------------------------------------------------------
/frontend/src/views/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
昵称:{{ nickName }}
9 |
更新时间:{{ timestamp }}
10 |
11 |
17 |
18 |
19 |
20 |
24 |
25 |
26 | -
31 | {{ item.name }}:
32 | {{ item.address }}
33 | 直达链接
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
173 |
--------------------------------------------------------------------------------
/frontend/src/views/login.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
17 |
18 | 扫描二维码登录
21 | 跳转到京东 App 登录
24 |
25 |
![]()
26 |
27 |
28 |
29 |
30 |
31 |
41 |
42 |
43 | 登录
46 |
47 |
48 |
49 |
50 |
51 |
52 |
181 |
182 |
183 |
--------------------------------------------------------------------------------
/backend/utils/USER_AGENT.js:
--------------------------------------------------------------------------------
1 | const USER_AGENTS = [
2 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36',
3 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
4 | 'jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36',
5 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; GM1910 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36',
6 | 'jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; 16T Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36',
7 | 'jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
8 | 'jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
9 | 'jdapp;iPhone;10.0.2;13.5;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
10 | 'jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
11 | 'jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
12 | 'jdapp;iPhone;10.0.2;13.7;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
13 | 'jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
14 | 'jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
15 | 'jdapp;iPhone;10.0.2;13.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
16 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
17 | 'jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36',
18 | 'jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36',
19 | 'jdapp;iPhone;10.0.2;11.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15F79',
20 | 'jdapp;android;10.0.2;10;;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36',
21 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36',
22 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A6000 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045224 Mobile Safari/537.36',
23 | 'jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36',
24 | 'jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; 16 X Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36',
25 | 'jdapp;android;10.0.2;8.0.0;network/wifi;Mozilla/5.0 (Linux; Android 8.0.0; HTC U-3w Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36',
26 | 'jdapp;iPhone;10.0.2;14.0.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
27 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; LYA-AL00 Build/HUAWEILYA-AL00L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36',
28 | 'jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
29 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
30 | 'jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
31 | 'jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36',
32 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; Redmi K20 Pro Premium Edition Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36',
33 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
34 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
35 | 'jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Premium Edition Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045513 Mobile Safari/537.36',
36 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36',
37 | 'jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
38 | ];
39 | /**
40 | * 生成随机数字
41 | * @param {number} min 最小值(包含)
42 | * @param {number} max 最大值(不包含)
43 | */
44 | function randomNumber(min = 0, max = 100) {
45 | return Math.min(Math.floor(min + Math.random() * (max - min)), max);
46 | }
47 |
48 | const RANDOM_UA = USER_AGENTS[randomNumber(0, USER_AGENTS.length)];
49 |
50 | const GET_RANDOM_TIME_UA = () => {
51 | return 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.14.0 main%2F1.0 baiduboxapp/11.18.0.16 (Baidu; P2 13.3.1) NABar/0.0';
52 | };
53 |
54 | module.exports = {
55 | RANDOM_UA,
56 | GET_RANDOM_TIME_UA,
57 | };
58 |
--------------------------------------------------------------------------------
/backend/user.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable camelcase */
2 | 'use strict';
3 |
4 | const got = require('got');
5 | require('dotenv').config();
6 | const QRCode = require('qrcode');
7 | const { addEnv, delEnv, getEnvs, getEnvsCount, updateEnv } = require('./ql');
8 | const path = require('path');
9 | const qlDir = process.env.QL_DIR || '/ql';
10 | const notifyFile = path.join(qlDir, 'shell/notify.sh');
11 | const { exec } = require('child_process');
12 | const { GET_RANDOM_TIME_UA } = require('./utils/USER_AGENT');
13 |
14 | const api = got.extend({
15 | retry: { limit: 0 },
16 | responseType: 'json',
17 | });
18 |
19 | module.exports = class User {
20 | ua;
21 | pt_key;
22 | pt_pin;
23 | cookie;
24 | eid;
25 | timestamp;
26 | nickName;
27 | token;
28 | okl_token;
29 | cookies;
30 | QRCode;
31 | remark;
32 | #s_token;
33 |
34 | constructor({ token, okl_token, cookies, pt_key, pt_pin, cookie, eid, remarks, remark, ua }) {
35 | this.token = token;
36 | this.okl_token = okl_token;
37 | this.cookies = cookies;
38 | this.pt_key = pt_key;
39 | this.pt_pin = pt_pin;
40 | this.cookie = cookie;
41 | this.eid = eid;
42 | this.remark = remark;
43 | this.ua = ua;
44 |
45 | if (pt_key && pt_pin) {
46 | this.cookie = 'pt_key=' + this.pt_key + ';pt_pin=' + this.pt_pin + ';';
47 | }
48 |
49 | if (cookie) {
50 | this.pt_pin = cookie.match(/pt_pin=(.*?);/)[1];
51 | this.pt_key = cookie.match(/pt_key=(.*?);/)[1];
52 | }
53 |
54 | if (remarks) {
55 | this.remark = remarks.match(/remark=(.*?);/) && remarks.match(/remark=(.*?);/)[1];
56 | }
57 | }
58 |
59 | async getQRConfig() {
60 | this.ua = this.ua || process.env.NINJA_UA || GET_RANDOM_TIME_UA();
61 | const taskUrl = `https://plogin.m.jd.com/cgi-bin/mm/new_login_entrance?lang=chs&appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=${Date.now()}&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`;
62 | const response = await api({
63 | url: taskUrl,
64 | headers: {
65 | Connection: 'Keep-Alive',
66 | 'Content-Type': 'application/x-www-form-urlencoded',
67 | Accept: 'application/json, text/plain, */*',
68 | 'Accept-Language': 'zh-cn',
69 | Referer: taskUrl,
70 | 'User-Agent': this.ua,
71 | Host: 'plogin.m.jd.com',
72 | },
73 | });
74 | const headers = response.headers;
75 | const data = response.body;
76 | await this.#formatSetCookies(headers, data);
77 |
78 | if (!this.#s_token) {
79 | throw new Error('二维码创建失败!');
80 | }
81 |
82 | const nowTime = Date.now();
83 | // eslint-disable-next-line prettier/prettier
84 | const taskPostUrl = `https://plogin.m.jd.com/cgi-bin/m/tmauthreflogurl?s_token=${
85 | this.#s_token
86 | }&v=${nowTime}&remember=true`;
87 |
88 | const configRes = await api({
89 | method: 'post',
90 | url: taskPostUrl,
91 | body: `lang=chs&appid=300&source=wq_passport&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=${nowTime}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action`,
92 | headers: {
93 | Connection: 'Keep-Alive',
94 | 'Content-Type': 'application/x-www-form-urlencoded',
95 | Accept: 'application/json, text/plain, */*',
96 | 'Accept-Language': 'zh-cn',
97 | Referer: taskUrl,
98 | 'User-Agent': this.ua,
99 | Host: 'plogin.m.jd.com',
100 | Cookie: this.cookies,
101 | },
102 | });
103 | const configHeaders = configRes.headers;
104 | const configData = configRes.body;
105 |
106 | this.token = configData.token;
107 | if (this.token)
108 | this.QRCode = await QRCode.toDataURL(
109 | `https://plogin.m.jd.com/cgi-bin/m/tmauth?appid=300&client_type=m&token=${this.token}`
110 | );
111 | const cookies = configHeaders['set-cookie'][0];
112 | this.okl_token = cookies.substring(cookies.indexOf('=') + 1, cookies.indexOf(';'));
113 | }
114 |
115 | async checkQRLogin() {
116 | if (!this.token || !this.okl_token || !this.cookies) {
117 | throw new Error('初始化登录请求失败!');
118 | }
119 | const nowTime = Date.now();
120 | const loginUrl = `https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=${nowTime}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`;
121 | const getUserCookieUrl = `https://plogin.m.jd.com/cgi-bin/m/tmauthchecktoken?&token=${this.token}&ou_state=0&okl_token=${this.okl_token}`;
122 | const response = await api({
123 | method: 'POST',
124 | url: getUserCookieUrl,
125 | body: `lang=chs&appid=300&source=wq_passport&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=${nowTime}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action`,
126 | headers: {
127 | Connection: 'Keep-Alive',
128 | 'Content-Type': 'application/x-www-form-urlencoded; Charset=UTF-8',
129 | Accept: 'application/json, text/plain, */*',
130 | 'Accept-Language': 'zh-cn',
131 | Referer: loginUrl,
132 | 'User-Agent': this.ua,
133 | Cookie: this.cookies,
134 | },
135 | });
136 | const data = response.body;
137 | const headers = response.headers;
138 | if (data.errcode === 0) {
139 | const pt_key = headers['set-cookie'][1];
140 | this.pt_key = pt_key.substring(pt_key.indexOf('=') + 1, pt_key.indexOf(';'));
141 | const pt_pin = headers['set-cookie'][2];
142 | this.pt_pin = pt_pin.substring(pt_pin.indexOf('=') + 1, pt_pin.indexOf(';'));
143 | this.cookie = 'pt_key=' + this.pt_key + ';pt_pin=' + this.pt_pin + ';';
144 |
145 | const result = await this.CKLogin();
146 | result.errcode = 0;
147 | return result;
148 | }
149 |
150 | return {
151 | errcode: data.errcode,
152 | message: data.message,
153 | };
154 | }
155 |
156 | async CKLogin() {
157 | let message;
158 | await this.#getNickname();
159 | const envs = await getEnvs();
160 | const poolInfo = await User.getPoolInfo();
161 | const env = await envs.find((item) => item.value.match(/pt_pin=(.*?);/)[1] === this.pt_pin);
162 | if (!env) {
163 | // 新用户
164 | if (!poolInfo.allowAdd) {
165 | throw new UserError('管理员已关闭注册,去其他地方看看吧', 210, 200);
166 | } else if (poolInfo.marginCount === 0) {
167 | throw new UserError('本站已到达注册上限,你来晚啦', 211, 200);
168 | } else {
169 | const remarks = `remark=${this.nickName};`;
170 | const body = await addEnv(this.cookie, remarks);
171 | if (body.code !== 200) {
172 | throw new UserError(body.message || '添加账户错误,请重试', 220, body.code || 200);
173 | }
174 | this.eid = body.data[0]._id;
175 | this.timestamp = body.data[0].timestamp;
176 | message = `注册成功,${this.nickName}`;
177 | this.#sendNotify('Ninja 运行通知', `用户 ${this.nickName}(${decodeURIComponent(this.pt_pin)}) 已上线`);
178 | }
179 | } else {
180 | this.eid = env._id;
181 | const body = await updateEnv(this.cookie, this.eid);
182 | if (body.code !== 200) {
183 | throw new UserError(body.message || '更新账户错误,请重试', 221, body.code || 200);
184 | }
185 | this.timestamp = body.data.timestamp;
186 | message = `欢迎回来,${this.nickName}`;
187 | this.#sendNotify('Ninja 运行通知', `用户 ${this.nickName}(${decodeURIComponent(this.pt_pin)}) 已更新 CK`);
188 | }
189 | return {
190 | nickName: this.nickName,
191 | eid: this.eid,
192 | timestamp: this.timestamp,
193 | message,
194 | };
195 | }
196 |
197 | async getUserInfoByEid() {
198 | const envs = await getEnvs();
199 | const env = await envs.find((item) => item._id === this.eid);
200 | if (!env) {
201 | throw new UserError('没有找到这个账户,重新登录试试看哦', 230, 200);
202 | }
203 | this.cookie = env.value;
204 | this.timestamp = env.timestamp;
205 | const remarks = env.remarks;
206 | if (remarks) {
207 | this.remark = remarks.match(/remark=(.*?);/) && remarks.match(/remark=(.*?);/)[1];
208 | }
209 | await this.#getNickname();
210 | return {
211 | nickName: this.nickName,
212 | eid: this.eid,
213 | timestamp: this.timestamp,
214 | remark: this.remark,
215 | };
216 | }
217 |
218 | async updateRemark() {
219 | if (!this.eid || !this.remark || this.remark.replace(/(^\s*)|(\s*$)/g, '') === '') {
220 | throw new UserError('参数错误', 240, 200);
221 | }
222 |
223 | const envs = await getEnvs();
224 | const env = await envs.find((item) => item._id === this.eid);
225 | if (!env) {
226 | throw new UserError('没有找到这个账户,重新登录试试看哦', 230, 200);
227 | }
228 | this.cookie = env.value;
229 |
230 | const remarks = `remark=${this.remark};`;
231 |
232 | const updateEnvBody = await updateEnv(this.cookie, this.eid, remarks);
233 | if (updateEnvBody.code !== 200) {
234 | throw new UserError('更新/上传备注出错,请重试', 241, 200);
235 | }
236 |
237 | return {
238 | message: '更新/上传备注成功',
239 | };
240 | }
241 |
242 | async delUserByEid() {
243 | await this.getUserInfoByEid();
244 | const body = await delEnv(this.eid);
245 | if (body.code !== 200) {
246 | throw new UserError(body.message || '删除账户错误,请重试', 240, body.code || 200);
247 | }
248 | this.#sendNotify('Ninja 运行通知', `用户 ${this.nickName}(${decodeURIComponent(this.pt_pin)}) 删号跑路了`);
249 | return {
250 | message: '账户已移除',
251 | };
252 | }
253 |
254 | static async getPoolInfo() {
255 | const count = await getEnvsCount();
256 | const allowCount = (process.env.ALLOW_NUM || 40) - count;
257 | return {
258 | marginCount: allowCount >= 0 ? allowCount : 0,
259 | allowAdd: Boolean(process.env.ALLOW_ADD) || true,
260 | };
261 | }
262 |
263 | static async getUsers() {
264 | const envs = await getEnvs();
265 | const result = envs.map(async (env) => {
266 | const user = new User({ cookie: env.value, remarks: env.remarks });
267 | await user.#getNickname(true);
268 | return {
269 | pt_pin: user.pt_pin,
270 | nickName: user.nickName,
271 | remark: user.remark || user.nickName,
272 | };
273 | });
274 | return Promise.all(result);
275 | }
276 |
277 | async #getNickname(nocheck) {
278 | const body = await api({
279 | url: `https://me-api.jd.com/user_new/info/GetJDUserInfoUnion?orgFlag=JD_PinGou_New&callSource=mainorder&channel=4&isHomewhite=0&sceneval=2&_=${Date.now()}&sceneval=2&g_login_type=1&g_ty=ls`,
280 | headers: {
281 | Accept: '*/*',
282 | 'Accept-Encoding': 'gzip, deflate, br',
283 | 'Accept-Language': 'zh-cn',
284 | Connection: 'keep-alive',
285 | Cookie: this.cookie,
286 | Referer: 'https://home.m.jd.com/myJd/newhome.action',
287 | 'User-Agent':
288 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
289 | Host: 'me-api.jd.com',
290 | },
291 | }).json();
292 | if (!body.data?.userInfo && !nocheck) {
293 | throw new UserError('获取用户信息失败,请检查您的 cookie !', 201, 200);
294 | }
295 | this.nickName = body.data?.userInfo.baseInfo.nickname || decodeURIComponent(this.pt_pin);
296 | }
297 |
298 | #formatSetCookies(headers, body) {
299 | return new Promise((resolve) => {
300 | let guid, lsid, ls_token;
301 | this.#s_token = body.s_token;
302 | guid = headers['set-cookie'][0];
303 | guid = guid.substring(guid.indexOf('=') + 1, guid.indexOf(';'));
304 | lsid = headers['set-cookie'][2];
305 | lsid = lsid.substring(lsid.indexOf('=') + 1, lsid.indexOf(';'));
306 | ls_token = headers['set-cookie'][3];
307 | ls_token = ls_token.substring(ls_token.indexOf('=') + 1, ls_token.indexOf(';'));
308 | this.cookies = `guid=${guid};lang=chs;lsid=${lsid};ls_token=${ls_token};`;
309 | resolve();
310 | });
311 | }
312 |
313 | #sendNotify(title, content) {
314 | const notify = process.env.NINJA_NOTIFY || true;
315 | if (!notify) {
316 | console.log('Ninja 通知已关闭\n' + title + '\n' + content + '\n' + '已跳过发送');
317 | return;
318 | }
319 | exec(`${notifyFile} "${title}" "${content}"`, (error, stdout, stderr) => {
320 | if (error) {
321 | console.log(stderr);
322 | } else {
323 | console.log(stdout);
324 | }
325 | });
326 | }
327 | };
328 |
329 | class UserError extends Error {
330 | constructor(message, status, statusCode) {
331 | super(message);
332 | this.name = 'UserError';
333 | this.status = status;
334 | this.statusCode = statusCode || 200;
335 | }
336 | }
337 |
--------------------------------------------------------------------------------
/backend/sendNotify.js:
--------------------------------------------------------------------------------
1 | /*
2 | * @Author: lxk0301 https://gitee.com/lxk0301
3 | * @Date: 2020-08-19 16:12:40
4 | * @Last Modified by: whyour
5 | * @Last Modified time: 2021-5-1 15:00:54
6 | * sendNotify 推送通知功能
7 | * @param text 通知头
8 | * @param desp 通知体
9 | * @param params 某些推送通知方式点击弹窗可跳转, 例:{ url: 'https://abc.com' }
10 | * @param author 作者仓库等信息 例:`本通知 By:https://github.com/whyour/qinglong`
11 | */
12 |
13 | const querystring = require('querystring');
14 | const $ = new Env();
15 | const timeout = 15000; //超时时间(单位毫秒)
16 | // =======================================go-cqhttp通知设置区域===========================================
17 | //gobot_url 填写请求地址http://127.0.0.1/send_private_msg
18 | //gobot_token 填写在go-cqhttp文件设置的访问密钥
19 | //gobot_qq 填写推送到个人QQ或者QQ群号
20 | //go-cqhttp相关API https://docs.go-cqhttp.org/api
21 | let GOBOT_URL = ''; // 推送到个人QQ: http://127.0.0.1/send_private_msg 群:http://127.0.0.1/send_group_msg
22 | let GOBOT_TOKEN = ''; //访问密钥
23 | let GOBOT_QQ = ''; // 如果GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群
24 |
25 | // =======================================微信server酱通知设置区域===========================================
26 | //此处填你申请的SCKEY.
27 | //(环境变量名 PUSH_KEY)
28 | let SCKEY = '';
29 |
30 | // =======================================Bark App通知设置区域===========================================
31 | //此处填你BarkAPP的信息(IP/设备码,例如:https://api.day.app/XXXXXXXX)
32 | let BARK_PUSH = '';
33 | //BARK app推送铃声,铃声列表去APP查看复制填写
34 | let BARK_SOUND = '';
35 | //BARK app推送消息的分组, 默认为"QingLong"
36 | let BARK_GROUP = 'QingLong';
37 |
38 | // =======================================telegram机器人通知设置区域===========================================
39 | //此处填你telegram bot 的Token,telegram机器人通知推送必填项.例如:1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw
40 | //(环境变量名 TG_BOT_TOKEN)
41 | let TG_BOT_TOKEN = '';
42 | //此处填你接收通知消息的telegram用户的id,telegram机器人通知推送必填项.例如:129xxx206
43 | //(环境变量名 TG_USER_ID)
44 | let TG_USER_ID = '';
45 | //tg推送HTTP代理设置(不懂可忽略,telegram机器人通知推送功能中非必填)
46 | let TG_PROXY_HOST = ''; //例如:127.0.0.1(环境变量名:TG_PROXY_HOST)
47 | let TG_PROXY_PORT = ''; //例如:1080(环境变量名:TG_PROXY_PORT)
48 | let TG_PROXY_AUTH = ''; //tg代理配置认证参数
49 | //Telegram api自建的反向代理地址(不懂可忽略,telegram机器人通知推送功能中非必填),默认tg官方api(环境变量名:TG_API_HOST)
50 | let TG_API_HOST = 'api.telegram.org';
51 | // =======================================钉钉机器人通知设置区域===========================================
52 | //此处填你钉钉 bot 的webhook,例如:5a544165465465645d0f31dca676e7bd07415asdasd
53 | //(环境变量名 DD_BOT_TOKEN)
54 | let DD_BOT_TOKEN = '';
55 | //密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串
56 | let DD_BOT_SECRET = '';
57 |
58 | // =======================================企业微信机器人通知设置区域===========================================
59 | //此处填你企业微信机器人的 webhook(详见文档 https://work.weixin.qq.com/api/doc/90000/90136/91770),例如:693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa
60 | //(环境变量名 QYWX_KEY)
61 | let QYWX_KEY = '';
62 |
63 | // =======================================企业微信应用消息通知设置区域===========================================
64 | /*
65 | 此处填你企业微信应用消息的值(详见文档 https://work.weixin.qq.com/api/doc/90000/90135/90236)
66 | 环境变量名 QYWX_AM依次填入 corpid,corpsecret,touser(注:多个成员ID使用|隔开),agentid,消息类型(选填,不填默认文本消息类型)
67 | 注意用,号隔开(英文输入法的逗号),例如:wwcff56746d9adwers,B-791548lnzXBE6_BWfxdf3kSTMJr9vFEPKAbh6WERQ,mingcheng,1000001,2COXgjH2UIfERF2zxrtUOKgQ9XklUqMdGSWLBoW_lSDAdafat
68 | 可选推送消息类型(推荐使用图文消息(mpnews)):
69 | - 文本卡片消息: 0 (数字零)
70 | - 文本消息: 1 (数字一)
71 | - 图文消息(mpnews): 素材库图片id, 可查看此教程(http://note.youdao.com/s/HMiudGkb)或者(https://note.youdao.com/ynoteshare1/index.html?id=1a0c8aff284ad28cbd011b29b3ad0191&type=note)
72 | */
73 | let QYWX_AM = '';
74 |
75 | // =======================================iGot聚合推送通知设置区域===========================================
76 | //此处填您iGot的信息(推送key,例如:https://push.hellyw.com/XXXXXXXX)
77 | let IGOT_PUSH_KEY = '';
78 |
79 | // =======================================push+设置区域=======================================
80 | //官方文档:http://www.pushplus.plus/
81 | //PUSH_PLUS_TOKEN:微信扫码登录后一对一推送或一对多推送下面的token(您的Token),不提供PUSH_PLUS_USER则默认为一对一推送
82 | //PUSH_PLUS_USER: 一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送)
83 | let PUSH_PLUS_TOKEN = '';
84 | let PUSH_PLUS_USER = '';
85 |
86 | //==========================云端环境变量的判断与接收=========================
87 | if (process.env.GOBOT_URL) {
88 | GOBOT_URL = process.env.GOBOT_URL;
89 | }
90 | if (process.env.GOBOT_TOKEN) {
91 | GOBOT_TOKEN = process.env.GOBOT_TOKEN;
92 | }
93 | if (process.env.GOBOT_QQ) {
94 | GOBOT_QQ = process.env.GOBOT_QQ;
95 | }
96 |
97 | if (process.env.PUSH_KEY) {
98 | SCKEY = process.env.PUSH_KEY;
99 | }
100 |
101 | if (process.env.QQ_SKEY) {
102 | QQ_SKEY = process.env.QQ_SKEY;
103 | }
104 |
105 | if (process.env.QQ_MODE) {
106 | QQ_MODE = process.env.QQ_MODE;
107 | }
108 |
109 | if (process.env.BARK_PUSH) {
110 | if (process.env.BARK_PUSH.indexOf('https') > -1 || process.env.BARK_PUSH.indexOf('http') > -1) {
111 | //兼容BARK自建用户
112 | BARK_PUSH = process.env.BARK_PUSH;
113 | } else {
114 | BARK_PUSH = `https://api.day.app/${process.env.BARK_PUSH}`;
115 | }
116 | if (process.env.BARK_SOUND) {
117 | BARK_SOUND = process.env.BARK_SOUND;
118 | }
119 | if (process.env.BARK_GROUP) {
120 | BARK_GROUP = process.env.BARK_GROUP;
121 | }
122 | } else {
123 | if (BARK_PUSH && BARK_PUSH.indexOf('https') === -1 && BARK_PUSH.indexOf('http') === -1) {
124 | //兼容BARK本地用户只填写设备码的情况
125 | BARK_PUSH = `https://api.day.app/${BARK_PUSH}`;
126 | }
127 | }
128 | if (process.env.TG_BOT_TOKEN) {
129 | TG_BOT_TOKEN = process.env.TG_BOT_TOKEN;
130 | }
131 | if (process.env.TG_USER_ID) {
132 | TG_USER_ID = process.env.TG_USER_ID;
133 | }
134 | if (process.env.TG_PROXY_AUTH) TG_PROXY_AUTH = process.env.TG_PROXY_AUTH;
135 | if (process.env.TG_PROXY_HOST) TG_PROXY_HOST = process.env.TG_PROXY_HOST;
136 | if (process.env.TG_PROXY_PORT) TG_PROXY_PORT = process.env.TG_PROXY_PORT;
137 | if (process.env.TG_API_HOST) TG_API_HOST = process.env.TG_API_HOST;
138 |
139 | if (process.env.DD_BOT_TOKEN) {
140 | DD_BOT_TOKEN = process.env.DD_BOT_TOKEN;
141 | if (process.env.DD_BOT_SECRET) {
142 | DD_BOT_SECRET = process.env.DD_BOT_SECRET;
143 | }
144 | }
145 |
146 | if (process.env.QYWX_KEY) {
147 | QYWX_KEY = process.env.QYWX_KEY;
148 | }
149 |
150 | if (process.env.QYWX_AM) {
151 | QYWX_AM = process.env.QYWX_AM;
152 | }
153 |
154 | if (process.env.IGOT_PUSH_KEY) {
155 | IGOT_PUSH_KEY = process.env.IGOT_PUSH_KEY;
156 | }
157 |
158 | if (process.env.PUSH_PLUS_TOKEN) {
159 | PUSH_PLUS_TOKEN = process.env.PUSH_PLUS_TOKEN;
160 | }
161 | if (process.env.PUSH_PLUS_USER) {
162 | PUSH_PLUS_USER = process.env.PUSH_PLUS_USER;
163 | }
164 | //==========================云端环境变量的判断与接收=========================
165 |
166 | /**
167 | * sendNotify 推送通知功能
168 | * @param text 通知头
169 | * @param desp 通知体
170 | * @param params 某些推送通知方式点击弹窗可跳转, 例:{ url: 'https://abc.com' }
171 | * @param author 作者仓库等信息 例:`本通知 By:https://github.com/whyour/qinglong`
172 | * @returns {Promise}
173 | */
174 | async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By:https://github.com/whyour/qinglong') {
175 | try {
176 | const notifySkipList = process.env.NOTIFY_SKIP_LIST ? process.env.NOTIFY_SKIP_LIST.split('&') : [];
177 | const titleIndex = notifySkipList.findIndex((item) => item === text);
178 |
179 | if (titleIndex !== -1) {
180 | console.log(`${text} 在推送黑名单中,已跳过推送`);
181 | return;
182 | }
183 |
184 | const got = require('got');
185 |
186 | const body = await got('http://localhost:5701/api/users').json();
187 | const users = body.data;
188 |
189 | for (const user of users) {
190 | if (user.pt_pin && user.nickName && user.remark) {
191 | desp = desp.replace(new RegExp(`${user.pt_pin}|${user.nickName}`, 'gm'), user.remark);
192 | }
193 | }
194 |
195 | } catch (error) {
196 | console.error(error);
197 | }
198 |
199 | //提供6种通知
200 | desp += author; //增加作者信息,防止被贩卖等
201 | await Promise.all([
202 | serverNotify(text, desp), //微信server酱
203 | pushPlusNotify(text, desp), //pushplus(推送加)
204 | ]);
205 | //由于上述两种微信通知需点击进去才能查看到详情,故text(标题内容)携带了账号序号以及昵称信息,方便不点击也可知道是哪个京东哪个活动
206 | text = text.match(/.*?(?=\s?-)/g) ? text.match(/.*?(?=\s?-)/g)[0] : text;
207 | await Promise.all([
208 | BarkNotify(text, desp, params), //iOS Bark APP
209 | tgBotNotify(text, desp), //telegram 机器人
210 | ddBotNotify(text, desp), //钉钉机器人
211 | qywxBotNotify(text, desp), //企业微信机器人
212 | qywxamNotify(text, desp), //企业微信应用消息推送
213 | iGotNotify(text, desp, params), //iGot
214 | gobotNotify(text, desp), //go-cqhttp
215 | ]);
216 | }
217 |
218 | function gobotNotify(text, desp, time = 2100) {
219 | return new Promise((resolve) => {
220 | if (GOBOT_URL) {
221 | const options = {
222 | url: `${GOBOT_URL}?access_token=${GOBOT_TOKEN}&${GOBOT_QQ}`,
223 | body: `message=${text}\n${desp}`,
224 | headers: {
225 | 'Content-Type': 'application/x-www-form-urlencoded',
226 | },
227 | timeout,
228 | };
229 | setTimeout(() => {
230 | $.post(options, (err, resp, data) => {
231 | try {
232 | if (err) {
233 | console.log('发送go-cqhttp通知调用API失败!!\n');
234 | console.log(err);
235 | } else {
236 | data = JSON.parse(data);
237 | if (data.retcode === 0) {
238 | console.log('go-cqhttp发送通知消息成功🎉\n');
239 | } else if (data.retcode === 100) {
240 | console.log(`go-cqhttp发送通知消息异常: ${data.errmsg}\n`);
241 | } else {
242 | console.log(`go-cqhttp发送通知消息异常\n${JSON.stringify(data)}`);
243 | }
244 | }
245 | } catch (e) {
246 | $.logErr(e, resp);
247 | } finally {
248 | resolve(data);
249 | }
250 | });
251 | }, time);
252 | } else {
253 | resolve();
254 | }
255 | });
256 | }
257 |
258 | function serverNotify(text, desp, time = 2100) {
259 | return new Promise((resolve) => {
260 | if (SCKEY) {
261 | //微信server酱推送通知一个\n不会换行,需要两个\n才能换行,故做此替换
262 | desp = desp.replace(/[\n\r]/g, '\n\n');
263 | const options = {
264 | url: SCKEY.includes('SCT') ? `https://sctapi.ftqq.com/${SCKEY}.send` : `https://sc.ftqq.com/${SCKEY}.send`,
265 | body: `text=${text}&desp=${desp}`,
266 | headers: {
267 | 'Content-Type': 'application/x-www-form-urlencoded',
268 | },
269 | timeout,
270 | };
271 | setTimeout(() => {
272 | $.post(options, (err, resp, data) => {
273 | try {
274 | if (err) {
275 | console.log('发送通知调用API失败!!\n');
276 | console.log(err);
277 | } else {
278 | data = JSON.parse(data);
279 | //server酱和Server酱·Turbo版的返回json格式不太一样
280 | if (data.errno === 0 || data.data.errno === 0) {
281 | console.log('server酱发送通知消息成功🎉\n');
282 | } else if (data.errno === 1024) {
283 | // 一分钟内发送相同的内容会触发
284 | console.log(`server酱发送通知消息异常: ${data.errmsg}\n`);
285 | } else {
286 | console.log(`server酱发送通知消息异常\n${JSON.stringify(data)}`);
287 | }
288 | }
289 | } catch (e) {
290 | $.logErr(e, resp);
291 | } finally {
292 | resolve(data);
293 | }
294 | });
295 | }, time);
296 | } else {
297 | resolve();
298 | }
299 | });
300 | }
301 |
302 | function CoolPush(text, desp) {
303 | return new Promise((resolve) => {
304 | if (QQ_SKEY) {
305 | let options = {
306 | url: `https://push.xuthus.cc/${QQ_MODE}/${QQ_SKEY}`,
307 | headers: {
308 | 'Content-Type': 'application/json',
309 | },
310 | };
311 |
312 | // 已知敏感词
313 | text = text.replace(/京豆/g, '豆豆');
314 | desp = desp.replace(/京豆/g, '');
315 | desp = desp.replace(/🐶/g, '');
316 | desp = desp.replace(/红包/g, 'H包');
317 |
318 | switch (QQ_MODE) {
319 | case 'email':
320 | options.json = {
321 | t: text,
322 | c: desp,
323 | };
324 | break;
325 | default:
326 | options.body = `${text}\n\n${desp}`;
327 | }
328 |
329 | let pushMode = function (t) {
330 | switch (t) {
331 | case 'send':
332 | return '个人';
333 | case 'group':
334 | return 'QQ群';
335 | case 'wx':
336 | return '微信';
337 | case 'ww':
338 | return '企业微信';
339 | case 'email':
340 | return '邮件';
341 | default:
342 | return '未知方式';
343 | }
344 | };
345 |
346 | $.post(options, (err, resp, data) => {
347 | try {
348 | if (err) {
349 | console.log(`发送${pushMode(QQ_MODE)}通知调用API失败!!\n`);
350 | console.log(err);
351 | } else {
352 | data = JSON.parse(data);
353 | if (data.code === 200) {
354 | console.log(`酷推发送${pushMode(QQ_MODE)}通知消息成功🎉\n`);
355 | } else if (data.code === 400) {
356 | console.log(`QQ酷推(Cool Push)发送${pushMode(QQ_MODE)}推送失败:${data.msg}\n`);
357 | } else if (data.code === 503) {
358 | console.log(`QQ酷推出错,${data.message}:${data.data}\n`);
359 | } else {
360 | console.log(`酷推推送异常: ${JSON.stringify(data)}`);
361 | }
362 | }
363 | } catch (e) {
364 | $.logErr(e, resp);
365 | } finally {
366 | resolve(data);
367 | }
368 | });
369 | } else {
370 | resolve();
371 | }
372 | });
373 | }
374 |
375 | function BarkNotify(text, desp, params = {}) {
376 | return new Promise((resolve) => {
377 | if (BARK_PUSH) {
378 | const options = {
379 | url: `${BARK_PUSH}/${encodeURIComponent(text)}/${encodeURIComponent(
380 | desp
381 | )}?sound=${BARK_SOUND}&group=${BARK_GROUP}&${querystring.stringify(params)}`,
382 | headers: {
383 | 'Content-Type': 'application/x-www-form-urlencoded',
384 | },
385 | timeout,
386 | };
387 | $.get(options, (err, resp, data) => {
388 | try {
389 | if (err) {
390 | console.log('Bark APP发送通知调用API失败!!\n');
391 | console.log(err);
392 | } else {
393 | data = JSON.parse(data);
394 | if (data.code === 200) {
395 | console.log('Bark APP发送通知消息成功🎉\n');
396 | } else {
397 | console.log(`${data.message}\n`);
398 | }
399 | }
400 | } catch (e) {
401 | $.logErr(e, resp);
402 | } finally {
403 | resolve();
404 | }
405 | });
406 | } else {
407 | resolve();
408 | }
409 | });
410 | }
411 |
412 | function tgBotNotify(text, desp) {
413 | return new Promise((resolve) => {
414 | if (TG_BOT_TOKEN && TG_USER_ID) {
415 | const options = {
416 | url: `https://${TG_API_HOST}/bot${TG_BOT_TOKEN}/sendMessage`,
417 | body: `chat_id=${TG_USER_ID}&text=${text}\n\n${desp}&disable_web_page_preview=true`,
418 | headers: {
419 | 'Content-Type': 'application/x-www-form-urlencoded',
420 | },
421 | timeout,
422 | };
423 | if (TG_PROXY_HOST && TG_PROXY_PORT) {
424 | const tunnel = require('tunnel');
425 | const agent = {
426 | https: tunnel.httpsOverHttp({
427 | proxy: {
428 | host: TG_PROXY_HOST,
429 | port: TG_PROXY_PORT * 1,
430 | proxyAuth: TG_PROXY_AUTH,
431 | },
432 | }),
433 | };
434 | Object.assign(options, { agent });
435 | }
436 | $.post(options, (err, resp, data) => {
437 | try {
438 | if (err) {
439 | console.log('telegram发送通知消息失败!!\n');
440 | console.log(err);
441 | } else {
442 | data = JSON.parse(data);
443 | if (data.ok) {
444 | console.log('Telegram发送通知消息成功🎉。\n');
445 | } else if (data.error_code === 400) {
446 | console.log('请主动给bot发送一条消息并检查接收用户ID是否正确。\n');
447 | } else if (data.error_code === 401) {
448 | console.log('Telegram bot token 填写错误。\n');
449 | }
450 | }
451 | } catch (e) {
452 | $.logErr(e, resp);
453 | } finally {
454 | resolve(data);
455 | }
456 | });
457 | } else {
458 | resolve();
459 | }
460 | });
461 | }
462 | function ddBotNotify(text, desp) {
463 | return new Promise((resolve) => {
464 | const options = {
465 | url: `https://oapi.dingtalk.com/robot/send?access_token=${DD_BOT_TOKEN}`,
466 | json: {
467 | msgtype: 'text',
468 | text: {
469 | content: ` ${text}\n\n${desp}`,
470 | },
471 | },
472 | headers: {
473 | 'Content-Type': 'application/json',
474 | },
475 | timeout,
476 | };
477 | if (DD_BOT_TOKEN && DD_BOT_SECRET) {
478 | const crypto = require('crypto');
479 | const dateNow = Date.now();
480 | const hmac = crypto.createHmac('sha256', DD_BOT_SECRET);
481 | hmac.update(`${dateNow}\n${DD_BOT_SECRET}`);
482 | const result = encodeURIComponent(hmac.digest('base64'));
483 | options.url = `${options.url}×tamp=${dateNow}&sign=${result}`;
484 | $.post(options, (err, resp, data) => {
485 | try {
486 | if (err) {
487 | console.log('钉钉发送通知消息失败!!\n');
488 | console.log(err);
489 | } else {
490 | data = JSON.parse(data);
491 | if (data.errcode === 0) {
492 | console.log('钉钉发送通知消息成功🎉。\n');
493 | } else {
494 | console.log(`${data.errmsg}\n`);
495 | }
496 | }
497 | } catch (e) {
498 | $.logErr(e, resp);
499 | } finally {
500 | resolve(data);
501 | }
502 | });
503 | } else if (DD_BOT_TOKEN) {
504 | $.post(options, (err, resp, data) => {
505 | try {
506 | if (err) {
507 | console.log('钉钉发送通知消息失败!!\n');
508 | console.log(err);
509 | } else {
510 | data = JSON.parse(data);
511 | if (data.errcode === 0) {
512 | console.log('钉钉发送通知消息完成。\n');
513 | } else {
514 | console.log(`${data.errmsg}\n`);
515 | }
516 | }
517 | } catch (e) {
518 | $.logErr(e, resp);
519 | } finally {
520 | resolve(data);
521 | }
522 | });
523 | } else {
524 | resolve();
525 | }
526 | });
527 | }
528 |
529 | function qywxBotNotify(text, desp) {
530 | return new Promise((resolve) => {
531 | const options = {
532 | url: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${QYWX_KEY}`,
533 | json: {
534 | msgtype: 'text',
535 | text: {
536 | content: ` ${text}\n\n${desp}`,
537 | },
538 | },
539 | headers: {
540 | 'Content-Type': 'application/json',
541 | },
542 | timeout,
543 | };
544 | if (QYWX_KEY) {
545 | $.post(options, (err, resp, data) => {
546 | try {
547 | if (err) {
548 | console.log('企业微信发送通知消息失败!!\n');
549 | console.log(err);
550 | } else {
551 | data = JSON.parse(data);
552 | if (data.errcode === 0) {
553 | console.log('企业微信发送通知消息成功🎉。\n');
554 | } else {
555 | console.log(`${data.errmsg}\n`);
556 | }
557 | }
558 | } catch (e) {
559 | $.logErr(e, resp);
560 | } finally {
561 | resolve(data);
562 | }
563 | });
564 | } else {
565 | resolve();
566 | }
567 | });
568 | }
569 |
570 | function ChangeUserId(desp) {
571 | const QYWX_AM_AY = QYWX_AM.split(',');
572 | if (QYWX_AM_AY[2]) {
573 | const userIdTmp = QYWX_AM_AY[2].split('|');
574 | let userId = '';
575 | for (let i = 0; i < userIdTmp.length; i++) {
576 | const count = '账号' + (i + 1);
577 | const count2 = '签到号 ' + (i + 1);
578 | if (desp.match(count2)) {
579 | userId = userIdTmp[i];
580 | }
581 | }
582 | if (!userId) userId = QYWX_AM_AY[2];
583 | return userId;
584 | } else {
585 | return '@all';
586 | }
587 | }
588 |
589 | function qywxamNotify(text, desp) {
590 | return new Promise((resolve) => {
591 | if (QYWX_AM) {
592 | const QYWX_AM_AY = QYWX_AM.split(',');
593 | const options_accesstoken = {
594 | url: `https://qyapi.weixin.qq.com/cgi-bin/gettoken`,
595 | json: {
596 | corpid: `${QYWX_AM_AY[0]}`,
597 | corpsecret: `${QYWX_AM_AY[1]}`,
598 | },
599 | headers: {
600 | 'Content-Type': 'application/json',
601 | },
602 | timeout,
603 | };
604 | $.post(options_accesstoken, (err, resp, data) => {
605 | html = desp.replace(/\n/g, '
');
606 | var json = JSON.parse(data);
607 | accesstoken = json.access_token;
608 | let options;
609 |
610 | switch (QYWX_AM_AY[4]) {
611 | case '0':
612 | options = {
613 | msgtype: 'textcard',
614 | textcard: {
615 | title: `${text}`,
616 | description: `${desp}`,
617 | url: 'https://github.com/whyour/qinglong',
618 | btntxt: '更多',
619 | },
620 | };
621 | break;
622 |
623 | case '1':
624 | options = {
625 | msgtype: 'text',
626 | text: {
627 | content: `${text}\n\n${desp}`,
628 | },
629 | };
630 | break;
631 |
632 | default:
633 | options = {
634 | msgtype: 'mpnews',
635 | mpnews: {
636 | articles: [
637 | {
638 | title: `${text}`,
639 | thumb_media_id: `${QYWX_AM_AY[4]}`,
640 | author: `智能助手`,
641 | content_source_url: ``,
642 | content: `${html}`,
643 | digest: `${desp}`,
644 | },
645 | ],
646 | },
647 | };
648 | }
649 | if (!QYWX_AM_AY[4]) {
650 | //如不提供第四个参数,则默认进行文本消息类型推送
651 | options = {
652 | msgtype: 'text',
653 | text: {
654 | content: `${text}\n\n${desp}`,
655 | },
656 | };
657 | }
658 | options = {
659 | url: `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${accesstoken}`,
660 | json: {
661 | touser: `${ChangeUserId(desp)}`,
662 | agentid: `${QYWX_AM_AY[3]}`,
663 | safe: '0',
664 | ...options,
665 | },
666 | headers: {
667 | 'Content-Type': 'application/json',
668 | },
669 | };
670 |
671 | $.post(options, (err, resp, data) => {
672 | try {
673 | if (err) {
674 | console.log('成员ID:' + ChangeUserId(desp) + '企业微信应用消息发送通知消息失败!!\n');
675 | console.log(err);
676 | } else {
677 | data = JSON.parse(data);
678 | if (data.errcode === 0) {
679 | console.log('成员ID:' + ChangeUserId(desp) + '企业微信应用消息发送通知消息成功🎉。\n');
680 | } else {
681 | console.log(`${data.errmsg}\n`);
682 | }
683 | }
684 | } catch (e) {
685 | $.logErr(e, resp);
686 | } finally {
687 | resolve(data);
688 | }
689 | });
690 | });
691 | } else {
692 | resolve();
693 | }
694 | });
695 | }
696 |
697 | function iGotNotify(text, desp, params = {}) {
698 | return new Promise((resolve) => {
699 | if (IGOT_PUSH_KEY) {
700 | // 校验传入的IGOT_PUSH_KEY是否有效
701 | const IGOT_PUSH_KEY_REGX = new RegExp('^[a-zA-Z0-9]{24}$');
702 | if (!IGOT_PUSH_KEY_REGX.test(IGOT_PUSH_KEY)) {
703 | console.log('您所提供的IGOT_PUSH_KEY无效\n');
704 | resolve();
705 | return;
706 | }
707 | const options = {
708 | url: `https://push.hellyw.com/${IGOT_PUSH_KEY.toLowerCase()}`,
709 | body: `title=${text}&content=${desp}&${querystring.stringify(params)}`,
710 | headers: {
711 | 'Content-Type': 'application/x-www-form-urlencoded',
712 | },
713 | timeout,
714 | };
715 | $.post(options, (err, resp, data) => {
716 | try {
717 | if (err) {
718 | console.log('发送通知调用API失败!!\n');
719 | console.log(err);
720 | } else {
721 | if (typeof data === 'string') data = JSON.parse(data);
722 | if (data.ret === 0) {
723 | console.log('iGot发送通知消息成功🎉\n');
724 | } else {
725 | console.log(`iGot发送通知消息失败:${data.errMsg}\n`);
726 | }
727 | }
728 | } catch (e) {
729 | $.logErr(e, resp);
730 | } finally {
731 | resolve(data);
732 | }
733 | });
734 | } else {
735 | resolve();
736 | }
737 | });
738 | }
739 |
740 | function pushPlusNotify(text, desp) {
741 | return new Promise((resolve) => {
742 | if (PUSH_PLUS_TOKEN) {
743 | desp = desp.replace(/[\n\r]/g, '
'); // 默认为html, 不支持plaintext
744 | const body = {
745 | token: `${PUSH_PLUS_TOKEN}`,
746 | title: `${text}`,
747 | content: `${desp}`,
748 | topic: `${PUSH_PLUS_USER}`,
749 | };
750 | const options = {
751 | url: `https://www.pushplus.plus/send`,
752 | body: JSON.stringify(body),
753 | headers: {
754 | 'Content-Type': ' application/json',
755 | },
756 | timeout,
757 | };
758 | $.post(options, (err, resp, data) => {
759 | try {
760 | if (err) {
761 | console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败!!\n`);
762 | console.log(err);
763 | } else {
764 | data = JSON.parse(data);
765 | if (data.code === 200) {
766 | console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息完成。\n`);
767 | } else {
768 | console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败:${data.msg}\n`);
769 | }
770 | }
771 | } catch (e) {
772 | $.logErr(e, resp);
773 | } finally {
774 | resolve(data);
775 | }
776 | });
777 | } else {
778 | resolve();
779 | }
780 | });
781 | }
782 |
783 | module.exports = {
784 | sendNotify,
785 | BARK_PUSH,
786 | };
787 |
788 | // prettier-ignore
789 | function Env(t, s) { return new (class { constructor(t, s) { (this.name = t), (this.data = null), (this.dataFile = 'box.dat'), (this.logs = []), (this.logSeparator = '\n'), (this.startTime = new Date().getTime()), Object.assign(this, s), this.log('', `\ud83d\udd14${this.name}, \u5f00\u59cb!`); } isNode() { return 'undefined' != typeof module && !!module.exports; } isQuanX() { return 'undefined' != typeof $task; } isSurge() { return 'undefined' != typeof $httpClient && 'undefined' == typeof $loon; } isLoon() { return 'undefined' != typeof $loon; } getScript(t) { return new Promise((s) => { $.get({ url: t }, (t, e, i) => s(i)); }); } runScript(t, s) { return new Promise((e) => { let i = this.getdata('@chavy_boxjs_userCfgs.httpapi'); i = i ? i.replace(/\n/g, '').trim() : i; let o = this.getdata('@chavy_boxjs_userCfgs.httpapi_timeout'); (o = o ? 1 * o : 20), (o = s && s.timeout ? s.timeout : o); const [h, a] = i.split('@'), r = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: t, mock_type: 'cron', timeout: o }, headers: { 'X-Key': h, Accept: '*/*' }, }; $.post(r, (t, s, i) => e(i)); }).catch((t) => this.logErr(t)); } loaddata() { if (!this.isNode()) return {}; { (this.fs = this.fs ? this.fs : require('fs')), (this.path = this.path ? this.path : require('path')); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s); if (!e && !i) return {}; { const i = e ? t : s; try { return JSON.parse(this.fs.readFileSync(i)); } catch (t) { return {}; } } } } writedata() { if (this.isNode()) { (this.fs = this.fs ? this.fs : require('fs')), (this.path = this.path ? this.path : require('path')); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s), o = JSON.stringify(this.data); e ? this.fs.writeFileSync(t, o) : i ? this.fs.writeFileSync(s, o) : this.fs.writeFileSync(t, o); } } lodash_get(t, s, e) { const i = s.replace(/\[(\d+)\]/g, '.$1').split('.'); let o = t; for (const t of i) if (((o = Object(o)[t]), void 0 === o)) return e; return o; } lodash_set(t, s, e) { return Object(t) !== t ? t : (Array.isArray(s) || (s = s.toString().match(/[^.[\]]+/g) || []), (s .slice(0, -1) .reduce( (t, e, i) => (Object(t[e]) === t[e] ? t[e] : (t[e] = Math.abs(s[i + 1]) >> 0 == +s[i + 1] ? [] : {})), t )[s[s.length - 1]] = e), t); } getdata(t) { let s = this.getval(t); if (/^@/.test(t)) { const [, e, i] = /^@(.*?)\.(.*?)$/.exec(t), o = e ? this.getval(e) : ''; if (o) try { const t = JSON.parse(o); s = t ? this.lodash_get(t, i, '') : s; } catch (t) { s = ''; } } return s; } setdata(t, s) { let e = !1; if (/^@/.test(s)) { const [, i, o] = /^@(.*?)\.(.*?)$/.exec(s), h = this.getval(i), a = i ? ('null' === h ? null : h || '{}') : '{}'; try { const s = JSON.parse(a); this.lodash_set(s, o, t), (e = this.setval(JSON.stringify(s), i)); } catch (s) { const h = {}; this.lodash_set(h, o, t), (e = this.setval(JSON.stringify(h), i)); } } else e = $.setval(t, s); return e; } getval(t) { return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? ((this.data = this.loaddata()), this.data[t]) : (this.data && this.data[t]) || null; } setval(t, s) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, s) : this.isQuanX() ? $prefs.setValueForKey(t, s) : this.isNode() ? ((this.data = this.loaddata()), (this.data[s] = t), this.writedata(), !0) : (this.data && this.data[s]) || null; } initGotEnv(t) { (this.got = this.got ? this.got : require('got')), (this.cktough = this.cktough ? this.cktough : require('tough-cookie')), (this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar()), t && ((t.headers = t.headers ? t.headers : {}), void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)); } get(t, s = () => {}) { t.headers && (delete t.headers['Content-Type'], delete t.headers['Content-Length']), this.isSurge() || this.isLoon() ? $httpClient.get(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i); }) : this.isQuanX() ? $task.fetch(t).then( (t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t) ) : this.isNode() && (this.initGotEnv(t), this.got(t) .on('redirect', (t, s) => { try { const e = t.headers['set-cookie'].map(this.cktough.Cookie.parse).toString(); this.ckjar.setCookieSync(e, null), (s.cookieJar = this.ckjar); } catch (t) { this.logErr(t); } }) .then( (t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t) )); } post(t, s = () => {}) { if ( (t.body && t.headers && !t.headers['Content-Type'] && (t.headers['Content-Type'] = 'application/x-www-form-urlencoded'), delete t.headers['Content-Length'], this.isSurge() || this.isLoon()) ) $httpClient.post(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i); }); else if (this.isQuanX()) (t.method = 'POST'), $task.fetch(t).then( (t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t) ); else if (this.isNode()) { this.initGotEnv(t); const { url: e, ...i } = t; this.got.post(e, i).then( (t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t) ); } } time(t) { let s = { 'M+': new Date().getMonth() + 1, 'd+': new Date().getDate(), 'H+': new Date().getHours(), 'm+': new Date().getMinutes(), 's+': new Date().getSeconds(), 'q+': Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + '').substr(4 - RegExp.$1.length))); for (let e in s) new RegExp('(' + e + ')').test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ('00' + s[e]).substr(('' + s[e]).length))); return t; } msg(s = t, e = '', i = '', o) { const h = (t) => !t || (!this.isLoon() && this.isSurge()) ? t : 'string' == typeof t ? this.isLoon() ? t : this.isQuanX() ? { 'open-url': t } : void 0 : 'object' == typeof t && (t['open-url'] || t['media-url']) ? this.isLoon() ? t['open-url'] : this.isQuanX() ? t : void 0 : void 0; $.isMute || (this.isSurge() || this.isLoon() ? $notification.post(s, e, i, h(o)) : this.isQuanX() && $notify(s, e, i, h(o))), this.logs.push('', '==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============='), this.logs.push(s), e && this.logs.push(e), i && this.logs.push(i); } log(...t) { t.length > 0 ? (this.logs = [...this.logs, ...t]) : console.log(this.logs.join(this.logSeparator)); } logErr(t, s) { const e = !this.isSurge() && !this.isQuanX() && !this.isLoon(); e ? $.log('', `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack) : $.log('', `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t); } wait(t) { return new Promise((s) => setTimeout(s, t)); } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log('', `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t); } })(t, s); }
790 |
--------------------------------------------------------------------------------
/backend/static/assets/index.fcdd9895.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";:root{--el-button-primary-border-color:var(--el-color-primary);--el-button-success-border-color:var(--el-color-success);--el-button-warning-border-color:var(--el-color-warning);--el-button-danger-border-color:var(--el-color-danger);--el-button-info-border-color:var(--el-color-info);--el-button-divide-border-color:rgba(255, 255, 255, 0.5)}.el-button{display:inline-block;line-height:1;min-height:40px;white-space:nowrap;cursor:pointer;background:var(--el-button-default-background-color);border:var(--el-border-base);border-color:var(--el-button-default-border-color);color:var(--el-button-default-font-color);-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:var(--el-button-font-weight);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:var(--el-border-radius-base)}.el-button+.el-button{margin-left:10px}.el-button:focus,.el-button:hover{color:var(--el-color-primary);border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:var(--el-color-white);border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:var(--el-color-white);outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:var(--el-button-disabled-font-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-background-color);border-color:var(--el-button-disabled-border-color)}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:var(--el-color-white);border-color:var(--el-button-disabled-border-color);color:var(--el-button-disabled-font-color)}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:"";position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.el-button.is-round{border-radius:var(--el-border-radius-round);padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#fff;background-color:#409eff;border-color:#409eff}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#fff}.el-button--primary.is-active,.el-button--primary:active{border-color:#3a8ee6;color:#fff;background:#3a8ee6}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#fff;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409eff;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409eff;border-color:#409eff;color:#fff}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#fff;background-color:#67c23a;border-color:#67c23a}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#fff}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#fff}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#fff;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67c23a;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67c23a;border-color:#67c23a;color:#fff}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#fff;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#fff}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#fff}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#fff;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#e6a23c;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#e6a23c;border-color:#e6a23c;color:#fff}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#fff;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#fff}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#fff}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#fff;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#f56c6c;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#f56c6c;border-color:#f56c6c;color:#fff}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#fff;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#fff;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#fff}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#fff}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#fff;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#fff}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#fff;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--medium{min-height:36px;padding:10px 20px;font-size:14px;border-radius:var(--el-border-radius-base)}.el-button--mini,.el-button--small{font-size:12px;border-radius:calc(var(--el-border-radius-base) - 1px)}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:20px}.el-button--small{min-height:32px;padding:9px 15px}.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:15px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini{min-height:28px}.el-button--mini.is-circle{padding:15px}.el-button--text{border-color:transparent;color:var(--el-color-primary);background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;border-color:transparent;background-color:transparent}.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover{border-color:transparent}.el-button-group .el-button--danger:last-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:last-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:last-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:last-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:last-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child),.el-button-group>.el-dropdown>.el-button{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--danger:first-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:first-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:first-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:first-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:first-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-right-color:var(--el-button-divide-border-color)}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table;content:""}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-top-right-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base);border-top-left-radius:var(--el-border-radius-base);border-bottom-left-radius:var(--el-border-radius-base)}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:var(--el-border-radius-round)}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button.is-active,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0}.el-overlay,.v-modal{position:fixed;height:100%;left:0}.el-dialog__wrapper,.el-overlay{top:0;right:0;bottom:0;overflow:auto}:root{--el-popup-modal-background-color:var(--el-color-black);--el-popup-modal-opacity:0.5;--el-dialog-background-color:var(--el-color-white);--el-dialog-box-shadow:0 1px 3px rgba(0, 0, 0, 0.3);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:20px}.v-modal-enter{-webkit-animation:v-modal-in var(--el-transition-duration-fast) ease;animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{-webkit-animation:v-modal-out var(--el-transition-duration-fast) ease forwards;animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{top:0;width:100%;opacity:var(--el-popup-modal-opacity);background:var(--el-popup-modal-background-color)}.el-popup-parent--hidden{overflow:hidden}.el-overlay{z-index:2000;background-color:rgba(0,0,0,.5)}.el-overlay .el-overlay-root{height:0}.el-dialog{position:relative;margin:0 auto 50px;background:var(--el-dialog-background-color);border-radius:var(--el-border-radius-small);-webkit-box-shadow:var(--el-dialog-box-shadow);box-shadow:var(--el-dialog-box-shadow);-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;left:0;margin:0}.el-dialog__header{padding:var(--el-dialog-padding-primary);padding-bottom:10px}.el-dialog__headerbtn{position:absolute;top:var(--el-dialog-padding-primary);right:var(--el-dialog-padding-primary);padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:var(--el-message-close-size)}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info)}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{line-height:var(--el-dialog-font-line-height);font-size:var(--el-dialog-title-font-size);color:var(--el-text-color-primary)}.el-dialog__body{padding:calc(var(--el-dialog-padding-primary) + 10px) var(--el-dialog-padding-primary);color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size);word-break:break-all}.el-dialog__footer{padding:var(--el-dialog-padding-primary);padding-top:10px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px calc(var(--el-dialog-padding-primary) + 5px) 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:modal-fade-in var(--el-transition-duration)!important;animation:modal-fade-in var(--el-transition-duration)!important}.dialog-fade-enter-active .el-dialog{-webkit-animation:dialog-fade-in var(--el-transition-duration);animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{-webkit-animation:modal-fade-out var(--el-transition-duration);animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-dialog{-webkit-animation:dialog-fade-out var(--el-transition-duration);animation:dialog-fade-out var(--el-transition-duration)}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@-webkit-keyframes modal-fade-in{0%{opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes modal-fade-in{0%{opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes modal-fade-out{0%{opacity:1}100%{opacity:0}}@keyframes modal-fade-out{0%{opacity:1}100%{opacity:0}}.el-input__inner,.el-textarea__inner{background-image:none;-webkit-transition:var(--el-border-transition-base);width:100%}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:var(--el-font-size-base)}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;font-size:inherit;color:var(--el-text-color-regular);background-color:#fff;border:1px solid #dcdfe6;border-radius:var(--el-border-radius-base);-webkit-transition:var(--el-border-transition-base);transition:var(--el-border-transition-base)}.el-textarea__inner::-webkit-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner::-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner:hover{border-color:var(--el-text-color-placeholder)}.el-textarea__inner:focus{outline:0;border-color:#409eff}.el-textarea .el-input__count{color:var(--el-color-info);background:#fff;position:absolute;font-size:12px;line-height:14px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{border-color:var(--el-color-danger)}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{position:relative;font-size:var(--el-font-size-base);display:inline-block;width:100%;line-height:40px}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:var(--el-text-color-placeholder);font-size:14px;cursor:pointer;-webkit-transition:var(--el-color-transition-base);transition:var(--el-color-transition-base)}.el-input .el-input__clear:hover{color:var(--el-text-color-secondary)}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--el-color-info);font-size:12px}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input,.el-input__inner{font-size:inherit}.el-input .el-input__count .el-input__count-inner{background:#fff;line-height:initial;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#fff;border-radius:var(--el-border-radius-base);border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-block;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:var(--el-border-transition-base);transition:var(--el-border-transition-base)}.el-input__prefix,.el-input__suffix{position:absolute;top:0;-webkit-transition:all var(--el-transition-duration);text-align:center;height:100%;color:var(--el-text-color-placeholder)}.el-input__inner::-webkit-input-placeholder{color:var(--el-text-color-placeholder)}.el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-input__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input__inner::-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input__inner:hover{border-color:var(--el-text-color-placeholder)}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409eff;outline:0}.el-input__suffix{right:5px;-webkit-transition:all var(--el-transition-duration);transition:all var(--el-transition-duration);pointer-events:none}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{left:5px;-webkit-transition:all var(--el-transition-duration);transition:all var(--el-transition-duration)}.el-input__icon{width:25px;text-align:center;-webkit-transition:all var(--el-transition-duration);transition:all var(--el-transition-duration);line-height:40px}.el-input__icon:after{content:"";height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-exceed .el-input__inner{border-color:var(--el-color-danger)}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--suffix--password-clear .el-input__inner{padding-right:55px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px;line-height:36px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px;line-height:32px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px;line-height:28px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#f5f7fa;color:var(--el-color-info);vertical-align:middle;display:table-cell;position:relative;border:1px solid #dcdfe6;border-radius:var(--el-border-radius-base);padding:0 20px;width:1px;white-space:nowrap}.el-input-group--prepend .el-input__inner,.el-input-group__append{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input__inner::-ms-clear{display:none;width:0;height:0}:root{--el-message-min-width:380px;--el-message-background-color:#edf2fc;--el-message-padding:15px 15px 15px 20px;--el-message-close-icon-color:var(--el-text-color-placeholder);--el-message-close-hover-color:var(--el-text-color-secondary);--el-message-success-font-color:var(--el-color-success);--el-message-info-font-color:var(--el-color-info);--el-message-warning-font-color:var(--el-color-warning);--el-message-error-font-color:var(--el-color-error)}.el-message{min-width:var(--el-message-min-width);-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:var(--el-border-radius-base);border-width:var(--el-border-width-base);border-style:var(--el-border-style-base);border-color:var(--el-border-color-lighter);position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:var(--el-message-background-color);-webkit-transition:opacity var(--el-transition-duration),top .4s,-webkit-transform .4s;transition:opacity var(--el-transition-duration),top .4s,-webkit-transform .4s;transition:opacity var(--el-transition-duration),transform .4s,top .4s;transition:opacity var(--el-transition-duration),transform .4s,top .4s,-webkit-transform .4s;overflow:hidden;padding:var(--el-message-padding);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:var(--el-message-success-font-color)}.el-message--info{background-color:#f4f4f5;border-color:#e9e9eb}.el-message--info .el-message__content{color:var(--el-message-info-font-color)}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:var(--el-message-warning-font-color)}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:var(--el-message-error-font-color)}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__content:focus{outline-width:0}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:var(--el-message-close-icon-color);font-size:var(--el-message-close-size)}.el-message__closeBtn:focus{outline-width:0}.el-message__closeBtn:hover{color:var(--el-message-close-hover-color)}.el-message .el-icon-success{color:var(--el-message-success-font-color)}.el-message .el-icon-info{color:var(--el-message-info-font-color)}.el-message .el-icon-warning{color:var(--el-message-warning-font-color)}.el-message .el-icon-error{color:var(--el-message-error-font-color)}.el-message-fade-enter-from,.el-message-fade-leave-to{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}:root{--el-color-primary:#409eff;--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-light-1:#53a8ff;--el-color-primary-light-2:#66b1ff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-4:#8cc5ff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-6:#b3d8ff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-success:#67c23a;--el-color-success-light:#e1f3d8;--el-color-success-lighter:#f0f9eb;--el-color-warning:#e6a23c;--el-color-warning-light:#faecd8;--el-color-warning-lighter:#fdf6ec;--el-color-danger:#f56c6c;--el-color-danger-light:#fde2e2;--el-color-danger-lighter:#fef0f0;--el-color-error:#f56c6c;--el-color-error-light:#fde2e2;--el-color-error-lighter:#fef0f0;--el-color-info:#909399;--el-color-info-light:#e9e9eb;--el-color-info-lighter:#f4f4f5;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#c0c4cc;--el-border-color-base:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-background-color-base:#f5f7fa;--el-link-color:var(--el-color-primary-light-2);--el-link-hover-color:var(--el-color-primary);--el-border-width-base:1px;--el-border-style-base:solid;--el-border-color-hover:var(--el-text-color-placeholder);--el-border-base:var(--el-border-width-base) var(--el-border-style-base) var(--el-border-color-base);--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-box-shadow-base:0 2px 4px rgba(0, 0, 0, 0.12),0 0 6px rgba(0, 0, 0, 0.04);--el-box-shadow-light:0 2px 12px 0 rgba(0, 0, 0, 0.1);--el-svg-monochrome-grey:#dcdde0;--el-fill-base:var(--el-color-white);--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-font-color-disabled-base:#bbb;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-disabled-fill-base:var(--el-background-color-base);--el-disabled-color-base:var(--el-text-color-placeholder);--el-disabled-border-base:var(--el-border-color-light);--el-button-font-weight:var(--el-font-weight-primary);--el-button-default-font-color:var(--el-text-color-regular);--el-button-default-background-color:var(--el-color-white);--el-button-default-border-color:var(--el-border-color-base);--el-button-disabled-font-color:var(--el-text-color-placeholder);--el-button-disabled-background-color:var(--el-color-white);--el-button-disabled-border-color:var(--el-border-color-light);--el-message-close-size:16px;--el-transition-duration:0.3s;--el-transition-duration-fast:0.2s;--el-ease-in-out-bezier-function:cubic-bezier(0.645, 0.045, 0.355, 1);--el-fast-bezier-transition:cubic-bezier(0.23, 1, 0.32, 1);--el-all-transition:all var(--el-transition-duration) var(--el-ease-in-out-bezier-function);--el-fade-transition:opacity var(--el-transition-duration) var(--el-fast-bezier-transition);--el-md-fade-transition:transform var(--el-transition-duration) var(--el-fast-bezier-transition),opacity var(--el-transition-duration) var(--el-fast-bezier-transition);--el-fade-linear-transition:opacity var(--el-transition-duration-fast) linear;--el-border-transition-base:border-color var(--el-transition-duration-fast) var(--el-ease-in-out-bezier-function);--el-color-transition-base:color var(--el-transition-duration-fast) var(--el-ease-in-out-bezier-function)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:var(--el-fade-linear-transition);transition:var(--el-fade-linear-transition)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{-webkit-transition:var(--el-fade-linear-transition);transition:var(--el-fade-linear-transition)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{-webkit-transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1);transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1);transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:var(--el-md-fade-transition);transition:var(--el-md-fade-transition);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:var(--el-md-fade-transition);transition:var(--el-md-fade-transition);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:var(--el-md-fade-transition);transition:var(--el-md-fade-transition);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.collapse-transition{-webkit-transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out;transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{-webkit-transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out;transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter-from,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1);transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}@font-face{font-family:element-icons;src:url(/assets/element-icons.9c88a535.woff) format("woff"),url(/assets/element-icons.de5eb258.ttf) format("truetype");font-weight:400;font-display:"auto";font-style:normal}[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-ice-cream-round:before{content:""}.el-icon-ice-cream-square:before{content:""}.el-icon-lollipop:before{content:""}.el-icon-potato-strips:before{content:""}.el-icon-milk-tea:before{content:""}.el-icon-ice-drink:before{content:""}.el-icon-ice-tea:before{content:""}.el-icon-coffee:before{content:""}.el-icon-orange:before{content:""}.el-icon-pear:before{content:""}.el-icon-apple:before{content:""}.el-icon-cherry:before{content:""}.el-icon-watermelon:before{content:""}.el-icon-grape:before{content:""}.el-icon-refrigerator:before{content:""}.el-icon-goblet-square-full:before{content:""}.el-icon-goblet-square:before{content:""}.el-icon-goblet-full:before{content:""}.el-icon-goblet:before{content:""}.el-icon-cold-drink:before{content:""}.el-icon-coffee-cup:before{content:""}.el-icon-water-cup:before{content:""}.el-icon-hot-water:before{content:""}.el-icon-ice-cream:before{content:""}.el-icon-dessert:before{content:""}.el-icon-sugar:before{content:""}.el-icon-tableware:before{content:""}.el-icon-burger:before{content:""}.el-icon-knife-fork:before{content:""}.el-icon-fork-spoon:before{content:""}.el-icon-chicken:before{content:""}.el-icon-food:before{content:""}.el-icon-dish-1:before{content:""}.el-icon-dish:before{content:""}.el-icon-moon-night:before{content:""}.el-icon-moon:before{content:""}.el-icon-cloudy-and-sunny:before{content:""}.el-icon-partly-cloudy:before{content:""}.el-icon-cloudy:before{content:""}.el-icon-sunny:before{content:""}.el-icon-sunset:before{content:""}.el-icon-sunrise-1:before{content:""}.el-icon-sunrise:before{content:""}.el-icon-heavy-rain:before{content:""}.el-icon-lightning:before{content:""}.el-icon-light-rain:before{content:""}.el-icon-wind-power:before{content:""}.el-icon-baseball:before{content:""}.el-icon-soccer:before{content:""}.el-icon-football:before{content:""}.el-icon-basketball:before{content:""}.el-icon-ship:before{content:""}.el-icon-truck:before{content:""}.el-icon-bicycle:before{content:""}.el-icon-mobile-phone:before{content:""}.el-icon-service:before{content:""}.el-icon-key:before{content:""}.el-icon-unlock:before{content:""}.el-icon-lock:before{content:""}.el-icon-watch:before{content:""}.el-icon-watch-1:before{content:""}.el-icon-timer:before{content:""}.el-icon-alarm-clock:before{content:""}.el-icon-map-location:before{content:""}.el-icon-delete-location:before{content:""}.el-icon-add-location:before{content:""}.el-icon-location-information:before{content:""}.el-icon-location-outline:before{content:""}.el-icon-location:before{content:""}.el-icon-place:before{content:""}.el-icon-discover:before{content:""}.el-icon-first-aid-kit:before{content:""}.el-icon-trophy-1:before{content:""}.el-icon-trophy:before{content:""}.el-icon-medal:before{content:""}.el-icon-medal-1:before{content:""}.el-icon-stopwatch:before{content:""}.el-icon-mic:before{content:""}.el-icon-copy-document:before{content:""}.el-icon-full-screen:before{content:""}.el-icon-switch-button:before{content:""}.el-icon-aim:before{content:""}.el-icon-crop:before{content:""}.el-icon-odometer:before{content:""}.el-icon-time:before{content:""}.el-icon-bangzhu:before{content:""}.el-icon-close-notification:before{content:""}.el-icon-microphone:before{content:""}.el-icon-turn-off-microphone:before{content:""}.el-icon-position:before{content:""}.el-icon-postcard:before{content:""}.el-icon-message:before{content:""}.el-icon-chat-line-square:before{content:""}.el-icon-chat-dot-square:before{content:""}.el-icon-chat-dot-round:before{content:""}.el-icon-chat-square:before{content:""}.el-icon-chat-line-round:before{content:""}.el-icon-chat-round:before{content:""}.el-icon-set-up:before{content:""}.el-icon-turn-off:before{content:""}.el-icon-open:before{content:""}.el-icon-connection:before{content:""}.el-icon-link:before{content:""}.el-icon-cpu:before{content:""}.el-icon-thumb:before{content:""}.el-icon-female:before{content:""}.el-icon-male:before{content:""}.el-icon-guide:before{content:""}.el-icon-news:before{content:""}.el-icon-price-tag:before{content:""}.el-icon-discount:before{content:""}.el-icon-wallet:before{content:""}.el-icon-coin:before{content:""}.el-icon-money:before{content:""}.el-icon-bank-card:before{content:""}.el-icon-box:before{content:""}.el-icon-present:before{content:""}.el-icon-sell:before{content:""}.el-icon-sold-out:before{content:""}.el-icon-shopping-bag-2:before{content:""}.el-icon-shopping-bag-1:before{content:""}.el-icon-shopping-cart-2:before{content:""}.el-icon-shopping-cart-1:before{content:""}.el-icon-shopping-cart-full:before{content:""}.el-icon-smoking:before{content:""}.el-icon-no-smoking:before{content:""}.el-icon-house:before{content:""}.el-icon-table-lamp:before{content:""}.el-icon-school:before{content:""}.el-icon-office-building:before{content:""}.el-icon-toilet-paper:before{content:""}.el-icon-notebook-2:before{content:""}.el-icon-notebook-1:before{content:""}.el-icon-files:before{content:""}.el-icon-collection:before{content:""}.el-icon-receiving:before{content:""}.el-icon-suitcase-1:before{content:""}.el-icon-suitcase:before{content:""}.el-icon-film:before{content:""}.el-icon-collection-tag:before{content:""}.el-icon-data-analysis:before{content:""}.el-icon-pie-chart:before{content:""}.el-icon-data-board:before{content:""}.el-icon-data-line:before{content:""}.el-icon-reading:before{content:""}.el-icon-magic-stick:before{content:""}.el-icon-coordinate:before{content:""}.el-icon-mouse:before{content:""}.el-icon-brush:before{content:""}.el-icon-headset:before{content:""}.el-icon-umbrella:before{content:""}.el-icon-scissors:before{content:""}.el-icon-mobile:before{content:""}.el-icon-attract:before{content:""}.el-icon-monitor:before{content:""}.el-icon-search:before{content:""}.el-icon-takeaway-box:before{content:""}.el-icon-paperclip:before{content:""}.el-icon-printer:before{content:""}.el-icon-document-add:before{content:""}.el-icon-document:before{content:""}.el-icon-document-checked:before{content:""}.el-icon-document-copy:before{content:""}.el-icon-document-delete:before{content:""}.el-icon-document-remove:before{content:""}.el-icon-tickets:before{content:""}.el-icon-folder-checked:before{content:""}.el-icon-folder-delete:before{content:""}.el-icon-folder-remove:before{content:""}.el-icon-folder-add:before{content:""}.el-icon-folder-opened:before{content:""}.el-icon-folder:before{content:""}.el-icon-edit-outline:before{content:""}.el-icon-edit:before{content:""}.el-icon-date:before{content:""}.el-icon-c-scale-to-original:before{content:""}.el-icon-view:before{content:""}.el-icon-loading:before{content:""}.el-icon-rank:before{content:""}.el-icon-sort-down:before{content:""}.el-icon-sort-up:before{content:""}.el-icon-sort:before{content:""}.el-icon-finished:before{content:""}.el-icon-refresh-left:before{content:""}.el-icon-refresh-right:before{content:""}.el-icon-refresh:before{content:""}.el-icon-video-play:before{content:""}.el-icon-video-pause:before{content:""}.el-icon-d-arrow-right:before{content:""}.el-icon-d-arrow-left:before{content:""}.el-icon-arrow-up:before{content:""}.el-icon-arrow-down:before{content:""}.el-icon-arrow-right:before{content:""}.el-icon-arrow-left:before{content:""}.el-icon-top-right:before{content:""}.el-icon-top-left:before{content:""}.el-icon-top:before{content:""}.el-icon-bottom:before{content:""}.el-icon-right:before{content:""}.el-icon-back:before{content:""}.el-icon-bottom-right:before{content:""}.el-icon-bottom-left:before{content:""}.el-icon-caret-top:before{content:""}.el-icon-caret-bottom:before{content:""}.el-icon-caret-right:before{content:""}.el-icon-caret-left:before{content:""}.el-icon-d-caret:before{content:""}.el-icon-share:before{content:""}.el-icon-menu:before{content:""}.el-icon-s-grid:before{content:""}.el-icon-s-check:before{content:""}.el-icon-s-data:before{content:""}.el-icon-s-opportunity:before{content:""}.el-icon-s-custom:before{content:""}.el-icon-s-claim:before{content:""}.el-icon-s-finance:before{content:""}.el-icon-s-comment:before{content:""}.el-icon-s-flag:before{content:""}.el-icon-s-marketing:before{content:""}.el-icon-s-shop:before{content:""}.el-icon-s-open:before{content:""}.el-icon-s-management:before{content:""}.el-icon-s-ticket:before{content:""}.el-icon-s-release:before{content:""}.el-icon-s-home:before{content:""}.el-icon-s-promotion:before{content:""}.el-icon-s-operation:before{content:""}.el-icon-s-unfold:before{content:""}.el-icon-s-fold:before{content:""}.el-icon-s-platform:before{content:""}.el-icon-s-order:before{content:""}.el-icon-s-cooperation:before{content:""}.el-icon-bell:before{content:""}.el-icon-message-solid:before{content:""}.el-icon-video-camera:before{content:""}.el-icon-video-camera-solid:before{content:""}.el-icon-camera:before{content:""}.el-icon-camera-solid:before{content:""}.el-icon-download:before{content:""}.el-icon-upload2:before{content:""}.el-icon-upload:before{content:""}.el-icon-picture-outline-round:before{content:""}.el-icon-picture-outline:before{content:""}.el-icon-picture:before{content:""}.el-icon-close:before{content:""}.el-icon-check:before{content:""}.el-icon-plus:before{content:""}.el-icon-minus:before{content:""}.el-icon-help:before{content:""}.el-icon-s-help:before{content:""}.el-icon-circle-close:before{content:""}.el-icon-circle-check:before{content:""}.el-icon-circle-plus-outline:before{content:""}.el-icon-remove-outline:before{content:""}.el-icon-zoom-out:before{content:""}.el-icon-zoom-in:before{content:""}.el-icon-error:before{content:""}.el-icon-success:before{content:""}.el-icon-circle-plus:before{content:""}.el-icon-remove:before{content:""}.el-icon-info:before{content:""}.el-icon-question:before{content:""}.el-icon-warning-outline:before{content:""}.el-icon-warning:before{content:""}.el-icon-goods:before{content:""}.el-icon-s-goods:before{content:""}.el-icon-star-off:before{content:""}.el-icon-star-on:before{content:""}.el-icon-more-outline:before{content:""}.el-icon-more:before{content:""}.el-icon-phone-outline:before{content:""}.el-icon-phone:before{content:""}.el-icon-user:before{content:""}.el-icon-user-solid:before{content:""}.el-icon-setting:before{content:""}.el-icon-s-tools:before{content:""}.el-icon-delete:before{content:""}.el-icon-delete-solid:before{content:""}.el-icon-eleme:before{content:""}.el-icon-platform-eleme:before{content:""}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}a[data-v-4b23e37a]{color:#42b983}.NinjaLogo{-webkit-animation:1s appear;animation:1s appear}@-webkit-keyframes appear{0%{opacity:0}}@keyframes appear{0%{opacity:0}}.header[data-v-1f23ce5f]{height:4rem;--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity));--tw-shadow:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.header-wrapper[data-v-1f23ce5f]{margin:auto;display:flex;height:100%;width:91.666667%;max-width:64rem;align-items:center;justify-content:space-between;font-size:1.5rem;line-height:2rem;font-weight:700}/*! tailwindcss v2.2.7 | MIT License | https://tailwindcss.com *//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */*,::after,::before{box-sizing:border-box}html{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}body{font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji'}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],button{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}fieldset{margin:0;padding:0}ol,ul{list-style:none;margin:0;padding:0}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}body{font-family:inherit;line-height:inherit}*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:currentColor}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::after,::before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}#app .absolute{position:absolute}#app .z-50{z-index:50}#app .m-auto{margin:auto}#app .my-4{margin-top:1rem;margin-bottom:1rem}#app .mt-4{margin-top:1rem}#app .ml-0{margin-left:0}#app .ml-2{margin-left:.5rem}#app .flex{display:flex}#app .table{display:table}#app .hidden{display:none}#app .h-10{height:2.5rem}#app .h-16{height:4rem}#app .h-full{height:100%}#app .h-screen{height:100vh}#app .w-10{width:2.5rem}#app .w-48{width:12rem}#app .w-11\/12{width:91.666667%}#app .w-full{width:100%}#app .w-screen{width:100vw}#app .max-w-5xl{max-width:64rem}@-webkit-keyframes spin{to{transform:rotate(360deg)}}@keyframes spin{to{transform:rotate(360deg)}}@-webkit-keyframes ping{100%,75%{transform:scale(2);opacity:0}}@keyframes ping{100%,75%{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,100%{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(0.8,0,1,1);animation-timing-function:cubic-bezier(0.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,0.2,1);animation-timing-function:cubic-bezier(0,0,0.2,1)}}@keyframes bounce{0%,100%{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(0.8,0,1,1);animation-timing-function:cubic-bezier(0.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,0.2,1);animation-timing-function:cubic-bezier(0,0,0.2,1)}}#app .select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#app .flex-col{flex-direction:column}#app .items-center{align-items:center}#app .justify-center{justify-content:center}#app .justify-between{justify-content:space-between}#app .rounded-full{border-radius:9999px}#app .bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}#app .bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}#app .bg-opacity-30{--tw-bg-opacity:0.3}#app .px-2{padding-left:.5rem;padding-right:.5rem}#app .py-1{padding-top:.25rem;padding-bottom:.25rem}#app .pt-6{padding-top:1.5rem}#app .pr-2{padding-right:.5rem}#app .pb-4{padding-bottom:1rem}#app .pl-3{padding-left:.75rem}#app .text-center{text-align:center}#app .text-xs{font-size:.75rem;line-height:1rem}#app .text-base{font-size:1rem;line-height:1.5rem}#app .text-2xl{font-size:1.5rem;line-height:2rem}#app .font-normal{font-weight:400}#app .font-bold{font-weight:700}#app .leading-6{line-height:1.5rem}#app .leading-normal{line-height:1.5}#app .text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}*,::after,::before{--tw-shadow:0 0 #0000}#app .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}*,::after,::before{--tw-ring-inset:var(--tw-empty, );/*!*//*!*/--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59, 130, 246, 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000}#app .drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}#app .backdrop-filter{--tw-backdrop-blur:var(--tw-empty, );/*!*//*!*/--tw-backdrop-brightness:var(--tw-empty, );/*!*//*!*/--tw-backdrop-contrast:var(--tw-empty, );/*!*//*!*/--tw-backdrop-grayscale:var(--tw-empty, );/*!*//*!*/--tw-backdrop-hue-rotate:var(--tw-empty, );/*!*//*!*/--tw-backdrop-invert:var(--tw-empty, );/*!*//*!*/--tw-backdrop-opacity:var(--tw-empty, );/*!*//*!*/--tw-backdrop-saturate:var(--tw-empty, );/*!*//*!*/--tw-backdrop-sepia:var(--tw-empty, );/*!*//*!*/-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}#app .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}#app .transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}*,::after,::before{box-sizing:border-box;margin:0}#app{font-family:'Source Sans Pro',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:16px;word-spacing:1px;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;box-sizing:border-box;display:flex;min-height:100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex-direction:column;--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.main{flex:1 1 0%}.content{margin:auto;width:91.666667%;max-width:64rem}.card{margin:auto;margin-top:1.25rem;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity));--tw-shadow:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.card-header{border-bottom-width:1px;padding:1rem}.card-title{font-size:1.125rem;line-height:1.75rem;font-weight:500}.card-subtitle{font-size:.875rem;line-height:1.25rem;font-weight:400;--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-footer{padding-right:1rem;padding-bottom:1rem;padding-left:1rem;text-align:right}a{--tw-text-opacity:1!important;color:rgba(96,165,250,var(--tw-text-opacity))!important}
--------------------------------------------------------------------------------
/backend/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: 5.3
2 |
3 | specifiers:
4 | '@koa/cors': ^3.1.0
5 | '@koa/router': ^10.1.0
6 | axios: ^0.21.1
7 | dotenv: ^10.0.0
8 | got: ^11.8.2
9 | koa: ^2.13.1
10 | koa-body: ^4.2.0
11 | koa-log4: ^2.3.2
12 | koa-static: ^5.0.0
13 | nodemon: ^2.0.12
14 | qrcode: ^1.4.4
15 |
16 | dependencies:
17 | '@koa/cors': 3.1.0
18 | '@koa/router': 10.1.0
19 | axios: 0.21.1
20 | dotenv: 10.0.0
21 | got: 11.8.2
22 | koa: 2.13.1
23 | koa-body: 4.2.0
24 | koa-log4: 2.3.2
25 | koa-static: 5.0.0
26 | nodemon: 2.0.12
27 | qrcode: 1.4.4
28 |
29 | packages:
30 |
31 | /@koa/cors/3.1.0:
32 | resolution: {integrity: sha512-7ulRC1da/rBa6kj6P4g2aJfnET3z8Uf3SWu60cjbtxTA5g8lxRdX/Bd2P92EagGwwAhANeNw8T8if99rJliR6Q==}
33 | engines: {node: '>= 8.0.0'}
34 | dependencies:
35 | vary: 1.1.2
36 | dev: false
37 |
38 | /@koa/router/10.1.0:
39 | resolution: {integrity: sha512-QZiCDn8Fd9vVN0qCWw81fToF5GMdtyPD04fIOHXiCCmXB6sznhjHMd3xbVS2ZxrgLWrcN8s6tIItEv0wuXt2Ow==}
40 | engines: {node: '>= 8.0.0'}
41 | dependencies:
42 | debug: 4.3.2
43 | http-errors: 1.8.0
44 | koa-compose: 4.1.0
45 | methods: 1.1.2
46 | path-to-regexp: 6.2.0
47 | transitivePeerDependencies:
48 | - supports-color
49 | dev: false
50 |
51 | /@sindresorhus/is/0.14.0:
52 | resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
53 | engines: {node: '>=6'}
54 | dev: false
55 |
56 | /@sindresorhus/is/4.0.1:
57 | resolution: {integrity: sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==}
58 | engines: {node: '>=10'}
59 | dev: false
60 |
61 | /@szmarczak/http-timer/1.1.2:
62 | resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==}
63 | engines: {node: '>=6'}
64 | dependencies:
65 | defer-to-connect: 1.1.3
66 | dev: false
67 |
68 | /@szmarczak/http-timer/4.0.6:
69 | resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
70 | engines: {node: '>=10'}
71 | dependencies:
72 | defer-to-connect: 2.0.1
73 | dev: false
74 |
75 | /@types/cacheable-request/6.0.2:
76 | resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==}
77 | dependencies:
78 | '@types/http-cache-semantics': 4.0.1
79 | '@types/keyv': 3.1.2
80 | '@types/node': 16.4.3
81 | '@types/responselike': 1.0.0
82 | dev: false
83 |
84 | /@types/formidable/1.2.3:
85 | resolution: {integrity: sha512-Ibu3TyzldPvzTK1yus5+uPDwN5m6pXCcO0c0rPKA1uce5ERjqP5AX9reKEqQFVlCScqjbQgitIQEOLlb6qd7Sw==}
86 | dependencies:
87 | '@types/node': 16.4.3
88 | dev: false
89 |
90 | /@types/http-cache-semantics/4.0.1:
91 | resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
92 | dev: false
93 |
94 | /@types/keyv/3.1.2:
95 | resolution: {integrity: sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==}
96 | dependencies:
97 | '@types/node': 16.4.3
98 | dev: false
99 |
100 | /@types/node/16.4.3:
101 | resolution: {integrity: sha512-GKM4FLMkWDc0sfx7tXqPWkM6NBow1kge0fgQh0bOnlqo4iT1kvTvMEKE0c1RtUGnbLlGRXiAA8SumE//90uKAg==}
102 | dev: false
103 |
104 | /@types/responselike/1.0.0:
105 | resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
106 | dependencies:
107 | '@types/node': 16.4.3
108 | dev: false
109 |
110 | /abbrev/1.1.1:
111 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
112 | dev: false
113 |
114 | /accepts/1.3.7:
115 | resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==}
116 | engines: {node: '>= 0.6'}
117 | dependencies:
118 | mime-types: 2.1.31
119 | negotiator: 0.6.2
120 | dev: false
121 |
122 | /ansi-align/3.0.0:
123 | resolution: {integrity: sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==}
124 | dependencies:
125 | string-width: 3.1.0
126 | dev: false
127 |
128 | /ansi-regex/4.1.0:
129 | resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==}
130 | engines: {node: '>=6'}
131 | dev: false
132 |
133 | /ansi-regex/5.0.0:
134 | resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==}
135 | engines: {node: '>=8'}
136 | dev: false
137 |
138 | /ansi-styles/3.2.1:
139 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
140 | engines: {node: '>=4'}
141 | dependencies:
142 | color-convert: 1.9.3
143 | dev: false
144 |
145 | /ansi-styles/4.3.0:
146 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
147 | engines: {node: '>=8'}
148 | dependencies:
149 | color-convert: 2.0.1
150 | dev: false
151 |
152 | /any-promise/1.3.0:
153 | resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=}
154 | dev: false
155 |
156 | /anymatch/3.1.2:
157 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
158 | engines: {node: '>= 8'}
159 | dependencies:
160 | normalize-path: 3.0.0
161 | picomatch: 2.3.0
162 | dev: false
163 |
164 | /axios/0.21.1:
165 | resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==}
166 | dependencies:
167 | follow-redirects: 1.14.1
168 | transitivePeerDependencies:
169 | - debug
170 | dev: false
171 |
172 | /balanced-match/1.0.2:
173 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
174 | dev: false
175 |
176 | /base64-js/1.5.1:
177 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
178 | dev: false
179 |
180 | /binary-extensions/2.2.0:
181 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
182 | engines: {node: '>=8'}
183 | dev: false
184 |
185 | /boxen/4.2.0:
186 | resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==}
187 | engines: {node: '>=8'}
188 | dependencies:
189 | ansi-align: 3.0.0
190 | camelcase: 5.3.1
191 | chalk: 3.0.0
192 | cli-boxes: 2.2.1
193 | string-width: 4.2.2
194 | term-size: 2.2.1
195 | type-fest: 0.8.1
196 | widest-line: 3.1.0
197 | dev: false
198 |
199 | /brace-expansion/1.1.11:
200 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
201 | dependencies:
202 | balanced-match: 1.0.2
203 | concat-map: 0.0.1
204 | dev: false
205 |
206 | /braces/3.0.2:
207 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
208 | engines: {node: '>=8'}
209 | dependencies:
210 | fill-range: 7.0.1
211 | dev: false
212 |
213 | /buffer-alloc-unsafe/1.1.0:
214 | resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==}
215 | dev: false
216 |
217 | /buffer-alloc/1.2.0:
218 | resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==}
219 | dependencies:
220 | buffer-alloc-unsafe: 1.1.0
221 | buffer-fill: 1.0.0
222 | dev: false
223 |
224 | /buffer-fill/1.0.0:
225 | resolution: {integrity: sha1-+PeLdniYiO858gXNY39o5wISKyw=}
226 | dev: false
227 |
228 | /buffer-from/1.1.1:
229 | resolution: {integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==}
230 | dev: false
231 |
232 | /buffer/5.7.1:
233 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
234 | dependencies:
235 | base64-js: 1.5.1
236 | ieee754: 1.2.1
237 | dev: false
238 |
239 | /bytes/3.1.0:
240 | resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==}
241 | engines: {node: '>= 0.8'}
242 | dev: false
243 |
244 | /cache-content-type/1.0.1:
245 | resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==}
246 | engines: {node: '>= 6.0.0'}
247 | dependencies:
248 | mime-types: 2.1.31
249 | ylru: 1.2.1
250 | dev: false
251 |
252 | /cacheable-lookup/5.0.4:
253 | resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
254 | engines: {node: '>=10.6.0'}
255 | dev: false
256 |
257 | /cacheable-request/6.1.0:
258 | resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==}
259 | engines: {node: '>=8'}
260 | dependencies:
261 | clone-response: 1.0.2
262 | get-stream: 5.2.0
263 | http-cache-semantics: 4.1.0
264 | keyv: 3.1.0
265 | lowercase-keys: 2.0.0
266 | normalize-url: 4.5.1
267 | responselike: 1.0.2
268 | dev: false
269 |
270 | /cacheable-request/7.0.2:
271 | resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==}
272 | engines: {node: '>=8'}
273 | dependencies:
274 | clone-response: 1.0.2
275 | get-stream: 5.2.0
276 | http-cache-semantics: 4.1.0
277 | keyv: 4.0.3
278 | lowercase-keys: 2.0.0
279 | normalize-url: 6.1.0
280 | responselike: 2.0.0
281 | dev: false
282 |
283 | /call-bind/1.0.2:
284 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
285 | dependencies:
286 | function-bind: 1.1.1
287 | get-intrinsic: 1.1.1
288 | dev: false
289 |
290 | /camelcase/5.3.1:
291 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
292 | engines: {node: '>=6'}
293 | dev: false
294 |
295 | /chalk/3.0.0:
296 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
297 | engines: {node: '>=8'}
298 | dependencies:
299 | ansi-styles: 4.3.0
300 | supports-color: 7.2.0
301 | dev: false
302 |
303 | /chokidar/3.5.2:
304 | resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==}
305 | engines: {node: '>= 8.10.0'}
306 | dependencies:
307 | anymatch: 3.1.2
308 | braces: 3.0.2
309 | glob-parent: 5.1.2
310 | is-binary-path: 2.1.0
311 | is-glob: 4.0.1
312 | normalize-path: 3.0.0
313 | readdirp: 3.6.0
314 | optionalDependencies:
315 | fsevents: 2.3.2
316 | dev: false
317 |
318 | /ci-info/2.0.0:
319 | resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
320 | dev: false
321 |
322 | /circular-json/0.5.9:
323 | resolution: {integrity: sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==}
324 | deprecated: CircularJSON is in maintenance only, flatted is its successor.
325 | dev: false
326 |
327 | /cli-boxes/2.2.1:
328 | resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
329 | engines: {node: '>=6'}
330 | dev: false
331 |
332 | /cliui/5.0.0:
333 | resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==}
334 | dependencies:
335 | string-width: 3.1.0
336 | strip-ansi: 5.2.0
337 | wrap-ansi: 5.1.0
338 | dev: false
339 |
340 | /clone-response/1.0.2:
341 | resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=}
342 | dependencies:
343 | mimic-response: 1.0.1
344 | dev: false
345 |
346 | /co-body/5.2.0:
347 | resolution: {integrity: sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==}
348 | dependencies:
349 | inflation: 2.0.0
350 | qs: 6.10.1
351 | raw-body: 2.4.1
352 | type-is: 1.6.18
353 | dev: false
354 |
355 | /co/4.6.0:
356 | resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=}
357 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
358 | dev: false
359 |
360 | /color-convert/1.9.3:
361 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
362 | dependencies:
363 | color-name: 1.1.3
364 | dev: false
365 |
366 | /color-convert/2.0.1:
367 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
368 | engines: {node: '>=7.0.0'}
369 | dependencies:
370 | color-name: 1.1.4
371 | dev: false
372 |
373 | /color-name/1.1.3:
374 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=}
375 | dev: false
376 |
377 | /color-name/1.1.4:
378 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
379 | dev: false
380 |
381 | /concat-map/0.0.1:
382 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
383 | dev: false
384 |
385 | /configstore/5.0.1:
386 | resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==}
387 | engines: {node: '>=8'}
388 | dependencies:
389 | dot-prop: 5.3.0
390 | graceful-fs: 4.2.6
391 | make-dir: 3.1.0
392 | unique-string: 2.0.0
393 | write-file-atomic: 3.0.3
394 | xdg-basedir: 4.0.0
395 | dev: false
396 |
397 | /content-disposition/0.5.3:
398 | resolution: {integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==}
399 | engines: {node: '>= 0.6'}
400 | dependencies:
401 | safe-buffer: 5.1.2
402 | dev: false
403 |
404 | /content-type/1.0.4:
405 | resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==}
406 | engines: {node: '>= 0.6'}
407 | dev: false
408 |
409 | /cookies/0.8.0:
410 | resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==}
411 | engines: {node: '>= 0.8'}
412 | dependencies:
413 | depd: 2.0.0
414 | keygrip: 1.1.0
415 | dev: false
416 |
417 | /core-util-is/1.0.2:
418 | resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=}
419 | dev: false
420 |
421 | /crypto-random-string/2.0.0:
422 | resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
423 | engines: {node: '>=8'}
424 | dev: false
425 |
426 | /date-format/1.2.0:
427 | resolution: {integrity: sha1-YV6CjiM90aubua4JUODOzPpuytg=}
428 | engines: {node: '>=4.0'}
429 | dev: false
430 |
431 | /debug/2.6.9:
432 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
433 | dependencies:
434 | ms: 2.0.0
435 | dev: false
436 |
437 | /debug/3.1.0:
438 | resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==}
439 | dependencies:
440 | ms: 2.0.0
441 | dev: false
442 |
443 | /debug/3.2.7:
444 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
445 | dependencies:
446 | ms: 2.1.3
447 | dev: false
448 |
449 | /debug/4.3.2:
450 | resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==}
451 | engines: {node: '>=6.0'}
452 | peerDependencies:
453 | supports-color: '*'
454 | peerDependenciesMeta:
455 | supports-color:
456 | optional: true
457 | dependencies:
458 | ms: 2.1.2
459 | dev: false
460 |
461 | /decamelize/1.2.0:
462 | resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=}
463 | engines: {node: '>=0.10.0'}
464 | dev: false
465 |
466 | /decompress-response/3.3.0:
467 | resolution: {integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=}
468 | engines: {node: '>=4'}
469 | dependencies:
470 | mimic-response: 1.0.1
471 | dev: false
472 |
473 | /decompress-response/6.0.0:
474 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
475 | engines: {node: '>=10'}
476 | dependencies:
477 | mimic-response: 3.1.0
478 | dev: false
479 |
480 | /deep-equal/1.0.1:
481 | resolution: {integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=}
482 | dev: false
483 |
484 | /deep-extend/0.6.0:
485 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
486 | engines: {node: '>=4.0.0'}
487 | dev: false
488 |
489 | /defer-to-connect/1.1.3:
490 | resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==}
491 | dev: false
492 |
493 | /defer-to-connect/2.0.1:
494 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
495 | engines: {node: '>=10'}
496 | dev: false
497 |
498 | /delegates/1.0.0:
499 | resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=}
500 | dev: false
501 |
502 | /depd/1.1.2:
503 | resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=}
504 | engines: {node: '>= 0.6'}
505 | dev: false
506 |
507 | /depd/2.0.0:
508 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
509 | engines: {node: '>= 0.8'}
510 | dev: false
511 |
512 | /destroy/1.0.4:
513 | resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=}
514 | dev: false
515 |
516 | /dijkstrajs/1.0.2:
517 | resolution: {integrity: sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==}
518 | dev: false
519 |
520 | /dot-prop/5.3.0:
521 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
522 | engines: {node: '>=8'}
523 | dependencies:
524 | is-obj: 2.0.0
525 | dev: false
526 |
527 | /dotenv/10.0.0:
528 | resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==}
529 | engines: {node: '>=10'}
530 | dev: false
531 |
532 | /duplexer3/0.1.4:
533 | resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=}
534 | dev: false
535 |
536 | /ee-first/1.1.1:
537 | resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=}
538 | dev: false
539 |
540 | /emoji-regex/7.0.3:
541 | resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==}
542 | dev: false
543 |
544 | /emoji-regex/8.0.0:
545 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
546 | dev: false
547 |
548 | /encodeurl/1.0.2:
549 | resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=}
550 | engines: {node: '>= 0.8'}
551 | dev: false
552 |
553 | /end-of-stream/1.4.4:
554 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
555 | dependencies:
556 | once: 1.4.0
557 | dev: false
558 |
559 | /escape-goat/2.1.1:
560 | resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==}
561 | engines: {node: '>=8'}
562 | dev: false
563 |
564 | /escape-html/1.0.3:
565 | resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=}
566 | dev: false
567 |
568 | /fill-range/7.0.1:
569 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
570 | engines: {node: '>=8'}
571 | dependencies:
572 | to-regex-range: 5.0.1
573 | dev: false
574 |
575 | /find-up/3.0.0:
576 | resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
577 | engines: {node: '>=6'}
578 | dependencies:
579 | locate-path: 3.0.0
580 | dev: false
581 |
582 | /follow-redirects/1.14.1:
583 | resolution: {integrity: sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==}
584 | engines: {node: '>=4.0'}
585 | peerDependencies:
586 | debug: '*'
587 | peerDependenciesMeta:
588 | debug:
589 | optional: true
590 | dev: false
591 |
592 | /formidable/1.2.2:
593 | resolution: {integrity: sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==}
594 | dev: false
595 |
596 | /fresh/0.5.2:
597 | resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=}
598 | engines: {node: '>= 0.6'}
599 | dev: false
600 |
601 | /fsevents/2.3.2:
602 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
603 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
604 | os: [darwin]
605 | dev: false
606 | optional: true
607 |
608 | /function-bind/1.1.1:
609 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
610 | dev: false
611 |
612 | /get-caller-file/2.0.5:
613 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
614 | engines: {node: 6.* || 8.* || >= 10.*}
615 | dev: false
616 |
617 | /get-intrinsic/1.1.1:
618 | resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==}
619 | dependencies:
620 | function-bind: 1.1.1
621 | has: 1.0.3
622 | has-symbols: 1.0.2
623 | dev: false
624 |
625 | /get-stream/4.1.0:
626 | resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
627 | engines: {node: '>=6'}
628 | dependencies:
629 | pump: 3.0.0
630 | dev: false
631 |
632 | /get-stream/5.2.0:
633 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
634 | engines: {node: '>=8'}
635 | dependencies:
636 | pump: 3.0.0
637 | dev: false
638 |
639 | /glob-parent/5.1.2:
640 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
641 | engines: {node: '>= 6'}
642 | dependencies:
643 | is-glob: 4.0.1
644 | dev: false
645 |
646 | /global-dirs/2.1.0:
647 | resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==}
648 | engines: {node: '>=8'}
649 | dependencies:
650 | ini: 1.3.7
651 | dev: false
652 |
653 | /got/11.8.2:
654 | resolution: {integrity: sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==}
655 | engines: {node: '>=10.19.0'}
656 | dependencies:
657 | '@sindresorhus/is': 4.0.1
658 | '@szmarczak/http-timer': 4.0.6
659 | '@types/cacheable-request': 6.0.2
660 | '@types/responselike': 1.0.0
661 | cacheable-lookup: 5.0.4
662 | cacheable-request: 7.0.2
663 | decompress-response: 6.0.0
664 | http2-wrapper: 1.0.3
665 | lowercase-keys: 2.0.0
666 | p-cancelable: 2.1.1
667 | responselike: 2.0.0
668 | dev: false
669 |
670 | /got/9.6.0:
671 | resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==}
672 | engines: {node: '>=8.6'}
673 | dependencies:
674 | '@sindresorhus/is': 0.14.0
675 | '@szmarczak/http-timer': 1.1.2
676 | cacheable-request: 6.1.0
677 | decompress-response: 3.3.0
678 | duplexer3: 0.1.4
679 | get-stream: 4.1.0
680 | lowercase-keys: 1.0.1
681 | mimic-response: 1.0.1
682 | p-cancelable: 1.1.0
683 | to-readable-stream: 1.0.0
684 | url-parse-lax: 3.0.0
685 | dev: false
686 |
687 | /graceful-fs/4.2.6:
688 | resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==}
689 | dev: false
690 |
691 | /has-flag/3.0.0:
692 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=}
693 | engines: {node: '>=4'}
694 | dev: false
695 |
696 | /has-flag/4.0.0:
697 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
698 | engines: {node: '>=8'}
699 | dev: false
700 |
701 | /has-symbols/1.0.2:
702 | resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==}
703 | engines: {node: '>= 0.4'}
704 | dev: false
705 |
706 | /has-yarn/2.1.0:
707 | resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==}
708 | engines: {node: '>=8'}
709 | dev: false
710 |
711 | /has/1.0.3:
712 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
713 | engines: {node: '>= 0.4.0'}
714 | dependencies:
715 | function-bind: 1.1.1
716 | dev: false
717 |
718 | /http-assert/1.4.1:
719 | resolution: {integrity: sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==}
720 | engines: {node: '>= 0.8'}
721 | dependencies:
722 | deep-equal: 1.0.1
723 | http-errors: 1.7.3
724 | dev: false
725 |
726 | /http-cache-semantics/4.1.0:
727 | resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==}
728 | dev: false
729 |
730 | /http-errors/1.6.3:
731 | resolution: {integrity: sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=}
732 | engines: {node: '>= 0.6'}
733 | dependencies:
734 | depd: 1.1.2
735 | inherits: 2.0.3
736 | setprototypeof: 1.1.0
737 | statuses: 1.5.0
738 | dev: false
739 |
740 | /http-errors/1.7.3:
741 | resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==}
742 | engines: {node: '>= 0.6'}
743 | dependencies:
744 | depd: 1.1.2
745 | inherits: 2.0.4
746 | setprototypeof: 1.1.1
747 | statuses: 1.5.0
748 | toidentifier: 1.0.0
749 | dev: false
750 |
751 | /http-errors/1.8.0:
752 | resolution: {integrity: sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==}
753 | engines: {node: '>= 0.6'}
754 | dependencies:
755 | depd: 1.1.2
756 | inherits: 2.0.4
757 | setprototypeof: 1.2.0
758 | statuses: 1.5.0
759 | toidentifier: 1.0.0
760 | dev: false
761 |
762 | /http2-wrapper/1.0.3:
763 | resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
764 | engines: {node: '>=10.19.0'}
765 | dependencies:
766 | quick-lru: 5.1.1
767 | resolve-alpn: 1.2.0
768 | dev: false
769 |
770 | /iconv-lite/0.4.24:
771 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
772 | engines: {node: '>=0.10.0'}
773 | dependencies:
774 | safer-buffer: 2.1.2
775 | dev: false
776 |
777 | /ieee754/1.2.1:
778 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
779 | dev: false
780 |
781 | /ignore-by-default/1.0.1:
782 | resolution: {integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk=}
783 | dev: false
784 |
785 | /import-lazy/2.1.0:
786 | resolution: {integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=}
787 | engines: {node: '>=4'}
788 | dev: false
789 |
790 | /imurmurhash/0.1.4:
791 | resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=}
792 | engines: {node: '>=0.8.19'}
793 | dev: false
794 |
795 | /inflation/2.0.0:
796 | resolution: {integrity: sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=}
797 | engines: {node: '>= 0.8.0'}
798 | dev: false
799 |
800 | /inherits/2.0.3:
801 | resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=}
802 | dev: false
803 |
804 | /inherits/2.0.4:
805 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
806 | dev: false
807 |
808 | /ini/1.3.7:
809 | resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==}
810 | dev: false
811 |
812 | /ini/1.3.8:
813 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
814 | dev: false
815 |
816 | /is-binary-path/2.1.0:
817 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
818 | engines: {node: '>=8'}
819 | dependencies:
820 | binary-extensions: 2.2.0
821 | dev: false
822 |
823 | /is-ci/2.0.0:
824 | resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
825 | hasBin: true
826 | dependencies:
827 | ci-info: 2.0.0
828 | dev: false
829 |
830 | /is-extglob/2.1.1:
831 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
832 | engines: {node: '>=0.10.0'}
833 | dev: false
834 |
835 | /is-fullwidth-code-point/2.0.0:
836 | resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=}
837 | engines: {node: '>=4'}
838 | dev: false
839 |
840 | /is-fullwidth-code-point/3.0.0:
841 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
842 | engines: {node: '>=8'}
843 | dev: false
844 |
845 | /is-generator-function/1.0.9:
846 | resolution: {integrity: sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==}
847 | engines: {node: '>= 0.4'}
848 | dev: false
849 |
850 | /is-glob/4.0.1:
851 | resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==}
852 | engines: {node: '>=0.10.0'}
853 | dependencies:
854 | is-extglob: 2.1.1
855 | dev: false
856 |
857 | /is-installed-globally/0.3.2:
858 | resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==}
859 | engines: {node: '>=8'}
860 | dependencies:
861 | global-dirs: 2.1.0
862 | is-path-inside: 3.0.3
863 | dev: false
864 |
865 | /is-npm/4.0.0:
866 | resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==}
867 | engines: {node: '>=8'}
868 | dev: false
869 |
870 | /is-number/7.0.0:
871 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
872 | engines: {node: '>=0.12.0'}
873 | dev: false
874 |
875 | /is-obj/2.0.0:
876 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
877 | engines: {node: '>=8'}
878 | dev: false
879 |
880 | /is-path-inside/3.0.3:
881 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
882 | engines: {node: '>=8'}
883 | dev: false
884 |
885 | /is-typedarray/1.0.0:
886 | resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=}
887 | dev: false
888 |
889 | /is-yarn-global/0.3.0:
890 | resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==}
891 | dev: false
892 |
893 | /isarray/1.0.0:
894 | resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=}
895 | dev: false
896 |
897 | /isarray/2.0.5:
898 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
899 | dev: false
900 |
901 | /json-buffer/3.0.0:
902 | resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=}
903 | dev: false
904 |
905 | /json-buffer/3.0.1:
906 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
907 | dev: false
908 |
909 | /keygrip/1.1.0:
910 | resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==}
911 | engines: {node: '>= 0.6'}
912 | dependencies:
913 | tsscmp: 1.0.6
914 | dev: false
915 |
916 | /keyv/3.1.0:
917 | resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}
918 | dependencies:
919 | json-buffer: 3.0.0
920 | dev: false
921 |
922 | /keyv/4.0.3:
923 | resolution: {integrity: sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==}
924 | dependencies:
925 | json-buffer: 3.0.1
926 | dev: false
927 |
928 | /koa-body/4.2.0:
929 | resolution: {integrity: sha512-wdGu7b9amk4Fnk/ytH8GuWwfs4fsB5iNkY8kZPpgQVb04QZSv85T0M8reb+cJmvLE8cjPYvBzRikD3s6qz8OoA==}
930 | dependencies:
931 | '@types/formidable': 1.2.3
932 | co-body: 5.2.0
933 | formidable: 1.2.2
934 | dev: false
935 |
936 | /koa-compose/3.2.1:
937 | resolution: {integrity: sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=}
938 | dependencies:
939 | any-promise: 1.3.0
940 | dev: false
941 |
942 | /koa-compose/4.1.0:
943 | resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==}
944 | dev: false
945 |
946 | /koa-convert/1.2.0:
947 | resolution: {integrity: sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=}
948 | engines: {node: '>= 4'}
949 | dependencies:
950 | co: 4.6.0
951 | koa-compose: 3.2.1
952 | dev: false
953 |
954 | /koa-log4/2.3.2:
955 | resolution: {integrity: sha512-1RXEvN+DlMgdEsVWW2MH8vZly9KGWdqryo6jmTWuVZWSmZEH/Hfp3lZ1SCtpD9Lmvkke5i6FzQrFucYUnmwFEQ==}
956 | dependencies:
957 | log4js: 3.0.6
958 | dev: false
959 |
960 | /koa-send/5.0.1:
961 | resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==}
962 | engines: {node: '>= 8'}
963 | dependencies:
964 | debug: 4.3.2
965 | http-errors: 1.8.0
966 | resolve-path: 1.4.0
967 | transitivePeerDependencies:
968 | - supports-color
969 | dev: false
970 |
971 | /koa-static/5.0.0:
972 | resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==}
973 | engines: {node: '>= 7.6.0'}
974 | dependencies:
975 | debug: 3.2.7
976 | koa-send: 5.0.1
977 | transitivePeerDependencies:
978 | - supports-color
979 | dev: false
980 |
981 | /koa/2.13.1:
982 | resolution: {integrity: sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==}
983 | engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4}
984 | dependencies:
985 | accepts: 1.3.7
986 | cache-content-type: 1.0.1
987 | content-disposition: 0.5.3
988 | content-type: 1.0.4
989 | cookies: 0.8.0
990 | debug: 3.1.0
991 | delegates: 1.0.0
992 | depd: 2.0.0
993 | destroy: 1.0.4
994 | encodeurl: 1.0.2
995 | escape-html: 1.0.3
996 | fresh: 0.5.2
997 | http-assert: 1.4.1
998 | http-errors: 1.8.0
999 | is-generator-function: 1.0.9
1000 | koa-compose: 4.1.0
1001 | koa-convert: 1.2.0
1002 | on-finished: 2.3.0
1003 | only: 0.0.2
1004 | parseurl: 1.3.3
1005 | statuses: 1.5.0
1006 | type-is: 1.6.18
1007 | vary: 1.1.2
1008 | dev: false
1009 |
1010 | /latest-version/5.1.0:
1011 | resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==}
1012 | engines: {node: '>=8'}
1013 | dependencies:
1014 | package-json: 6.5.0
1015 | dev: false
1016 |
1017 | /locate-path/3.0.0:
1018 | resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
1019 | engines: {node: '>=6'}
1020 | dependencies:
1021 | p-locate: 3.0.0
1022 | path-exists: 3.0.0
1023 | dev: false
1024 |
1025 | /log4js/3.0.6:
1026 | resolution: {integrity: sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==}
1027 | engines: {node: '>=6.0'}
1028 | dependencies:
1029 | circular-json: 0.5.9
1030 | date-format: 1.2.0
1031 | debug: 3.2.7
1032 | rfdc: 1.3.0
1033 | streamroller: 0.7.0
1034 | dev: false
1035 |
1036 | /lowercase-keys/1.0.1:
1037 | resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
1038 | engines: {node: '>=0.10.0'}
1039 | dev: false
1040 |
1041 | /lowercase-keys/2.0.0:
1042 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
1043 | engines: {node: '>=8'}
1044 | dev: false
1045 |
1046 | /make-dir/3.1.0:
1047 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
1048 | engines: {node: '>=8'}
1049 | dependencies:
1050 | semver: 6.3.0
1051 | dev: false
1052 |
1053 | /media-typer/0.3.0:
1054 | resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=}
1055 | engines: {node: '>= 0.6'}
1056 | dev: false
1057 |
1058 | /methods/1.1.2:
1059 | resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=}
1060 | engines: {node: '>= 0.6'}
1061 | dev: false
1062 |
1063 | /mime-db/1.48.0:
1064 | resolution: {integrity: sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==}
1065 | engines: {node: '>= 0.6'}
1066 | dev: false
1067 |
1068 | /mime-types/2.1.31:
1069 | resolution: {integrity: sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==}
1070 | engines: {node: '>= 0.6'}
1071 | dependencies:
1072 | mime-db: 1.48.0
1073 | dev: false
1074 |
1075 | /mimic-response/1.0.1:
1076 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
1077 | engines: {node: '>=4'}
1078 | dev: false
1079 |
1080 | /mimic-response/3.1.0:
1081 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
1082 | engines: {node: '>=10'}
1083 | dev: false
1084 |
1085 | /minimatch/3.0.4:
1086 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==}
1087 | dependencies:
1088 | brace-expansion: 1.1.11
1089 | dev: false
1090 |
1091 | /minimist/1.2.5:
1092 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==}
1093 | dev: false
1094 |
1095 | /mkdirp/0.5.5:
1096 | resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==}
1097 | hasBin: true
1098 | dependencies:
1099 | minimist: 1.2.5
1100 | dev: false
1101 |
1102 | /ms/2.0.0:
1103 | resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=}
1104 | dev: false
1105 |
1106 | /ms/2.1.2:
1107 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1108 | dev: false
1109 |
1110 | /ms/2.1.3:
1111 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
1112 | dev: false
1113 |
1114 | /negotiator/0.6.2:
1115 | resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==}
1116 | engines: {node: '>= 0.6'}
1117 | dev: false
1118 |
1119 | /nodemon/2.0.12:
1120 | resolution: {integrity: sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==}
1121 | engines: {node: '>=8.10.0'}
1122 | hasBin: true
1123 | requiresBuild: true
1124 | dependencies:
1125 | chokidar: 3.5.2
1126 | debug: 3.2.7
1127 | ignore-by-default: 1.0.1
1128 | minimatch: 3.0.4
1129 | pstree.remy: 1.1.8
1130 | semver: 5.7.1
1131 | supports-color: 5.5.0
1132 | touch: 3.1.0
1133 | undefsafe: 2.0.3
1134 | update-notifier: 4.1.3
1135 | dev: false
1136 |
1137 | /nopt/1.0.10:
1138 | resolution: {integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=}
1139 | hasBin: true
1140 | dependencies:
1141 | abbrev: 1.1.1
1142 | dev: false
1143 |
1144 | /normalize-path/3.0.0:
1145 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1146 | engines: {node: '>=0.10.0'}
1147 | dev: false
1148 |
1149 | /normalize-url/4.5.1:
1150 | resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==}
1151 | engines: {node: '>=8'}
1152 | dev: false
1153 |
1154 | /normalize-url/6.1.0:
1155 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
1156 | engines: {node: '>=10'}
1157 | dev: false
1158 |
1159 | /object-inspect/1.11.0:
1160 | resolution: {integrity: sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==}
1161 | dev: false
1162 |
1163 | /on-finished/2.3.0:
1164 | resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=}
1165 | engines: {node: '>= 0.8'}
1166 | dependencies:
1167 | ee-first: 1.1.1
1168 | dev: false
1169 |
1170 | /once/1.4.0:
1171 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
1172 | dependencies:
1173 | wrappy: 1.0.2
1174 | dev: false
1175 |
1176 | /only/0.0.2:
1177 | resolution: {integrity: sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=}
1178 | dev: false
1179 |
1180 | /p-cancelable/1.1.0:
1181 | resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
1182 | engines: {node: '>=6'}
1183 | dev: false
1184 |
1185 | /p-cancelable/2.1.1:
1186 | resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
1187 | engines: {node: '>=8'}
1188 | dev: false
1189 |
1190 | /p-limit/2.3.0:
1191 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
1192 | engines: {node: '>=6'}
1193 | dependencies:
1194 | p-try: 2.2.0
1195 | dev: false
1196 |
1197 | /p-locate/3.0.0:
1198 | resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
1199 | engines: {node: '>=6'}
1200 | dependencies:
1201 | p-limit: 2.3.0
1202 | dev: false
1203 |
1204 | /p-try/2.2.0:
1205 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
1206 | engines: {node: '>=6'}
1207 | dev: false
1208 |
1209 | /package-json/6.5.0:
1210 | resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==}
1211 | engines: {node: '>=8'}
1212 | dependencies:
1213 | got: 9.6.0
1214 | registry-auth-token: 4.2.1
1215 | registry-url: 5.1.0
1216 | semver: 6.3.0
1217 | dev: false
1218 |
1219 | /parseurl/1.3.3:
1220 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
1221 | engines: {node: '>= 0.8'}
1222 | dev: false
1223 |
1224 | /path-exists/3.0.0:
1225 | resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=}
1226 | engines: {node: '>=4'}
1227 | dev: false
1228 |
1229 | /path-is-absolute/1.0.1:
1230 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=}
1231 | engines: {node: '>=0.10.0'}
1232 | dev: false
1233 |
1234 | /path-to-regexp/6.2.0:
1235 | resolution: {integrity: sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==}
1236 | dev: false
1237 |
1238 | /picomatch/2.3.0:
1239 | resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==}
1240 | engines: {node: '>=8.6'}
1241 | dev: false
1242 |
1243 | /pngjs/3.4.0:
1244 | resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==}
1245 | engines: {node: '>=4.0.0'}
1246 | dev: false
1247 |
1248 | /prepend-http/2.0.0:
1249 | resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=}
1250 | engines: {node: '>=4'}
1251 | dev: false
1252 |
1253 | /process-nextick-args/2.0.1:
1254 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
1255 | dev: false
1256 |
1257 | /pstree.remy/1.1.8:
1258 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
1259 | dev: false
1260 |
1261 | /pump/3.0.0:
1262 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
1263 | dependencies:
1264 | end-of-stream: 1.4.4
1265 | once: 1.4.0
1266 | dev: false
1267 |
1268 | /pupa/2.1.1:
1269 | resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==}
1270 | engines: {node: '>=8'}
1271 | dependencies:
1272 | escape-goat: 2.1.1
1273 | dev: false
1274 |
1275 | /qrcode/1.4.4:
1276 | resolution: {integrity: sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==}
1277 | engines: {node: '>=4'}
1278 | hasBin: true
1279 | dependencies:
1280 | buffer: 5.7.1
1281 | buffer-alloc: 1.2.0
1282 | buffer-from: 1.1.1
1283 | dijkstrajs: 1.0.2
1284 | isarray: 2.0.5
1285 | pngjs: 3.4.0
1286 | yargs: 13.3.2
1287 | dev: false
1288 |
1289 | /qs/6.10.1:
1290 | resolution: {integrity: sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==}
1291 | engines: {node: '>=0.6'}
1292 | dependencies:
1293 | side-channel: 1.0.4
1294 | dev: false
1295 |
1296 | /quick-lru/5.1.1:
1297 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
1298 | engines: {node: '>=10'}
1299 | dev: false
1300 |
1301 | /raw-body/2.4.1:
1302 | resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==}
1303 | engines: {node: '>= 0.8'}
1304 | dependencies:
1305 | bytes: 3.1.0
1306 | http-errors: 1.7.3
1307 | iconv-lite: 0.4.24
1308 | unpipe: 1.0.0
1309 | dev: false
1310 |
1311 | /rc/1.2.8:
1312 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
1313 | hasBin: true
1314 | dependencies:
1315 | deep-extend: 0.6.0
1316 | ini: 1.3.8
1317 | minimist: 1.2.5
1318 | strip-json-comments: 2.0.1
1319 | dev: false
1320 |
1321 | /readable-stream/2.3.7:
1322 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==}
1323 | dependencies:
1324 | core-util-is: 1.0.2
1325 | inherits: 2.0.4
1326 | isarray: 1.0.0
1327 | process-nextick-args: 2.0.1
1328 | safe-buffer: 5.1.2
1329 | string_decoder: 1.1.1
1330 | util-deprecate: 1.0.2
1331 | dev: false
1332 |
1333 | /readdirp/3.6.0:
1334 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1335 | engines: {node: '>=8.10.0'}
1336 | dependencies:
1337 | picomatch: 2.3.0
1338 | dev: false
1339 |
1340 | /registry-auth-token/4.2.1:
1341 | resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==}
1342 | engines: {node: '>=6.0.0'}
1343 | dependencies:
1344 | rc: 1.2.8
1345 | dev: false
1346 |
1347 | /registry-url/5.1.0:
1348 | resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==}
1349 | engines: {node: '>=8'}
1350 | dependencies:
1351 | rc: 1.2.8
1352 | dev: false
1353 |
1354 | /require-directory/2.1.1:
1355 | resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=}
1356 | engines: {node: '>=0.10.0'}
1357 | dev: false
1358 |
1359 | /require-main-filename/2.0.0:
1360 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
1361 | dev: false
1362 |
1363 | /resolve-alpn/1.2.0:
1364 | resolution: {integrity: sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA==}
1365 | dev: false
1366 |
1367 | /resolve-path/1.4.0:
1368 | resolution: {integrity: sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=}
1369 | engines: {node: '>= 0.8'}
1370 | dependencies:
1371 | http-errors: 1.6.3
1372 | path-is-absolute: 1.0.1
1373 | dev: false
1374 |
1375 | /responselike/1.0.2:
1376 | resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=}
1377 | dependencies:
1378 | lowercase-keys: 1.0.1
1379 | dev: false
1380 |
1381 | /responselike/2.0.0:
1382 | resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==}
1383 | dependencies:
1384 | lowercase-keys: 2.0.0
1385 | dev: false
1386 |
1387 | /rfdc/1.3.0:
1388 | resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==}
1389 | dev: false
1390 |
1391 | /safe-buffer/5.1.2:
1392 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
1393 | dev: false
1394 |
1395 | /safer-buffer/2.1.2:
1396 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
1397 | dev: false
1398 |
1399 | /semver-diff/3.1.1:
1400 | resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==}
1401 | engines: {node: '>=8'}
1402 | dependencies:
1403 | semver: 6.3.0
1404 | dev: false
1405 |
1406 | /semver/5.7.1:
1407 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
1408 | hasBin: true
1409 | dev: false
1410 |
1411 | /semver/6.3.0:
1412 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
1413 | hasBin: true
1414 | dev: false
1415 |
1416 | /set-blocking/2.0.0:
1417 | resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=}
1418 | dev: false
1419 |
1420 | /setprototypeof/1.1.0:
1421 | resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==}
1422 | dev: false
1423 |
1424 | /setprototypeof/1.1.1:
1425 | resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==}
1426 | dev: false
1427 |
1428 | /setprototypeof/1.2.0:
1429 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
1430 | dev: false
1431 |
1432 | /side-channel/1.0.4:
1433 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
1434 | dependencies:
1435 | call-bind: 1.0.2
1436 | get-intrinsic: 1.1.1
1437 | object-inspect: 1.11.0
1438 | dev: false
1439 |
1440 | /signal-exit/3.0.3:
1441 | resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==}
1442 | dev: false
1443 |
1444 | /statuses/1.5.0:
1445 | resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=}
1446 | engines: {node: '>= 0.6'}
1447 | dev: false
1448 |
1449 | /streamroller/0.7.0:
1450 | resolution: {integrity: sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==}
1451 | engines: {node: '>=0.12.0'}
1452 | dependencies:
1453 | date-format: 1.2.0
1454 | debug: 3.2.7
1455 | mkdirp: 0.5.5
1456 | readable-stream: 2.3.7
1457 | dev: false
1458 |
1459 | /string-width/3.1.0:
1460 | resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==}
1461 | engines: {node: '>=6'}
1462 | dependencies:
1463 | emoji-regex: 7.0.3
1464 | is-fullwidth-code-point: 2.0.0
1465 | strip-ansi: 5.2.0
1466 | dev: false
1467 |
1468 | /string-width/4.2.2:
1469 | resolution: {integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==}
1470 | engines: {node: '>=8'}
1471 | dependencies:
1472 | emoji-regex: 8.0.0
1473 | is-fullwidth-code-point: 3.0.0
1474 | strip-ansi: 6.0.0
1475 | dev: false
1476 |
1477 | /string_decoder/1.1.1:
1478 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
1479 | dependencies:
1480 | safe-buffer: 5.1.2
1481 | dev: false
1482 |
1483 | /strip-ansi/5.2.0:
1484 | resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
1485 | engines: {node: '>=6'}
1486 | dependencies:
1487 | ansi-regex: 4.1.0
1488 | dev: false
1489 |
1490 | /strip-ansi/6.0.0:
1491 | resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==}
1492 | engines: {node: '>=8'}
1493 | dependencies:
1494 | ansi-regex: 5.0.0
1495 | dev: false
1496 |
1497 | /strip-json-comments/2.0.1:
1498 | resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=}
1499 | engines: {node: '>=0.10.0'}
1500 | dev: false
1501 |
1502 | /supports-color/5.5.0:
1503 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
1504 | engines: {node: '>=4'}
1505 | dependencies:
1506 | has-flag: 3.0.0
1507 | dev: false
1508 |
1509 | /supports-color/7.2.0:
1510 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1511 | engines: {node: '>=8'}
1512 | dependencies:
1513 | has-flag: 4.0.0
1514 | dev: false
1515 |
1516 | /term-size/2.2.1:
1517 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
1518 | engines: {node: '>=8'}
1519 | dev: false
1520 |
1521 | /to-readable-stream/1.0.0:
1522 | resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
1523 | engines: {node: '>=6'}
1524 | dev: false
1525 |
1526 | /to-regex-range/5.0.1:
1527 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1528 | engines: {node: '>=8.0'}
1529 | dependencies:
1530 | is-number: 7.0.0
1531 | dev: false
1532 |
1533 | /toidentifier/1.0.0:
1534 | resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==}
1535 | engines: {node: '>=0.6'}
1536 | dev: false
1537 |
1538 | /touch/3.1.0:
1539 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==}
1540 | hasBin: true
1541 | dependencies:
1542 | nopt: 1.0.10
1543 | dev: false
1544 |
1545 | /tsscmp/1.0.6:
1546 | resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==}
1547 | engines: {node: '>=0.6.x'}
1548 | dev: false
1549 |
1550 | /type-fest/0.8.1:
1551 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
1552 | engines: {node: '>=8'}
1553 | dev: false
1554 |
1555 | /type-is/1.6.18:
1556 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
1557 | engines: {node: '>= 0.6'}
1558 | dependencies:
1559 | media-typer: 0.3.0
1560 | mime-types: 2.1.31
1561 | dev: false
1562 |
1563 | /typedarray-to-buffer/3.1.5:
1564 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
1565 | dependencies:
1566 | is-typedarray: 1.0.0
1567 | dev: false
1568 |
1569 | /undefsafe/2.0.3:
1570 | resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==}
1571 | dependencies:
1572 | debug: 2.6.9
1573 | dev: false
1574 |
1575 | /unique-string/2.0.0:
1576 | resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
1577 | engines: {node: '>=8'}
1578 | dependencies:
1579 | crypto-random-string: 2.0.0
1580 | dev: false
1581 |
1582 | /unpipe/1.0.0:
1583 | resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=}
1584 | engines: {node: '>= 0.8'}
1585 | dev: false
1586 |
1587 | /update-notifier/4.1.3:
1588 | resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==}
1589 | engines: {node: '>=8'}
1590 | dependencies:
1591 | boxen: 4.2.0
1592 | chalk: 3.0.0
1593 | configstore: 5.0.1
1594 | has-yarn: 2.1.0
1595 | import-lazy: 2.1.0
1596 | is-ci: 2.0.0
1597 | is-installed-globally: 0.3.2
1598 | is-npm: 4.0.0
1599 | is-yarn-global: 0.3.0
1600 | latest-version: 5.1.0
1601 | pupa: 2.1.1
1602 | semver-diff: 3.1.1
1603 | xdg-basedir: 4.0.0
1604 | dev: false
1605 |
1606 | /url-parse-lax/3.0.0:
1607 | resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=}
1608 | engines: {node: '>=4'}
1609 | dependencies:
1610 | prepend-http: 2.0.0
1611 | dev: false
1612 |
1613 | /util-deprecate/1.0.2:
1614 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=}
1615 | dev: false
1616 |
1617 | /vary/1.1.2:
1618 | resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=}
1619 | engines: {node: '>= 0.8'}
1620 | dev: false
1621 |
1622 | /which-module/2.0.0:
1623 | resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=}
1624 | dev: false
1625 |
1626 | /widest-line/3.1.0:
1627 | resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
1628 | engines: {node: '>=8'}
1629 | dependencies:
1630 | string-width: 4.2.2
1631 | dev: false
1632 |
1633 | /wrap-ansi/5.1.0:
1634 | resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==}
1635 | engines: {node: '>=6'}
1636 | dependencies:
1637 | ansi-styles: 3.2.1
1638 | string-width: 3.1.0
1639 | strip-ansi: 5.2.0
1640 | dev: false
1641 |
1642 | /wrappy/1.0.2:
1643 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=}
1644 | dev: false
1645 |
1646 | /write-file-atomic/3.0.3:
1647 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
1648 | dependencies:
1649 | imurmurhash: 0.1.4
1650 | is-typedarray: 1.0.0
1651 | signal-exit: 3.0.3
1652 | typedarray-to-buffer: 3.1.5
1653 | dev: false
1654 |
1655 | /xdg-basedir/4.0.0:
1656 | resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
1657 | engines: {node: '>=8'}
1658 | dev: false
1659 |
1660 | /y18n/4.0.3:
1661 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
1662 | dev: false
1663 |
1664 | /yargs-parser/13.1.2:
1665 | resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==}
1666 | dependencies:
1667 | camelcase: 5.3.1
1668 | decamelize: 1.2.0
1669 | dev: false
1670 |
1671 | /yargs/13.3.2:
1672 | resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==}
1673 | dependencies:
1674 | cliui: 5.0.0
1675 | find-up: 3.0.0
1676 | get-caller-file: 2.0.5
1677 | require-directory: 2.1.1
1678 | require-main-filename: 2.0.0
1679 | set-blocking: 2.0.0
1680 | string-width: 3.1.0
1681 | which-module: 2.0.0
1682 | y18n: 4.0.3
1683 | yargs-parser: 13.1.2
1684 | dev: false
1685 |
1686 | /ylru/1.2.1:
1687 | resolution: {integrity: sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==}
1688 | engines: {node: '>= 4.0.0'}
1689 | dev: false
1690 |
--------------------------------------------------------------------------------