diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..95a8418
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+/node_modules
+/.idea
+/.vscode
+/dist
+/doc
\ No newline at end of file
diff --git a/.mocharc.js b/.mocharc.js
new file mode 100644
index 0000000..bcc49aa
--- /dev/null
+++ b/.mocharc.js
@@ -0,0 +1,11 @@
+module.exports = {
+ require: [
+ 'ts-node/register',
+ ],
+ timeout: 999999,
+ exit: false,
+ spec: [
+ './test/**/*.test.ts'
+ ],
+ 'preserve-symlinks': true
+}
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..b8f0108
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,14 @@
+
+FROM node:18-alpine
+
+ENV Param sid=0
+
+ADD ./dist ./app
+
+WORKDIR /app
+
+RUN apk add tzdata
+
+RUN npm config set registry http://registry.npm.taobao.org/ && npm install pm2@5.2.2 -g
+
+CMD cd /app && sh zoeninfo.sh "Asia/Tokyo" && pm2-runtime start js_pm2.config.js -- ${Param}
diff --git a/DontShowAgainFeedbackService.xml b/DontShowAgainFeedbackService.xml
deleted file mode 100644
index be55d6c..0000000
--- a/DontShowAgainFeedbackService.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/_windows/keymap.xml b/_windows/keymap.xml
deleted file mode 100644
index 229f73d..0000000
--- a/_windows/keymap.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/advancedSettings.xml b/advancedSettings.xml
deleted file mode 100644
index cee20f8..0000000
--- a/advancedSettings.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/baseRefactoring.xml b/baseRefactoring.xml
deleted file mode 100644
index dd208be..0000000
--- a/baseRefactoring.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/codestyles/Default.xml b/codestyles/Default.xml
deleted file mode 100644
index e94f32a..0000000
--- a/codestyles/Default.xml
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/colors.scheme.xml b/colors.scheme.xml
deleted file mode 100644
index 39308cd..0000000
--- a/colors.scheme.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/debugger.xml b/debugger.xml
deleted file mode 100644
index 544ab15..0000000
--- a/debugger.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/diff.xml b/diff.xml
deleted file mode 100644
index 699b320..0000000
--- a/diff.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/editor-font.xml b/editor-font.xml
deleted file mode 100644
index 2a546c4..0000000
--- a/editor-font.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/filetypes.xml b/filetypes.xml
deleted file mode 100644
index 30aa432..0000000
--- a/filetypes.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/find.xml b/find.xml
deleted file mode 100644
index fe4d2f4..0000000
--- a/find.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
- *.xml
- *.css
- *.shtml
- *.shtm
- *.ng
- *.htm
- *.sht
- *.html
- *.mts
- *.cts
- *.ats
- *.cjs
- *.js
- *.ts
-
-
\ No newline at end of file
diff --git a/frame.md b/frame.md
new file mode 100644
index 0000000..825deab
--- /dev/null
+++ b/frame.md
@@ -0,0 +1,44 @@
+## **src**
+
+###### api_o2s
+
+* o2s -> ***任意端与服务端通信代码***
+* s2s -> ***服务端与服务端通信代码***
+
+###### api_s2c -> ***与客户端的业务逻辑交互代码***
+
+###### gameJson -> ***服务端的json配置文件***
+
+###### json -> ***与客户端的共享json配置文件,初次svn拉取项目记得svn切换至../../cehua/json***
+
+###### module -> ***mongodb与redis的数据模型***
+
+###### monopoly -> ***服务端使用类型文件***
+
+###### public -> ***服务端使用函数***
+
+###### shared -> ***客户端与服务端共享的类型文件以及函数***
+
+###### encrypt.ts -> ***数据加解密***
+
+###### extends.ts -> ***扩展npm安装的包***
+
+###### global.ts -> ***全局变量定义***
+
+###### index.ts -> ***启动脚本***
+
+###### jsonType.ts -> ***json配置文件类型提示***
+
+###### lng.ts -> ***语言包***
+
+###### localConfig.ts -> ***本地服务端配置***
+
+###### scheduler.ts -> ***定时器***
+
+###### setHttp.ts -> ***创建、初始化 http服务***
+
+###### setMongodb.ts -> ***初始化mongodb***
+
+###### setRedis.ts -> ***初始化redis***
+
+###### setWs.ts -> ***创建、初始化 websocket服务***
diff --git a/grazie_global.xml b/grazie_global.xml
deleted file mode 100644
index e34475b..0000000
--- a/grazie_global.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ide.general.xml b/ide.general.xml
deleted file mode 100644
index a4827a0..0000000
--- a/ide.general.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/js_docker_dev.js b/js_docker_dev.js
new file mode 100644
index 0000000..f9afc33
--- /dev/null
+++ b/js_docker_dev.js
@@ -0,0 +1,61 @@
+/**
+ * 执行脚本环境要求
+ * 1. aliyun cli
+ * 2. docker
+ */
+
+const { execSync } = require('child_process');
+const { argv, platform } = require('process');
+
+const imageName = argv[2];
+const tag = argv[3];
+const url = 'staging-legolas-registry.ap-northeast-1.cr.aliyuncs.com';
+const repositories = `${url}/blacklagoon/heijiaoserver`;
+
+function executeCommand(command) {
+ try {
+ const outPut = execSync(command, { stdio: 'inherit' });
+ return outPut?.toString() || '';
+ } catch (error) {
+ console.error(`Command execution failed: ${command}`)
+ console.error(error.message);
+ process.exit();
+ }
+}
+
+function buildImage() {
+ console.log('构建镜像');
+ if (platform == 'linux') executeCommand(`npm run build_docker_linux`);
+ else if (platform == 'win32') executeCommand(`npm run build_docker_win`)
+ executeCommand(`docker build -t ${imageName} .`);
+}
+
+function dockerLogin() {
+ console.log('登陆镜像仓库');
+ const region = 'ap-northeast-1';
+ const instanceId = 'cri-fe5eqsg73zl4vd4m';
+ const version = '2018-12-01';
+ const command = `aliyun cr GetAuthorizationToken --profile dev --region ${region} --InstanceId ${instanceId} --version ${version} --force`;
+ const output = execSync(command, { encoding: 'utf8' });
+ const result = JSON.parse(output);
+ const password = result.AuthorizationToken.replace(/"/g, '');
+ executeCommand(`docker login --username=cr_temp_user --password=${password} ${url}`)
+}
+
+function dockerTag() {
+ console.log('标记镜像');
+ executeCommand(`docker tag ${imageName} ${repositories}:${tag}`);
+}
+
+function dockerPush() {
+ console.log('推送镜像');
+ executeCommand(`docker push ${repositories}:${tag}`);
+}
+
+if (!imageName) return console.error('imageName is null');
+if (!tag) return console.error('tag is null');
+
+buildImage();
+dockerLogin();
+dockerTag();
+dockerPush();
diff --git a/js_docker_prod.js b/js_docker_prod.js
new file mode 100644
index 0000000..6920e3c
--- /dev/null
+++ b/js_docker_prod.js
@@ -0,0 +1,61 @@
+/**
+ * 执行脚本环境要求
+ * 1. aliyun cli
+ * 2. docker
+ */
+
+const { execSync } = require('child_process');
+const { argv, platform } = require('process');
+
+const imageName = argv[2];
+const tag = argv[3];
+const url = 'production-legolas-registry.ap-northeast-1.cr.aliyuncs.com';
+const repositories = `${url}/blacklagoon/heijiao-server`;
+
+function executeCommand(command) {
+ try {
+ const outPut = execSync(command, { stdio: 'inherit' });
+ return outPut?.toString() || '';
+ } catch (error) {
+ console.error(`Command execution failed: ${command}`)
+ console.error(error.message);
+ process.exit();
+ }
+}
+
+function buildImage() {
+ console.log('构建镜像');
+ if (platform == 'linux') executeCommand(`npm run build_docker_linux`);
+ else if (platform == 'win32') executeCommand(`npm run build_docker_win`)
+ executeCommand(`docker build -t ${imageName} .`);
+}
+
+function dockerLogin() {
+ console.log('登陆镜像仓库');
+ const region = 'ap-northeast-1';
+ const instanceId = 'cri-azy285s79zw3ti5v';
+ const version = '2018-12-01';
+ const command = `aliyun cr GetAuthorizationToken --profile prod --region ${region} --InstanceId ${instanceId} --version ${version} --force`;
+ const output = execSync(command, { encoding: 'utf8' });
+ const result = JSON.parse(output);
+ const password = result.AuthorizationToken.replace(/"/g, '');
+ executeCommand(`docker login --username=cr_temp_user --password=${password} ${url}`)
+}
+
+function dockerTag() {
+ console.log('标记镜像');
+ executeCommand(`docker tag ${imageName} ${repositories}:${tag}`);
+}
+
+function dockerPush() {
+ console.log('推送镜像');
+ executeCommand(`docker push ${repositories}:${tag}`);
+}
+
+if (!imageName) return console.error('imageName is null');
+if (!tag) return console.error('tag is null');
+
+buildImage();
+dockerLogin();
+dockerTag();
+dockerPush();
diff --git a/js_jsonType.js b/js_jsonType.js
new file mode 100644
index 0000000..10b36c3
--- /dev/null
+++ b/js_jsonType.js
@@ -0,0 +1,20 @@
+var fs = require('fs');
+var path = require('path');
+var shell = require('child_process');
+
+shell.execSync(`svn up ${path.join(__dirname, '../cehua')}`);
+shell.exec(`node ${path.join(__dirname, '../cehua/_creatJsonType.js')} ${path.join(__dirname, 'src/gamejson')}`, (err, stdout, stderr) => {
+ if (stdout) {
+
+ fs.writeFileSync('src/jsonType.ts', stdout + `
+
+declare global {
+ type _gcType = gcType;
+}
+
+export function initGcType () {
+
+}
+ `);
+ }
+});
\ No newline at end of file
diff --git a/js_pm2.config.js b/js_pm2.config.js
new file mode 100644
index 0000000..9dee1a0
--- /dev/null
+++ b/js_pm2.config.js
@@ -0,0 +1,85 @@
+const fs = require('fs');
+const os = require('os');
+const path = require('path');
+const {env} = require('process');
+const request = require('sync-request');
+
+console.log('服务端环境变量 ', env.SERVER_ID, env.SERVER_TYPE);
+
+if (env.SERVER_ID) {
+ let type = env.SERVER_TYPE || 'game';
+ let url = `http://server-tool:7456/server/getConfig?sid=${env.SERVER_ID}&type=${type}`
+ console.log('拉取服务端启动配置文件', url);
+
+ let res = request('GET', url, {
+ headers: {
+ 'content-type': 'application/json'
+ }
+ });
+
+ const body = JSON.parse(res.body.toString());
+ if (body) {
+ fs.writeFileSync('config.json', JSON.stringify(body, null, 2));
+ console.log('服务端配置: ', body);
+ } else {
+ console.log('拉取失败');
+ }
+}
+
+//读取服务配置
+const config = fs.existsSync(path.resolve(__dirname, 'config.json')) ? JSON.parse(fs.readFileSync(path.resolve(__dirname, 'config.json'), 'utf-8')) : {};
+const dis = config.serverId != undefined ? config.serverId : '0';
+const localApps = [
+ {
+ // 应用程序名称
+ name: 'heijiao_msg_s' + dis,
+ // 执行文件
+ script: 'index.js',
+ // 应用程序所在的目录
+ cwd: './',
+ //集群实例数量,0表示根据cpu核心数自动控制
+ instances: 8,
+ // 传递给脚本的参数
+ args: '-serverType msg',
+ // 是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。
+ watch: false,
+ // 不用监听的文件
+ ignore_watch: [
+ 'logs'
+ ],
+ // 自定义应用程序的错误日志文件(错误日志文件)
+ error_file: './logs/errMsg.log',
+ // 自定义应用程序日志文件(正常日志文件)
+ out_file: './logs/outMsg.log',
+ // 指定日志文件的时间格式
+ log_date_format: 'YYYY-MM-DD HH:mm:ss',
+ }
+];
+const crossApps = [
+ {
+ // 应用程序名称
+ name: 'heijiao_cross_s' + dis,
+ // 执行文件
+ script: 'index.js',
+ // 应用程序所在的目录
+ cwd: './',
+ // 传递给脚本的参数
+ args: '-serverType cross',
+ // 是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。
+ watch: false,
+ // 不用监听的文件
+ ignore_watch: [
+ 'logs'
+ ],
+ // 自定义应用程序的错误日志文件(错误日志文件)
+ error_file: './logs/errCross.log',
+ // 自定义应用程序日志文件(正常日志文件)
+ out_file: './logs/outCross.log',
+ // 指定日志文件的时间格式
+ log_date_format: 'YYYY-MM-DD HH:mm:ss',
+ }
+]
+
+module.exports = {
+ apps: config.type == 'cross' ? crossApps : localApps
+}
\ No newline at end of file
diff --git a/js_uploadDoc.js b/js_uploadDoc.js
new file mode 100644
index 0000000..be36d8c
--- /dev/null
+++ b/js_uploadDoc.js
@@ -0,0 +1,128 @@
+const fs = require('fs');
+const ftp = require('ftp');
+const path = require('path');
+const client = new ftp();
+
+function changeMD(url) {
+ var str = ''
+ if (url.indexOf('s2c') != -1) {
+ str = `
+## [返回上一级](README.md)
+
+## 目录
+
+ `
+ } else if (url.indexOf('s2o') != -1) {
+ str = `
+## [返回上一级](README.md)
+## 通用说明
+
+- 所有请求方法均为 \`POST\`
+- 所有请求均需加入以下 Header :
+ - \`Content-Type: application/json\`
+- 调用api的格式为:
+ - \`url: http://{ip}:{port}{path}\`
+ - \`body: 对应api的请求类型\`
+ - \`加密方式: 联系该项目的后端获取\`
+- 返回值统一为:
+ - 请求参数校验不成功返回:
+ - \`data error 字符串\`
+ - 请求参数校验成功:
+ {
+ /**请求是否成功 */
+ isSucc: boolean;
+ /**请求的返回值 对应调用api的响应值*/
+ res?: any;
+ /**请求返回的错误信息*/
+ err?: any;
+ }
+- 以向玩家发送邮件为例:
+
+ 
+ 
+
+## 目录
+ `
+ }
+
+ let file = fs.readFileSync(url, 'utf-8');
+ file = file.replace(/^# TSRPC API 接口文档(.|\n)*^## 目录/gm, str);
+ fs.writeFileSync(url, file);
+}
+
+changeMD('doc/s2c/tsapi.md');
+changeMD('doc/s2o/tsapi.md');
+
+client.on('ready', async () => {
+ console.log('ftp client is ready');
+
+ await cd('document/serverDoc/doc/heijiao');
+ let { err, files } = await list();
+ console.log(files);
+ for (let file of files) {
+ await del(file.name)
+ }
+ await put('doc/s2c/tsapi.md', 's2c.md');
+ await put('doc/s2o/tsapi.md', 's2o.md');
+
+ client.destroy();
+});
+
+client.on('close', () => {
+ console.log('ftp client has close')
+});
+
+client.on('end', () => {
+ console.log('ftp client has end')
+});
+
+client.on('error', (err) => {
+ console.log('ftp client has an error : ' + JSON.stringify(err))
+});
+
+client.connect({
+ host: '10.0.1.20',
+ port: '21',
+ user: 'administrator',
+ password: 'a123456789.',
+ keepalive: 1000
+});
+
+//列出目标目录
+async function list() {
+ return new Promise((resolve, reject) => {
+ client.list((err, files) => {
+ resolve({ err: err, files: files });
+ })
+ });
+}
+
+//切换目录
+async function cd(dirPath) {
+ return new Promise(res => {
+ client.cwd(dirPath, (err, dir) => {
+ res({ err: err, dir: dir })
+ })
+ });
+}
+
+//删除
+async function del(path) {
+ return new Promise(res => {
+ client.rmdir(path, (err, dir) => {
+
+ res({ err: err, dir: dir })
+ })
+ });
+}
+
+//将文件上传到ftp目标地址
+async function put(currentFile, targetFilePath) {
+ const rs = fs.createReadStream(currentFile);
+
+ return new Promise((resolve, reject) => {
+ client.put(rs, targetFilePath, (err) => {
+ resolve({ err: err });
+ })
+ });
+}
\ No newline at end of file
diff --git a/keymaps/Windows.xml b/keymaps/Windows.xml
deleted file mode 100644
index ff86be3..0000000
--- a/keymaps/Windows.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/laf.xml b/laf.xml
deleted file mode 100644
index d78e667..0000000
--- a/laf.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/nodejs.xml b/nodejs.xml
deleted file mode 100644
index 0fdfcbf..0000000
--- a/nodejs.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..1043838
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,8076 @@
+{
+ "name": "server-.",
+ "version": "0.1.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "server-.",
+ "version": "0.1.0",
+ "dependencies": {
+ "axios": "^1.4.0",
+ "crypto-js": "^4.1.1",
+ "express": "^4.18.2",
+ "json5": "^2.2.3",
+ "mathjs": "^11.4.0",
+ "mongodb": "^4.11.0",
+ "redis": "^4.3.1",
+ "shelljs": "^0.8.5",
+ "sync-request": "^6.1.0",
+ "tsrpc": "^3.4.12",
+ "xlsx": "^0.18.5"
+ },
+ "devDependencies": {
+ "@types/crypto-js": "^4.1.1",
+ "@types/json5": "^2.2.0",
+ "@types/mathjs": "^9.4.2",
+ "@types/mocha": "^8.2.3",
+ "@types/mongodb": "^4.0.7",
+ "@types/node": "^15.14.9",
+ "@types/redis": "^4.0.11",
+ "ftp": "^0.3.10",
+ "mocha": "^9.2.2",
+ "onchange": "^7.1.0",
+ "ts-node": "^10.9.1",
+ "tsrpc-cli": "^2.4.5",
+ "typescript": "^4.8.4"
+ }
+ },
+ "node_modules/@aws-crypto/ie11-detection": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz",
+ "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ },
+ "node_modules/@aws-crypto/sha256-browser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
+ "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.0",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ },
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
+ "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-js/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ },
+ "node_modules/@aws-crypto/supports-web-crypto": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz",
+ "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ },
+ "node_modules/@aws-crypto/util": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz",
+ "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "^3.110.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/util/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/abort-controller": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.193.0.tgz",
+ "integrity": "sha512-MYPBm5PWyKP+Tq37mKs5wDbyAyVMocF5iYmx738LYXBSj8A1V4LTFrvfd4U16BRC/sM0DYB9fBFJUQ9ISFRVYw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cognito-identity": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.194.0.tgz",
+ "integrity": "sha512-khDgkrrSC/2PFN7Sb8sUsvt6QTsU3s9vcizFULWc8H5OO58tTdzkoKuAa5XMVbSRQnnl6iQ4uv6bBglCC+OfSw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/client-sts": "3.194.0",
+ "@aws-sdk/config-resolver": "3.193.0",
+ "@aws-sdk/credential-provider-node": "3.193.0",
+ "@aws-sdk/fetch-http-handler": "3.193.0",
+ "@aws-sdk/hash-node": "3.193.0",
+ "@aws-sdk/invalid-dependency": "3.193.0",
+ "@aws-sdk/middleware-content-length": "3.193.0",
+ "@aws-sdk/middleware-host-header": "3.193.0",
+ "@aws-sdk/middleware-logger": "3.193.0",
+ "@aws-sdk/middleware-recursion-detection": "3.193.0",
+ "@aws-sdk/middleware-retry": "3.193.0",
+ "@aws-sdk/middleware-serde": "3.193.0",
+ "@aws-sdk/middleware-signing": "3.193.0",
+ "@aws-sdk/middleware-stack": "3.193.0",
+ "@aws-sdk/middleware-user-agent": "3.193.0",
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/node-http-handler": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/smithy-client": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "@aws-sdk/util-base64-browser": "3.188.0",
+ "@aws-sdk/util-base64-node": "3.188.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.188.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.193.0",
+ "@aws-sdk/util-defaults-mode-node": "3.193.0",
+ "@aws-sdk/util-user-agent-browser": "3.193.0",
+ "@aws-sdk/util-user-agent-node": "3.193.0",
+ "@aws-sdk/util-utf8-browser": "3.188.0",
+ "@aws-sdk/util-utf8-node": "3.188.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.193.0.tgz",
+ "integrity": "sha512-NxDckym95mtimYp9uWRA1lcyJHDyS8OZEaDC+dZ/tt5wGyPoc3ftHZNWDLzZM1PUjzgo+XzjMBVkWMvk/SRSYw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/config-resolver": "3.193.0",
+ "@aws-sdk/fetch-http-handler": "3.193.0",
+ "@aws-sdk/hash-node": "3.193.0",
+ "@aws-sdk/invalid-dependency": "3.193.0",
+ "@aws-sdk/middleware-content-length": "3.193.0",
+ "@aws-sdk/middleware-host-header": "3.193.0",
+ "@aws-sdk/middleware-logger": "3.193.0",
+ "@aws-sdk/middleware-recursion-detection": "3.193.0",
+ "@aws-sdk/middleware-retry": "3.193.0",
+ "@aws-sdk/middleware-serde": "3.193.0",
+ "@aws-sdk/middleware-stack": "3.193.0",
+ "@aws-sdk/middleware-user-agent": "3.193.0",
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/node-http-handler": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/smithy-client": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "@aws-sdk/util-base64-browser": "3.188.0",
+ "@aws-sdk/util-base64-node": "3.188.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.188.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.193.0",
+ "@aws-sdk/util-defaults-mode-node": "3.193.0",
+ "@aws-sdk/util-user-agent-browser": "3.193.0",
+ "@aws-sdk/util-user-agent-node": "3.193.0",
+ "@aws-sdk/util-utf8-browser": "3.188.0",
+ "@aws-sdk/util-utf8-node": "3.188.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sts": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.194.0.tgz",
+ "integrity": "sha512-duolI7KLvRLMrL0ZpiVvmhaC5stKcNp5tfJ7gUW24tyf+7ImAmk2odSMIgcq54EWQ3XppTKBhEGCjOJ9th7+Qg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/config-resolver": "3.193.0",
+ "@aws-sdk/credential-provider-node": "3.193.0",
+ "@aws-sdk/fetch-http-handler": "3.193.0",
+ "@aws-sdk/hash-node": "3.193.0",
+ "@aws-sdk/invalid-dependency": "3.193.0",
+ "@aws-sdk/middleware-content-length": "3.193.0",
+ "@aws-sdk/middleware-endpoint": "3.193.0",
+ "@aws-sdk/middleware-host-header": "3.193.0",
+ "@aws-sdk/middleware-logger": "3.193.0",
+ "@aws-sdk/middleware-recursion-detection": "3.193.0",
+ "@aws-sdk/middleware-retry": "3.193.0",
+ "@aws-sdk/middleware-sdk-sts": "3.193.0",
+ "@aws-sdk/middleware-serde": "3.193.0",
+ "@aws-sdk/middleware-signing": "3.193.0",
+ "@aws-sdk/middleware-stack": "3.193.0",
+ "@aws-sdk/middleware-user-agent": "3.193.0",
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/node-http-handler": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/smithy-client": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "@aws-sdk/util-base64-browser": "3.188.0",
+ "@aws-sdk/util-base64-node": "3.188.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.188.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.193.0",
+ "@aws-sdk/util-defaults-mode-node": "3.193.0",
+ "@aws-sdk/util-endpoints": "3.194.0",
+ "@aws-sdk/util-user-agent-browser": "3.193.0",
+ "@aws-sdk/util-user-agent-node": "3.193.0",
+ "@aws-sdk/util-utf8-browser": "3.188.0",
+ "@aws-sdk/util-utf8-node": "3.188.0",
+ "fast-xml-parser": "4.0.11",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/config-resolver": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.193.0.tgz",
+ "integrity": "sha512-HIjuv2A1glgkXy9g/A8bfsiz3jTFaRbwGZheoHFZod6iEQQEbbeAsBe3u2AZyzOrVLgs8lOvBtgU8XKSJWjDkw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/signature-v4": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-config-provider": "3.188.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-cognito-identity": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.194.0.tgz",
+ "integrity": "sha512-AAtnTap4SS0aDuLB8NsWuvAkbaCX8kh6QG+S4+hziPq3+OZtYq34QM8j52ojGyB99VU4dhJmxoExMayLOSTIJg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/client-cognito-identity": "3.194.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.193.0.tgz",
+ "integrity": "sha512-pRqZoIaqCdWB4JJdR6DqDn3u+CwKJchwiCPnRtChwC8KXCMkT4njq9J1bWG3imYeTxP/G06O1PDONEuD4pPtNQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-imds": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.193.0.tgz",
+ "integrity": "sha512-jC7uT7uVpO/iitz49toHMGFKXQ2igWQQG2SKirREqDRaz5HSXwEP1V3rcOlNNyGIBPMggDjZnxYgJHqBXSq9Ag==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.193.0.tgz",
+ "integrity": "sha512-JQ4tyeLjwsa9Jo95yTrLgFFspAP5GwaZDqDJArG98waKDzxhl7FeBs+N32+oux6WB7RKRB0svOK02nnoWnrjVg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.193.0",
+ "@aws-sdk/credential-provider-imds": "3.193.0",
+ "@aws-sdk/credential-provider-sso": "3.193.0",
+ "@aws-sdk/credential-provider-web-identity": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.193.0.tgz",
+ "integrity": "sha512-2E8yWVw1vLb6IumZxA0w4mes759YSCTHLdfp5nMBpn+d+Otz26mczKSe7xr7AaVONq+/sVPUl2GfTFTWM4B0eA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.193.0",
+ "@aws-sdk/credential-provider-imds": "3.193.0",
+ "@aws-sdk/credential-provider-ini": "3.193.0",
+ "@aws-sdk/credential-provider-process": "3.193.0",
+ "@aws-sdk/credential-provider-sso": "3.193.0",
+ "@aws-sdk/credential-provider-web-identity": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.193.0.tgz",
+ "integrity": "sha512-zpXxtQzQqkaUuFqmHW9dSkh9p/1k+XNKlwEkG8FTwAJNUWmy2ZMJv+8NTVn4s4vaRu7xJ1er9chspYr7mvxHlA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.193.0.tgz",
+ "integrity": "sha512-jBFWreNFZUgnGyCkpxDGf+LrXTuzEfjYkJYti1HnnsUF4vF0PsVZS6/FQi1mDl3pqorrtgknI59ENnAhKVxtBg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.193.0.tgz",
+ "integrity": "sha512-MIQY9KwLCBnRyIt7an4EtMrFQZz2HC1E8vQDdKVzmeQBBePhW61fnX9XDP9bfc3Ypg1NggLG00KBPEC88twLFg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-providers": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.194.0.tgz",
+ "integrity": "sha512-pEwhG/W5Y/sEItXu3ulpuq3+nl9M3PDHzgtDfKbtvO8Mfhd8EucmHbTGHIcHdUow44E94tGIbxsnt239e9m/yg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/client-cognito-identity": "3.194.0",
+ "@aws-sdk/client-sso": "3.193.0",
+ "@aws-sdk/client-sts": "3.194.0",
+ "@aws-sdk/credential-provider-cognito-identity": "3.194.0",
+ "@aws-sdk/credential-provider-env": "3.193.0",
+ "@aws-sdk/credential-provider-imds": "3.193.0",
+ "@aws-sdk/credential-provider-ini": "3.193.0",
+ "@aws-sdk/credential-provider-node": "3.193.0",
+ "@aws-sdk/credential-provider-process": "3.193.0",
+ "@aws-sdk/credential-provider-sso": "3.193.0",
+ "@aws-sdk/credential-provider-web-identity": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/fetch-http-handler": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.193.0.tgz",
+ "integrity": "sha512-UhIS2LtCK9hqBzYVon6BI8WebJW1KC0GGIL/Gse5bqzU9iAGgFLAe66qg9k+/h3Jjc5LNAYzqXNVizMwn7689Q==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/querystring-builder": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-base64-browser": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/hash-node": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.193.0.tgz",
+ "integrity": "sha512-O2SLPVBjrCUo+4ouAdRUoHBYsyurO9LcjNZNYD7YQOotBTbVFA3cx7kTZu+K4B6kX7FDaGbqbE1C/T1/eg/r+w==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-buffer-from": "3.188.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/invalid-dependency": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.193.0.tgz",
+ "integrity": "sha512-54DCknekLwJAI1os76XJ8XCzfAH7BGkBGtlWk5WCNkZTfj3rf5RUiXz4uoKUMWE1rZmyMDoDDS1PBo+yTVKW5w==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/is-array-buffer": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.188.0.tgz",
+ "integrity": "sha512-n69N4zJZCNd87Rf4NzufPzhactUeM877Y0Tp/F3KiHqGeTnVjYUa4Lv1vLBjqtfjYb2HWT3NKlYn5yzrhaEwiQ==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-content-length": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.193.0.tgz",
+ "integrity": "sha512-em0Sqo7O7DFOcVXU460pbcYuIjblDTZqK2YE62nQ0T+5Nbj+MSjuoite+rRRdRww9VqBkUROGKON45bUNjogtQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-endpoint": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.193.0.tgz",
+ "integrity": "sha512-Inbpt7jcHGvzF7UOJOCxx9wih0+eAQYERikokidWJa7M405EJpVYq1mGbeOcQUPANU3uWF1AObmUUFhbkriHQw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/middleware-serde": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/signature-v4": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "@aws-sdk/util-config-provider": "3.188.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.193.0.tgz",
+ "integrity": "sha512-aegzj5oRWd//lmfmkzRmgG2b4l3140v8Ey4QkqCxcowvAEX5a7rh23yuKaGtmiePwv2RQalCKz+tN6JXCm8g6Q==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.193.0.tgz",
+ "integrity": "sha512-D/h1pU5tAcyJpJ8ZeD1Sta0S9QZPcxERYRBiJdEl8VUrYwfy3Cl1WJedVOmd5nG73ZLRSyHeXHewb/ohge3yKQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.193.0.tgz",
+ "integrity": "sha512-fMWP76Q1GOb/9OzS1arizm6Dbfo02DPZ6xp7OoAN3PS6ybH3Eb47s/gP3jzgBPAITQacFj4St/4a06YWYrN3NA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-retry": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.193.0.tgz",
+ "integrity": "sha512-zTQkHLBQBJi6ns655WYcYLyLPc1tgbEYU080Oc8zlveLUqoDn1ogkcmNhG7XMeQuBvWZBYN7J3/wFaXlDzeCKg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/service-error-classification": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "tslib": "^2.3.1",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-sts": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.193.0.tgz",
+ "integrity": "sha512-TafiDkeflUsnbNa89TLkDnAiRRp1gAaZLDAjt75AzriRKZnhtFfYUXWb+qAuN50T+CkJ/gZI9LHDZL5ogz/HxQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/middleware-signing": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/signature-v4": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-serde": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.193.0.tgz",
+ "integrity": "sha512-dH93EJYVztY+ZDPzSMRi9LfAZfKO+luH62raNy49hlNa4jiyE1Tc/+qwlmOEpfGsrtcZ9TgsON1uFF9sgBXXaA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-signing": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.193.0.tgz",
+ "integrity": "sha512-obBoELGPf5ikvHYZwbzllLeuODiokdDfe92Ve2ufeOa/d8+xsmbqNzNdCTLNNTmr1tEIaEE7ngZVTOiHqAVhyw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/signature-v4": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-stack": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.193.0.tgz",
+ "integrity": "sha512-Ix5d7gE6bZwFNIVf0dGnjYuymz1gjitNoAZDPpv1nEZlUMek/jcno5lmzWFzUZXY/azpbIyaPwq/wm/c69au5A==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.193.0.tgz",
+ "integrity": "sha512-0vT6F9NwYQK7ARUUJeHTUIUPnupsO3IbmjHSi1+clkssFlJm2UfmSGeafiWe4AYH3anATTvZEtcxX5DZT/ExbA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/node-config-provider": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.193.0.tgz",
+ "integrity": "sha512-5RLdjQLH69ISRG8TX9klSLOpEySXxj+z9E9Em39HRvw0/rDcd8poCTADvjYIOqRVvMka0z/hm+elvUTIVn/DRw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/node-http-handler": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.193.0.tgz",
+ "integrity": "sha512-DP4BmFw64HOShgpAPEEMZedVnRmKKjHOwMEoXcnNlAkMXnYUFHiKvudYq87Q2AnSlT6OHkyMviB61gEvIk73dA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/abort-controller": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/querystring-builder": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/property-provider": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.193.0.tgz",
+ "integrity": "sha512-IaDR/PdZjKlAeSq2E/6u6nkPsZF9wvhHZckwH7uumq4ocWsWXFzaT+hKpV4YZPHx9n+K2YV4Gn/bDedpz99W1Q==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/protocol-http": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.193.0.tgz",
+ "integrity": "sha512-r0wbTwFJyXq0uiImI6giqG3g/RO1N/y4wwPA7qr7OC+KXJ0NkyVxIf6e7Vx8h06aM1ATtngbwJaMP59kVCp85A==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/querystring-builder": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.193.0.tgz",
+ "integrity": "sha512-PRaK6649iw0UO45UjUoiUzFcOKXZb8pMjjFJpqALpEvdZT3twxqhlPXujT7GWPKrSwO4uPLNnyYEtPY82wx2vw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-uri-escape": "3.188.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/querystring-parser": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.193.0.tgz",
+ "integrity": "sha512-dGEPCe8SK4/td5dSpiaEI3SvT5eHXrbJWbLGyD4FL3n7WCGMy2xVWAB/yrgzD0GdLDjDa8L5vLVz6yT1P9i+hA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/service-error-classification": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.193.0.tgz",
+ "integrity": "sha512-bPnXVu8ErE1RfWVVQKc2TE7EuoImUi4dSPW9g80fGRzJdQNwXb636C+7OUuWvSDzmFwuBYqZza8GZjVd+rz2zQ==",
+ "optional": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/shared-ini-file-loader": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.193.0.tgz",
+ "integrity": "sha512-hnvZup8RSpFXfah7Rrn6+lQJnAOCO+OiDJ2R/iMgZQh475GRQpLbu3cPhCOkjB14vVLygJtW8trK/0+zKq93bQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/signature-v4": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.193.0.tgz",
+ "integrity": "sha512-JEqqOB8wQZz6g1ERNUOIBFDFt8OJtz5G5Uh1CdkS5W66gyWnJEz/dE1hA2VTqqQwHGGEsIEV/hlzruU1lXsvFA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/is-array-buffer": "3.188.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-hex-encoding": "3.188.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "@aws-sdk/util-uri-escape": "3.188.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/smithy-client": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.193.0.tgz",
+ "integrity": "sha512-BY0jhfW76vyXr7ODMaKO3eyS98RSrZgOMl6DTQV9sk7eFP/MPVlG7p7nfX/CDIgPBIO1z0A0i2CVIzYur9uGgQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/middleware-stack": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/types": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.193.0.tgz",
+ "integrity": "sha512-LV/wcPolRZKORrcHwkH59QMCkiDR5sM+9ZtuTxvyUGG2QFW/kjoxs08fUF10OWNJMrotBI+czDc5QJRgN8BlAw==",
+ "optional": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/url-parser": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.193.0.tgz",
+ "integrity": "sha512-hwD1koJlOu2a6GvaSbNbdo7I6a3tmrsNTZr8bCjAcbqpc5pDThcpnl/Uaz3zHmMPs92U8I6BvWoK6pH8By06qw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/querystring-parser": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-base64-browser": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz",
+ "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-base64-node": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.188.0.tgz",
+ "integrity": "sha512-r1dccRsRjKq+OhVRUfqFiW3sGgZBjHbMeHLbrAs9jrOjU2PTQ8PSzAXLvX/9lmp7YjmX17Qvlsg0NCr1tbB9OA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/util-buffer-from": "3.188.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-body-length-browser": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+ "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-body-length-node": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.188.0.tgz",
+ "integrity": "sha512-XwqP3vxk60MKp4YDdvDeCD6BPOiG2e+/Ou4AofZOy5/toB6NKz2pFNibQIUg2+jc7mPMnGnvOW3MQEgSJ+gu/Q==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-buffer-from": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.188.0.tgz",
+ "integrity": "sha512-NX1WXZ8TH20IZb4jPFT2CnLKSqZWddGxtfiWxD9M47YOtq/SSQeR82fhqqVjJn4P8w2F5E28f+Du4ntg/sGcxA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/is-array-buffer": "3.188.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-config-provider": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.188.0.tgz",
+ "integrity": "sha512-LBA7tLbi7v4uvbOJhSnjJrxbcRifKK/1ZVK94JTV2MNSCCyNkFotyEI5UWDl10YKriTIUyf7o5cakpiDZ3O4xg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-browser": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.193.0.tgz",
+ "integrity": "sha512-9riQKFrSJcsNAMnPA/3ltpSxNykeO20klE/UKjxEoD7UWjxLwsPK22UJjFwMRaHoAFcZD0LU/SgPxbC0ktCYCg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-node": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.193.0.tgz",
+ "integrity": "sha512-occQmckvPRiM4YQIZnulfKKKjykGKWloa5ByGC5gOEGlyeP9zJpfs4zc/M2kArTAt+d2r3wkBtsKe5yKSlVEhA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/config-resolver": "3.193.0",
+ "@aws-sdk/credential-provider-imds": "3.193.0",
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-endpoints": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.194.0.tgz",
+ "integrity": "sha512-G+DGC3Zx0GnQpt4DpRmVcCfliNxf3nwBtZ3JIdCptkUZgDEpLYzOfjbf3bUyPTQh+oGHeqfnVAF+rFjTnYql3A==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-hex-encoding": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.188.0.tgz",
+ "integrity": "sha512-QyWovTtjQ2RYxqVM+STPh65owSqzuXURnfoof778spyX4iQ4z46wOge1YV2ZtwS8w5LWd9eeVvDrLu5POPYOnA==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-locate-window": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.188.0.tgz",
+ "integrity": "sha512-SxobBVLZkkLSawTCfeQnhVX3Azm9O+C2dngZVe1+BqtF8+retUbVTs7OfYeWBlawVkULKF2e781lTzEHBBjCzw==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-middleware": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.193.0.tgz",
+ "integrity": "sha512-+aC6pmkcGgpxaMWCH/FXTsGWl2W342oQGs1OYKGi+W8z9UguXrqamWjdkdMqgunvj9qOEG2KBMKz1FWFFZlUyA==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-uri-escape": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.188.0.tgz",
+ "integrity": "sha512-4Y6AYZMT483Tiuq8dxz5WHIiPNdSFPGrl6tRTo2Oi2FcwypwmFhqgEGcqxeXDUJktvaCBxeA08DLr/AemVhPCg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.193.0.tgz",
+ "integrity": "sha512-1EkGYsUtOMEyJG/UBIR4PtmO3lVjKNoUImoMpLtEucoGbWz5RG9zFSwLevjFyFs5roUBFlxkSpTMo8xQ3aRzQg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.193.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.193.0.tgz",
+ "integrity": "sha512-G/2/1cSgsxVtREAm8Eq8Duib5PXzXknFRHuDpAxJ5++lsJMXoYMReS278KgV54cojOkAVfcODDTqmY3Av0WHhQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aws-sdk/util-utf8-browser": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz",
+ "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-utf8-node": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.188.0.tgz",
+ "integrity": "sha512-hCgP4+C0Lekjpjt2zFJ2R/iHes5sBGljXa5bScOFAEkRUc0Qw0VNgTv7LpEbIOAwGmqyxBoCwBW0YHPW1DfmYQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/util-buffer-from": "3.188.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.20.6.tgz",
+ "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.11"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@blakeembrey/deque": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/@blakeembrey/deque/-/deque-1.0.5.tgz",
+ "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==",
+ "dev": true
+ },
+ "node_modules/@blakeembrey/template": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/@blakeembrey/template/-/template-1.1.0.tgz",
+ "integrity": "sha512-iZf+UWfL+DogJVpd/xMQyP6X6McYd6ArdYoPMiv/zlOTzeXXfQbYxBNJJBF6tThvsjLMbA8tLjkCdm9RWMFCCw==",
+ "dev": true
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@redis/bloom": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.0.2.tgz",
+ "integrity": "sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@redis/client": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.3.0.tgz",
+ "integrity": "sha512-XCFV60nloXAefDsPnYMjHGtvbtHR8fV5Om8cQ0JYqTNbWcQo/4AryzJ2luRj4blveWazRK/j40gES8M7Cp6cfQ==",
+ "dependencies": {
+ "cluster-key-slot": "1.1.0",
+ "generic-pool": "3.8.2",
+ "yallist": "4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@redis/client/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/@redis/graph": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.0.1.tgz",
+ "integrity": "sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@redis/json": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+ "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@redis/search": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz",
+ "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@redis/time-series": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.3.tgz",
+ "integrity": "sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz",
+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz",
+ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==",
+ "dev": true
+ },
+ "node_modules/@types/concat-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmmirror.com/@types/concat-stream/-/concat-stream-1.6.1.tgz",
+ "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/crypto-js": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==",
+ "dev": true
+ },
+ "node_modules/@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmmirror.com/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json5": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/@types/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-NrVug5woqbvNZ0WX+Gv4R+L4TGddtmFek2u8RtccAgFZWtS9QXF2xCXY22/M4nzkaKF0q9Fc6M/5rxLDhfwc/A==",
+ "deprecated": "This is a stub types definition. json5 provides its own type definitions, so you do not need this installed.",
+ "dev": true,
+ "dependencies": {
+ "json5": "*"
+ }
+ },
+ "node_modules/@types/mathjs": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmmirror.com/@types/mathjs/-/mathjs-9.4.2.tgz",
+ "integrity": "sha512-GF5g1vJmvKdWIWsE53XX7EDAyCaZ9p6gaYm1xhlXn5JjrY/NJrOfJN3fBxS3wyZpVh3QqKoMkS2WjFwxWMHOTw==",
+ "deprecated": "This is a stub types definition. mathjs provides its own type definitions, so you do not need this installed.",
+ "dev": true,
+ "dependencies": {
+ "mathjs": "*"
+ }
+ },
+ "node_modules/@types/mocha": {
+ "version": "8.2.3",
+ "resolved": "https://registry.npmmirror.com/@types/mocha/-/mocha-8.2.3.tgz",
+ "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==",
+ "dev": true
+ },
+ "node_modules/@types/mongodb": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-4.0.7.tgz",
+ "integrity": "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw==",
+ "deprecated": "mongodb provides its own types. @types/mongodb is no longer needed.",
+ "dev": true,
+ "dependencies": {
+ "mongodb": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "15.14.9",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-15.14.9.tgz",
+ "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A=="
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
+ },
+ "node_modules/@types/redis": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/@types/redis/-/redis-4.0.11.tgz",
+ "integrity": "sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==",
+ "deprecated": "This is a stub types definition. redis provides its own type definitions, so you do not need this installed.",
+ "dev": true,
+ "dependencies": {
+ "redis": "*"
+ }
+ },
+ "node_modules/@types/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+ },
+ "node_modules/@types/whatwg-url": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+ "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/webidl-conversions": "*"
+ }
+ },
+ "node_modules/@types/ws": {
+ "version": "7.4.7",
+ "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-7.4.7.tgz",
+ "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+ "dev": true
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz",
+ "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/adler-32": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
+ "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+ "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axios/node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/bowser": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+ "optional": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "node_modules/bson": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz",
+ "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==",
+ "dependencies": {
+ "buffer": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+ },
+ "node_modules/cfb": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
+ "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+ "dependencies": {
+ "adler-32": "~1.3.0",
+ "crc-32": "~1.2.0"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.7.0.tgz",
+ "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/cluster-key-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz",
+ "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/codepage": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
+ "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/commandpost": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/commandpost/-/commandpost-1.4.0.tgz",
+ "integrity": "sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ==",
+ "dev": true
+ },
+ "node_modules/complex.js": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/complex.js/-/complex.js-2.1.1.tgz",
+ "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/concat-stream/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "node_modules/concat-stream/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/concat-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/concat-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "node_modules/crc-32": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+ "bin": {
+ "crc32": "bin/crc32.njs"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-js": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.4.2",
+ "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.2.tgz",
+ "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA=="
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "dependencies": {
+ "clone": "^1.0.2"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/editorconfig": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmmirror.com/editorconfig/-/editorconfig-0.15.3.tgz",
+ "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.19.0",
+ "lru-cache": "^4.1.5",
+ "semver": "^5.6.0",
+ "sigmund": "^1.0.1"
+ },
+ "bin": {
+ "editorconfig": "bin/editorconfig"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "node_modules/escape-latex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/escape-latex/-/escape-latex-1.2.0.tgz",
+ "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw=="
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.1",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+ "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+ "optional": true,
+ "dependencies": {
+ "strnum": "^1.0.5"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ },
+ "funding": {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ }
+ },
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/figures/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/frac": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
+ "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/ftp": {
+ "version": "0.3.10",
+ "resolved": "https://registry.npmmirror.com/ftp/-/ftp-0.3.10.tgz",
+ "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "1.1.x",
+ "xregexp": "2.0.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/ftp/node_modules/readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ftp/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+ "dev": true
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generic-pool": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz",
+ "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "node_modules/get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true
+ },
+ "node_modules/growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmmirror.com/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.x"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/http-basic": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmmirror.com/http-basic/-/http-basic-8.1.3.tgz",
+ "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
+ "dependencies": {
+ "caseless": "^0.12.0",
+ "concat-stream": "^1.6.2",
+ "http-response-object": "^3.0.1",
+ "parse-cache-control": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-response-object": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/http-response-object/-/http-response-object-3.0.2.tgz",
+ "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+ "dependencies": {
+ "@types/node": "^10.0.3"
+ }
+ },
+ "node_modules/http-response-object/node_modules/@types/node": {
+ "version": "10.17.60",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-10.17.60.tgz",
+ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
+ },
+ "node_modules/human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.12.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "node_modules/ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/inquirer": {
+ "version": "8.2.5",
+ "resolved": "https://registry.npmmirror.com/inquirer/-/inquirer-8.2.5.tgz",
+ "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.5",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/invert-kv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz",
+ "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ip": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/javascript-natural-sort": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmmirror.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
+ "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw=="
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/k8w-crypto": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/k8w-crypto/-/k8w-crypto-0.2.0.tgz",
+ "integrity": "sha512-M6u4eQ6CQaU5xO3s4zaUUp9G79xNDhXtTU0X7N80tDcBhQC5ggowlyOzj95v7WiCuk7xkV0aFsTmCpuf0m0djw==",
+ "dev": true
+ },
+ "node_modules/k8w-extend-native": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmmirror.com/k8w-extend-native/-/k8w-extend-native-1.4.6.tgz",
+ "integrity": "sha512-AHTCyFshldMme0s9FKD+QKG+QZdBkHXzl+8kYfNhsSDhcdQ5TYWQwphjecSJjxNdGd78TIbO0fHiOvM+Ei22YA==",
+ "dependencies": {
+ "k8w-linq-array": "*",
+ "k8w-super-date": "*",
+ "k8w-super-object": "*"
+ }
+ },
+ "node_modules/k8w-linq-array": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmmirror.com/k8w-linq-array/-/k8w-linq-array-0.2.8.tgz",
+ "integrity": "sha512-4IAkQN8UJdk804tQi++wuwSZvFWk/Wcl1uG5PR/0c0YvB5hUd2f8tJm3OgOMOxjV9UVByNLvnPYGIwrFQPpjlA=="
+ },
+ "node_modules/k8w-super-date": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmmirror.com/k8w-super-date/-/k8w-super-date-0.1.3.tgz",
+ "integrity": "sha512-IBqKOAMAXR/bgzu+rYI30tEMP/Y6Q8HQuqJiTkE2mLJg11yok9guoi8uZTynTahviVBndcfBpOgi1H/zhihv7w=="
+ },
+ "node_modules/k8w-super-object": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/k8w-super-object/-/k8w-super-object-0.3.0.tgz",
+ "integrity": "sha512-u2jfh4goYXKZmSucaLaOTaNbLRatjv0CSRpzE0KU0732+9XtYZFd5vrdw/mzJfK5fPHb/zyikOSHDX5mJrav+g=="
+ },
+ "node_modules/lcid": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz",
+ "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+ "dev": true,
+ "dependencies": {
+ "invert-kv": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true
+ },
+ "node_modules/map-age-cleaner": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmmirror.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+ "dev": true,
+ "dependencies": {
+ "p-defer": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mathjs": {
+ "version": "11.4.0",
+ "resolved": "https://registry.npmmirror.com/mathjs/-/mathjs-11.4.0.tgz",
+ "integrity": "sha512-SGhKmXnwsPWrLHvhzm849RJPMjFTgLgVwKtv2L+IY7XHB4nuzyZLfV2eHT1HtBZ4yzsLHgcqak47zMmxuEIIUg==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "complex.js": "^2.1.1",
+ "decimal.js": "^10.4.2",
+ "escape-latex": "^1.2.0",
+ "fraction.js": "^4.2.0",
+ "javascript-natural-sort": "^0.7.1",
+ "seedrandom": "^3.0.5",
+ "tiny-emitter": "^2.1.0",
+ "typed-function": "^4.1.0"
+ },
+ "bin": {
+ "mathjs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mem": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/mem/-/mem-5.1.1.tgz",
+ "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
+ "dev": true,
+ "dependencies": {
+ "map-age-cleaner": "^0.1.3",
+ "mimic-fn": "^2.1.0",
+ "p-is-promise": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/memory-pager": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+ "optional": true
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-4.2.1.tgz",
+ "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "dev": true
+ },
+ "node_modules/mocha": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmmirror.com/mocha/-/mocha-9.2.2.tgz",
+ "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==",
+ "dev": true,
+ "dependencies": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.3",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "4.2.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.1",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "which": "2.0.2",
+ "workerpool": "6.2.0",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/mongodb": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.11.0.tgz",
+ "integrity": "sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg==",
+ "dependencies": {
+ "bson": "^4.7.0",
+ "denque": "^2.1.0",
+ "mongodb-connection-string-url": "^2.5.4",
+ "socks": "^2.7.1"
+ },
+ "engines": {
+ "node": ">=12.9.0"
+ },
+ "optionalDependencies": {
+ "@aws-sdk/credential-providers": "^3.186.0",
+ "saslprep": "^1.0.3"
+ }
+ },
+ "node_modules/mongodb-connection-string-url": {
+ "version": "2.5.4",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz",
+ "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==",
+ "dependencies": {
+ "@types/whatwg-url": "^8.2.1",
+ "whatwg-url": "^11.0.0"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.1.tgz",
+ "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onchange": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmmirror.com/onchange/-/onchange-7.1.0.tgz",
+ "integrity": "sha512-ZJcqsPiWUAUpvmnJri5TPBooqJOPmC0ttN65juhN15Q8xA+Nbg3BaxBHXQ45EistKKlKElb0edmbPWnKSBkvMg==",
+ "dev": true,
+ "dependencies": {
+ "@blakeembrey/deque": "^1.0.5",
+ "@blakeembrey/template": "^1.0.0",
+ "arg": "^4.1.3",
+ "chokidar": "^3.3.1",
+ "cross-spawn": "^7.0.1",
+ "ignore": "^5.1.4",
+ "tree-kill": "^1.2.2"
+ },
+ "bin": {
+ "onchange": "dist/bin.js"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/os-locale": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/os-locale/-/os-locale-5.0.0.tgz",
+ "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^4.0.0",
+ "lcid": "^3.0.0",
+ "mem": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/p-defer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/p-defer/-/p-defer-1.0.0.tgz",
+ "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/p-is-promise/-/p-is-promise-2.1.0.tgz",
+ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+ "dev": true
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+ "dependencies": {
+ "resolve": "^1.1.6"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/redis": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-4.3.1.tgz",
+ "integrity": "sha512-cM7yFU5CA6zyCF7N/+SSTcSJQSRMEKN0k0Whhu6J7n9mmXRoXugfWDBo5iOzGwABmsWKSwGPTU5J4Bxbl+0mrA==",
+ "dependencies": {
+ "@redis/bloom": "1.0.2",
+ "@redis/client": "1.3.0",
+ "@redis/graph": "1.0.1",
+ "@redis/json": "1.0.4",
+ "@redis/search": "1.1.0",
+ "@redis/time-series": "1.0.3"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.5.7",
+ "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.7.tgz",
+ "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/saslprep": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+ "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+ "optional": true,
+ "dependencies": {
+ "sparse-bitfield": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/seedrandom": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/seedrandom/-/seedrandom-3.0.5.tgz",
+ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
+ },
+ "node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "dependencies": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ },
+ "bin": {
+ "shjs": "bin/shjs"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "node_modules/sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==",
+ "dev": true
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+ "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "dependencies": {
+ "ip": "^2.0.0",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/sparse-bitfield": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+ "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+ "optional": true,
+ "dependencies": {
+ "memory-pager": "^1.0.2"
+ }
+ },
+ "node_modules/ssf": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
+ "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+ "dependencies": {
+ "frac": "~1.1.2"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+ "optional": true
+ },
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/sync-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/sync-request/-/sync-request-6.1.0.tgz",
+ "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+ "dependencies": {
+ "http-response-object": "^3.0.1",
+ "sync-rpc": "^1.2.1",
+ "then-request": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/sync-rpc": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmmirror.com/sync-rpc/-/sync-rpc-1.3.6.tgz",
+ "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+ "dependencies": {
+ "get-port": "^3.1.0"
+ }
+ },
+ "node_modules/then-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/then-request/-/then-request-6.0.2.tgz",
+ "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+ "dependencies": {
+ "@types/concat-stream": "^1.6.0",
+ "@types/form-data": "0.0.33",
+ "@types/node": "^8.0.0",
+ "@types/qs": "^6.2.31",
+ "caseless": "~0.12.0",
+ "concat-stream": "^1.6.0",
+ "form-data": "^2.2.0",
+ "http-basic": "^8.1.1",
+ "http-response-object": "^3.0.1",
+ "promise": "^8.0.0",
+ "qs": "^6.4.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/then-request/node_modules/@types/node": {
+ "version": "8.10.66",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-8.10.66.tgz",
+ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "node_modules/tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz",
+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+ "dev": true,
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node/node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/tsbuffer": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmmirror.com/tsbuffer/-/tsbuffer-2.2.7.tgz",
+ "integrity": "sha512-WkP6NU14W14Kxa+OtccJ4m9+nY8UZs/DlM3FQzxstBkNGzmNvggN3+2mfIzYO8YDKu6mqYUXgpNg1aqIYcUACw==",
+ "dependencies": {
+ "k8w-extend-native": "^1.4.6",
+ "tsbuffer-validator": "^2.1.1",
+ "tslib": "*"
+ }
+ },
+ "node_modules/tsbuffer-proto-generator": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmmirror.com/tsbuffer-proto-generator/-/tsbuffer-proto-generator-1.7.2.tgz",
+ "integrity": "sha512-Rjq/mNXb6Z3ORi5M0BH3O+L0hpr+RcLzJ1edXO4bOZkojdtxDmwoKGBKoh+/xba+bhOiSiwHfVZLiQ06A6vEmw==",
+ "dev": true,
+ "dependencies": {
+ "k8w-crypto": "^0.2.0",
+ "k8w-extend-native": "^1.4.6",
+ "tsbuffer-schema": "^2.2.0",
+ "tslib": "*",
+ "typescript": "^4"
+ }
+ },
+ "node_modules/tsbuffer-schema": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/tsbuffer-schema/-/tsbuffer-schema-2.2.0.tgz",
+ "integrity": "sha512-I4+5Xfk7G+D++kXdNnYTeY26WQTaf14C84XQwPKteNmrwxRY3CQCkMqASRiCUqtpOuDn43qmoxuXpT+Vo8Wltg=="
+ },
+ "node_modules/tsbuffer-validator": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/tsbuffer-validator/-/tsbuffer-validator-2.1.1.tgz",
+ "integrity": "sha512-12JVltPQjv2hZqfd9TZhTjCyQ0bvtRlTXyczOAaH+CnryWI9Twt0i9ZGaM5fb2QMxW5BOhToOIbwO8opDqpCEg==",
+ "dependencies": {
+ "k8w-extend-native": "^1.4.6",
+ "tsbuffer-schema": "^2.2.0",
+ "tslib": "*"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/tsrpc": {
+ "version": "3.4.12",
+ "resolved": "https://registry.npmmirror.com/tsrpc/-/tsrpc-3.4.12.tgz",
+ "integrity": "sha512-FMa7FdzW7LdhsQ49DxcNegeW4oRJGxqP+3DXbZBvsUHSeL2h6UFCSKmw2TypI2ChDeRGgbo+wt6uJ0upF6fz9Q==",
+ "dependencies": {
+ "@types/ws": "^7.4.7",
+ "chalk": "^4.1.2",
+ "tsbuffer": "^2.2.7",
+ "tsrpc-base-client": "^2.1.11",
+ "tsrpc-proto": "^1.4.3",
+ "uuid": "^8.3.2",
+ "ws": "^7.5.9"
+ }
+ },
+ "node_modules/tsrpc-base-client": {
+ "version": "2.1.12",
+ "resolved": "https://registry.npmmirror.com/tsrpc-base-client/-/tsrpc-base-client-2.1.12.tgz",
+ "integrity": "sha512-7Zsby1dtDQkxzvT/tRMLLnjCqpYpoCwN9Sci9x7iWCBMNHiiBPBoKIIp2nqhlfLF3kxSgemQOGF499Mx3GVQfg==",
+ "dependencies": {
+ "k8w-extend-native": "^1.4.6",
+ "tsbuffer": "^2.2.7",
+ "tslib": "*",
+ "tsrpc-proto": "^1.4.3"
+ }
+ },
+ "node_modules/tsrpc-cli": {
+ "version": "2.4.5",
+ "resolved": "https://registry.npmmirror.com/tsrpc-cli/-/tsrpc-cli-2.4.5.tgz",
+ "integrity": "sha512-/3MMyGAAuSnZLQVfoRZXI5sfyGakRTk2AfrllvVSUSfGPTr06iU1YAgOATNYEHl+uAj1+QFz3dKT8g3J+wCIcw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "chokidar": "^3.5.3",
+ "fs-extra": "^10.1.0",
+ "glob": "^7.2.3",
+ "inquirer": "^8.2.4",
+ "k8w-extend-native": "^1.4.6",
+ "minimist": "^1.2.6",
+ "ora": "^5.4.1",
+ "os-locale": "^5.0.0",
+ "ts-node": "^10.8.2",
+ "tsbuffer": "^2.2.3",
+ "tsbuffer-proto-generator": "^1.7.2",
+ "tsbuffer-schema": "^2.2.0",
+ "tsrpc-proto": "^1.4.2",
+ "typescript": "^4.7.4",
+ "typescript-formatter": "^7.2.2"
+ },
+ "bin": {
+ "tsrpc": "bin.js",
+ "tsrpc-cli": "bin.js"
+ }
+ },
+ "node_modules/tsrpc-cli/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tsrpc-cli/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tsrpc-proto": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmmirror.com/tsrpc-proto/-/tsrpc-proto-1.4.3.tgz",
+ "integrity": "sha512-qtkk5i34m9/K1258EdyXAEikU/ADPELHCCXN/oFJ4XwH+kN3kXnKYmwCDblUuMA73V2+A/EwkgUGyAgPa335Hw==",
+ "dependencies": {
+ "tsbuffer-schema": "^2.2.0",
+ "tslib": "*"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-function": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/typed-function/-/typed-function-4.1.0.tgz",
+ "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg==",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
+ "node_modules/typescript": {
+ "version": "4.8.4",
+ "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz",
+ "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/typescript-formatter": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmmirror.com/typescript-formatter/-/typescript-formatter-7.2.2.tgz",
+ "integrity": "sha512-V7vfI9XArVhriOTYHPzMU2WUnm5IMdu9X/CPxs8mIMGxmTBFpDABlbkBka64PZJ9/xgQeRpK8KzzAG4MPzxBDQ==",
+ "dev": true,
+ "dependencies": {
+ "commandpost": "^1.0.0",
+ "editorconfig": "^0.15.0"
+ },
+ "bin": {
+ "tsfmt": "bin/tsfmt"
+ },
+ "engines": {
+ "node": ">= 4.2.0"
+ },
+ "peerDependencies": {
+ "typescript": "^2.1.6 || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wmf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
+ "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/word": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
+ "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/workerpool": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmmirror.com/workerpool/-/workerpool-6.2.0.tgz",
+ "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xlsx": {
+ "version": "0.18.5",
+ "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz",
+ "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+ "dependencies": {
+ "adler-32": "~1.3.0",
+ "cfb": "~1.2.1",
+ "codepage": "~1.15.0",
+ "crc-32": "~1.2.1",
+ "ssf": "~0.11.2",
+ "wmf": "~1.0.1",
+ "word": "~0.3.0"
+ },
+ "bin": {
+ "xlsx": "bin/xlsx.njs"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/xregexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/xregexp/-/xregexp-2.0.0.tgz",
+ "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ }
+ },
+ "dependencies": {
+ "@aws-crypto/ie11-detection": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz",
+ "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==",
+ "optional": true,
+ "requires": {
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-crypto/sha256-browser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
+ "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.0",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-crypto/sha256-js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
+ "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-crypto/supports-web-crypto": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz",
+ "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==",
+ "optional": true,
+ "requires": {
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-crypto/util": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz",
+ "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "^3.110.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/abort-controller": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.193.0.tgz",
+ "integrity": "sha512-MYPBm5PWyKP+Tq37mKs5wDbyAyVMocF5iYmx738LYXBSj8A1V4LTFrvfd4U16BRC/sM0DYB9fBFJUQ9ISFRVYw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/client-cognito-identity": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.194.0.tgz",
+ "integrity": "sha512-khDgkrrSC/2PFN7Sb8sUsvt6QTsU3s9vcizFULWc8H5OO58tTdzkoKuAa5XMVbSRQnnl6iQ4uv6bBglCC+OfSw==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/client-sts": "3.194.0",
+ "@aws-sdk/config-resolver": "3.193.0",
+ "@aws-sdk/credential-provider-node": "3.193.0",
+ "@aws-sdk/fetch-http-handler": "3.193.0",
+ "@aws-sdk/hash-node": "3.193.0",
+ "@aws-sdk/invalid-dependency": "3.193.0",
+ "@aws-sdk/middleware-content-length": "3.193.0",
+ "@aws-sdk/middleware-host-header": "3.193.0",
+ "@aws-sdk/middleware-logger": "3.193.0",
+ "@aws-sdk/middleware-recursion-detection": "3.193.0",
+ "@aws-sdk/middleware-retry": "3.193.0",
+ "@aws-sdk/middleware-serde": "3.193.0",
+ "@aws-sdk/middleware-signing": "3.193.0",
+ "@aws-sdk/middleware-stack": "3.193.0",
+ "@aws-sdk/middleware-user-agent": "3.193.0",
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/node-http-handler": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/smithy-client": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "@aws-sdk/util-base64-browser": "3.188.0",
+ "@aws-sdk/util-base64-node": "3.188.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.188.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.193.0",
+ "@aws-sdk/util-defaults-mode-node": "3.193.0",
+ "@aws-sdk/util-user-agent-browser": "3.193.0",
+ "@aws-sdk/util-user-agent-node": "3.193.0",
+ "@aws-sdk/util-utf8-browser": "3.188.0",
+ "@aws-sdk/util-utf8-node": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/client-sso": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.193.0.tgz",
+ "integrity": "sha512-NxDckym95mtimYp9uWRA1lcyJHDyS8OZEaDC+dZ/tt5wGyPoc3ftHZNWDLzZM1PUjzgo+XzjMBVkWMvk/SRSYw==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/config-resolver": "3.193.0",
+ "@aws-sdk/fetch-http-handler": "3.193.0",
+ "@aws-sdk/hash-node": "3.193.0",
+ "@aws-sdk/invalid-dependency": "3.193.0",
+ "@aws-sdk/middleware-content-length": "3.193.0",
+ "@aws-sdk/middleware-host-header": "3.193.0",
+ "@aws-sdk/middleware-logger": "3.193.0",
+ "@aws-sdk/middleware-recursion-detection": "3.193.0",
+ "@aws-sdk/middleware-retry": "3.193.0",
+ "@aws-sdk/middleware-serde": "3.193.0",
+ "@aws-sdk/middleware-stack": "3.193.0",
+ "@aws-sdk/middleware-user-agent": "3.193.0",
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/node-http-handler": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/smithy-client": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "@aws-sdk/util-base64-browser": "3.188.0",
+ "@aws-sdk/util-base64-node": "3.188.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.188.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.193.0",
+ "@aws-sdk/util-defaults-mode-node": "3.193.0",
+ "@aws-sdk/util-user-agent-browser": "3.193.0",
+ "@aws-sdk/util-user-agent-node": "3.193.0",
+ "@aws-sdk/util-utf8-browser": "3.188.0",
+ "@aws-sdk/util-utf8-node": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/client-sts": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.194.0.tgz",
+ "integrity": "sha512-duolI7KLvRLMrL0ZpiVvmhaC5stKcNp5tfJ7gUW24tyf+7ImAmk2odSMIgcq54EWQ3XppTKBhEGCjOJ9th7+Qg==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/config-resolver": "3.193.0",
+ "@aws-sdk/credential-provider-node": "3.193.0",
+ "@aws-sdk/fetch-http-handler": "3.193.0",
+ "@aws-sdk/hash-node": "3.193.0",
+ "@aws-sdk/invalid-dependency": "3.193.0",
+ "@aws-sdk/middleware-content-length": "3.193.0",
+ "@aws-sdk/middleware-endpoint": "3.193.0",
+ "@aws-sdk/middleware-host-header": "3.193.0",
+ "@aws-sdk/middleware-logger": "3.193.0",
+ "@aws-sdk/middleware-recursion-detection": "3.193.0",
+ "@aws-sdk/middleware-retry": "3.193.0",
+ "@aws-sdk/middleware-sdk-sts": "3.193.0",
+ "@aws-sdk/middleware-serde": "3.193.0",
+ "@aws-sdk/middleware-signing": "3.193.0",
+ "@aws-sdk/middleware-stack": "3.193.0",
+ "@aws-sdk/middleware-user-agent": "3.193.0",
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/node-http-handler": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/smithy-client": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "@aws-sdk/util-base64-browser": "3.188.0",
+ "@aws-sdk/util-base64-node": "3.188.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.188.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.193.0",
+ "@aws-sdk/util-defaults-mode-node": "3.193.0",
+ "@aws-sdk/util-endpoints": "3.194.0",
+ "@aws-sdk/util-user-agent-browser": "3.193.0",
+ "@aws-sdk/util-user-agent-node": "3.193.0",
+ "@aws-sdk/util-utf8-browser": "3.188.0",
+ "@aws-sdk/util-utf8-node": "3.188.0",
+ "fast-xml-parser": "4.0.11",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/config-resolver": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.193.0.tgz",
+ "integrity": "sha512-HIjuv2A1glgkXy9g/A8bfsiz3jTFaRbwGZheoHFZod6iEQQEbbeAsBe3u2AZyzOrVLgs8lOvBtgU8XKSJWjDkw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/signature-v4": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-config-provider": "3.188.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-cognito-identity": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.194.0.tgz",
+ "integrity": "sha512-AAtnTap4SS0aDuLB8NsWuvAkbaCX8kh6QG+S4+hziPq3+OZtYq34QM8j52ojGyB99VU4dhJmxoExMayLOSTIJg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/client-cognito-identity": "3.194.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-env": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.193.0.tgz",
+ "integrity": "sha512-pRqZoIaqCdWB4JJdR6DqDn3u+CwKJchwiCPnRtChwC8KXCMkT4njq9J1bWG3imYeTxP/G06O1PDONEuD4pPtNQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-imds": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.193.0.tgz",
+ "integrity": "sha512-jC7uT7uVpO/iitz49toHMGFKXQ2igWQQG2SKirREqDRaz5HSXwEP1V3rcOlNNyGIBPMggDjZnxYgJHqBXSq9Ag==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-ini": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.193.0.tgz",
+ "integrity": "sha512-JQ4tyeLjwsa9Jo95yTrLgFFspAP5GwaZDqDJArG98waKDzxhl7FeBs+N32+oux6WB7RKRB0svOK02nnoWnrjVg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/credential-provider-env": "3.193.0",
+ "@aws-sdk/credential-provider-imds": "3.193.0",
+ "@aws-sdk/credential-provider-sso": "3.193.0",
+ "@aws-sdk/credential-provider-web-identity": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-node": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.193.0.tgz",
+ "integrity": "sha512-2E8yWVw1vLb6IumZxA0w4mes759YSCTHLdfp5nMBpn+d+Otz26mczKSe7xr7AaVONq+/sVPUl2GfTFTWM4B0eA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/credential-provider-env": "3.193.0",
+ "@aws-sdk/credential-provider-imds": "3.193.0",
+ "@aws-sdk/credential-provider-ini": "3.193.0",
+ "@aws-sdk/credential-provider-process": "3.193.0",
+ "@aws-sdk/credential-provider-sso": "3.193.0",
+ "@aws-sdk/credential-provider-web-identity": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-process": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.193.0.tgz",
+ "integrity": "sha512-zpXxtQzQqkaUuFqmHW9dSkh9p/1k+XNKlwEkG8FTwAJNUWmy2ZMJv+8NTVn4s4vaRu7xJ1er9chspYr7mvxHlA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-sso": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.193.0.tgz",
+ "integrity": "sha512-jBFWreNFZUgnGyCkpxDGf+LrXTuzEfjYkJYti1HnnsUF4vF0PsVZS6/FQi1mDl3pqorrtgknI59ENnAhKVxtBg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/client-sso": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-web-identity": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.193.0.tgz",
+ "integrity": "sha512-MIQY9KwLCBnRyIt7an4EtMrFQZz2HC1E8vQDdKVzmeQBBePhW61fnX9XDP9bfc3Ypg1NggLG00KBPEC88twLFg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-providers": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.194.0.tgz",
+ "integrity": "sha512-pEwhG/W5Y/sEItXu3ulpuq3+nl9M3PDHzgtDfKbtvO8Mfhd8EucmHbTGHIcHdUow44E94tGIbxsnt239e9m/yg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/client-cognito-identity": "3.194.0",
+ "@aws-sdk/client-sso": "3.193.0",
+ "@aws-sdk/client-sts": "3.194.0",
+ "@aws-sdk/credential-provider-cognito-identity": "3.194.0",
+ "@aws-sdk/credential-provider-env": "3.193.0",
+ "@aws-sdk/credential-provider-imds": "3.193.0",
+ "@aws-sdk/credential-provider-ini": "3.193.0",
+ "@aws-sdk/credential-provider-node": "3.193.0",
+ "@aws-sdk/credential-provider-process": "3.193.0",
+ "@aws-sdk/credential-provider-sso": "3.193.0",
+ "@aws-sdk/credential-provider-web-identity": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/fetch-http-handler": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.193.0.tgz",
+ "integrity": "sha512-UhIS2LtCK9hqBzYVon6BI8WebJW1KC0GGIL/Gse5bqzU9iAGgFLAe66qg9k+/h3Jjc5LNAYzqXNVizMwn7689Q==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/querystring-builder": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-base64-browser": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/hash-node": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.193.0.tgz",
+ "integrity": "sha512-O2SLPVBjrCUo+4ouAdRUoHBYsyurO9LcjNZNYD7YQOotBTbVFA3cx7kTZu+K4B6kX7FDaGbqbE1C/T1/eg/r+w==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-buffer-from": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/invalid-dependency": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.193.0.tgz",
+ "integrity": "sha512-54DCknekLwJAI1os76XJ8XCzfAH7BGkBGtlWk5WCNkZTfj3rf5RUiXz4uoKUMWE1rZmyMDoDDS1PBo+yTVKW5w==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/is-array-buffer": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.188.0.tgz",
+ "integrity": "sha512-n69N4zJZCNd87Rf4NzufPzhactUeM877Y0Tp/F3KiHqGeTnVjYUa4Lv1vLBjqtfjYb2HWT3NKlYn5yzrhaEwiQ==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-content-length": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.193.0.tgz",
+ "integrity": "sha512-em0Sqo7O7DFOcVXU460pbcYuIjblDTZqK2YE62nQ0T+5Nbj+MSjuoite+rRRdRww9VqBkUROGKON45bUNjogtQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-endpoint": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.193.0.tgz",
+ "integrity": "sha512-Inbpt7jcHGvzF7UOJOCxx9wih0+eAQYERikokidWJa7M405EJpVYq1mGbeOcQUPANU3uWF1AObmUUFhbkriHQw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/middleware-serde": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/signature-v4": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/url-parser": "3.193.0",
+ "@aws-sdk/util-config-provider": "3.188.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-host-header": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.193.0.tgz",
+ "integrity": "sha512-aegzj5oRWd//lmfmkzRmgG2b4l3140v8Ey4QkqCxcowvAEX5a7rh23yuKaGtmiePwv2RQalCKz+tN6JXCm8g6Q==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-logger": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.193.0.tgz",
+ "integrity": "sha512-D/h1pU5tAcyJpJ8ZeD1Sta0S9QZPcxERYRBiJdEl8VUrYwfy3Cl1WJedVOmd5nG73ZLRSyHeXHewb/ohge3yKQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-recursion-detection": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.193.0.tgz",
+ "integrity": "sha512-fMWP76Q1GOb/9OzS1arizm6Dbfo02DPZ6xp7OoAN3PS6ybH3Eb47s/gP3jzgBPAITQacFj4St/4a06YWYrN3NA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-retry": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.193.0.tgz",
+ "integrity": "sha512-zTQkHLBQBJi6ns655WYcYLyLPc1tgbEYU080Oc8zlveLUqoDn1ogkcmNhG7XMeQuBvWZBYN7J3/wFaXlDzeCKg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/service-error-classification": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "tslib": "^2.3.1",
+ "uuid": "^8.3.2"
+ }
+ },
+ "@aws-sdk/middleware-sdk-sts": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.193.0.tgz",
+ "integrity": "sha512-TafiDkeflUsnbNa89TLkDnAiRRp1gAaZLDAjt75AzriRKZnhtFfYUXWb+qAuN50T+CkJ/gZI9LHDZL5ogz/HxQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/middleware-signing": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/signature-v4": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-serde": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.193.0.tgz",
+ "integrity": "sha512-dH93EJYVztY+ZDPzSMRi9LfAZfKO+luH62raNy49hlNa4jiyE1Tc/+qwlmOEpfGsrtcZ9TgsON1uFF9sgBXXaA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-signing": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.193.0.tgz",
+ "integrity": "sha512-obBoELGPf5ikvHYZwbzllLeuODiokdDfe92Ve2ufeOa/d8+xsmbqNzNdCTLNNTmr1tEIaEE7ngZVTOiHqAVhyw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/signature-v4": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-stack": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.193.0.tgz",
+ "integrity": "sha512-Ix5d7gE6bZwFNIVf0dGnjYuymz1gjitNoAZDPpv1nEZlUMek/jcno5lmzWFzUZXY/azpbIyaPwq/wm/c69au5A==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-user-agent": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.193.0.tgz",
+ "integrity": "sha512-0vT6F9NwYQK7ARUUJeHTUIUPnupsO3IbmjHSi1+clkssFlJm2UfmSGeafiWe4AYH3anATTvZEtcxX5DZT/ExbA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/node-config-provider": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.193.0.tgz",
+ "integrity": "sha512-5RLdjQLH69ISRG8TX9klSLOpEySXxj+z9E9Em39HRvw0/rDcd8poCTADvjYIOqRVvMka0z/hm+elvUTIVn/DRw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/shared-ini-file-loader": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/node-http-handler": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.193.0.tgz",
+ "integrity": "sha512-DP4BmFw64HOShgpAPEEMZedVnRmKKjHOwMEoXcnNlAkMXnYUFHiKvudYq87Q2AnSlT6OHkyMviB61gEvIk73dA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/abort-controller": "3.193.0",
+ "@aws-sdk/protocol-http": "3.193.0",
+ "@aws-sdk/querystring-builder": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/property-provider": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.193.0.tgz",
+ "integrity": "sha512-IaDR/PdZjKlAeSq2E/6u6nkPsZF9wvhHZckwH7uumq4ocWsWXFzaT+hKpV4YZPHx9n+K2YV4Gn/bDedpz99W1Q==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/protocol-http": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.193.0.tgz",
+ "integrity": "sha512-r0wbTwFJyXq0uiImI6giqG3g/RO1N/y4wwPA7qr7OC+KXJ0NkyVxIf6e7Vx8h06aM1ATtngbwJaMP59kVCp85A==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/querystring-builder": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.193.0.tgz",
+ "integrity": "sha512-PRaK6649iw0UO45UjUoiUzFcOKXZb8pMjjFJpqALpEvdZT3twxqhlPXujT7GWPKrSwO4uPLNnyYEtPY82wx2vw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-uri-escape": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/querystring-parser": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.193.0.tgz",
+ "integrity": "sha512-dGEPCe8SK4/td5dSpiaEI3SvT5eHXrbJWbLGyD4FL3n7WCGMy2xVWAB/yrgzD0GdLDjDa8L5vLVz6yT1P9i+hA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/service-error-classification": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.193.0.tgz",
+ "integrity": "sha512-bPnXVu8ErE1RfWVVQKc2TE7EuoImUi4dSPW9g80fGRzJdQNwXb636C+7OUuWvSDzmFwuBYqZza8GZjVd+rz2zQ==",
+ "optional": true
+ },
+ "@aws-sdk/shared-ini-file-loader": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.193.0.tgz",
+ "integrity": "sha512-hnvZup8RSpFXfah7Rrn6+lQJnAOCO+OiDJ2R/iMgZQh475GRQpLbu3cPhCOkjB14vVLygJtW8trK/0+zKq93bQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/signature-v4": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.193.0.tgz",
+ "integrity": "sha512-JEqqOB8wQZz6g1ERNUOIBFDFt8OJtz5G5Uh1CdkS5W66gyWnJEz/dE1hA2VTqqQwHGGEsIEV/hlzruU1lXsvFA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/is-array-buffer": "3.188.0",
+ "@aws-sdk/types": "3.193.0",
+ "@aws-sdk/util-hex-encoding": "3.188.0",
+ "@aws-sdk/util-middleware": "3.193.0",
+ "@aws-sdk/util-uri-escape": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/smithy-client": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.193.0.tgz",
+ "integrity": "sha512-BY0jhfW76vyXr7ODMaKO3eyS98RSrZgOMl6DTQV9sk7eFP/MPVlG7p7nfX/CDIgPBIO1z0A0i2CVIzYur9uGgQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/middleware-stack": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/types": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.193.0.tgz",
+ "integrity": "sha512-LV/wcPolRZKORrcHwkH59QMCkiDR5sM+9ZtuTxvyUGG2QFW/kjoxs08fUF10OWNJMrotBI+czDc5QJRgN8BlAw==",
+ "optional": true
+ },
+ "@aws-sdk/url-parser": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.193.0.tgz",
+ "integrity": "sha512-hwD1koJlOu2a6GvaSbNbdo7I6a3tmrsNTZr8bCjAcbqpc5pDThcpnl/Uaz3zHmMPs92U8I6BvWoK6pH8By06qw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/querystring-parser": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-base64-browser": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz",
+ "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-base64-node": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.188.0.tgz",
+ "integrity": "sha512-r1dccRsRjKq+OhVRUfqFiW3sGgZBjHbMeHLbrAs9jrOjU2PTQ8PSzAXLvX/9lmp7YjmX17Qvlsg0NCr1tbB9OA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/util-buffer-from": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-body-length-browser": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+ "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-body-length-node": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.188.0.tgz",
+ "integrity": "sha512-XwqP3vxk60MKp4YDdvDeCD6BPOiG2e+/Ou4AofZOy5/toB6NKz2pFNibQIUg2+jc7mPMnGnvOW3MQEgSJ+gu/Q==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-buffer-from": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.188.0.tgz",
+ "integrity": "sha512-NX1WXZ8TH20IZb4jPFT2CnLKSqZWddGxtfiWxD9M47YOtq/SSQeR82fhqqVjJn4P8w2F5E28f+Du4ntg/sGcxA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/is-array-buffer": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-config-provider": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.188.0.tgz",
+ "integrity": "sha512-LBA7tLbi7v4uvbOJhSnjJrxbcRifKK/1ZVK94JTV2MNSCCyNkFotyEI5UWDl10YKriTIUyf7o5cakpiDZ3O4xg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-defaults-mode-browser": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.193.0.tgz",
+ "integrity": "sha512-9riQKFrSJcsNAMnPA/3ltpSxNykeO20klE/UKjxEoD7UWjxLwsPK22UJjFwMRaHoAFcZD0LU/SgPxbC0ktCYCg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-defaults-mode-node": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.193.0.tgz",
+ "integrity": "sha512-occQmckvPRiM4YQIZnulfKKKjykGKWloa5ByGC5gOEGlyeP9zJpfs4zc/M2kArTAt+d2r3wkBtsKe5yKSlVEhA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/config-resolver": "3.193.0",
+ "@aws-sdk/credential-provider-imds": "3.193.0",
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/property-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-endpoints": {
+ "version": "3.194.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.194.0.tgz",
+ "integrity": "sha512-G+DGC3Zx0GnQpt4DpRmVcCfliNxf3nwBtZ3JIdCptkUZgDEpLYzOfjbf3bUyPTQh+oGHeqfnVAF+rFjTnYql3A==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-hex-encoding": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.188.0.tgz",
+ "integrity": "sha512-QyWovTtjQ2RYxqVM+STPh65owSqzuXURnfoof778spyX4iQ4z46wOge1YV2ZtwS8w5LWd9eeVvDrLu5POPYOnA==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-locate-window": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.188.0.tgz",
+ "integrity": "sha512-SxobBVLZkkLSawTCfeQnhVX3Azm9O+C2dngZVe1+BqtF8+retUbVTs7OfYeWBlawVkULKF2e781lTzEHBBjCzw==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-middleware": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.193.0.tgz",
+ "integrity": "sha512-+aC6pmkcGgpxaMWCH/FXTsGWl2W342oQGs1OYKGi+W8z9UguXrqamWjdkdMqgunvj9qOEG2KBMKz1FWFFZlUyA==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-uri-escape": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.188.0.tgz",
+ "integrity": "sha512-4Y6AYZMT483Tiuq8dxz5WHIiPNdSFPGrl6tRTo2Oi2FcwypwmFhqgEGcqxeXDUJktvaCBxeA08DLr/AemVhPCg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-user-agent-browser": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.193.0.tgz",
+ "integrity": "sha512-1EkGYsUtOMEyJG/UBIR4PtmO3lVjKNoUImoMpLtEucoGbWz5RG9zFSwLevjFyFs5roUBFlxkSpTMo8xQ3aRzQg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.193.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-user-agent-node": {
+ "version": "3.193.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.193.0.tgz",
+ "integrity": "sha512-G/2/1cSgsxVtREAm8Eq8Duib5PXzXknFRHuDpAxJ5++lsJMXoYMReS278KgV54cojOkAVfcODDTqmY3Av0WHhQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/node-config-provider": "3.193.0",
+ "@aws-sdk/types": "3.193.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-utf8-browser": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz",
+ "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-utf8-node": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.188.0.tgz",
+ "integrity": "sha512-hCgP4+C0Lekjpjt2zFJ2R/iHes5sBGljXa5bScOFAEkRUc0Qw0VNgTv7LpEbIOAwGmqyxBoCwBW0YHPW1DfmYQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/util-buffer-from": "3.188.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.20.6.tgz",
+ "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
+ "requires": {
+ "regenerator-runtime": "^0.13.11"
+ }
+ },
+ "@blakeembrey/deque": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/@blakeembrey/deque/-/deque-1.0.5.tgz",
+ "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==",
+ "dev": true
+ },
+ "@blakeembrey/template": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/@blakeembrey/template/-/template-1.1.0.tgz",
+ "integrity": "sha512-iZf+UWfL+DogJVpd/xMQyP6X6McYd6ArdYoPMiv/zlOTzeXXfQbYxBNJJBF6tThvsjLMbA8tLjkCdm9RWMFCCw==",
+ "dev": true
+ },
+ "@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@redis/bloom": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.0.2.tgz",
+ "integrity": "sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw==",
+ "requires": {}
+ },
+ "@redis/client": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.3.0.tgz",
+ "integrity": "sha512-XCFV60nloXAefDsPnYMjHGtvbtHR8fV5Om8cQ0JYqTNbWcQo/4AryzJ2luRj4blveWazRK/j40gES8M7Cp6cfQ==",
+ "requires": {
+ "cluster-key-slot": "1.1.0",
+ "generic-pool": "3.8.2",
+ "yallist": "4.0.0"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+ },
+ "@redis/graph": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.0.1.tgz",
+ "integrity": "sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ==",
+ "requires": {}
+ },
+ "@redis/json": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+ "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
+ "requires": {}
+ },
+ "@redis/search": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz",
+ "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==",
+ "requires": {}
+ },
+ "@redis/time-series": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.3.tgz",
+ "integrity": "sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==",
+ "requires": {}
+ },
+ "@tsconfig/node10": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz",
+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
+ "dev": true
+ },
+ "@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true
+ },
+ "@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true
+ },
+ "@tsconfig/node16": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz",
+ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==",
+ "dev": true
+ },
+ "@types/concat-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmmirror.com/@types/concat-stream/-/concat-stream-1.6.1.tgz",
+ "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/crypto-js": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==",
+ "dev": true
+ },
+ "@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmmirror.com/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/json5": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/@types/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-NrVug5woqbvNZ0WX+Gv4R+L4TGddtmFek2u8RtccAgFZWtS9QXF2xCXY22/M4nzkaKF0q9Fc6M/5rxLDhfwc/A==",
+ "dev": true,
+ "requires": {
+ "json5": "*"
+ }
+ },
+ "@types/mathjs": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmmirror.com/@types/mathjs/-/mathjs-9.4.2.tgz",
+ "integrity": "sha512-GF5g1vJmvKdWIWsE53XX7EDAyCaZ9p6gaYm1xhlXn5JjrY/NJrOfJN3fBxS3wyZpVh3QqKoMkS2WjFwxWMHOTw==",
+ "dev": true,
+ "requires": {
+ "mathjs": "*"
+ }
+ },
+ "@types/mocha": {
+ "version": "8.2.3",
+ "resolved": "https://registry.npmmirror.com/@types/mocha/-/mocha-8.2.3.tgz",
+ "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==",
+ "dev": true
+ },
+ "@types/mongodb": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-4.0.7.tgz",
+ "integrity": "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw==",
+ "dev": true,
+ "requires": {
+ "mongodb": "*"
+ }
+ },
+ "@types/node": {
+ "version": "15.14.9",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-15.14.9.tgz",
+ "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A=="
+ },
+ "@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
+ },
+ "@types/redis": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/@types/redis/-/redis-4.0.11.tgz",
+ "integrity": "sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==",
+ "dev": true,
+ "requires": {
+ "redis": "*"
+ }
+ },
+ "@types/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+ },
+ "@types/whatwg-url": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+ "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+ "requires": {
+ "@types/node": "*",
+ "@types/webidl-conversions": "*"
+ }
+ },
+ "@types/ws": {
+ "version": "7.4.7",
+ "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-7.4.7.tgz",
+ "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "requires": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ }
+ },
+ "acorn": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz",
+ "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+ "dev": true
+ },
+ "acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true
+ },
+ "adler-32": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
+ "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.21.3"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "axios": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+ "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+ "requires": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ },
+ "dependencies": {
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "requires": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "body-parser": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "requires": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "bowser": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+ "optional": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "bson": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz",
+ "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==",
+ "requires": {
+ "buffer": "^5.6.0"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+ },
+ "cfb": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
+ "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+ "requires": {
+ "adler-32": "~1.3.0",
+ "crc-32": "~1.2.0"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "cli-spinners": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.7.0.tgz",
+ "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==",
+ "dev": true
+ },
+ "cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "dev": true
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true
+ },
+ "cluster-key-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz",
+ "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw=="
+ },
+ "codepage": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
+ "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "commandpost": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/commandpost/-/commandpost-1.4.0.tgz",
+ "integrity": "sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ==",
+ "dev": true
+ },
+ "complex.js": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/complex.js/-/complex.js-2.1.1.tgz",
+ "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "requires": {
+ "safe-buffer": "5.2.1"
+ }
+ },
+ "content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
+ },
+ "cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "crc-32": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
+ },
+ "create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "crypto-js": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
+ },
+ "debug": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true
+ },
+ "decimal.js": {
+ "version": "10.4.2",
+ "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.2.tgz",
+ "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA=="
+ },
+ "defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "requires": {
+ "clone": "^1.0.2"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
+ },
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ },
+ "destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
+ },
+ "diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true
+ },
+ "editorconfig": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmmirror.com/editorconfig/-/editorconfig-0.15.3.tgz",
+ "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.19.0",
+ "lru-cache": "^4.1.5",
+ "semver": "^5.6.0",
+ "sigmund": "^1.0.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "escape-latex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/escape-latex/-/escape-latex-1.2.0.tgz",
+ "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw=="
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
+ },
+ "execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "express": {
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "requires": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.1",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ }
+ },
+ "fast-xml-parser": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+ "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+ "optional": true,
+ "requires": {
+ "strnum": "^1.0.5"
+ }
+ },
+ "figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ }
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true
+ },
+ "follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+ },
+ "form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
+ },
+ "frac": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
+ "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
+ },
+ "fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA=="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
+ },
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "ftp": {
+ "version": "0.3.10",
+ "resolved": "https://registry.npmmirror.com/ftp/-/ftp-0.3.10.tgz",
+ "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.x",
+ "xregexp": "2.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+ "dev": true
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+ },
+ "generic-pool": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz",
+ "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg=="
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg=="
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "dependencies": {
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmmirror.com/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "requires": {
+ "function-bind": "^1.1.2"
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "http-basic": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmmirror.com/http-basic/-/http-basic-8.1.3.tgz",
+ "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
+ "requires": {
+ "caseless": "^0.12.0",
+ "concat-stream": "^1.6.2",
+ "http-response-object": "^3.0.1",
+ "parse-cache-control": "^1.0.1"
+ }
+ },
+ "http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "requires": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ }
+ },
+ "http-response-object": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/http-response-object/-/http-response-object-3.0.2.tgz",
+ "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+ "requires": {
+ "@types/node": "^10.0.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.17.60",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-10.17.60.tgz",
+ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
+ }
+ }
+ },
+ "human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "inquirer": {
+ "version": "8.2.5",
+ "resolved": "https://registry.npmmirror.com/inquirer/-/inquirer-8.2.5.tgz",
+ "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.5",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
+ },
+ "invert-kv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz",
+ "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+ "dev": true
+ },
+ "ip": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "requires": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true
+ },
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "javascript-natural-sort": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmmirror.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
+ "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw=="
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "k8w-crypto": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/k8w-crypto/-/k8w-crypto-0.2.0.tgz",
+ "integrity": "sha512-M6u4eQ6CQaU5xO3s4zaUUp9G79xNDhXtTU0X7N80tDcBhQC5ggowlyOzj95v7WiCuk7xkV0aFsTmCpuf0m0djw==",
+ "dev": true
+ },
+ "k8w-extend-native": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmmirror.com/k8w-extend-native/-/k8w-extend-native-1.4.6.tgz",
+ "integrity": "sha512-AHTCyFshldMme0s9FKD+QKG+QZdBkHXzl+8kYfNhsSDhcdQ5TYWQwphjecSJjxNdGd78TIbO0fHiOvM+Ei22YA==",
+ "requires": {
+ "k8w-linq-array": "*",
+ "k8w-super-date": "*",
+ "k8w-super-object": "*"
+ }
+ },
+ "k8w-linq-array": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmmirror.com/k8w-linq-array/-/k8w-linq-array-0.2.8.tgz",
+ "integrity": "sha512-4IAkQN8UJdk804tQi++wuwSZvFWk/Wcl1uG5PR/0c0YvB5hUd2f8tJm3OgOMOxjV9UVByNLvnPYGIwrFQPpjlA=="
+ },
+ "k8w-super-date": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmmirror.com/k8w-super-date/-/k8w-super-date-0.1.3.tgz",
+ "integrity": "sha512-IBqKOAMAXR/bgzu+rYI30tEMP/Y6Q8HQuqJiTkE2mLJg11yok9guoi8uZTynTahviVBndcfBpOgi1H/zhihv7w=="
+ },
+ "k8w-super-object": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/k8w-super-object/-/k8w-super-object-0.3.0.tgz",
+ "integrity": "sha512-u2jfh4goYXKZmSucaLaOTaNbLRatjv0CSRpzE0KU0732+9XtYZFd5vrdw/mzJfK5fPHb/zyikOSHDX5mJrav+g=="
+ },
+ "lcid": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz",
+ "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ }
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true
+ },
+ "map-age-cleaner": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmmirror.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+ "dev": true,
+ "requires": {
+ "p-defer": "^1.0.0"
+ }
+ },
+ "mathjs": {
+ "version": "11.4.0",
+ "resolved": "https://registry.npmmirror.com/mathjs/-/mathjs-11.4.0.tgz",
+ "integrity": "sha512-SGhKmXnwsPWrLHvhzm849RJPMjFTgLgVwKtv2L+IY7XHB4nuzyZLfV2eHT1HtBZ4yzsLHgcqak47zMmxuEIIUg==",
+ "requires": {
+ "@babel/runtime": "^7.20.1",
+ "complex.js": "^2.1.1",
+ "decimal.js": "^10.4.2",
+ "escape-latex": "^1.2.0",
+ "fraction.js": "^4.2.0",
+ "javascript-natural-sort": "^0.7.1",
+ "seedrandom": "^3.0.5",
+ "tiny-emitter": "^2.1.0",
+ "typed-function": "^4.1.0"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
+ },
+ "mem": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/mem/-/mem-5.1.1.tgz",
+ "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
+ "dev": true,
+ "requires": {
+ "map-age-cleaner": "^0.1.3",
+ "mimic-fn": "^2.1.0",
+ "p-is-promise": "^2.1.0"
+ }
+ },
+ "memory-pager": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+ "optional": true
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-4.2.1.tgz",
+ "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "dev": true
+ },
+ "mocha": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmmirror.com/mocha/-/mocha-9.2.2.tgz",
+ "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==",
+ "dev": true,
+ "requires": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.3",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "4.2.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.1",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "which": "2.0.2",
+ "workerpool": "6.2.0",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ }
+ },
+ "mongodb": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.11.0.tgz",
+ "integrity": "sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg==",
+ "requires": {
+ "@aws-sdk/credential-providers": "^3.186.0",
+ "bson": "^4.7.0",
+ "denque": "^2.1.0",
+ "mongodb-connection-string-url": "^2.5.4",
+ "saslprep": "^1.0.3",
+ "socks": "^2.7.1"
+ }
+ },
+ "mongodb-connection-string-url": {
+ "version": "2.5.4",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz",
+ "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==",
+ "requires": {
+ "@types/whatwg-url": "^8.2.1",
+ "whatwg-url": "^11.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.1.tgz",
+ "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
+ },
+ "on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onchange": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmmirror.com/onchange/-/onchange-7.1.0.tgz",
+ "integrity": "sha512-ZJcqsPiWUAUpvmnJri5TPBooqJOPmC0ttN65juhN15Q8xA+Nbg3BaxBHXQ45EistKKlKElb0edmbPWnKSBkvMg==",
+ "dev": true,
+ "requires": {
+ "@blakeembrey/deque": "^1.0.5",
+ "@blakeembrey/template": "^1.0.0",
+ "arg": "^4.1.3",
+ "chokidar": "^3.3.1",
+ "cross-spawn": "^7.0.1",
+ "ignore": "^5.1.4",
+ "tree-kill": "^1.2.2"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "requires": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ }
+ },
+ "os-locale": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/os-locale/-/os-locale-5.0.0.tgz",
+ "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==",
+ "dev": true,
+ "requires": {
+ "execa": "^4.0.0",
+ "lcid": "^3.0.0",
+ "mem": "^5.0.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true
+ },
+ "p-defer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/p-defer/-/p-defer-1.0.0.tgz",
+ "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
+ "dev": true
+ },
+ "p-is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/p-is-promise/-/p-is-promise-2.1.0.tgz",
+ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "requires": {
+ "asap": "~2.0.6"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "requires": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+ "dev": true
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ },
+ "qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ },
+ "raw-body": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "requires": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+ "requires": {
+ "resolve": "^1.1.6"
+ }
+ },
+ "redis": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-4.3.1.tgz",
+ "integrity": "sha512-cM7yFU5CA6zyCF7N/+SSTcSJQSRMEKN0k0Whhu6J7n9mmXRoXugfWDBo5iOzGwABmsWKSwGPTU5J4Bxbl+0mrA==",
+ "requires": {
+ "@redis/bloom": "1.0.2",
+ "@redis/client": "1.3.0",
+ "@redis/graph": "1.0.1",
+ "@redis/json": "1.0.4",
+ "@redis/search": "1.1.0",
+ "@redis/time-series": "1.0.3"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "requires": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true
+ },
+ "rxjs": {
+ "version": "7.5.7",
+ "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.7.tgz",
+ "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "saslprep": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+ "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+ "optional": true,
+ "requires": {
+ "sparse-bitfield": "^3.0.3"
+ }
+ },
+ "seedrandom": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/seedrandom/-/seedrandom-3.0.5.tgz",
+ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ }
+ }
+ },
+ "serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "requires": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ }
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
+ },
+ "socks": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+ "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "requires": {
+ "ip": "^2.0.0",
+ "smart-buffer": "^4.2.0"
+ }
+ },
+ "sparse-bitfield": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+ "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+ "optional": true,
+ "requires": {
+ "memory-pager": "^1.0.2"
+ }
+ },
+ "ssf": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
+ "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+ "requires": {
+ "frac": "~1.1.2"
+ }
+ },
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+ "optional": true
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+ },
+ "sync-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/sync-request/-/sync-request-6.1.0.tgz",
+ "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+ "requires": {
+ "http-response-object": "^3.0.1",
+ "sync-rpc": "^1.2.1",
+ "then-request": "^6.0.0"
+ }
+ },
+ "sync-rpc": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmmirror.com/sync-rpc/-/sync-rpc-1.3.6.tgz",
+ "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+ "requires": {
+ "get-port": "^3.1.0"
+ }
+ },
+ "then-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/then-request/-/then-request-6.0.2.tgz",
+ "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+ "requires": {
+ "@types/concat-stream": "^1.6.0",
+ "@types/form-data": "0.0.33",
+ "@types/node": "^8.0.0",
+ "@types/qs": "^6.2.31",
+ "caseless": "~0.12.0",
+ "concat-stream": "^1.6.0",
+ "form-data": "^2.2.0",
+ "http-basic": "^8.1.1",
+ "http-response-object": "^3.0.1",
+ "promise": "^8.0.0",
+ "qs": "^6.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "8.10.66",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-8.10.66.tgz",
+ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="
+ }
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
+ },
+ "tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
+ "tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true
+ },
+ "ts-node": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz",
+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+ "dev": true,
+ "requires": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "dependencies": {
+ "diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true
+ }
+ }
+ },
+ "tsbuffer": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmmirror.com/tsbuffer/-/tsbuffer-2.2.7.tgz",
+ "integrity": "sha512-WkP6NU14W14Kxa+OtccJ4m9+nY8UZs/DlM3FQzxstBkNGzmNvggN3+2mfIzYO8YDKu6mqYUXgpNg1aqIYcUACw==",
+ "requires": {
+ "k8w-extend-native": "^1.4.6",
+ "tsbuffer-validator": "^2.1.1",
+ "tslib": "*"
+ }
+ },
+ "tsbuffer-proto-generator": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmmirror.com/tsbuffer-proto-generator/-/tsbuffer-proto-generator-1.7.2.tgz",
+ "integrity": "sha512-Rjq/mNXb6Z3ORi5M0BH3O+L0hpr+RcLzJ1edXO4bOZkojdtxDmwoKGBKoh+/xba+bhOiSiwHfVZLiQ06A6vEmw==",
+ "dev": true,
+ "requires": {
+ "k8w-crypto": "^0.2.0",
+ "k8w-extend-native": "^1.4.6",
+ "tsbuffer-schema": "^2.2.0",
+ "tslib": "*",
+ "typescript": "^4"
+ }
+ },
+ "tsbuffer-schema": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/tsbuffer-schema/-/tsbuffer-schema-2.2.0.tgz",
+ "integrity": "sha512-I4+5Xfk7G+D++kXdNnYTeY26WQTaf14C84XQwPKteNmrwxRY3CQCkMqASRiCUqtpOuDn43qmoxuXpT+Vo8Wltg=="
+ },
+ "tsbuffer-validator": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/tsbuffer-validator/-/tsbuffer-validator-2.1.1.tgz",
+ "integrity": "sha512-12JVltPQjv2hZqfd9TZhTjCyQ0bvtRlTXyczOAaH+CnryWI9Twt0i9ZGaM5fb2QMxW5BOhToOIbwO8opDqpCEg==",
+ "requires": {
+ "k8w-extend-native": "^1.4.6",
+ "tsbuffer-schema": "^2.2.0",
+ "tslib": "*"
+ }
+ },
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "tsrpc": {
+ "version": "3.4.12",
+ "resolved": "https://registry.npmmirror.com/tsrpc/-/tsrpc-3.4.12.tgz",
+ "integrity": "sha512-FMa7FdzW7LdhsQ49DxcNegeW4oRJGxqP+3DXbZBvsUHSeL2h6UFCSKmw2TypI2ChDeRGgbo+wt6uJ0upF6fz9Q==",
+ "requires": {
+ "@types/ws": "^7.4.7",
+ "chalk": "^4.1.2",
+ "tsbuffer": "^2.2.7",
+ "tsrpc-base-client": "^2.1.11",
+ "tsrpc-proto": "^1.4.3",
+ "uuid": "^8.3.2",
+ "ws": "^7.5.9"
+ }
+ },
+ "tsrpc-base-client": {
+ "version": "2.1.12",
+ "resolved": "https://registry.npmmirror.com/tsrpc-base-client/-/tsrpc-base-client-2.1.12.tgz",
+ "integrity": "sha512-7Zsby1dtDQkxzvT/tRMLLnjCqpYpoCwN9Sci9x7iWCBMNHiiBPBoKIIp2nqhlfLF3kxSgemQOGF499Mx3GVQfg==",
+ "requires": {
+ "k8w-extend-native": "^1.4.6",
+ "tsbuffer": "^2.2.7",
+ "tslib": "*",
+ "tsrpc-proto": "^1.4.3"
+ }
+ },
+ "tsrpc-cli": {
+ "version": "2.4.5",
+ "resolved": "https://registry.npmmirror.com/tsrpc-cli/-/tsrpc-cli-2.4.5.tgz",
+ "integrity": "sha512-/3MMyGAAuSnZLQVfoRZXI5sfyGakRTk2AfrllvVSUSfGPTr06iU1YAgOATNYEHl+uAj1+QFz3dKT8g3J+wCIcw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.2",
+ "chokidar": "^3.5.3",
+ "fs-extra": "^10.1.0",
+ "glob": "^7.2.3",
+ "inquirer": "^8.2.4",
+ "k8w-extend-native": "^1.4.6",
+ "minimist": "^1.2.6",
+ "ora": "^5.4.1",
+ "os-locale": "^5.0.0",
+ "ts-node": "^10.8.2",
+ "tsbuffer": "^2.2.3",
+ "tsbuffer-proto-generator": "^1.7.2",
+ "tsbuffer-schema": "^2.2.0",
+ "tsrpc-proto": "^1.4.2",
+ "typescript": "^4.7.4",
+ "typescript-formatter": "^7.2.2"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
+ "tsrpc-proto": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmmirror.com/tsrpc-proto/-/tsrpc-proto-1.4.3.tgz",
+ "integrity": "sha512-qtkk5i34m9/K1258EdyXAEikU/ADPELHCCXN/oFJ4XwH+kN3kXnKYmwCDblUuMA73V2+A/EwkgUGyAgPa335Hw==",
+ "requires": {
+ "tsbuffer-schema": "^2.2.0",
+ "tslib": "*"
+ }
+ },
+ "type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "typed-function": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/typed-function/-/typed-function-4.1.0.tgz",
+ "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg=="
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
+ "typescript": {
+ "version": "4.8.4",
+ "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz",
+ "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
+ "dev": true
+ },
+ "typescript-formatter": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmmirror.com/typescript-formatter/-/typescript-formatter-7.2.2.tgz",
+ "integrity": "sha512-V7vfI9XArVhriOTYHPzMU2WUnm5IMdu9X/CPxs8mIMGxmTBFpDABlbkBka64PZJ9/xgQeRpK8KzzAG4MPzxBDQ==",
+ "dev": true,
+ "requires": {
+ "commandpost": "^1.0.0",
+ "editorconfig": "^0.15.0"
+ }
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+ },
+ "v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
+ },
+ "wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "requires": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
+ },
+ "whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "requires": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "wmf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
+ "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
+ },
+ "word": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
+ "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
+ },
+ "workerpool": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmmirror.com/workerpool/-/workerpool-6.2.0.tgz",
+ "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "requires": {}
+ },
+ "xlsx": {
+ "version": "0.18.5",
+ "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz",
+ "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+ "requires": {
+ "adler-32": "~1.3.0",
+ "cfb": "~1.2.1",
+ "codepage": "~1.15.0",
+ "crc-32": "~1.2.1",
+ "ssf": "~0.11.2",
+ "wmf": "~1.0.1",
+ "word": "~0.3.0"
+ }
+ },
+ "xregexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/xregexp/-/xregexp-2.0.0.tgz",
+ "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==",
+ "dev": true
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
+ },
+ "yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ }
+ },
+ "yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..2086b37
--- /dev/null
+++ b/package.json
@@ -0,0 +1,49 @@
+{
+ "name": "server-.",
+ "description": "黑礁",
+ "version": "0.1.0",
+ "main": "index.js",
+ "private": true,
+ "scripts": {
+ "dev": "tsrpc-cli dev",
+ "build": "tsrpc-cli build && copy js_pm2.config.js dist && copy zoeninfo.sh dist && mkdir dist\\json && xcopy src\\json dist\\json /e ",
+ "build_win": "tsrpc-cli build && copy js_pm2.config.js dist && copy zoeninfo.sh dist && mkdir dist\\json && xcopy src\\json dist\\json /e ",
+ "build_linux": "tsrpc-cli build && cp js_pm2.config.js dist && cp zoeninfo.sh dist && cp src/json/ -a dist ",
+ "build_docker_win": "npm run build_win && cd dist && npm i --omit=dev",
+ "build_docker_linux": "npm run build_linux && cd dist && npm i --omit=dev",
+ "doc": "tsrpc-cli doc && node js_uploadDoc.js",
+ "test": "mocha test/**/*.test.ts",
+ "proto": "tsrpc-cli proto",
+ "sync": "tsrpc-cli sync",
+ "api": "tsrpc-cli api",
+ "capi": "npm run proto && npm run api && npm run doc"
+ },
+ "devDependencies": {
+ "@types/crypto-js": "^4.1.1",
+ "@types/json5": "^2.2.0",
+ "@types/mathjs": "^9.4.2",
+ "@types/mocha": "^8.2.3",
+ "@types/mongodb": "^4.0.7",
+ "@types/node": "^15.14.9",
+ "@types/redis": "^4.0.11",
+ "ftp": "^0.3.10",
+ "mocha": "^9.2.2",
+ "onchange": "^7.1.0",
+ "ts-node": "^10.9.1",
+ "tsrpc-cli": "^2.4.5",
+ "typescript": "^4.8.4"
+ },
+ "dependencies": {
+ "axios": "^1.4.0",
+ "crypto-js": "^4.1.1",
+ "express": "^4.18.2",
+ "json5": "^2.2.3",
+ "mathjs": "^11.4.0",
+ "mongodb": "^4.11.0",
+ "redis": "^4.3.1",
+ "shelljs": "^0.8.5",
+ "sync-request": "^6.1.0",
+ "tsrpc": "^3.4.12",
+ "xlsx": "^0.18.5"
+ }
+}
diff --git a/src/api_cross/clsl/ApiFindEnemy.ts b/src/api_cross/clsl/ApiFindEnemy.ts
new file mode 100644
index 0000000..e6ead85
--- /dev/null
+++ b/src/api_cross/clsl/ApiFindEnemy.ts
@@ -0,0 +1,21 @@
+import { ApiCall } from "tsrpc";
+import { ReqFindEnemy, ResFindEnemy } from "../../cross/protocols/clsl/PtlFindEnemy";
+import { formatNpcData } from '../../shared/fightControl/fightFun';
+
+export default async function (call: ApiCall) {
+ let my = await G.mongodb.collection('clslCrossUser').findOne({ uid: call.req.uid });
+ let starConf = getStarConf(my.allStar);
+ let others = await G.mongodb.collection('clslCrossUser').find({ uid: { $nin: [call.req.uid] } }).toArray();
+ let enemy = others.random();
+
+ call.succ({
+ allStar: enemy?.allStar || my.allStar,
+ info: enemy?.info || formatNpcData(starConf.npc)
+ });
+}
+
+const endConf = Object.values(G.gc.clsl_dan).slice(-1)[0];
+
+function getStarConf(star = 0) {
+ return G.gc.clsl_dan[star] || endConf;
+}
\ No newline at end of file
diff --git a/src/api_cross/clsl/ApiLog.ts b/src/api_cross/clsl/ApiLog.ts
new file mode 100644
index 0000000..6f8b44b
--- /dev/null
+++ b/src/api_cross/clsl/ApiLog.ts
@@ -0,0 +1,14 @@
+import { ApiCall } from "tsrpc";
+import { ReqLog, ResLog } from "../../cross/protocols/clsl/PtlLog";
+import { FightFun } from '../../public/fight';
+
+export default async function (call: ApiCall) {
+ if (call.req.result) {
+ FightFun.saveLog(call.req.uid, 'clsl', call.req.result);
+ call.succ({});
+ } else {
+ call.succ({
+ logs: await FightFun.readLog(call.req.uid, 'clsl')
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/api_cross/clsl/ApiRank.ts b/src/api_cross/clsl/ApiRank.ts
new file mode 100644
index 0000000..ff8eeff
--- /dev/null
+++ b/src/api_cross/clsl/ApiRank.ts
@@ -0,0 +1,7 @@
+import { ApiCall } from "tsrpc";
+import { ReqRank, ResRank } from "../../cross/protocols/clsl/PtlRank";
+import { Rank } from '../../public/rank/rank';
+
+export default async function (call: ApiCall) {
+ call.succ(await Rank.list.clslCross.getRankList(call.req.gud.uid, call.req.gud));
+}
\ No newline at end of file
diff --git a/src/api_cross/clsl/ApiRankUids.ts b/src/api_cross/clsl/ApiRankUids.ts
new file mode 100644
index 0000000..4530770
--- /dev/null
+++ b/src/api_cross/clsl/ApiRankUids.ts
@@ -0,0 +1,10 @@
+import { ApiCall } from "tsrpc";
+import { ReqRankUids, ResRankUids } from "../../cross/protocols/clsl/PtlRankUids";
+import { Rank } from '../../public/rank/rank';
+
+export default async function (call: ApiCall) {
+ let rankList = await Rank.list.clslCross.getRankListAll()
+ call.succ({
+ uids: rankList.map(li => li.player.uid)
+ });
+}
\ No newline at end of file
diff --git a/src/api_cross/clsl/ApiUpLoad.ts b/src/api_cross/clsl/ApiUpLoad.ts
new file mode 100644
index 0000000..7d40b57
--- /dev/null
+++ b/src/api_cross/clsl/ApiUpLoad.ts
@@ -0,0 +1,23 @@
+import { ApiCall } from "tsrpc";
+import { ReqUpLoad, ResUpLoad } from "../../cross/protocols/clsl/PtlUpLoad";
+import { Rank } from '../../public/rank/rank';
+
+export default async function (call: ApiCall) {
+ let { allStar, uid, ...ops } = call.req;
+
+ let a = await G.mongodb.collection('clslCrossUser').findOneAndUpdate(
+ { uid: uid },
+ {
+ $inc: { allStar: allStar || 0 },
+ $set: ops
+ },
+ { upsert: true }
+ );
+
+ if (allStar != undefined && ops.info) {
+ Rank.list.clslCross.addNew({
+ player: a.value.info.player,
+ valArr: [(await G.mongodb.collection('clslCrossUser').findOne({ uid: uid })).allStar]
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/api_cross/hbzb/jfs/ApiGetEnemy.ts b/src/api_cross/hbzb/jfs/ApiGetEnemy.ts
new file mode 100644
index 0000000..7ea9a6b
--- /dev/null
+++ b/src/api_cross/hbzb/jfs/ApiGetEnemy.ts
@@ -0,0 +1,43 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetEnemy, ResGetEnemy } from "../../../cross/protocols/hbzb/jfs/PtlGetEnemy";
+import { Rank } from '../../../public/rank/rank';
+import { formatNpcData } from '../../../shared/fightControl/fightFun';
+import { PublicShared } from "../../../shared/public/public";
+
+export default async function (call: ApiCall) {
+ // TODO
+ let allPlayers = Rank.list.hbzbCross.allPlayer;
+ let user = allPlayers[call.req.uid];
+ if (!user) return call.succ({ enemy: [] });
+
+ let conf = call.req.auto ? G.gc.hbzb.jfsMatchingAuto : G.gc.hbzb.jfsMatchingHand;
+ let rang = conf.map(val => {
+ return [PublicShared.eval(val.min, { zhanli: user.data.player.power }), PublicShared.eval(val.max, { zhanli: user.data.player.power })] as [number, number];
+ });
+ let min = rang.slice(-1)[0][0];
+ let max = rang[0][1];
+ let players = Object.values(allPlayers).filter(p => {
+ return p.data.player.power >= min && p.data.player.power <= max && p.data.player.uid != call.req.uid;
+ });
+ let select: string[] = [];
+ let enemy = rang.map((r, index) => {
+ let es = players.filter(p => p.data.player.power >= r[0] && p.data.player.power <= r[1] && !select.includes(p.data.player.uid));
+ if (es.length > 0) {
+ let { uid, ...ops } = es.random();
+ select.push(uid);
+ return ops;
+ } else {
+ return {
+ data: getNpc(user.data.player.lv, index),
+ jifen: 1000
+ };
+ }
+ });
+
+ call.succ({ enemy: enemy });
+}
+
+function getNpc(lv: number, index: number) {
+ let rang = G.gc.hbzb.jfsRefreshNpcId.find(v => lv >= v.lvs[0] && lv <= v.lvs[1]);
+ return formatNpcData(rang.npcs[index].random());
+}
\ No newline at end of file
diff --git a/src/api_cross/hbzb/jfs/ApiGetLog.ts b/src/api_cross/hbzb/jfs/ApiGetLog.ts
new file mode 100644
index 0000000..c252cae
--- /dev/null
+++ b/src/api_cross/hbzb/jfs/ApiGetLog.ts
@@ -0,0 +1,7 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetLog, ResGetLog } from "../../../cross/protocols/hbzb/jfs/PtlGetLog";
+import { FightFun } from '../../../public/fight';
+
+export default async function (call: ApiCall) {
+ call.succ(await FightFun.readLog(call.req.uid, 'hbzbJfs'));
+}
\ No newline at end of file
diff --git a/src/api_cross/hbzb/jfs/ApiGetRankList.ts b/src/api_cross/hbzb/jfs/ApiGetRankList.ts
new file mode 100644
index 0000000..90718c9
--- /dev/null
+++ b/src/api_cross/hbzb/jfs/ApiGetRankList.ts
@@ -0,0 +1,9 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetRankList, ResGetRankList } from "../../../cross/protocols/hbzb/jfs/PtlGetRankList";
+import { Rank } from '../../../public/rank/rank';
+
+export default async function (call: ApiCall) {
+ let rankList = await Rank.list.hbzbCross.getRankListAll()
+ // TODO
+ call.succ({ rankList: rankList, jifen: Rank.list.hbzbCross.allPlayer[call.req.uid]?.jifen || 1000 });
+}
\ No newline at end of file
diff --git a/src/api_cross/hbzb/jfs/ApiGetUser.ts b/src/api_cross/hbzb/jfs/ApiGetUser.ts
new file mode 100644
index 0000000..081d04d
--- /dev/null
+++ b/src/api_cross/hbzb/jfs/ApiGetUser.ts
@@ -0,0 +1,7 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetUser, ResGetUser } from "../../../cross/protocols/hbzb/jfs/PtlGetUser";
+
+export default async function (call: ApiCall) {
+ // TODO
+ call.error('API Not Implemented');
+}
\ No newline at end of file
diff --git a/src/api_cross/hbzb/zbs/ApiGetEnemy.ts b/src/api_cross/hbzb/zbs/ApiGetEnemy.ts
new file mode 100644
index 0000000..757c5c2
--- /dev/null
+++ b/src/api_cross/hbzb/zbs/ApiGetEnemy.ts
@@ -0,0 +1,31 @@
+import {ApiCall} from "tsrpc";
+import {ReqGetEnemy, ResGetEnemy} from "../../../cross/protocols/hbzb/zbs/PtlGetEnemy";
+import {Rank} from '../../../public/rank/rank';
+
+export default async function (call: ApiCall) {
+ let list = await Rank.list.hbzbZbsCross.getRankListAll();
+ let enemys = list.slice(0, 10);
+ let myRank = list.findIndex(e => e.player.uid == call.req.uid);
+
+ if (myRank > 8) {
+ if (myRank == 9) enemys.push(list.slice(10, 5).random());
+ else if (myRank == 10) enemys.push(list.slice(11, 5).random());
+ else {
+ let two = list.slice(10, myRank - 10).shuffle();
+ enemys.push(...two.slice(0, 2));
+ enemys.push(list.slice(myRank + 1, 5).random());
+ }
+ }
+
+
+ call.succ({
+ enemy: enemys.map((e, i) => ({
+ data: {
+ player: e.player,
+ roles: e.roles
+ },
+ rank: i
+ })),
+ rank: myRank
+ });
+}
\ No newline at end of file
diff --git a/src/api_cross/hbzb/zbs/ApiGetLog.ts b/src/api_cross/hbzb/zbs/ApiGetLog.ts
new file mode 100644
index 0000000..4487ef1
--- /dev/null
+++ b/src/api_cross/hbzb/zbs/ApiGetLog.ts
@@ -0,0 +1,7 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetLog, ResGetLog } from "../../../cross/protocols/hbzb/zbs/PtlGetLog";
+import { FightFun } from '../../../public/fight';
+
+export default async function (call: ApiCall) {
+ call.succ(await FightFun.readLog(call.req.uid, 'hbzbZbs'));
+}
\ No newline at end of file
diff --git a/src/api_cross/hbzb/zbs/ApiGetRankList.ts b/src/api_cross/hbzb/zbs/ApiGetRankList.ts
new file mode 100644
index 0000000..aa01d09
--- /dev/null
+++ b/src/api_cross/hbzb/zbs/ApiGetRankList.ts
@@ -0,0 +1,8 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetRankList, ResGetRankList } from "../../../cross/protocols/hbzb/zbs/PtlGetRankList";
+import { Rank } from '../../../public/rank/rank';
+
+export default async function (call: ApiCall) {
+ let rankList = await Rank.list.hbzbZbsCross.getRankListAll();
+ call.succ({ rankList: rankList });
+}
\ No newline at end of file
diff --git a/src/api_cross/hbzb/zbs/ApiGetStatus.ts b/src/api_cross/hbzb/zbs/ApiGetStatus.ts
new file mode 100644
index 0000000..316b1ba
--- /dev/null
+++ b/src/api_cross/hbzb/zbs/ApiGetStatus.ts
@@ -0,0 +1,8 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetStatus, ResGetStatus } from "../../../cross/protocols/hbzb/zbs/PtlGetStatus";
+import { Rank } from '../../../public/rank/rank';
+
+export default async function (call: ApiCall) {
+ let rank = await Rank.list.hbzbZbsCross.getRankSortByOne(call.req.uid)
+ call.succ({ status: rank});
+}
\ No newline at end of file
diff --git a/src/api_cross/hbzb/zbs/ApiSendJjcTop.ts b/src/api_cross/hbzb/zbs/ApiSendJjcTop.ts
new file mode 100644
index 0000000..ac28c16
--- /dev/null
+++ b/src/api_cross/hbzb/zbs/ApiSendJjcTop.ts
@@ -0,0 +1,13 @@
+import { ApiCall } from "tsrpc";
+import { ReqSendJjcTop, ResSendJjcTop } from "../../../cross/protocols/hbzb/zbs/PtlSendJjcTop";
+import { Rank } from '../../../public/rank/rank';
+
+export default async function (call: ApiCall) {
+ // Rank.list.hbzbZbsCross.list.push(...call.req.tops);
+ for (let index = 0; index < call.req.tops.length; index++) {
+ const element = call.req.tops[index];
+ element["valArr"] = [0];
+ Rank.list.hbzbZbsCross.addNew(element)
+
+ };
+}
\ No newline at end of file
diff --git a/src/api_cross/kbzz/ApiApply.ts b/src/api_cross/kbzz/ApiApply.ts
new file mode 100644
index 0000000..57ba8cd
--- /dev/null
+++ b/src/api_cross/kbzz/ApiApply.ts
@@ -0,0 +1,7 @@
+import { ApiCall } from "tsrpc";
+import { ReqApply, ResApply } from "../../cross/protocols/kbzz/PtlApply";
+
+export default async function (call: ApiCall) {
+ G.mongodb.collection('kbzzApplyUser').updateOne({ uid: call.req.info.player.uid }, { $set: { info: call.req.info } }, { upsert: true });
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_cross/kbzz/ApiGetUser.ts b/src/api_cross/kbzz/ApiGetUser.ts
new file mode 100644
index 0000000..1284126
--- /dev/null
+++ b/src/api_cross/kbzz/ApiGetUser.ts
@@ -0,0 +1,12 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetUser, ResGetUser } from "../../cross/protocols/kbzz/PtlGetUser";
+
+export default async function (call: ApiCall) {
+
+ let dbData = await G.mongodb.collection('kbzzGroupUser').findOne({ uid: call.req.uid });
+
+ call.succ({
+ group: dbData.group,
+ troop: dbData.troop
+ });
+}
\ No newline at end of file
diff --git a/src/api_cross/kbzz/ApiGroupRank.ts b/src/api_cross/kbzz/ApiGroupRank.ts
new file mode 100644
index 0000000..9165b4e
--- /dev/null
+++ b/src/api_cross/kbzz/ApiGroupRank.ts
@@ -0,0 +1,17 @@
+import { ApiCall } from "tsrpc";
+import { ReqGroupRank, ResGroupRank } from "../../cross/protocols/kbzz/PtlGroupRank";
+
+export default async function (call: ApiCall) {
+ // TODO
+ let db = await G.mongodb.collection('kbzzGroupTroop').find({ group: call.req.group }).toArray();
+
+ call.succ({
+ rank: db.map(d => {
+ return {
+ troop: d.troop,
+ score: d.score
+ };
+ }),
+ log: (await G.mongodb.collection('kbzzGroupLog').findOne({ group: call.req.group }))?.log || []
+ });
+}
\ No newline at end of file
diff --git a/src/api_cross/kbzz/ApiRank.ts b/src/api_cross/kbzz/ApiRank.ts
new file mode 100644
index 0000000..237b8e2
--- /dev/null
+++ b/src/api_cross/kbzz/ApiRank.ts
@@ -0,0 +1,17 @@
+import { ApiCall } from "tsrpc";
+import { ReqRank, ResRank } from "../../cross/protocols/kbzz/PtlRank";
+import { RankKbzz } from '../../public/rank/rank_kbzz';
+
+export default async function (call: ApiCall) {
+ let _cunzai = await G.mongodb.collection('kbzzGroupTroop').findOne({})
+ if (!_cunzai) {
+ return call.error('', { code: -1, message: '功能未开放' })
+ }
+ let db = await G.mongodb.collection('kbzzGroupUser').findOne({ uid: call.req.uid });
+ let group = db?.group || 0;
+ let rank = await RankKbzz.groupList[group].getRankList(call.req.uid);
+
+ call.succ({
+ ...rank
+ });
+}
\ No newline at end of file
diff --git a/src/api_cross/kbzz/ApiRefresh.ts b/src/api_cross/kbzz/ApiRefresh.ts
new file mode 100644
index 0000000..af7f78e
--- /dev/null
+++ b/src/api_cross/kbzz/ApiRefresh.ts
@@ -0,0 +1,19 @@
+import { ApiCall } from "tsrpc";
+import { ReqRefresh, ResRefresh } from "../../cross/protocols/kbzz/PtlRefresh";
+
+export default async function (call: ApiCall) {
+ let enemys = await G.mongodb.collection('kbzzGroupUser').find({ group: call.req.group, troop: { $nin: [call.req.troop] } }).toArray();
+ enemys.sort(() => Math.random() - .5);
+
+ let arr = enemys.slice(0, G.gc.kbzz.refreshEnemyNum).map(e => {
+ return {
+ info: e.info,
+ troop: e.troop,
+ result: null
+ };
+ });
+
+ call.succ({
+ enemy: arr
+ });
+}
\ No newline at end of file
diff --git a/src/api_cross/kbzz/ApiState.ts b/src/api_cross/kbzz/ApiState.ts
new file mode 100644
index 0000000..833cda9
--- /dev/null
+++ b/src/api_cross/kbzz/ApiState.ts
@@ -0,0 +1,12 @@
+import { ApiCall } from "tsrpc";
+import { ReqState, ResState } from "../../cross/protocols/kbzz/PtlState";
+
+export default async function (call: ApiCall) {
+
+ let num = await G.mongodb.collection(call.req.type == 'apply' ? 'kbzzApplyUser' : 'kbzzGroupUser').countDocuments();
+
+ call.succ({
+ num: num,
+ succ: call.req.type == 'apply' ? num >= G.gc.kbzz.groupNum : num >= 1
+ });
+}
\ No newline at end of file
diff --git a/src/api_cross/kbzz/ApiUpUser.ts b/src/api_cross/kbzz/ApiUpUser.ts
new file mode 100644
index 0000000..c24b9ee
--- /dev/null
+++ b/src/api_cross/kbzz/ApiUpUser.ts
@@ -0,0 +1,44 @@
+import { ApiCall } from "tsrpc";
+import { ReqUpUser, ResUpUser } from "../../cross/protocols/kbzz/PtlUpUser";
+import { RankKbzz } from '../../public/rank/rank_kbzz';
+
+export default async function (call: ApiCall) {
+
+
+ G.mongodb.collection('kbzzGroupUser').updateOne(
+ { uid: call.req.uid },
+ {
+ $inc: { score: call.req.addScore },
+ $set: call.req.info == null ? {} : { info: call.req.info }
+ }
+ );
+
+ G.mongodb.collection('kbzzGroupTroop').updateOne(
+ { group: call.req.group, troop: call.req.troop },
+ {
+ $inc: { score: call.req.addScore }
+ }
+ );
+
+ G.mongodb.collection('kbzzGroupLog').updateOne(
+ { group: call.req.group },
+ {
+ $push: {
+ log: {
+ $each: [call.req.log],
+ $slice: -50
+ }
+ }
+ },
+ { upsert: true }
+ );
+
+ if (call.req.info != null) {
+ RankKbzz.groupList[call.req.group].addNew({
+ ...call.req.info,
+ valArr: [call.req.allScore]
+ });
+ }
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApiBaoMing.ts b/src/api_cross/wzry/ApiBaoMing.ts
new file mode 100644
index 0000000..7bb3fab
--- /dev/null
+++ b/src/api_cross/wzry/ApiBaoMing.ts
@@ -0,0 +1,13 @@
+import { ApiCall } from "tsrpc";
+import { ReqBaoMing, ResBaoMing } from "../../cross/protocols/wzry/PtlBaoMing";
+
+export default async function (call: ApiCall) {
+ let _setData = {
+ zkey: call.req.zkey,
+ data: call.req.data,
+ jifen: 0,
+ uid: call.req.data.player.uid
+ }
+ await G.mongodb.collection('wzry_user_cross').updateOne({ uid: call.req.data.player.uid }, { $set: _setData }, { upsert: true })
+ call.succ({ mydata: _setData });
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApiDldRefre.ts b/src/api_cross/wzry/ApiDldRefre.ts
new file mode 100644
index 0000000..f02b34f
--- /dev/null
+++ b/src/api_cross/wzry/ApiDldRefre.ts
@@ -0,0 +1,9 @@
+import { ApiCall } from "tsrpc";
+import { ReqDldRefre, ResDldRefre } from "../../cross/protocols/wzry/PtlDldRefre";
+
+export default async function (call: ApiCall) {
+ let others = await G.mongodb.collection('wzry_fight').find({ uid: { $nin: [call.req.uid] } }).toArray();
+ let enemy = others.random();
+
+ call.succ({ info: enemy.data })
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApiRank.ts b/src/api_cross/wzry/ApiRank.ts
new file mode 100644
index 0000000..f31e925
--- /dev/null
+++ b/src/api_cross/wzry/ApiRank.ts
@@ -0,0 +1,15 @@
+import { ApiCall } from "tsrpc";
+import { ReqRank, ResRank } from "../../cross/protocols/wzry/PtlRank";
+import { ChatFun } from "../../public/chat";
+import { EmailFun } from "../../public/email";
+import { FightFun } from "../../public/fight";
+import { Rank } from '../../public/rank/rank';
+import { SchedulerWzryDlDstart, wzrygroup } from "../../public/scheduler/scheduler_wzry";
+import { WangZheRongYaofun } from "../../public/wzry";
+import { PublicShared } from "../../shared/public/public";
+
+export default async function (call: ApiCall) {
+ let _r = await Rank.list.wzryCross.getRankList(call.req.gud.uid, call.req.gud)
+
+ call.succ(_r);
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApiSetWzFight.ts b/src/api_cross/wzry/ApiSetWzFight.ts
new file mode 100644
index 0000000..ddf772e
--- /dev/null
+++ b/src/api_cross/wzry/ApiSetWzFight.ts
@@ -0,0 +1,24 @@
+import { ApiCall } from "tsrpc";
+import { ReqSetWzFight, ResSetWzFight } from "../../cross/protocols/wzry/PtlSetWzFight";
+import { Rank } from "../../public/rank/rank";
+
+export default async function (call: ApiCall) {
+ let _setData = {
+ zkey: call.req.zkey,
+ data: call.req.data,
+ jifen: call.req.jifen,
+ uid: call.req.data.player.uid
+ }
+ await G.mongodb.collection('wzry_fight').updateOne({ uid: call.req.data.player.uid }, { $set: _setData })
+ // 有积分数据更新积分
+ if (_setData.jifen) {
+ let data = {
+ valArr: [_setData.jifen],
+ ..._setData.data
+ }
+ Rank.list.wzryCross.addNew(data)
+ }
+
+ let rank = await Rank.list.wzryCross.getPlayerRank(call.req.data.player.uid) || -1
+ call.succ({ mydata: _setData, rank: rank });
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApiUpdateFight.ts b/src/api_cross/wzry/ApiUpdateFight.ts
new file mode 100644
index 0000000..d1ae133
--- /dev/null
+++ b/src/api_cross/wzry/ApiUpdateFight.ts
@@ -0,0 +1,23 @@
+import { ApiCall } from "tsrpc";
+import { ReqUpdateFight, ResUpdateFight } from "../../cross/protocols/wzry/PtlUpdateFight";
+
+export default async function (call: ApiCall) {
+ if (call.req.setdata) {
+ await G.mongodb.collection('wzry_fight').updateOne({ uid: call.req.uid }, { $set: call.req.setdata })
+ }
+
+ if (call.req.isjingcai) {
+ await G.mongodb.collection('crosskv').updateOne({ type: "wzryallnum" }, { $inc: { num: call.req.isjingcai } }, { upsert: true })
+ }
+
+ // 设置删除跨服邮件的标识符,标识已经被拉倒本服生效
+ if (call.req?.isdelemail?.isdel) {
+ let _list = []
+ for (let index = 0; index < call.req.isdelemail.email.length; index++) {
+ const element = call.req.isdelemail.email[index];
+ _list.push(G.mongodb.conversionId(element))
+ }
+ await G.mongodb.collection('email').updateMany({ _id: { $in: _list } }, {$set: { isdel: 1 }})
+ }
+ call.succ({})
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApiWzFightData.ts b/src/api_cross/wzry/ApiWzFightData.ts
new file mode 100644
index 0000000..3421bca
--- /dev/null
+++ b/src/api_cross/wzry/ApiWzFightData.ts
@@ -0,0 +1,45 @@
+import { ApiCall } from "tsrpc";
+import { ReqWzFightData, ResWzFightData } from "../../cross/protocols/wzry/PtlWzFightData";
+import { Rank } from "../../public/rank/rank";
+import { PublicShared } from "../../shared/public/public";
+
+export default async function (call: ApiCall) {
+ // 王者参与数据
+ let changeInfo: ResWzFightData = {}
+ if (call.req.iswzfight) {
+ let _myFight = await G.mongodb.collection('wzry_fight').findOne({ uid: call.req.uid })
+ if (_myFight && Object.keys(_myFight).length > 0) {
+ if (_myFight?._id) delete _myFight._id
+ _myFight['rank'] = await Rank.list.wzryCross.getPlayerRank(call.req.uid) || -1
+ changeInfo['info'] = _myFight
+ }
+ }
+
+ // 王者之巅本期数据
+ if (call.req.iswzzd) {
+ let zkey = PublicShared.getToWeek()
+ let _wzzd = await G.mongodb.collection('wzrywiner').findOne({ zkey: zkey })
+ if (_wzzd && _wzzd._id) delete _wzzd._id
+ changeInfo['wzzd'] = _wzzd
+ }
+
+ if (call.req.isdel) {
+ // 删除本期数据
+ await G.mongodb.collection('wzry_fight').deleteMany({})
+ await G.mongodb.collection('crosskv').deleteMany({ type: 'wzryallnum' })
+ await G.mongodb.collection('wzry_user_cross').deleteMany({})
+ await G.mongodb.collection('wzry_fight_log').deleteMany({})
+ await Rank.list.wzryCross.clear()
+ }
+
+ // 跨服邮件
+ if (call.req.isemail) {
+ let _crossEmail = await G.mongodb.collection('email').find({ isdel: { $exists: false } }).toArray()
+ _crossEmail.forEach(email => {
+ email._id.toString()
+ })
+ changeInfo['crossEmail'] = _crossEmail
+ }
+
+ call.succ(changeInfo)
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApiWzFightGroup.ts b/src/api_cross/wzry/ApiWzFightGroup.ts
new file mode 100644
index 0000000..b16398e
--- /dev/null
+++ b/src/api_cross/wzry/ApiWzFightGroup.ts
@@ -0,0 +1,7 @@
+import { ApiCall } from "tsrpc";
+import { ReqWzFightGroup, ResWzFightGroup } from "../../cross/protocols/wzry/PtlWzFightGroup";
+
+export default async function (call: ApiCall) {
+ let _myFight = await G.mongodb.collection('wzry_fight').find({ ...call.req.where }).toArray()
+ call.succ({ info: _myFight })
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApiWzzd.ts b/src/api_cross/wzry/ApiWzzd.ts
new file mode 100644
index 0000000..82a5dcd
--- /dev/null
+++ b/src/api_cross/wzry/ApiWzzd.ts
@@ -0,0 +1,8 @@
+import { ApiCall } from "tsrpc";
+import { ReqWzzd, ResWzzd } from "../../cross/protocols/wzry/PtlWzzd";
+
+export default async function (call: ApiCall) {
+ let _where = call.req?.where ? call.req.where : {}
+ let wzzdlist = await G.mongodb.collection('wzrywiner').find(_where).toArray()
+ call.succ({ wzzdlist: wzzdlist });
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApicatFightLog.ts b/src/api_cross/wzry/ApicatFightLog.ts
new file mode 100644
index 0000000..fbe0d99
--- /dev/null
+++ b/src/api_cross/wzry/ApicatFightLog.ts
@@ -0,0 +1,11 @@
+import { ApiCall } from "tsrpc";
+import { ReqcatFightLog, RescatFightLog } from "../../cross/protocols/wzry/PtlcatFightLog";
+
+export default async function (call: ApiCall) {
+ let result = await G.mongodb.collection('wzry_fight_log').findOne({ _id: G.mongodb.conversionId(call.req.fid) });
+ if (!result) {
+ return call.errorCode(-1);
+ }
+ delete result._id;
+ call.succ({ result: result });
+}
\ No newline at end of file
diff --git a/src/api_cross/wzry/ApigetJingCai.ts b/src/api_cross/wzry/ApigetJingCai.ts
new file mode 100644
index 0000000..424f80a
--- /dev/null
+++ b/src/api_cross/wzry/ApigetJingCai.ts
@@ -0,0 +1,9 @@
+import { ApiCall } from "tsrpc";
+import { ReqgetJingCai, ResgetJingCai } from "../../cross/protocols/wzry/PtlgetJingCai";
+
+export default async function (call: ApiCall) {
+ let num = (await G.mongodb.collection('crosskv').findOne({ type: 'wzryallnum' }))?.num || 0
+ call.succ({
+ num: num
+ })
+}
\ No newline at end of file
diff --git a/src/api_o2s/ApiAddHuoDong.ts b/src/api_o2s/ApiAddHuoDong.ts
new file mode 100644
index 0000000..eb0d885
--- /dev/null
+++ b/src/api_o2s/ApiAddHuoDong.ts
@@ -0,0 +1,22 @@
+import { ApiCall } from "tsrpc";
+import { ReqAddHuoDong, ResAddHuoDong } from "../monopoly/protocols/PtlAddHuoDong";
+import { HuoDongFun } from "../public/huodongfun";
+import { PublicShared } from "../shared/public/public";
+
+export default async function (call: ApiCall) {
+ let _hd = call.req
+ if (_hd["ttype"] == 0) {
+ if (_hd["stime"] == -1) { // 永久活动
+ _hd["stime"] = 0
+ _hd["rtime"] = 0
+ _hd["etime"] = 0
+ _hd["showtime"] = "永久"
+ } else { // 不是永久活动,直接使用传输时间;检测显示时间
+ let _st = PublicShared.fmtTime(_hd["stime"])
+ let _rt = PublicShared.fmtTime(_hd["rtime"])
+ _hd["showtime"] = _st + " - " + _rt
+ }
+ }
+
+ call.succ({ insertId: await HuoDongFun.addHuoDong(_hd) });
+}
\ No newline at end of file
diff --git a/src/api_o2s/ApiCatAllhd.ts b/src/api_o2s/ApiCatAllhd.ts
new file mode 100644
index 0000000..aeca85f
--- /dev/null
+++ b/src/api_o2s/ApiCatAllhd.ts
@@ -0,0 +1,13 @@
+import { ApiCall } from "tsrpc";
+import { ReqCatAllhd, ResCatAllhd } from "../monopoly/protocols/PtlCatAllhd";
+import { HuoDongFun } from "../public/huodongfun";
+
+export default async function (call: ApiCall) {
+ let _where = call.req.where
+ let _w = {}
+ if (_where && Object.keys(_where).length > 0) {
+ _w = _where
+ }
+ let _hdList = await HuoDongFun.catAllHD(_w)
+ call.succ({ hdlist: _hdList });
+}
\ No newline at end of file
diff --git a/src/api_o2s/ApiDelHuoDong.ts b/src/api_o2s/ApiDelHuoDong.ts
new file mode 100644
index 0000000..7f83dfc
--- /dev/null
+++ b/src/api_o2s/ApiDelHuoDong.ts
@@ -0,0 +1,8 @@
+import { ApiCall } from "tsrpc";
+import { ReqDelHuoDong, ResDelHuoDong } from "../monopoly/protocols/PtlDelHuoDong";
+import { HuoDongFun } from "../public/huodongfun";
+
+export default async function (call: ApiCall) {
+ await HuoDongFun.delHD(call.req.hdid)
+ call.succ({ status: "success" });
+}
\ No newline at end of file
diff --git a/src/api_o2s/ApiEmail.ts b/src/api_o2s/ApiEmail.ts
new file mode 100644
index 0000000..ea6c22b
--- /dev/null
+++ b/src/api_o2s/ApiEmail.ts
@@ -0,0 +1,7 @@
+import { ApiCall } from "tsrpc";
+import { ReqEmail, ResEmail } from "../monopoly/protocols/PtlEmail";
+import { EmailFun } from '../public/email';
+
+export default async function (call: ApiCall) {
+ call.succ({ insertId: await EmailFun.addEmail(call.req) });
+}
\ No newline at end of file
diff --git a/src/api_o2s/ApiGetLog.ts b/src/api_o2s/ApiGetLog.ts
new file mode 100644
index 0000000..90c8ee2
--- /dev/null
+++ b/src/api_o2s/ApiGetLog.ts
@@ -0,0 +1,19 @@
+import { existsSync, readFileSync, readdirSync } from 'fs';
+import { dirname, join } from 'path';
+import { ApiCall } from "tsrpc";
+import { ReqGetLog, ResGetLog } from "../monopoly/protocols/PtlGetLog";
+
+export default async function (call: ApiCall) {
+ let logStr = '';
+ let dir = join(dirname(require.main.filename), 'logs');
+
+ if (existsSync(dir)) {
+ let files = readdirSync(dir);
+ files.forEach(file => {
+ logStr += file + ':\n';
+ logStr += readFileSync(join(dir, file), 'utf-8') + '\n';
+ });
+ }
+
+ call.succ(logStr);
+}
\ No newline at end of file
diff --git a/src/api_o2s/Apihealthz.ts b/src/api_o2s/Apihealthz.ts
new file mode 100644
index 0000000..6287d2d
--- /dev/null
+++ b/src/api_o2s/Apihealthz.ts
@@ -0,0 +1,37 @@
+import { ApiCall } from "tsrpc";
+import { Reqhealthz, Reshealthz } from "../monopoly/protocols/Ptlhealthz";
+
+export default async function (call: ApiCall) {
+ let _chkMDB = await G.mongodb.indexInformation("user")
+ let _chkRedis = await G.redis.chkRedis()
+
+ let _dateTime = new Date();
+ let _newTime = _dateTime.format('YYYY-MM-DDTHH:MM+01:00');
+
+ // 构造返回值
+ let _data: Reshealthz = {
+ code: 0,
+ data: {
+ dependencies: []
+ }
+ }
+
+ let _names = ["mongodb", "redis"]
+ for (let index = 0; index < [_chkMDB, _chkRedis].length; index++) {
+ const element = [_chkMDB, _chkRedis][index];
+
+ let _tmp = {
+ dependency: _names[index],
+ status: (_names[index] == "mongodb" ? _chkMDB : _chkRedis) ? 0 : 102,
+ reason: '',
+ severity: _names[index] == "mongodb" ? "critical" : "warning",
+ lastcheck: _newTime
+ }
+
+ _data.code = _tmp.status
+ _data.data.dependencies.push(_tmp)
+
+ }
+
+ call.succ(_data);
+}
\ No newline at end of file
diff --git a/src/api_o2s/games/Apideploy.ts b/src/api_o2s/games/Apideploy.ts
new file mode 100644
index 0000000..4655655
--- /dev/null
+++ b/src/api_o2s/games/Apideploy.ts
@@ -0,0 +1,14 @@
+import { ApiCall } from "tsrpc";
+import { Reqdeploy, Resdeploy } from "../../monopoly/protocols/games/Ptldeploy";
+import { initStarupFun } from "../../starup";
+
+export default async function (call: ApiCall) {
+ try{
+ initStarupFun.initStart()
+ }catch(err){
+ call.succ({message:err.toString(), code:-1})
+ }
+
+ // 区服初始化
+ call.succ({ message: "success", code: 0 });
+}
\ No newline at end of file
diff --git a/src/api_o2s/games/Apimetrics.ts b/src/api_o2s/games/Apimetrics.ts
new file mode 100644
index 0000000..8608123
--- /dev/null
+++ b/src/api_o2s/games/Apimetrics.ts
@@ -0,0 +1,17 @@
+import { ApiCall } from "tsrpc";
+import { Reqmetrics, Resmetrics } from "../../monopoly/protocols/games/Ptlmetrics";
+
+export default async function (call: ApiCall) {
+ // 当前区服付费人数
+ let now_paid_user_num = await G.mongodb.collection('payLog').countDocuments({})
+ // 当前区服在线人数
+ let now_login_user_num = await G.mongodb.collection('user').countDocuments({ newonlinetime: { $gte: G.time - 90, $lte: G.time + 30 } })
+ // 当前区服注册人数
+ let now_register_user_num = await G.mongodb.collection('user').countDocuments({})
+
+ call.succ({
+ now_paid_user_num: now_paid_user_num,
+ now_login_user_num: now_login_user_num,
+ now_register_user_num: now_register_user_num
+ });
+}
\ No newline at end of file
diff --git a/src/api_o2s/games/Apinotification.ts b/src/api_o2s/games/Apinotification.ts
new file mode 100644
index 0000000..64871e0
--- /dev/null
+++ b/src/api_o2s/games/Apinotification.ts
@@ -0,0 +1,127 @@
+import { ApiCall } from "tsrpc";
+import { GongGaoBan_info, Reqnotification, Resnotification } from "../../monopoly/protocols/games/Ptlnotification";
+import { ChatFun } from "../../public/chat";
+import { EmailFun } from "../../public/email";
+import { NotifiCationFun } from "../../public/notification";
+import { ServerToolFun } from "../../public/servertooltcp";
+
+export default async function (call: ApiCall) {
+ let template = call.req.template
+ let action = call.req.action
+
+ if (template == "server_mail") { // 全服邮件
+ if (action == "offline") { // publish 发布全服邮件/个人邮件/公告板/跑马灯 offline 下线全服邮件/公告板/跑马灯
+ // 根据g123 唯一id 删除邮件
+ await G.mongodb.collection('email').deleteMany({ "g123log.id": { $in: call.req.data } });
+ } else {
+ let _prize = await NotifiCationFun.getFmtPrize(call.req.data.assets)
+
+ let _mails = call.req.data.mail
+ for (let indexMail = 0; indexMail < _mails.length; indexMail++) {
+ const elementMail = _mails[indexMail];
+ EmailFun.addQuanFuEmail({
+ uid: "system",
+ type: 'gm',
+ title: elementMail.header,
+ content: elementMail.content,
+ prize: _prize,
+ contentInsertArr: [],
+ createTime: call.req.data?.startTime || G.time,
+ g123log: { id: call.req.data.id }
+ })
+ }
+ }
+
+ } else if (template == "player_mail") { // 个人邮件
+ let _playerIds = call.req.data.playerIds
+ for (let index = 0; index < _playerIds.length; index++) {
+ const element = _playerIds[index];
+ // 邮件内容
+ let _prize = await NotifiCationFun.getFmtPrize(call.req.data.assets)
+ let _mails = call.req.data.mail
+ for (let indexMail = 0; indexMail < _mails.length; indexMail++) {
+ const elementMail = _mails[indexMail];
+ EmailFun.addEmail({
+ uid: element,
+ type: 'gm',
+ title: elementMail.header,
+ content: elementMail.content,
+ prize: _prize,
+ contentInsertArr: [],
+ createTime: call.req.data?.sendTime || G.time,
+ g123log: { id: call.req.data.id }
+ })
+ }
+ }
+ } else if (template == "news_ticker") { // 跑马灯
+ if (action == "offline") { // 删除跑马灯
+ ChatFun.newMsg({
+ type: 'local',
+ msg: "",
+ time: G.time,
+ sender: 'system',
+ otherData: {
+ pmd: false,
+ args: [],
+
+ ids: call.req.data
+ }
+ })
+
+ } else {
+ let newsTicker = call.req.data.newsTicker
+ for (let index = 0; index < newsTicker.length; index++) {
+ const element = newsTicker[index];
+
+ ChatFun.newMsg({
+ type: 'local',
+ msg: element.content,
+ time: call.req.data.startTime,
+ sender: 'system',
+ otherData: {
+ pmd: true,
+ args: [],
+
+ interval: call.req.data.interval, // 播放间隔,单位分钟,为0时仅播放frequency次
+ frequency: call.req.data.frequency, // 每回播放频次,单位条数
+ id: call.req.data.id // G123生成的告知唯一ID
+ }
+ })
+ }
+
+ }
+ } else if (template == "bulletin") { // 游戏公告板(登录游戏之前的公告)
+ if (action == "offline") { // 删除公告
+ ServerToolFun.postServer("server/delGongGao", { "gonggao": call.req.data })
+ } else {
+ let _gongGao: GongGaoBan_info[] = []
+ let bulletin = call.req.data.bulletin
+
+ let levelMin = call.req.data.levelMin
+ let levelMax = call.req.data.levelMax
+ let stime = call.req.data.startTime
+ let etime = call.req.data.endTime
+ for (let index = 0; index < bulletin.length; index++) {
+ const element = bulletin[index];
+
+ let _tmp: GongGaoBan_info = {
+ content: element.content,
+ title: element.header,
+ stime: stime,
+ etime: etime,
+ sort: "0", // 写入的时候会复写
+ otherData: {
+ levelMin: levelMin,
+ levelMax: levelMax,
+ id: call.req.data.id,
+ serverIds: call.req.data.serverIds
+ }
+ }
+ _gongGao.push(_tmp)
+ }
+ ServerToolFun.postServer("server/setGongGao", { "gonggao": _gongGao })
+ }
+ }
+
+ call.succ({ message: "success", code: 0 });
+}
\ No newline at end of file
diff --git a/src/api_o2s/games/Apiopen.ts b/src/api_o2s/games/Apiopen.ts
new file mode 100644
index 0000000..67dd22f
--- /dev/null
+++ b/src/api_o2s/games/Apiopen.ts
@@ -0,0 +1,50 @@
+import {ApiCall} from "tsrpc";
+import {Reqopen, Resopen} from "../../monopoly/protocols/games/Ptlopen";
+import {env} from "process";
+import request from "sync-request";
+import fs from "fs";
+import {initStarupFun} from "../../starup";
+
+export default async function (call: ApiCall) {
+ // 设置开区时间
+ let _opentine = call.req.opentime
+
+ let _dateTime = new Date(_opentine);
+ _dateTime = new Date(_dateTime.getTime());
+ G.openTime = _dateTime.format('YYYY-MM-DD hh:mm:ss')
+
+ await setConfig()
+
+ call.succ({
+ code: 0,
+ message: G.openTime
+ });
+
+ initStarupFun.initStart()
+
+ if(call.req.utc){
+ console.log('---------------开始修改时区shell脚本---------------')
+ const shell = require('shelljs');
+ shell.exec(`sh /app/zoeninfo.sh ${call.req.utc}`)
+ }
+}
+
+async function setConfig(){
+ let type = env.SERVER_TYPE || 'game';
+ let url = `http://server-tool:7456/server/getConfig?sid=${env.SERVER_ID}&type=${type}`
+ console.log('拉取服务端启动配置文件', url);
+
+ let res = await request('GET', url, {
+ headers: {
+ 'content-type': 'application/json'
+ }
+ });
+
+ const body = JSON.parse(res.body.toString());
+ if (body) {
+ await fs.writeFileSync('/app/config.json', JSON.stringify(body, null, 2));
+ console.log('服务端配置: ', body);
+ } else {
+ console.log('拉取失败');
+ }
+}
\ No newline at end of file
diff --git a/src/api_o2s/games/Apiranking.ts b/src/api_o2s/games/Apiranking.ts
new file mode 100644
index 0000000..5b5b19a
--- /dev/null
+++ b/src/api_o2s/games/Apiranking.ts
@@ -0,0 +1,40 @@
+import { ApiCall } from "tsrpc";
+import { rankOpenfun } from "../../api_s2c/rank/ApiOpen";
+import { Reqranking, Resranking } from "../../monopoly/protocols/games/Ptlranking";
+import { NotifiCationFun } from "../../public/notification";
+import { PayFun } from "../../public/pay";
+
+export default async function (call: ApiCall) {
+ // 设置开区时间
+ let _num = call.req.skip ? 999 : call.req.num
+ let _rankType = call.req.rankid
+
+ // 无此玩家 随便取一个玩家
+ let gud = await G.mongodb.collection('user').findOne({});
+ if (!gud) {
+ return call.error('', { code: 1002, message: globalThis.lng.wuciwanjia });
+ }
+ let rescall = PayFun.getCall(gud);
+ // 排行榜数据
+ let _rankData = await rankOpenfun(rescall, [_rankType])
+ // 排行
+ let _renkList = _rankData[_rankType]["rankList"]
+ let _resData = []
+
+ for (let index = 0; index < _renkList.length; index++) {
+ const element = _renkList[index];
+ let _tmp: Resranking["data"][0] = {
+ ranking: index + 1,
+ id: element.player.uid,
+ name: element.player.name,
+ rankkingValue: (element.valArr ? element.valArr[0] : await NotifiCationFun.getFmtRankVal(_rankType, element)).toString()
+ }
+ _resData.push(_tmp)
+ }
+
+ call.succ({
+ code: 0,
+ message: globalThis.lng.huoqupaihang,
+ data: _resData
+ });
+}
\ No newline at end of file
diff --git a/src/api_o2s/gift/Apipopup.ts b/src/api_o2s/gift/Apipopup.ts
new file mode 100644
index 0000000..44fe9f5
--- /dev/null
+++ b/src/api_o2s/gift/Apipopup.ts
@@ -0,0 +1,27 @@
+import {ApiCall} from "tsrpc";
+import {Reqpopup, Respopup} from "../../monopoly/protocols/gift/Ptlpopup";
+
+export default async function (call: ApiCall) {
+ // 给用户推送礼包的逻辑实现
+ let popup_info = call.req
+
+ // todo 开发去实现
+ console.log("收到礼包推送", popup_info)
+
+ let user = G.server.uid_connections[popup_info.game_user_id]
+
+ let giftLog: any = {...popup_info}
+
+ if (user) {
+ giftLog = {
+ ...popup_info,
+ showTime: G.time,
+ endTime: G.time + popup_info.duration
+ }
+ G.server.sendMsgByUid(popup_info.game_user_id, 'msg_s2c/SendGift', giftLog)
+ }
+
+ G.mongodb.collection('giftLog').updateOne({popup_id: giftLog.popup_id}, {$set: giftLog}, {upsert: true});
+
+ call.succ({})
+}
\ No newline at end of file
diff --git a/src/api_o2s/gm/ApiPay.ts b/src/api_o2s/gm/ApiPay.ts
new file mode 100644
index 0000000..b7bd450
--- /dev/null
+++ b/src/api_o2s/gm/ApiPay.ts
@@ -0,0 +1,9 @@
+import {ApiCall} from "tsrpc";
+import {ReqPay, ResPay} from "../../monopoly/protocols/gm/PtlPay";
+import {PayFun} from "../../public/pay";
+
+export default async function (call: ApiCall) {
+
+ await PayFun.pay(call.req.uid, call.req.payId, call.req.payArgs, call.req.type);
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_o2s/gm/ApiSendPrize.ts b/src/api_o2s/gm/ApiSendPrize.ts
new file mode 100644
index 0000000..787dbbf
--- /dev/null
+++ b/src/api_o2s/gm/ApiSendPrize.ts
@@ -0,0 +1,7 @@
+import {ApiCall} from "tsrpc";
+import {ReqSendPrize, ResSendPrize} from "../../monopoly/protocols/gm/PtlSendPrize";
+
+export default async function (call: ApiCall) {
+
+
+}
\ No newline at end of file
diff --git a/src/api_o2s/hdinfo/Apidetails.ts b/src/api_o2s/hdinfo/Apidetails.ts
new file mode 100644
index 0000000..3e26fba
--- /dev/null
+++ b/src/api_o2s/hdinfo/Apidetails.ts
@@ -0,0 +1,61 @@
+import { ApiCall } from "tsrpc";
+import { g123_response_hdinfo_details, g123_response_hdinfo_details_accountingData, g123_response_hdinfo_details_taowa, Reqdetails, Resdetails } from "../../monopoly/protocols/hdinfo/Ptldetails";
+import { HuoDongFun } from "../../public/huodongfun";
+import { PayFun } from "../../public/pay";
+
+export default async function (call: ApiCall) {
+ let _where = call.req.uid ? { uid: call.req.uid } : {}
+
+ // 无玩家 随便取一个玩家
+ let gud = await G.mongodb.collection('user').findOne(_where);
+ if (!gud) {
+ return call.error('', { code: 1002, message: globalThis.lng.wuciwanjia });
+ }
+ let rescall = PayFun.getCall(gud);
+
+ // 构造返回值
+ let _data: g123_response_hdinfo_details[] = []
+
+ // 目前游戏只有游戏 5 符合查询要求
+ // @ts-ignore
+ let _hds = await HuoDongFun.gethdList(rescall, 5)
+ for (let index = 0; index < _hds.length; index++) {
+ const element = _hds[index];
+
+ let _dbType: `leijichongzhi${number}` = `leijichongzhi${element.hdid}`
+ let _users = await G.mongodb.cEvent(_dbType).find({ type: _dbType }).toArray();
+
+ let accountingData: g123_response_hdinfo_details_accountingData[] = []
+ for (let index = 0; index < _users.length; index++) {
+
+ const elementUser = _users[index];
+ let _tmp = {
+ ranking: index,
+ participantId: elementUser.uid,
+ value: await (await PayFun.getPayDaysAllPayNum(elementUser.uid, element.stime, element.rtime)).toString()
+ }
+ accountingData.push(_tmp)
+ }
+
+ // 排序
+ accountingData = accountingData.sort((b, a) => Number(a.value) - Number(b.value))
+ accountingData.forEach((ele, index) => {
+ ele.ranking = index + 1
+ })
+
+ let _pushiTmp: g123_response_hdinfo_details_taowa[] = []
+ _pushiTmp.push({
+ eventId: element.hdid.toString(),
+ eventName: element.name,
+ serverId: G.config.serverId,
+ accountingTime: element.rtime * 1000,
+ accountingData: accountingData
+ })
+ _data.push({
+ total: index + 1,
+ elemengts: _pushiTmp
+ })
+ }
+
+ call.succ({ status: 0, message: "success", data: _data });
+}
\ No newline at end of file
diff --git a/src/api_o2s/union/Apirename.ts b/src/api_o2s/union/Apirename.ts
new file mode 100644
index 0000000..21b97fd
--- /dev/null
+++ b/src/api_o2s/union/Apirename.ts
@@ -0,0 +1,17 @@
+import { ApiCall } from "tsrpc";
+import { Reqrename, Resrename } from "../../monopoly/protocols/union/Ptlrename";
+import { GongHuiFun } from "../../public/gonghui/gonghui";
+import { GHManage } from "../../public/gonghui/manage";
+
+export default async function (call: ApiCall) {
+ let _newName = call.req.guildName;
+ await GongHuiFun.checkSetArgs({ name: _newName });
+
+ let _GH = await GHManage.getGH(call.req.guildId);
+ if (!_GH) {
+ call.error('', { status: 1001, message: globalThis.lng.wucigonghui });
+ }
+ _GH.updateSetting({ name: _newName });
+
+ call.succ({ status: 0, message: "success" });
+}
\ No newline at end of file
diff --git a/src/api_o2s/user/Apidata.ts b/src/api_o2s/user/Apidata.ts
new file mode 100644
index 0000000..026321e
--- /dev/null
+++ b/src/api_o2s/user/Apidata.ts
@@ -0,0 +1,36 @@
+import { ApiCall } from "tsrpc";
+import { Reqdata, Resdata } from "../../monopoly/protocols/user/Ptldata";
+import { PayFun } from "../../public/pay";
+import { PlayerFun } from "../../public/player";
+
+export default async function (call: ApiCall) {
+ let uid = call.req.data.playerId
+ let upData = call.req.data.playerData
+
+ // 无此玩家
+ let getgud = await G.mongodb.collection('user').findOne({ uid: uid });
+ if (!getgud) {
+ return call.error('', { code: 1002, message: globalThis.lng.wuciwanjia });
+ }
+
+ // 无法修改的数据
+ let falseData = ["name", "uid", "bindUid"]
+ // 需要修改的数据key
+ let _tmp = Object.keys(upData)
+ let _setData = {}
+ for (let index = 0; index < _tmp.length; index++) {
+ const element = _tmp[index];
+ if (upData[element] == getgud[element] || falseData.indexOf(element) != -1) {
+ continue
+ }
+ _setData[element] = upData[element]
+ }
+
+ if (Object.keys(_setData).length > 0) {
+ let renamecall = PayFun.getCall(getgud);
+ await PlayerFun.addAttr(renamecall, _setData);
+ G.server.sendMsgByUid(uid, 'msg_s2c/PlayerChange', _setData)
+ }
+
+ call.succ({ message: "玩家导入数据成功", code: 0 });
+}
\ No newline at end of file
diff --git a/src/api_o2s/user/Apigetdata.ts b/src/api_o2s/user/Apigetdata.ts
new file mode 100644
index 0000000..1fd42dd
--- /dev/null
+++ b/src/api_o2s/user/Apigetdata.ts
@@ -0,0 +1,15 @@
+import { ApiCall } from "tsrpc";
+import { Reqgetdata, Resgetdata } from "../../monopoly/protocols/user/Ptlgetdata";
+
+export default async function (call: ApiCall) {
+ let uid = call.req.user_id;
+
+ // 无此玩家
+ let getgud = await G.mongodb.collection('user').findOne({ uid: uid });
+ if (!getgud) {
+ return call.error('', { code: 1002, message: globalThis.lng.wuciwanjia });
+ }
+ let { _id, ...gud } = getgud;
+
+ call.succ({ message: "导出玩家数据成功", code: 0, data: gud });
+}
\ No newline at end of file
diff --git a/src/api_o2s/user/Apirename.ts b/src/api_o2s/user/Apirename.ts
new file mode 100644
index 0000000..c36efb8
--- /dev/null
+++ b/src/api_o2s/user/Apirename.ts
@@ -0,0 +1,32 @@
+import { ApiCall } from "tsrpc";
+import { Reqrename, Resrename } from "../../monopoly/protocols/user/Ptlrename";
+import { PlayerFun } from "../../public/player";
+import { PayFun } from "../../public/pay";
+
+export default async function (call: ApiCall) {
+ let uid = call.req.data.playerId
+ let _name = call.req.data.nickname
+
+ // 名称已被使用
+ let _user = await G.mongodb.collection('user').findOne({ "name": _name });
+ if (_user) {
+ return call.error('', { code: 1001, message: globalThis.lng.nameyicunzai });
+ }
+
+ // g123 后台修改不限次数,不扣资源
+ // let num = call.conn.gud.changeNameNum || 0;
+ // let need = G.gc.common.usercom.changename[num] || G.gc.common.usercom.changename.slice(-1)[0];
+
+ // 无此玩家
+ let gud = await G.mongodb.collection('user').findOne({ uid: uid });
+ if (!gud) {
+ return call.error('', { code: 1002, message: globalThis.lng.wuciwanjia });
+ }
+ let rescall = PayFun.getCall(gud);
+ await PlayerFun.addAttr(rescall, { name: _name });
+ G.server.sendMsgByUid(uid, 'msg_s2c/PlayerChange', { name: _name })
+
+ call.succ({ message: "玩家昵称更新成功", code: 0 });
+
+ G.emit('PLAYER_CHANGE_NAME', gud, _name);
+}
\ No newline at end of file
diff --git a/src/api_s2c/ApiBingo.ts b/src/api_s2c/ApiBingo.ts
new file mode 100644
index 0000000..5ef1516
--- /dev/null
+++ b/src/api_s2c/ApiBingo.ts
@@ -0,0 +1,127 @@
+import { ApiCall } from "tsrpc";
+import { HeroFun } from '../public/hero';
+import { PlayerFun } from '../public/player';
+import { defaultUserAppend, UserFun } from '../public/user';
+import { ReqBingo, ResBingo } from "../shared/protocols/PtlBingo";
+
+export default async function (call: ApiCall) {
+ // TODO
+ if (G.config.debug == false) return call.succ('fail');
+
+ let shell = call.req.split(' ');
+
+ if (shell[0] == 'all') {
+
+ if (shell[1] == 'item') {
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+
+ await PlayerFun.addItem(call, Object.keys(G.gc.item).map((v, index) => {
+ return {
+ a: 'item',
+ t: v,
+ n: parseInt(shell[2]),
+ };
+ }));
+ } else if (shell[1] == 'hero') {
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+
+ await PlayerFun.addHero(call, Object.keys(G.gc.hero).map(v => {
+ return {
+ a: 'item',
+ t: v,
+ n: parseInt(shell[2]),
+ };
+ }));
+ } else if (shell[1] == 'equip') {
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+
+ await PlayerFun.addEquip(call, Object.keys(G.gc.equip).map(v => {
+ return {
+ a: 'equip',
+ t: v,
+ n: parseInt(shell[2]),
+ };
+ }));
+ } else if (shell[1] == 'shiwu') {
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+ if (isNaN(parseInt(shell[3]))) return call.error(`请输入正确的品质`);
+
+ await PlayerFun.addShiwu(call, Object.keys(G.gc.shiwu).map(v => {
+ return {
+ a: 'shiwu',
+ t: v,
+ n: parseInt(shell[2]),
+ colour: parseInt(shell[3])
+ };
+ }));
+ } else if (shell[1] == 'peijian') {
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+
+ await PlayerFun.addPeijian(call, Object.keys(G.gc.peijian).map(v => {
+ return {
+ a: 'peijian',
+ t: v,
+ n: parseInt(shell[2]),
+ };
+ }));
+ }
+
+ } else if (shell[0] == 'item') {
+
+ if (!G.gc.item[shell[1]]) return call.error(`道具id不存在:${shell[1]}`);
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+ await PlayerFun.addItem(call, [{ a: 'item', t: shell[1], n: parseInt(shell[2]) }]);
+
+ } else if (shell[0] == 'hero') {
+
+ if (!G.gc.hero[shell[1]]) return call.error(`英雄id不存在:${shell[1]}`);
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+ await PlayerFun.addHero(call, [{ a: 'item', t: shell[1], n: parseInt(shell[2]) }]);
+
+ } else if (shell[0] == 'equip') {
+
+ if (!G.gc.equip[shell[1]]) return call.error(`装备id不存在:${shell[1]}`);
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+ await PlayerFun.addEquip(call, [{ a: 'equip', t: shell[1], n: parseInt(shell[2]) }]);
+
+ } else if (shell[0] == 'shiwu') {
+
+ if (!G.gc.shiwu[shell[1]]) return call.error(`饰物id不存在:${shell[1]}`);
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+ if (isNaN(parseInt(shell[3]))) return call.error(`请输入正确的品质`);
+ await PlayerFun.addShiwu(call, [{ a: 'shiwu', t: shell[1], n: parseInt(shell[2]), colour: parseInt(shell[3]) }]);
+
+ } else if (shell[0] == 'peijian') {
+
+ if (!G.gc.peijian[shell[1]]) return call.error(`配件id不存在:${shell[1]}`);
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+ await PlayerFun.addPeijian(call, [{ a: 'peijian', t: shell[1], n: parseInt(shell[2]) }]);
+
+ } else if (shell[0] == 'attr') {
+ if (G.gc.attr[shell[1]] == undefined) return call.error(`道具id不存在:${shell[1]}`);
+ if (isNaN(parseInt(shell[2]))) return call.error(`请输入正确的数量`);
+ await PlayerFun.addAttr(call, [{ a: 'attr', t: shell[1], n: parseInt(shell[2]) }]);
+
+ } else if (shell.length == 2) {
+
+ let gud = Object.assign(UserFun.create(''), defaultUserAppend);
+ if (gud[shell[0]] != undefined) {
+ let obj = {};
+ if (typeof gud[shell[0]] == 'string') {
+ obj[shell[0]] = shell[1];
+ } else if (typeof gud[shell[0]] == 'number' && !isNaN(parseInt(shell[1]))) {
+ obj[shell[0]] = parseInt(shell[1]);
+ } else {
+ return;
+ }
+ await PlayerFun.addAttr(call, obj);
+ }
+
+ } else if (shell[0] == 'heroMaxLv') {
+ let heros = await G.redis.get('hero', call.uid);
+ for (let [_id, hero] of Object.entries(heros)) {
+ await HeroFun.changeHeroAttr(call, hero, { lv: Object.keys(G.gc.playerLv).length * 3, jieji: Object.keys(G.gc.herogrow[hero.heroId]).length - 1 });
+ }
+ }
+ call.succ('succ');
+}
\ No newline at end of file
diff --git a/src/api_s2c/ApiFightTest.ts b/src/api_s2c/ApiFightTest.ts
new file mode 100644
index 0000000..f56b62a
--- /dev/null
+++ b/src/api_s2c/ApiFightTest.ts
@@ -0,0 +1,41 @@
+import { ApiCall } from "tsrpc";
+import { FightFun } from '../public/fight';
+import { joinFightData } from '../shared/fightControl/fightType';
+import { ReqFightTest, ResFightTest } from "../shared/protocols/PtlFightTest";
+import { HeroShared } from '../shared/public/hero';
+import { PublicShared } from '../shared/public/public';
+
+export default async function (call: ApiCall) {
+
+ let joins: joinFightData[] = [];
+
+ let pd = await FightFun.getPlayerFightData(call.uid);
+
+ call.req.roles.forEach((d, i) => {
+ let player = call.req.player?.[i] || { ...pd, fightHeros: d.map(d => d.hero.heroId.toString()) };
+
+ let a: any[] = d.map((hd, index) => {
+
+ let buff = HeroShared.getHeroBasicAttr({ ...hd.hero, lv: hd.hero.lv || 1, jieji: hd.hero.jieji || 0 }, player, index + 1);
+ let hero = {
+ attr: buff,
+ ...hd.hero
+ };
+
+ PublicShared.mergeProperty(hero.attr, hd.attr);
+ hero.attr.maxHp = hero.attr.hp;
+ return hero;
+ });
+
+ joins.push({
+ player: JSON.parse(JSON.stringify(player)),
+ roles: Object.fromEntries(a.map((h, p) => [p + 1, h]))
+ });
+ });
+
+ let res = FightFun.fight(joins);
+
+ call.succ({
+ result: res
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/ApiSyncBtn.ts b/src/api_s2c/ApiSyncBtn.ts
new file mode 100644
index 0000000..d732794
--- /dev/null
+++ b/src/api_s2c/ApiSyncBtn.ts
@@ -0,0 +1,139 @@
+import {ApiCall} from "tsrpc";
+import {EventFun} from '../public/event/event';
+import {PayFun} from '../public/pay';
+import {ReqSyncBtn, ResSyncBtn, syncBtnKeys} from "../shared/protocols/PtlSyncBtn";
+import {PublicShared} from '../shared/public/public';
+
+const defaultKeys: syncBtnKeys[] = [
+ 'huobanzhaomu', 'yibaichou', 'shouchong',
+ 'dayjijin', 'dengjijijin', 'guanqiajijin', 'tianshujijin',
+ 'zhanling',
+ 'xianshilibao',
+ 'xianshizhaomu',
+ 'G123Gift'
+
+ // 'kaifukuanghuan',
+ // 'qiridenglu',
+ // 'leijichongzhi', 'xinshoulibao', 'jierihuodong', 'yuedujijin', 'zixuanlibao', 'diaoluoduihuan', 'chuanshuozhilu',
+ // 'yangchengmubiao'
+];
+
+export default async function (call: ApiCall) {
+ let change: ResSyncBtn = {};
+ let keys = call.req.length < 1 ? defaultKeys : call.req;
+ let data = await G.mongodb.collection('syncBtns').findOne({uid: call.uid});
+
+ if (!data) data = {} as any;
+
+ for (let key of keys) {
+ switch (key) {
+ case 'huobanzhaomu':
+ case 'yibaichou':
+ case 'shouchong':
+ //领完消失
+ if (!data[key]) {
+ data[key] = {active: true};
+ change[key] = data[key];
+ }
+ break;
+ case 'dayjijin':
+ case 'dengjijijin':
+ case 'guanqiajijin':
+ case 'tianshujijin':
+ //领完消失
+ if (!PublicShared.getEventIsOpen(G.gc.eventOpen[key], call.conn.gud)) {
+ data[key] = {active: false};
+ } else {
+ if (!data[key]) {
+ data[key] = {active: true};
+ change[key] = data[key];
+ }
+ }
+ break;
+ case 'zhanling':
+ //30天一轮循环,不管奖励。常驻活动
+ if (!PublicShared.getEventIsOpen(G.gc.zhanling.eventOpen, call.conn.gud)) {
+ data[key] = {active: false};
+ } else {
+ let zls = await G.mongodb.collection('scheduler').findOne({type: 'zhanling'});
+ if (!data[key] || data[key].round != zls.round) {
+ let lastRunTime = zls && zls.lastRunTime? zls.lastRunTime : G.time
+ let round = zls && zls.lastRunTime? zls.round : 1
+ data[key] = {active: true, sTime: lastRunTime, round: round};
+ change[key] = data[key];
+
+ PayFun.setPayLog(call.uid, {payId: G.gc.zhanling.payId, val: []});
+
+ G.mongodb.cEvent('zhanling').findOne({uid: call.uid, type: 'zhanling'}).then(data => {
+ //新一轮战令 不管玩家多久没上线 只补发玩家上一轮没有领取的奖励
+ data && EventFun.reissueZhanLingPrize(data, call.conn.gud);
+
+ G.mongodb.cEvent('zhanling').updateOne(
+ {uid: call.uid, type: 'zhanling'},
+ {
+ $set: {
+ lv: 1,
+ exp: 0,
+ rec: {},
+ isPay: false,
+ taskRec: [],
+ refreshTime: G.time
+ }
+ },
+ {upsert: true}
+ );
+ });
+ }
+ }
+ break;
+ case 'xianshilibao':
+ // 到时间消失
+ if (!data.xianshilibao) {
+ data.xianshilibao = change.xianshilibao = {pays: []};
+ } else {
+ change.xianshilibao = data.xianshilibao;
+ data.xianshilibao.pays = data.xianshilibao.pays.filter(p => {
+ return p.eTime > G.time;
+ });
+ }
+ break;
+ case 'xianshizhaomu':
+ // 不确定
+ if (G.time < PublicShared.getToDayZeroTime(G.openTime) + G.gc.xianshizhaomu.time.slice(-1)[0]) {
+ data[key] = {active: false};
+ } else {
+ data[key] = {active: false};
+ }
+ break;
+ case 'G123Gift':
+ data[key] = {active: false, giftInfo:[]};
+ let giftList = await G.mongodb.collection('giftLog').find({
+ game_user_id: call.uid,
+ $or: [{endTime: {$gte: G.time}}, {endTime: {$exists: false}}]
+ }).toArray();
+ if (giftList.length>0) {
+ data[key] = {active: true, giftInfo: giftList.filter(i=>(i.buyNumber||0) 0) {
+ G.mongodb.collection('syncBtns').updateOne({uid: call.uid}, {$set: change}, {upsert: true});
+ }
+
+ call.succ(Object.fromEntries(keys.map(key => [key, data[key]])));
+}
\ No newline at end of file
diff --git a/src/api_s2c/ApiTest.ts b/src/api_s2c/ApiTest.ts
new file mode 100644
index 0000000..ba39182
--- /dev/null
+++ b/src/api_s2c/ApiTest.ts
@@ -0,0 +1,12 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../public/player';
+import { ReqTest, ResTest } from "../shared/protocols/PtlTest";
+
+export default async function (call: ApiCall) {
+ // TODO
+ // if (G.config.debug == false) return call.succ({});
+ await PlayerFun.sendPrize(call, G.gc.playerdata.data);
+ call.succ({});
+ // PayFun.pay(call.uid, 'zuanshi_1', G.gc.pay['zuanshi_1'].prize);
+ // call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/chat/ApiDelPrivate.ts b/src/api_s2c/chat/ApiDelPrivate.ts
new file mode 100644
index 0000000..c532b5f
--- /dev/null
+++ b/src/api_s2c/chat/ApiDelPrivate.ts
@@ -0,0 +1,15 @@
+import { ApiCall } from "tsrpc";
+import { ReqDelPrivate, ResDelPrivate } from "../../shared/protocols/chat/PtlDelPrivate";
+
+export default async function (call: ApiCall) {
+
+ G.redis.get('chatPrivate', call.uid).then(v => {
+ if (v?.includes(call.req.privateId)) {
+ G.redis.arrPop('chatPrivate', call.uid, v.findIndex(id => id == call.req.privateId));
+ }
+ });
+
+ G.mongodb.collection('chat').deleteOne({ type: call.req.privateId });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/chat/ApiGetList.ts b/src/api_s2c/chat/ApiGetList.ts
new file mode 100644
index 0000000..78b6c36
--- /dev/null
+++ b/src/api_s2c/chat/ApiGetList.ts
@@ -0,0 +1,23 @@
+import { ApiCall } from "tsrpc";
+import { ChatFun } from '../../public/chat';
+import { ReqGetList, ResGetList } from "../../shared/protocols/chat/PtlGetList";
+import { PublicShared } from "../../shared/public/public";
+
+export default async function (call: ApiCall) {
+
+ let publicList = await G.mongodb.collection('chat').find({ type: { $in: ['cross', 'local', `guild${call.conn.gud.ghId || ''}`] } }).toArray();
+ let _guildList = publicList.find(l => l.type.indexOf('guild') != -1)?.list || []
+ let list = {
+ cross: publicList.find(l => l.type == 'cross')?.list || [],
+ local: publicList.find(l => l.type == 'local')?.list || [],
+ guild: _guildList.filter(l => { return PublicShared.getToDayZeroTime(G.time) < l.time }),
+ private: await ChatFun.getPrivateList(call.uid)
+ };
+
+ // 删除过期帮助
+ if (_guildList.length != list.guild.length) {
+ G.mongodb.collection('chat').updateOne({ type: 'guild' + call.conn.gud.ghId }, { $set: { list: list.guild } });
+ }
+
+ call.succ(list);
+}
\ No newline at end of file
diff --git a/src/api_s2c/chat/ApiHelp.ts b/src/api_s2c/chat/ApiHelp.ts
new file mode 100644
index 0000000..02f650b
--- /dev/null
+++ b/src/api_s2c/chat/ApiHelp.ts
@@ -0,0 +1,84 @@
+import { ApiCall } from "tsrpc";
+import { PayFun } from '../../public/pay';
+import { PlayerFun } from '../../public/player';
+import { ReqHelp, ResHelp } from "../../shared/protocols/chat/PtlHelp";
+import { PublicShared } from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ call.req.helps = call.req.helps.filter(h => {
+ return G.time >= PublicShared.getToDayZeroTime(h.cTime) && call.uid != h.uid;
+ });
+ // 'chat list is null'
+ if (call.req.helps.length < 1) return call.error('', { code: -1, message: globalThis.lng.chat_1 });
+
+ let chatList = await G.mongodb.collection('chat').findOne({ type: 'guild' + call.conn.gud.ghId });
+ if (!chatList || chatList.list.length < 1) return call.error('', { code: -2, message: globalThis.lng.chat_1 });
+
+ let list = [];
+ let _isQz: 0 | 1 = 0
+ chatList.list.remove(v => {
+ // 只需要移除过期的即可 (不是当天的就是过期)
+ if (PublicShared.getToDayZeroTime(v.time) == PublicShared.getToDayZeroTime(G.time)) {
+ // 帮助次数不够
+ _isQz = (v.sender.uid == call.uid && v.otherData.myhelpless >= call.req.helps.length) && _isQz == 0 ? 1 : _isQz
+ list.push(v);
+ return true;
+ } else return false;
+ });
+
+ if (_isQz == 0) {
+ // '请先求助或帮助次数不够'
+ return call.error('', { code: -3, message: globalThis.lng.chat_2 });
+ }
+
+ // 新增条件,移除本玩家
+ let listFilter = list.filter(li => li.otherData.helpUis.length < G.gc.shili_com.resHelp[li.otherData.helpIndex].num && !li.otherData.helpUis.includes(call.uid)
+ && (li.sender.uid != call.uid));
+ if (listFilter.length < 1) return call.error('', { code: -4, message: 'chat list is null' });
+
+ let prize = [];
+ let change = [];
+ let need = [];
+
+ for (let index = 0; index < call.req.helps.length; index++) {
+ const element = call.req.helps[index];
+
+ for (let index = 0; index < list.length; index++) {
+ const li = list[index];
+
+ // 扣除帮助次数
+ if (li.sender.uid == call.uid) {
+ let _lessNum = li.otherData.myhelpless - 1
+ li.otherData.myhelpless = _lessNum < 0 ? 0 : _lessNum
+ }
+ // 修改被帮玩家数据 及 发奖
+ if (li.sender.uid == element.uid) {
+ change.push({
+ uid: li.sender.uid,
+ cTime: li.time,
+ pushUid: call.uid,
+ });
+ li.otherData.helpUis.push(call.uid);
+ if (G.gc.shili_com.resHelp[li.otherData.helpIndex] <= li.otherData.helpUis.length) {
+ PlayerFun.sendPrize(PayFun.getCall(await G.redis.get('user', li.sender.uid)), [G.gc.shili_com.resHelp[li.otherData.helpIndex].need]);
+ }
+ prize.push(...PublicShared.randomDropGroup(G.gc.shili_com.resHelp[li.otherData.helpIndex].helpPrizeDrop));
+ }
+ }
+ }
+
+ // 新改帮助无消耗
+ // need = PublicShared.mergePrize(need);
+ // await PlayerFun.checkNeedIsMeet(call, need);
+ // await PlayerFun.cutNeed(call, need);
+
+ prize = PublicShared.mergePrize(prize);
+ await PlayerFun.sendPrize(call, prize);
+
+ G.server.broadcastClusterMsg('msg_s2c/ChatHelp', { change: change }, {ghId:call.conn.gud.ghId});
+ G.mongodb.collection('chat').updateOne({ type: 'guild' + call.conn.gud.ghId }, { $set: { list: list } });
+
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/chat/ApiPrivate.ts b/src/api_s2c/chat/ApiPrivate.ts
new file mode 100644
index 0000000..4151bca
--- /dev/null
+++ b/src/api_s2c/chat/ApiPrivate.ts
@@ -0,0 +1,39 @@
+import { ApiCall } from "tsrpc";
+import { ChatFun } from '../../public/chat';
+import { FriendManage } from '../../public/friend/manage';
+import { ReqPrivate, ResPrivate } from "../../shared/protocols/chat/PtlPrivate";
+import { MsgPrivate } from '../../shared/protocols/msg_s2c/MsgPrivate';
+
+export default async function (call: ApiCall) {
+ let my = await FriendManage.getFriend(call.uid);
+
+ if (!my.data.friendList.includes(call.req.uid)) return call.errorCode(-1);
+
+ let privateId = [call.uid, call.req.uid].sort().join('&');
+
+ ChatFun.writePrivateId(call.uid, privateId);
+ ChatFun.writePrivateId(call.req.uid, privateId);
+
+ let recipient = await G.mongodb.collection('user').findOne({ uid: call.req.uid });
+ let msg: MsgPrivate = {
+ msg: call.req.msg,
+ time: G.time,
+ sender: call.conn.gud,
+ privateId: privateId,
+ otherData: {
+ uids: [call.req.uid, call.uid]
+ },
+ recipient: recipient
+ };
+
+ G.mongodb.collection('chat').updateOne(
+ { type: privateId },
+ { $push: { list: msg } },
+ { upsert: true }
+ );
+
+ G.server.sendMsgByUid(call.uid, 'msg_s2c/Private', msg);
+ G.server.sendMsgByUid(call.req.uid, 'msg_s2c/Private', msg);
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/chat/ApiSend.ts b/src/api_s2c/chat/ApiSend.ts
new file mode 100644
index 0000000..4ea6ec7
--- /dev/null
+++ b/src/api_s2c/chat/ApiSend.ts
@@ -0,0 +1,39 @@
+import { ApiCall, WsClientStatus } from "tsrpc";
+import { ActionLog } from '../../public/actionLog/actionLog';
+import { ChatFun } from '../../public/chat';
+import { ReqSend, ResSend } from "../../shared/protocols/chat/PtlSend";
+
+
+
+export default async function (call: ApiCall) {
+
+ let data = call.req;
+ if (data.msg.length < 1 || data.msg.length > 30) return call.error('', { code: -1 });
+
+ if (data.otherData?.helpIndex != undefined) {
+ let num = await ActionLog.getDayLog(call.uid, 'resHelp');
+ if (num > 0) return call.errorCode(-2);
+ ActionLog.addDayLog(call.uid, { key: 'resHelp', val: 1 });
+ data.otherData.helpUis = [];
+ // 我助力别人次数 初始10
+ data.otherData.myhelpless = 10;
+ }
+
+ let gud = call.conn.gud;
+ let sendData = {
+ ...data,
+ time: G.time,
+ sender: gud
+ };
+
+ if (sendData.type == 'guild' && !gud.ghId) return call.error('', { code: -3, message: globalThis.lng.chat_3 });
+
+ if (sendData.type == 'cross' && G.clientCross?.status == WsClientStatus.Opened) {
+ G.clientCross.sendMsg('msg_cross/CrossChat', sendData);
+ call.succ({});
+ return;
+ }
+
+ ChatFun.newMsg(sendData);
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/chongzhi/ApiBuyGift.ts b/src/api_s2c/chongzhi/ApiBuyGift.ts
new file mode 100644
index 0000000..a9b88bf
--- /dev/null
+++ b/src/api_s2c/chongzhi/ApiBuyGift.ts
@@ -0,0 +1,28 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ReqBuyGift, ResBuyGift } from "../../shared/protocols/chongzhi/PtlBuyGift";
+
+export default async function (call: ApiCall) {
+
+ if (call.req.vip > call.conn.gud.vip) return call.error(globalThis.lng.chongzhi_1);
+ if (!G.gc.chongzhi.tequan[call.req.vip] || !G.gc.chongzhi.tequan[call.req.vip].gift) return call.error(globalThis.lng.chongzhi_2);
+
+ let data = await G.mongodb.cPlayerInfo('chongzhi').findOne({ uid: call.uid, type: 'chongzhi' });
+ let buyNum = data?.giftBy?.[call.req.vip];
+ let need = G.gc.chongzhi.tequan[call.req.vip].gift.need.map(v => { return { ...v, n: v.n * G.gc.chongzhi.tequan[call.req.vip].gift.sale / 10 }; });
+ if (buyNum >= G.gc.chongzhi.tequan[call.req.vip].gift.buyNum) return call.error(globalThis.lng.chongzhi_3);
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+ await PlayerFun.sendPrize(call, G.gc.chongzhi.tequan[call.req.vip].gift.prize);
+
+ G.mongodb.cPlayerInfo('chongzhi').updateOne(
+ { uid: call.uid, type: 'chongzhi' },
+ { $inc: G.mongodb.createTreeObj({ key: 'giftBy', k: call.req.vip.toString(), val: 1 }) },
+ { upsert: true }
+ );
+
+ call.succ({
+ prize: G.gc.chongzhi.tequan[call.req.vip].gift.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/chongzhi/ApiOpen.ts b/src/api_s2c/chongzhi/ApiOpen.ts
new file mode 100644
index 0000000..54bb51a
--- /dev/null
+++ b/src/api_s2c/chongzhi/ApiOpen.ts
@@ -0,0 +1,14 @@
+import { ApiCall } from "tsrpc";
+import { PayFun } from '../../public/pay';
+import { ReqOpen, ResOpen } from "../../shared/protocols/chongzhi/PtlOpen";
+
+export default async function (call: ApiCall) {
+
+ let data = await G.mongodb.cPlayerInfo('chongzhi').findOne({ uid: call.uid, type: 'chongzhi' });
+ let logs = await PayFun.getPayLog(call.uid);
+
+ call.succ({
+ payNum: Object.fromEntries(G.gc.chongzhi.payCom.map(pay => pay.payId).map(payId => [payId, logs?.[payId]?.length || 0])),
+ giftBuy: data?.giftBy || {},
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/conglinshoulie/ApiBuyNum.ts b/src/api_s2c/conglinshoulie/ApiBuyNum.ts
new file mode 100644
index 0000000..74a18ed
--- /dev/null
+++ b/src/api_s2c/conglinshoulie/ApiBuyNum.ts
@@ -0,0 +1,24 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ReqBuyNum, ResBuyNum } from "../../shared/protocols/conglinshoulie/PtlBuyNum";
+import { HongDianChange } from "../hongdian/fun";
+import { clslDb } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+
+ let db = await clslDb().findOne({ uid: call.uid, type: 'clsl' });
+ let buyNum = db?.buyFightNum || 0;
+ let hasNum = G.gc.clsl_com.vipBuyFightNum[call.conn.gud.vip];
+
+ if (buyNum >= hasNum) return call.errorCode(-1);
+
+ let _need = [G.gc.clsl_com.buyFightNumNeed[buyNum]]
+ await PlayerFun.checkNeedIsMeet(call, _need);
+ await PlayerFun.cutNeed(call, _need);
+
+ clslDb().updateOne({ uid: call.uid, type: 'clsl' }, { $inc: { buyFightNum: 1 } });
+
+ HongDianChange.sendChangeKey(call.uid, ['clslhd'])
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/conglinshoulie/ApiFind.ts b/src/api_s2c/conglinshoulie/ApiFind.ts
new file mode 100644
index 0000000..948bfea
--- /dev/null
+++ b/src/api_s2c/conglinshoulie/ApiFind.ts
@@ -0,0 +1,40 @@
+import { ApiCall } from "tsrpc";
+import { FightFun } from '../../public/fight';
+import { PlayerFun } from '../../public/player';
+import { ReqFind, ResFind } from "../../shared/protocols/conglinshoulie/PtlFind";
+import { PublicShared } from '../../shared/public/public';
+import { addStar, clslDb } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let weekZeroTime = PublicShared.getToWeekMondayZeroTime();
+ if (G.time < weekZeroTime + G.gc.clsl_com.fightTime[0] || G.time > weekZeroTime + G.gc.clsl_com.fightTime[1]) return call.errorCode(-1);
+
+ let db = await clslDb().findOne({ uid: call.uid, type: 'clsl' });
+ let curStar = db?.allStar || 0;
+ let useNum = db?.useFightNum || 0;
+ let buyNum = db?.buyFightNum || 0;
+ let starConf = G.gc.clsl_dan[curStar] || Object.values(G.gc.clsl_dan).slice(-1)[0];
+
+ if (useNum >= buyNum + G.gc.clsl_com.fightNum) return call.errorCode(-2);
+
+ let my = await call.conn.getDefaultFightData();
+ let other = (await G.clientCross.callApi('clsl/FindEnemy', { uid: call.uid })).res;
+ let result = FightFun.fight([my, other.info]);
+
+ if ((result.winSide != 0 && starConf.failCut) || result.winSide == 0) {
+ addStar(call, result.winSide == 0 ? 1 : -starConf.failCut, my);
+ }
+
+ result.winSide == 0 && clslDb().updateOne({ uid: call.uid, type: 'clsl' }, { $inc: { fightWinNum: 1 } });
+ clslDb().updateOne({ uid: call.uid, type: 'clsl' }, { $inc: { useFightNum: 1 } });
+
+ await PlayerFun.sendPrize(call, starConf.fightPrize);
+
+ G.clientCross?.callApi('clsl/Log', { uid: call.uid, result: result });
+ G.clientCross?.callApi('clsl/Log', { uid: other.info.player.uid, result: result });
+
+ call.succ({
+ enemy: other,
+ result: result
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/conglinshoulie/ApiGetLog.ts b/src/api_s2c/conglinshoulie/ApiGetLog.ts
new file mode 100644
index 0000000..cdc43b8
--- /dev/null
+++ b/src/api_s2c/conglinshoulie/ApiGetLog.ts
@@ -0,0 +1,6 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetLog, ResGetLog } from "../../shared/protocols/conglinshoulie/PtlGetLog";
+
+export default async function (call: ApiCall) {
+ call.succ((await G.clientCross.callApi('clsl/Log', { uid: call.uid })).res?.logs || []);
+}
\ No newline at end of file
diff --git a/src/api_s2c/conglinshoulie/ApiOpen.ts b/src/api_s2c/conglinshoulie/ApiOpen.ts
new file mode 100644
index 0000000..e50e2b8
--- /dev/null
+++ b/src/api_s2c/conglinshoulie/ApiOpen.ts
@@ -0,0 +1,47 @@
+import { OptionalId, WithId } from 'mongodb';
+import { ApiCall } from "tsrpc";
+import { CollectionPlayerInfo } from '../../module/collection_palyerInfo';
+import { joinFightData } from '../../shared/fightControl/fightType';
+import { ReqOpen, ResOpen } from "../../shared/protocols/conglinshoulie/PtlOpen";
+import { PublicShared } from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let db = await clslDb().findOne({ uid: call.uid, type: 'clsl' });
+ let { _id, uid, type, ...ops } = db || {} as WithId>>;
+
+ if (!db || ops?.refreshTime < PublicShared.getToDayZeroTime()) {
+
+ let change: Partial = {
+ refreshTime: G.time,
+ useFightNum: 0,
+ recWinPrize: [],
+ fightWinNum: 0,
+ buyFightNum: 0
+ };
+
+ Object.assign(ops, change);
+
+ clslDb().updateOne({ uid: call.uid, type: 'clsl' }, { $set: change }, { upsert: true });
+
+ call.conn.getDefaultFightData().then(v => {
+ G.clientCross.callApi('clsl/UpLoad', { uid: call.uid, info: v });
+ });
+ }
+
+ call.succ({
+ allStar: ops?.allStar || 0,
+ buyFightNum: ops?.buyFightNum || 0,
+ useFightNum: ops?.useFightNum || 0,
+ fightWinNum: ops?.fightWinNum || 0,
+ recWinPrize: ops?.recWinPrize || []
+ });
+}
+
+export function clslDb() {
+ return G.mongodb.cPlayerInfo('clsl');
+}
+
+export async function addStar(call: ApiCall, star: number, info?: joinFightData) {
+ clslDb().updateOne({ uid: call.uid, type: 'clsl' }, { $inc: { allStar: star } }, { upsert: true });
+ G.clientCross.callApi('clsl/UpLoad', { uid: call.uid, allStar: star, info: info || await call.conn.getDefaultFightData() });
+}
\ No newline at end of file
diff --git a/src/api_s2c/conglinshoulie/ApiRec.ts b/src/api_s2c/conglinshoulie/ApiRec.ts
new file mode 100644
index 0000000..2d336bd
--- /dev/null
+++ b/src/api_s2c/conglinshoulie/ApiRec.ts
@@ -0,0 +1,23 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ReqRec, ResRec } from "../../shared/protocols/conglinshoulie/PtlRec";
+import { HongDianChange } from "../hongdian/fun";
+import { addStar, clslDb } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let conf = G.gc.clsl_com.fightWinPrize[call.req.index];
+ if (!conf) return call.errorCode(-1);
+
+ let db = await clslDb().findOne({ uid: call.uid, type: 'clsl' });
+ if ((db?.fightWinNum || 0) < conf.total || db?.recWinPrize?.includes(call.req.index)) return call.errorCode(-2);
+
+ await PlayerFun.sendPrize(call, conf.prize);
+
+ addStar(call, conf.star);
+
+ clslDb().updateOne({ uid: call.uid, type: 'clsl' }, { $push: { recWinPrize: call.req.index } });
+
+ HongDianChange.sendChangeKey(call.uid, ['clslhd'])
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixiaheishi/ApiOpen.ts b/src/api_s2c/dixiaheishi/ApiOpen.ts
new file mode 100644
index 0000000..af58a69
--- /dev/null
+++ b/src/api_s2c/dixiaheishi/ApiOpen.ts
@@ -0,0 +1,6 @@
+import { ApiCall } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../shared/protocols/dixiaheishi/PtlOpen";
+
+export default async function (call: ApiCall) {
+ call.error(globalThis.lng.dixiaheishi_3);
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixialeitai/ApiBuy.ts b/src/api_s2c/dixialeitai/ApiBuy.ts
new file mode 100644
index 0000000..986df45
--- /dev/null
+++ b/src/api_s2c/dixialeitai/ApiBuy.ts
@@ -0,0 +1,31 @@
+import { ApiCall } from "tsrpc";
+import { DxltFun } from '../../public/dxlt';
+import { PlayerFun } from '../../public/player';
+import { ReqBuy, ResBuy } from "../../shared/protocols/dixialeitai/PtlBuy";
+import { ResOpen } from '../../shared/protocols/dixialeitai/PtlOpen';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+
+ let change: Partial = {};
+ let data = await DxltFun.getData(call);
+ let shopItem = data.shop[call.req.id];
+
+ if (!shopItem) return call.error(globalThis.lng.dixialeitai_1);
+ if (shopItem.useBuyNum >= shopItem.buyNum) return call.error(globalThis.lng.dixialeitai_1);
+
+ shopItem.useBuyNum++;
+ change.shop = data.shop;
+
+ await PlayerFun.checkNeedIsMeet(call, shopItem.need);
+ await PlayerFun.sendPrize(call, shopItem.prize);
+ await PlayerFun.cutNeed(call, shopItem.need);
+ await DxltFun.changeData(call, change);
+
+ HongDianChange.sendChangeKey(call.uid, ['dxlthd']);
+
+ call.succ({
+ change: change,
+ prize: shopItem.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixialeitai/ApiFight.ts b/src/api_s2c/dixialeitai/ApiFight.ts
new file mode 100644
index 0000000..975dfa5
--- /dev/null
+++ b/src/api_s2c/dixialeitai/ApiFight.ts
@@ -0,0 +1,94 @@
+import { ApiCall } from "tsrpc";
+import { DxltFun } from '../../public/dxlt';
+import { FightFun } from '../../public/fight';
+import { PlayerFun } from '../../public/player';
+import { formatNpcData } from '../../shared/fightControl/fightFun';
+import { roleDataType } from '../../shared/fightControl/fightType';
+import { ReqFight, ResFight } from "../../shared/protocols/dixialeitai/PtlFight";
+import { ResOpen } from '../../shared/protocols/dixialeitai/PtlOpen';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let change: Partial = {};
+ let data = await DxltFun.getData(call);
+
+ if (data.killBoss >= G.gc.dxlt_com.dayFightLayer) return call.error(globalThis.lng.dixialeitai_2);
+ if (G.gc.dxlt_layer[data.curLayer].type != 1) return call.error(globalThis.lng.dixialeitai_3);
+ if (data.over) return call.error(globalThis.lng.dixialeitai_4);
+ if (!data.heros[call.req]) return call.error(globalThis.lng.dixialeitai_5);
+ if (data.heros[call.req].attr.hp <= 0) return call.error(globalThis.lng.dixialeitai_6);
+
+ let hero: roleDataType = JSON.parse(JSON.stringify(data.heros[call.req]));
+ Object.assign(hero.attr, DxltFun.getBuff(data));
+
+ let npc = formatNpcData(G.gc.dxlt_layer[data.curLayer].npcId);
+ Object.entries(data.enemyState).forEach(role => {
+ Object.assign(npc.roles[role[0]].attr, role[1]);
+ });
+
+ const result = FightFun.fight(
+ [
+ {
+ player: call.conn.gud,
+ roles: Object.fromEntries([hero].map(hero => [1, hero]))
+ },
+ npc
+ ],
+ 30,
+ 'pve'
+ );
+
+ let _role = result.fightData[0].roles[1];
+ Object.assign(data.heros[call.req].attr, { hp: _role.attr.hp, maxHp: _role.attr.maxHp });
+
+ change.heros = data.heros;
+ change.enemyState = {};
+
+ let prize: atn[] = [];
+ if (result.winSide == 0) {
+
+ DxltFun.saodan(data, 1);
+ change.over = true;
+ change.item = data.item;
+ change.buff = data.buff;
+
+ if (data.saodang.mibaoNum) {
+ change.mibao = (data.mibao || 0) + data.saodang.mibaoNum;
+ }
+
+ if (G.gc.dxlt_layer[data.curLayer].isBoss) {
+ change.killBoss = (data.killBoss || 0) + 1;
+ }
+
+ prize.push(...G.gc.dxlt_layer[data.curLayer].price);
+
+ if (data.saodang.prize) {
+ prize.push(...data.saodang.prize);
+ }
+
+ if (data.saodang.shop) {
+ DxltFun.changeShop(data, change);
+ }
+
+ DxltFun.passLayerChange(data, change);
+ } else {
+ Object.entries(result.fightData[1].roles).forEach(role => {
+ change.enemyState[role[0]] = { hp: role[1].attr.hp, maxHp: role[1].attr.maxHp };
+ });
+ }
+
+ if (prize.length > 0) {
+ await PlayerFun.sendPrize(call, prize);
+ }
+
+ await DxltFun.changeData(call, change);
+
+ HongDianChange.sendChangeKey(call.uid, ['dxlthd']);
+
+ call.succ({
+ change: change,
+ result: result,
+ fightPrize: data.saodang || {},
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixialeitai/ApiNext.ts b/src/api_s2c/dixialeitai/ApiNext.ts
new file mode 100644
index 0000000..0c84433
--- /dev/null
+++ b/src/api_s2c/dixialeitai/ApiNext.ts
@@ -0,0 +1,30 @@
+import { ApiCall } from "tsrpc";
+import { DxltFun } from '../../public/dxlt';
+import { ReqNext, ResNext } from "../../shared/protocols/dixialeitai/PtlNext";
+import { ResOpen } from '../../shared/protocols/dixialeitai/PtlOpen';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+
+ let change: Partial = {};
+ let data = await DxltFun.getData(call);
+
+ if (!G.gc.dxlt_layer[data.curLayer + 1]) return call.error(globalThis.lng.dixialeitai_7);
+
+ change.curLayer = data.curLayer += 1;
+ if (G.gc.dxlt_layer[change.curLayer].type == 2) {
+ DxltFun.passLayerChange(data, change);
+ DxltFun.changeShop(data, change);
+ change.over = true;
+ } else {
+ change.over = false;
+ }
+
+ await DxltFun.changeData(call, change);
+
+ HongDianChange.sendChangeKey(call.uid, ['dxlthd'])
+
+ call.succ({
+ change: change
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixialeitai/ApiOpen.ts b/src/api_s2c/dixialeitai/ApiOpen.ts
new file mode 100644
index 0000000..fd0583f
--- /dev/null
+++ b/src/api_s2c/dixialeitai/ApiOpen.ts
@@ -0,0 +1,47 @@
+import { ApiCall } from "tsrpc";
+import { DxltFun } from '../../public/dxlt';
+import { ReqOpen, ResOpen } from "../../shared/protocols/dixialeitai/PtlOpen";
+import { PublicShared } from '../../shared/public/public';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+
+ let collection = await G.mongodb.collection('dxlt').findOne({ uid: call.uid });
+ if (!collection) return call.error('', { code: 2 });
+
+ let { _id, uid, ...data } = collection;
+
+ if (Object.keys(data).length == 2) {//说明第一次进入游戏
+ data.buff = {};
+ data.item = {};
+ data.over = false;
+ data.curLayer = 1;
+ data.maxLayer = 0;
+ data.curMaxLayer = 0;
+ data.toDayLayer = 0;
+ data.recordLayer = 0;
+ data.mibao = 0;
+ data.enemyState = {};
+ data.killPrizeRec = [];
+ data.passPrizeRec = [];
+ data.shop = {};
+ data.killBoss = 0;
+ call.succ(data);
+ } else if (PublicShared.getToDayZeroTime() >= PublicShared.getToDayZeroTime(data.resetTime) + 2 * 24 * 3600) {//每两天重置
+ data.item = {};
+ data.buff = {};
+ data.toDayLayer = 0;
+ data.enemyState = {};
+ data.killPrizeRec = [];
+ data.shop = {};
+ data.killBoss = 0;
+ DxltFun.backLayer(data);
+ call.error('', { code: 2 });
+ HongDianChange.sendChangeKey(call.uid, ['dxlthd']);
+ } else {
+ call.succ(data);
+ }
+
+ G.redis.set('dxlt', call.uid, data);
+ G.mongodb.collection('dxlt').updateOne({ uid: call.uid }, { $set: { ...data } });
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixialeitai/ApiRecMiBao.ts b/src/api_s2c/dixialeitai/ApiRecMiBao.ts
new file mode 100644
index 0000000..dc3e820
--- /dev/null
+++ b/src/api_s2c/dixialeitai/ApiRecMiBao.ts
@@ -0,0 +1,27 @@
+import { ApiCall } from "tsrpc";
+import { DxltFun } from '../../public/dxlt';
+import { PlayerFun } from '../../public/player';
+import { ResOpen } from '../../shared/protocols/dixialeitai/PtlOpen';
+import { ReqRecMiBao, ResRecMiBao } from "../../shared/protocols/dixialeitai/PtlRecMiBao";
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+
+ let change: Partial = {};
+ let data = await DxltFun.getData(call);
+
+ if (!G.gc.dxlt_mb[call.req.id]) return call.error(globalThis.lng.dixialeitai_5);
+ if (data.mibao < G.gc.dxlt_com.getPrizeByMiBaoNum) return call.error(globalThis.lng.dixialeitai_8);
+
+ change.mibao = (data.mibao - G.gc.dxlt_com.getPrizeByMiBaoNum);
+
+ await PlayerFun.sendPrize(call, G.gc.dxlt_mb[call.req.id].mibao);
+ await DxltFun.changeData(call, change);
+
+ HongDianChange.sendChangeKey(call.uid, ['dxlthd']);
+
+ call.succ({
+ change: change,
+ prize: G.gc.dxlt_mb[call.req.id].mibao
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixialeitai/ApiRecPrize.ts b/src/api_s2c/dixialeitai/ApiRecPrize.ts
new file mode 100644
index 0000000..289a4f0
--- /dev/null
+++ b/src/api_s2c/dixialeitai/ApiRecPrize.ts
@@ -0,0 +1,32 @@
+import { ApiCall } from "tsrpc";
+import { DxltFun } from '../../public/dxlt';
+import { PlayerFun } from '../../public/player';
+import { ResOpen } from '../../shared/protocols/dixialeitai/PtlOpen';
+import { ReqRecPrize, ResRecPrize } from "../../shared/protocols/dixialeitai/PtlRecPrize";
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+
+ let change: Partial = {};
+ let data = await DxltFun.getData(call);
+ let val = call.req.type == 'killPrizeRec' ? (data.killBoss || 0) : data.maxLayer;
+ let conf = call.req.type == 'killPrizeRec' ? G.gc.dxlt_com.killPrize : G.gc.dxlt_com.passPrize;
+
+ if (!conf[call.req.index]) return call.error(globalThis.lng.dixialeitai_5);
+ if (data[call.req.type].includes(call.req.index)) return call.error(globalThis.lng.dixialeitai_9);
+ if (val < conf[call.req.index].need) return call.error(globalThis.lng.dixialeitai_10);
+
+ data[call.req.type].push(call.req.index);
+
+ change[call.req.type] = data[call.req.type];
+
+ await PlayerFun.sendPrize(call, conf[call.req.index].prize);
+ await DxltFun.changeData(call, change);
+
+ HongDianChange.sendChangeKey(call.uid, ['dxlthd']);
+
+ call.succ({
+ change: change,
+ prize: conf[call.req.index].prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixialeitai/ApiSetDef.ts b/src/api_s2c/dixialeitai/ApiSetDef.ts
new file mode 100644
index 0000000..2c5428e
--- /dev/null
+++ b/src/api_s2c/dixialeitai/ApiSetDef.ts
@@ -0,0 +1,30 @@
+import { ApiCall } from "tsrpc";
+import { HeroFun } from '../../public/hero';
+import { ReqSetDef, ResSetDef } from "../../shared/protocols/dixialeitai/PtlSetDef";
+
+export default async function (call: ApiCall) {
+
+ let arr = call.req;
+ if (arr.isDuplication()) return call.error(globalThis.lng.dixialeitai_5);
+ if (arr.length < G.gc.dxlt_com.heroNum[0] || arr.length > G.gc.dxlt_com.heroNum[1]) return call.error(globalThis.lng.dixialeitai_5);
+
+ let heros = await HeroFun.getHeros(call, arr);
+ if (heros.filter(hero => hero != null).length < arr.length) return call.error(globalThis.lng.dixialeitai_5);
+
+ await G.mongodb.collection('dxlt').updateOne(
+ {
+ uid: call.uid
+ },
+ {
+ $set: {
+ resetTime: G.time,
+ heros: (await call.conn.getDefaultFightData(Object.fromEntries(arr.map((_id, pos) => [pos + 1, _id])))).roles
+ }
+ },
+ {
+ upsert: true
+ }
+ );
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixialeitai/ApiUseItem.ts b/src/api_s2c/dixialeitai/ApiUseItem.ts
new file mode 100644
index 0000000..57930c6
--- /dev/null
+++ b/src/api_s2c/dixialeitai/ApiUseItem.ts
@@ -0,0 +1,70 @@
+import { ApiCall } from "tsrpc";
+import { DxltFun } from '../../public/dxlt';
+import { PlayerFun } from '../../public/player';
+import { ResOpen } from '../../shared/protocols/dixialeitai/PtlOpen';
+import { ReqUseItem, ResUseItem } from "../../shared/protocols/dixialeitai/PtlUseItem";
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let args = call.req;
+ let change: Partial = {};
+ let data = await DxltFun.getData(call);
+ let item = data.item;
+ let conf = G.gc.dxlt_com.fightPrize.item[args.id];
+ let prize: atn[] = [];
+
+ if (!item[args.id]) return call.error(globalThis.lng.dixialeitai_11);
+ if (args.id == '1' && !data.heros[args.pos]) return call.error(globalThis.lng.dixialeitai_5);
+ if (args.id == '2' && data.killBoss >= G.gc.dxlt_com.dayFightLayer) return call.error(globalThis.lng.dixialeitai_2);
+ if (args.id == '2' && G.gc.dxlt_layer[data.curLayer].type != 1) return call.error(globalThis.lng.dixialeitai_12);
+ if (args.id == '2' && data.over) return call.error(globalThis.lng.dixialeitai_12);
+
+ item[args.id]--;
+ switch (args.id) {
+ case '1':
+ data.heros[args.pos].attr.hp += data.heros[args.pos].attr.maxHp * conf.val;
+ if (data.heros[args.pos].attr.hp > data.heros[args.pos].attr.maxHp) data.heros[args.pos].attr.hp = data.heros[args.pos].attr.maxHp;
+ change.heros = data.heros;
+ break;
+ case '2':
+ DxltFun.saodan(data, 1);
+ change.over = true;
+ change.buff = data.buff;
+
+ if (data.saodang.mibaoNum) {
+ change.mibao += data.saodang.mibaoNum;
+ }
+
+ if (G.gc.dxlt_layer[data.curLayer].isBoss) {
+ change.killBoss = (data.killBoss || 0) + 1;
+ }
+
+ prize.push(...G.gc.dxlt_layer[data.curLayer].price);
+
+ if (data.saodang.prize) {
+ prize.push(...data.saodang.prize);
+ }
+
+ if (data.saodang.shop) {
+ DxltFun.changeShop(data, change);
+ }
+
+ DxltFun.passLayerChange(data, change);
+ break;
+ case '3':
+ DxltFun.changeShop(data, change);
+ break;
+ }
+ change.item = data.item;
+
+ prize.length > 0 && await PlayerFun.sendPrize(call, prize);
+ await DxltFun.changeData(call, change);
+
+ HongDianChange.sendChangeKey(call.uid, ['dxlthd']);
+
+ call.succ({
+ change: change,
+ fightPrize: data.saodang || {},
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixiaqianzhuang/ApiOpen.ts b/src/api_s2c/dixiaqianzhuang/ApiOpen.ts
new file mode 100644
index 0000000..33efb9a
--- /dev/null
+++ b/src/api_s2c/dixiaqianzhuang/ApiOpen.ts
@@ -0,0 +1,11 @@
+import { ApiCall } from "tsrpc";
+import { DiXiaQianZhuangFun } from "../../public/dixiaqianzhuang";
+import { ReqOpen, ResOpen } from "../../shared/protocols/dixiaqianzhuang/PtlOpen";
+
+export default async function (call: ApiCall) {
+ let result = await DiXiaQianZhuangFun.getMyData(call)
+
+ call.succ({
+ num: result
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/dixiaqianzhuang/ApiQf.ts b/src/api_s2c/dixiaqianzhuang/ApiQf.ts
new file mode 100644
index 0000000..688aff0
--- /dev/null
+++ b/src/api_s2c/dixiaqianzhuang/ApiQf.ts
@@ -0,0 +1,109 @@
+import { OptionalId, UpdateFilter } from 'mongodb';
+import { ApiCall } from "tsrpc";
+import { CollectionPlayerInfo } from '../../module/collection_palyerInfo';
+import { PlayerFun } from '../../public/player';
+import { ReqQf, ResQf } from "../../shared/protocols/dixiaqianzhuang/PtlQf";
+import { ResOpen } from '../../shared/protocols/dixiaqianzhuang/PtlOpen';
+import { DiXiaQianZhuangFun } from '../../public/dixiaqianzhuang';
+import { HongDianChange } from '../hongdian/fun';
+
+export default async function (call: ApiCall) {
+ let need: atn[];
+ let prize: atn[];
+ let _num = await DiXiaQianZhuangFun.getMyData(call)
+ let update: UpdateFilter>>;
+ let changeData: Partial;
+ let _rbj = {} // 返回的暴击次数
+
+ let _needNum: number = 0
+ let _jinbi: number = 0
+ let isnum: number = 0 // 实际次数
+ if (call.req.type == 1) {
+ let _myNeed = await DiXiaQianZhuangFun.getNumNeed(call, _num + 1)
+ // vip 条件不足
+ if (_myNeed.needvip > call.conn.gud.vip) {
+ return call.error('', { code: -1, message: globalThis.lng.dixaiqianzhuang_1 })
+ }
+
+ if (_myNeed.need) {
+ _needNum = _myNeed.need
+ }
+ let _bj = await DiXiaQianZhuangFun.getBj()
+ _jinbi += _myNeed.jinbi * _bj
+ _rbj[_bj.toString()] = 1
+ isnum = 1
+
+ } else if (call.req.type == 10) {
+ for (let index = 1; index <= call.req.type; index++) {
+ let _myNeed = await DiXiaQianZhuangFun.getNumNeed(call, _num + index)
+ if (_myNeed.needvip > call.conn.gud.vip) {
+ break
+ }
+
+ isnum += 1
+ if (_myNeed.need) {
+ _needNum += _myNeed.need
+ }
+
+ let _bj = await DiXiaQianZhuangFun.getBj()
+ // console.log("第 {} 次暴击 {} 倍数", index, _bj)
+ if (_myNeed.jinbi) {
+ _jinbi += _myNeed.jinbi * _bj
+ }
+
+ // 返回的暴击次数
+
+ if (_rbj[_bj]) {
+ _rbj[_bj] += 1
+ } else {
+ _rbj[_bj] = 1
+ }
+ }
+
+ // 一次次数都没有
+ if (isnum == 0) {
+ return call.error('', { code: -2, message: globalThis.lng.dixaiqianzhuang_1 })
+ }
+ }
+
+ // 更新数据的数据
+ update = {
+ $set: { time: G.time, num: isnum + _num }
+ };
+
+ if (_needNum) {
+ need = [{ "a": "attr", "t": "rmbmoney", "n": _needNum }]
+ let meet = await PlayerFun.checkNeedByArgs(call, need[0]);
+ need = [meet.atn];
+ }
+ prize = [{ "a": "attr", "t": "jinbi", "n": _jinbi }]
+
+ // 设置数据
+ G.mongodb.collection('playerInfo', 'dixiaqianzhuang').updateOne(
+ {
+ uid: call.uid,
+ type: 'dixiaqianzhuang'
+ },
+ {
+ ...update
+ },
+ {
+ upsert: true
+ }
+ );
+
+ // 扣除奖励和发奖
+ need && await PlayerFun.cutNeed(call, need);
+ await PlayerFun.sendPrize(call, prize);
+
+ changeData = {
+ num: _num + isnum
+ };
+ HongDianChange.sendChangeKey(call.uid, ['dixiaqianzhuanghd', 'taskhd', 'huodonghd'])
+
+ call.succ({
+ prize: prize,
+ changeData: changeData,
+ bj: _rbj
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/email/ApiAllReceive.ts b/src/api_s2c/email/ApiAllReceive.ts
new file mode 100644
index 0000000..a4953b2
--- /dev/null
+++ b/src/api_s2c/email/ApiAllReceive.ts
@@ -0,0 +1,20 @@
+import { ApiCall } from "tsrpc";
+import { EmailFun } from '../../public/email';
+import { PlayerFun } from '../../public/player';
+import { ReqAllReceive, ResAllReceive } from "../../shared/protocols/email/PtlAllReceive";
+
+export default async function (call: ApiCall) {
+
+ let emailList = (await EmailFun.getAllEmail(call.uid, true)).filter(email => (email.type == 'system' && email.prizeData?.isGet == false && email.prizeData?.prize?.length > 0)
+ || (email.type == 'system' && email.uid == "system" && (email?.prizelist?.indexOf(call.uid) == -1 && call.conn.gud && call.conn.gud.cTime <= email.createTime)));
+
+ if (emailList.length < 1) return call.error(globalThis.lng.email_1);
+
+ let prizeList = emailList.map(email => email.prizeData.prize).reduce((a, b) => a.concat(b));
+ let sendPrize = await PlayerFun.sendPrize(call, prizeList);
+
+ call.succ({
+ prize: sendPrize,
+ change: EmailFun.receiveEmail(call.uid, emailList.map(email => email._id))
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/email/ApiAllRemove.ts b/src/api_s2c/email/ApiAllRemove.ts
new file mode 100644
index 0000000..262cbe7
--- /dev/null
+++ b/src/api_s2c/email/ApiAllRemove.ts
@@ -0,0 +1,13 @@
+import { ApiCall } from "tsrpc";
+import { EmailFun } from '../../public/email';
+import { ReqAllRemove, ResAllRemove } from "../../shared/protocols/email/PtlAllRemove";
+
+export default async function (call: ApiCall) {
+ // TODO
+ let emailList = (await EmailFun.getAllEmail(call.uid, true)).filter(email => (email.type == 'system' && (!email.prizeData || email.prizeData?.isGet == true || !email.prizeData.prize || email.prizeData.prize.length < 1
+ || (email?.dellist?.indexOf(call.uid) == -1 && call.conn.gud && call.conn.gud.cTime <= email.createTime))));
+
+ if (emailList.length < 1) return call.error(globalThis.lng.email_2);
+
+ call.succ(EmailFun.removeEmail(call.uid, emailList.map(email => email._id)));
+}
\ No newline at end of file
diff --git a/src/api_s2c/email/ApiOpen.ts b/src/api_s2c/email/ApiOpen.ts
new file mode 100644
index 0000000..5fd03f0
--- /dev/null
+++ b/src/api_s2c/email/ApiOpen.ts
@@ -0,0 +1,10 @@
+import { ApiCall } from "tsrpc";
+import { EmailFun } from '../../public/email';
+import { ReqOpen, ResOpen } from "../../shared/protocols/email/PtlOpen";
+
+export default async function (call: ApiCall) {
+ let list = await EmailFun.getAllEmail(call.uid);
+ let obj: ResOpen = {};
+ list.forEach(e => obj[e._id] = e);
+ call.succ(obj);
+}
\ No newline at end of file
diff --git a/src/api_s2c/email/ApiRead.ts b/src/api_s2c/email/ApiRead.ts
new file mode 100644
index 0000000..ca8d275
--- /dev/null
+++ b/src/api_s2c/email/ApiRead.ts
@@ -0,0 +1,9 @@
+import { ApiCall } from "tsrpc";
+import { EmailFun } from '../../public/email';
+import { ReqRead, ResRead } from "../../shared/protocols/email/PtlRead";
+
+export default async function (call: ApiCall) {
+ // 修改状态为已读
+ await EmailFun.readEmail(call.uid, call.req._id);
+ call.succ([]);
+}
\ No newline at end of file
diff --git a/src/api_s2c/email/ApiReceive.ts b/src/api_s2c/email/ApiReceive.ts
new file mode 100644
index 0000000..4626ab4
--- /dev/null
+++ b/src/api_s2c/email/ApiReceive.ts
@@ -0,0 +1,20 @@
+import { ApiCall } from "tsrpc";
+import { EmailFun } from '../../public/email';
+import { PlayerFun } from '../../public/player';
+import { ReqReceive, ResReceive } from "../../shared/protocols/email/PtlReceive";
+
+export default async function (call: ApiCall) {
+
+ let email = await EmailFun.getEmail(call.uid, call.req._id);
+
+ if (!email) return call.error(globalThis.lng.email_3);
+ if (!email.prizeData || (email.prizeData.prize && email.prizeData.prize.length < 1)) return call.error(globalThis.lng.email_5);
+ if (email.prizeData.isGet) return call.error(globalThis.lng.email_4);
+
+ let prize = await PlayerFun.sendPrize(call, email.prizeData.prize);
+
+ call.succ({
+ prize: prize,
+ change: EmailFun.receiveEmail(call.uid, call.req._id)
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/email/ApiRemove.ts b/src/api_s2c/email/ApiRemove.ts
new file mode 100644
index 0000000..413a106
--- /dev/null
+++ b/src/api_s2c/email/ApiRemove.ts
@@ -0,0 +1,12 @@
+import { ApiCall } from "tsrpc";
+import { EmailFun } from '../../public/email';
+import { ReqRemove, ResRemove } from "../../shared/protocols/email/PtlRemove";
+
+export default async function (call: ApiCall) {
+ let email = await EmailFun.getEmail(call.uid, call.req._id);
+
+ if (!email) return call.error(globalThis.lng.email_3);
+ if (email.prizeData?.isGet == false && email.prizeData?.prize?.length > 0) return call.error(globalThis.lng.email_6);
+
+ call.succ(EmailFun.removeEmail(call.uid, call.req._id));
+}
\ No newline at end of file
diff --git a/src/api_s2c/equip/ApiAdjustment.ts b/src/api_s2c/equip/ApiAdjustment.ts
new file mode 100644
index 0000000..e2206e9
--- /dev/null
+++ b/src/api_s2c/equip/ApiAdjustment.ts
@@ -0,0 +1,48 @@
+import { ApiCall } from "tsrpc";
+import { EquipFun } from '../../public/equip';
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ReqAdjustment, ResAdjustment } from "../../shared/protocols/equip/PtlAdjustment";
+import { EquipShared } from '../../shared/public/equip';
+import { PublicShared } from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+
+ let equip = await EquipFun.getEquip(call, call.req.equipId);
+ if (!equip) return call.error('', { code: 0 });
+
+ let curLv = equip.adjustment || 0;
+ if (!G.gc.equipAdjusting[curLv + 1]) return call.error('', { code: -1 });
+
+ let addLv = 0;
+ let allNeed: atn[] = [];
+
+ for (let i = 1; i <= call.req.num; i++) {
+ let conf = G.gc.equipAdjusting[curLv + i];
+ if (!conf) break;
+ let isMeet = await PlayerFun.checkNeedIsMeet(call, PublicShared.mergePrize(allNeed.concat(conf.need)), false);
+ if (!isMeet.isOk) {
+ if (addLv == 0) {
+ return call.error('', { code: -104, atn: isMeet.atn });
+ } else {
+ break;
+ }
+ }
+ addLv++;
+ allNeed.push(...conf.need);
+ }
+
+ await PlayerFun.cutNeed(call, allNeed);
+ await EquipFun.changeEquipAttr(call, equip, { adjustment: curLv + addLv });
+
+ if (equip.wearaId) {
+ let hero = await HeroFun.getHero(call, equip.wearaId);
+ if (hero) {
+ let wearData = hero.equip || {};
+ wearData[G.gc.equip[equip.equipId].type] = EquipShared.fmtEquip(equip);
+ await HeroFun.changeHeroAttr(call, hero, { equip: wearData });
+ }
+ }
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/equip/ApiGetList.ts b/src/api_s2c/equip/ApiGetList.ts
new file mode 100644
index 0000000..6a258c8
--- /dev/null
+++ b/src/api_s2c/equip/ApiGetList.ts
@@ -0,0 +1,37 @@
+import { ApiCall } from "tsrpc";
+import { RedisCollections2 } from '../../module/redis';
+import { ReqGetList, ResGetList } from "../../shared/protocols/equip/PtlGetList";
+
+export default async function (call: ApiCall) {
+ let list: ResGetList['list'] = {};
+ let kvList: k_v = {};
+ let arrList = await G.mongodb.collection('equip').find({ uid: call.uid }).toArray();
+
+ let equipCon = G.gc.equip
+ let color = {}
+ let maxequiplv = 0
+ arrList.forEach(v => {
+ let d = G.mongodb.conversionIdObj(v);
+ kvList[G.formatRedisKey(d._id)] = d;
+ list[d._id] = d;
+
+ if (v.lv > maxequiplv) maxequiplv = v.lv
+ if (!color[equipCon[v.equipId].colour]) color[equipCon[v.equipId].colour] = 0
+ color[equipCon[v.equipId].colour] += 1
+
+ });
+ // 记录玩家最大等级,注册任务用
+ await G.mongodb.collection('playerInfo', 'usertasklog').updateOne({ uid: call.conn.uid, type: 'usertasklog' },
+ { $set: { maxequiplv: maxequiplv, equipcolor: color } }, { upsert: true })
+
+ G.redis.set('equip', call.uid, kvList);
+
+ let recLshd = await G.mongodb.collection('playerInfo', 'lshd_equip').findOne({ uid: call.conn.uid, type: 'lshd_equip' });
+ let { uid, _id, type, ...equips } = (recLshd || {});
+
+ call.conn.lshd.equip = equips || {};
+ call.succ({
+ list: list,
+ lshd: equips || {}
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/equip/ApiLvUp.ts b/src/api_s2c/equip/ApiLvUp.ts
new file mode 100644
index 0000000..b0f4ccc
--- /dev/null
+++ b/src/api_s2c/equip/ApiLvUp.ts
@@ -0,0 +1,52 @@
+import { ApiCall } from "tsrpc";
+import { Wjjl } from '../../module/collection_wjjl';
+import { EquipFun } from '../../public/equip';
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ReqLvUp, ResLvUp } from "../../shared/protocols/equip/PtlLvUp";
+import { ServiceType } from '../../shared/protocols/serviceProto';
+import { EquipShared } from '../../shared/public/equip';
+import { PublicShared } from '../../shared/public/public';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let equip = await EquipFun.getEquip(call, call.req.equipId);
+
+ if (!equip) return call.error(globalThis.lng.equip_1);
+ if (equip.lv >= call.conn.gud.lv * 2) return call.error(globalThis.lng.equip_2);
+
+ let addLv = 0;
+ let allNeed: atn[] = [];
+
+ for (let i = 1; i <= call.req.upLv; i++) {
+ if (equip.lv + i > call.conn.gud.lv * 2) break;
+ let need = EquipShared.getEquipLvUpNeed({ lv: equip.lv + i });
+ let isMeet = await PlayerFun.checkNeedIsMeet(call, PublicShared.mergePrize(allNeed.concat(need)), false);
+ if (!isMeet.isOk) {
+ if (addLv == 0) {
+ return call.error('', { code: -104, atn: isMeet.atn });
+ } else {
+ break;
+ }
+ }
+ addLv++;
+ allNeed = allNeed.concat(need);
+ }
+
+ await PlayerFun.cutNeed(call, allNeed);
+ await EquipFun.changeEquipAttr(call, equip, { lv: equip.lv + addLv });
+
+ Wjjl.setVal(call.uid, 'equip_qh_lv', equip.lv);
+
+ if (equip.wearaId) {
+ let hero = await HeroFun.getHero(call, equip.wearaId);
+ if (hero) {
+ let wearData = hero.equip || {};
+ wearData[G.gc.equip[equip.equipId].type] = EquipShared.fmtEquip(equip);
+ await HeroFun.changeHeroAttr(call, hero, { equip: wearData });
+ }
+ }
+
+ HongDianChange.sendChangeKey(call.uid, ['taskhd', 'huodonghd']);
+ call.succ({ lv: equip.lv, addlv: addLv });
+}
\ No newline at end of file
diff --git a/src/api_s2c/equip/ApiOneKeyLvUp.ts b/src/api_s2c/equip/ApiOneKeyLvUp.ts
new file mode 100644
index 0000000..374c320
--- /dev/null
+++ b/src/api_s2c/equip/ApiOneKeyLvUp.ts
@@ -0,0 +1,68 @@
+import { ApiCall } from "tsrpc";
+import { Wjjl } from '../../module/collection_wjjl';
+import { EquipFun } from '../../public/equip';
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ReqOneKeyLvUp, ResOneKeyLvUp } from "../../shared/protocols/equip/PtlOneKeyLvUp";
+import { ServiceType } from '../../shared/protocols/serviceProto';
+import { EquipShared } from '../../shared/public/equip';
+import { PublicShared } from '../../shared/public/public';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let hero = await HeroFun.getHero(call, call.req.heroId);
+
+ if (!hero) return call.errorCode(-4);
+ if (hero.lv < G.gc.herocom.equipOpenLv) return call.errorCode(0);
+ if (Object.values(hero.equip || {}).filter(v => v != '').length < 1) return call.errorCode(-1);
+ // let res = EquipShared.getQuickLvUpNeed(hero.equip, call.conn.gud.lv)
+ // let {posLvUp, allNeed, log} = res
+ let allNeed:atn[] = [];
+ let posLvUp = {};
+ // 获取装备数量
+ let _equip = {}
+ Object.keys(hero.equip).forEach( x => {
+ if(hero.equip[x]) _equip[x] = EquipShared.getFmtEquipLvUp(x, hero.equip)
+ })
+ for (let i = 1; i <= 10 * Object.keys(_equip).length; i++) {
+ let meet: boolean[] = [];
+ // 排序,取等级最低的装备升级
+ let _sortPos = Object.keys(_equip).sort((a, b) => _equip[a] - _equip[b])
+ const pos = _sortPos[0]
+ // const pos = _sortPos[index];
+ if (!hero.equip[pos]) continue;
+ let equipLv = _equip[pos]
+ if (equipLv + 1 > call.conn.gud.lv * 2) continue;
+ let need:atn[] = EquipShared.getEquipLvUpNeed({ lv: equipLv + 1 });
+ let countNeed = PublicShared.mergePrize(allNeed.concat(need));
+ if ((await PlayerFun.checkNeedIsMeet(call, countNeed, false)).isOk == false) {
+ continue;
+ }
+ meet.push(true);
+ allNeed = allNeed.concat(need);
+ if (!posLvUp[pos]) posLvUp[pos] = 0;
+ posLvUp[pos]++;
+ _equip[pos]++;
+ if (!meet.includes(true)) break;
+ }
+ if (allNeed.length < 1) return call.errorCode(-104);
+
+ await PlayerFun.cutNeed(call, allNeed);
+
+ let log = {};
+ for (let pos in posLvUp) {
+ let equip = EquipShared.fmtEquip(hero.equip[pos]);
+ let _lv = equip.lv + posLvUp[pos];
+ await EquipFun.changeEquipAttr(call, equip, { lv: _lv });
+ hero.equip[pos] = EquipShared.fmtEquip(equip);
+
+ Wjjl.setVal(call.uid, 'equip_qh_lv', _lv);
+
+ log[pos] = _lv;
+ }
+
+ await HeroFun.changeHeroAttr(call, hero, { equip: hero.equip });
+ HongDianChange.sendChangeKey(call.uid, ['taskhd', 'huodonghd']);
+
+ call.succ({ posLvUp: posLvUp, log: log, allNeed});
+}
\ No newline at end of file
diff --git a/src/api_s2c/equip/ApiOneKeyTakeOff.ts b/src/api_s2c/equip/ApiOneKeyTakeOff.ts
new file mode 100644
index 0000000..559bac6
--- /dev/null
+++ b/src/api_s2c/equip/ApiOneKeyTakeOff.ts
@@ -0,0 +1,22 @@
+import { ApiCall } from "tsrpc";
+import { EquipFun } from '../../public/equip';
+import { HeroFun } from '../../public/hero';
+import { ReqOneKeyTakeOff, ResOneKeyTakeOff } from "../../shared/protocols/equip/PtlOneKeyTakeOff";
+import { EquipShared } from '../../shared/public/equip';
+
+export default async function (call: ApiCall) {
+ let hero = await HeroFun.getHero(call, call.req.h_id);
+ if (!hero) return call.errorCode(-1);
+
+ let obj = hero.equip || {};
+ let equips = Object.values(obj).filter(s => !!s).map(s => EquipShared.fmtEquip(s));
+
+ if (equips.length > 0) {
+ for (let equip of equips) {
+ await EquipFun.changeEquipAttr(call, equip, { wearaId: '' }, false);
+ }
+ await HeroFun.changeHeroAttr(call, hero, { equip: {} });
+ }
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/equip/ApiOneKeyWear.ts b/src/api_s2c/equip/ApiOneKeyWear.ts
new file mode 100644
index 0000000..1ea3f52
--- /dev/null
+++ b/src/api_s2c/equip/ApiOneKeyWear.ts
@@ -0,0 +1,58 @@
+import { ApiCall } from "tsrpc";
+import { EquipFun } from '../../public/equip';
+import { HeroFun } from '../../public/hero';
+import { ReqOneKeyWear, ResOneKeyWear } from "../../shared/protocols/equip/PtlOneKeyWear";
+import { ServiceType } from '../../shared/protocols/serviceProto';
+import { EquipShared } from '../../shared/public/equip';
+
+export default async function (call: ApiCall) {
+ let hero = await HeroFun.getHero(call, call.req.heroId);
+
+ if (!hero) return call.error(globalThis.lng.equip_3);
+ if (hero.lv < G.gc.herocom.equipOpenLv) return call.error(`英雄${G.gc.herocom.equipOpenLv}级开启`);
+
+ let wearNum = 0;
+ let wearData = hero.equip || {};
+ let equipList = await G.redis.get('equip', call.conn.uid) || {};
+ let allEquip = Object.values(equipList);
+ let heroIds = Object.values(call.conn.gud.heroPos).filter(i=>!!i)
+
+
+ for (let pos = 1; pos < 5; pos++) {
+ let posEquip = wearData[pos] || '';
+ let curEquip = EquipShared.fmtEquip(posEquip);
+ let curEquipConf = G.gc.equip[curEquip.equipId];
+ let wearEquip = allEquip.filter(e => {
+ let conf = G.gc.equip[e.equipId];
+ if (!posEquip) {
+ return (!e.wearaId || !heroIds.includes(e.wearaId)) && conf.type == pos;
+ } else {
+ return (!e.wearaId || !heroIds.includes(e.wearaId)) && conf.type == pos && (
+ conf.colour > curEquipConf.colour
+ || (conf.colour > curEquipConf.colour && e.lv > curEquip.lv)
+ || (conf.colour > curEquipConf.colour && e.lv > curEquip.lv && e.star > curEquip.star));
+ }
+ }).sort((a, b) => {
+ if (G.gc.equip[a.equipId].colour != G.gc.equip[b.equipId].colour) {
+ return G.gc.equip[b.equipId].colour - G.gc.equip[a.equipId].colour;
+ } else if (a.lv != b.lv) {
+ return b.lv - a.lv;
+ } else {
+ return b.star - a.star;
+ }
+ })[0];
+ if (!wearEquip) continue;
+ if (posEquip) {
+ await EquipFun.changeEquipAttr(call, equipList[G.formatRedisKey(EquipShared.fmtEquip(posEquip)._id)], { wearaId: '' }, false);
+ }
+ await EquipFun.changeEquipAttr(call, wearEquip, { wearaId: hero._id });
+ wearNum++;
+ wearData[pos] = EquipShared.fmtEquip(wearEquip);
+ }
+
+ if (wearNum > 0) {
+ await HeroFun.changeHeroAttr(call, hero, { equip: wearData });
+ }
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/equip/ApiReset.ts b/src/api_s2c/equip/ApiReset.ts
new file mode 100644
index 0000000..43070e5
--- /dev/null
+++ b/src/api_s2c/equip/ApiReset.ts
@@ -0,0 +1,82 @@
+import {ApiCall} from "tsrpc";
+import {EquipFun} from '../../public/equip';
+import {PlayerFun} from '../../public/player';
+import {ReqReset, ResReset} from "../../shared/protocols/equip/PtlReset";
+import {prizeType} from '../../shared/protocols/type';
+import {EquipShared} from '../../shared/public/equip';
+import {PublicShared} from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let req = call.req;
+ let equips = await EquipFun.getEquip(call, req._ids);
+
+ if (equips.length != req._ids.length) return call.errorCode(-1);
+ if (equips.some(e => e.wearaId != '')) return call.errorCode(-2);
+ if (req.type == 'cj' && equips.some(e => (e.lv || e.star || e.adjustment) && G.gc.equip[e.equipId].colour > 3)) return call.errorCode(-3);
+ if (req.type == 'yl') {
+ let ylprize: prizeType[] = [];
+ for (let equip of equips) {
+ if (equip.lv) {
+ ylprize.push(...new Array(equip.lv).fill(1).map((v, i) => EquipShared.getEquipLvUpNeed({lv: i + 1})).reduce((a, b) => a.concat(b)));
+ }
+ if (equip.star) {
+ ylprize.push(...new Array(equip.star).fill(1).map((v, i) => G.gc.equipstar[equip.equipId][i + 1].need).reduce((a, b) => a.concat(b)));
+ }
+ if (equip.adjustment) {
+ ylprize.push(...new Array(equip.adjustment).fill(1).map((v, i) => G.gc.equipAdjusting[i + 1].need).reduce((a, b) => a.concat(b)));
+ }
+ }
+ ylprize = PublicShared.mergePrize(ylprize);
+ ylprize.forEach(p => {
+ if (p.t == 'jinbi') p.n = Math.floor(p.n * G.gc.guanlidiaodu.equip_cz_jinbi);
+ });
+ return call.succ({
+ prize: ylprize
+ });
+ }
+ let need = G.gc.guanlidiaodu[req.type == 'cz' ? 'equip_cz_need' : 'equip_qs_need'].map(n => {
+ return {
+ ...n,
+ n: n.n * equips.length
+ };
+ });
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ let prize: prizeType[] = [];
+
+
+ for (let equip of equips) {
+
+ if (equip.lv) {
+ prize.push(...new Array(equip.lv).fill(1).map((v, i) => EquipShared.getEquipLvUpNeed({lv: i + 1})).reduce((a, b) => a.concat(b)));
+ }
+
+ if (equip.star) {
+ prize.push(...new Array(equip.star).fill(1).map((v, i) => G.gc.equipstar[equip.equipId][i + 1].need).reduce((a, b) => a.concat(b)));
+ }
+
+ if (equip.adjustment) {
+ prize.push(...new Array(equip.adjustment).fill(1).map((v, i) => G.gc.equipAdjusting[i + 1].need).reduce((a, b) => a.concat(b)));
+ }
+
+ if (req.type == 'cj') continue
+
+ await EquipFun.changeEquipAttr(call, equip, {lv: 0, star: 0, adjustment: 0});
+ }
+ if (req.type == 'cj') {
+ await PlayerFun.cutEquip(call, req._ids);
+ prize.push(...equips.map(c => G.gc.guanlidiaodu.equip_qs_prize[G.gc.equip[c.equipId].colour] as any[]).reduce((a, b) => a.concat(b)));
+ }
+
+ prize = PublicShared.mergePrize(prize);
+ prize.forEach(p => {
+ if (p.t == 'jinbi') p.n = Math.floor(p.n * G.gc.guanlidiaodu.equip_cz_jinbi);
+ });
+
+ await PlayerFun.sendPrize(call, prize);
+
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/equip/ApiStarUp.ts b/src/api_s2c/equip/ApiStarUp.ts
new file mode 100644
index 0000000..0727daf
--- /dev/null
+++ b/src/api_s2c/equip/ApiStarUp.ts
@@ -0,0 +1,67 @@
+import { ApiCall } from "tsrpc";
+import { CollectionEquip } from '../../module/collection_equip';
+import { EquipFun } from '../../public/equip';
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ReqStarUp, ResStarUp } from "../../shared/protocols/equip/PtlStarUp";
+import { ServiceType } from '../../shared/protocols/serviceProto';
+import { EquipShared } from '../../shared/public/equip';
+import { md_redPoint_check } from '../gongyu/mingdao/ApiOpen';
+import { PublicShared } from "../../shared/public/public";
+
+export default async function (call: ApiCall) {
+
+ let equip = await G.redis.get('equip', call.uid, call.req.equipId);
+
+ if (!equip) return call.error(globalThis.lng.equip_1);
+ if (!G.gc.equipstar[equip.equipId]) return call.error(globalThis.lng.equip_4);
+ if (!G.gc.equipstar[equip.equipId][equip.star + 1]) return call.error(globalThis.lng.equip_5);
+
+ let need = G.gc.equipstar[equip.equipId][equip.star + 1].need;
+ let needItem = need.filter(v => v.a != 'equip');
+ let needEquip = need.filter(v => v.a == 'equip');
+
+ await PlayerFun.checkNeedIsMeet(call, needItem);
+
+ if (needEquip.length > 0) {
+ let equipArr: CollectionEquip[] = [];
+
+ for (let _id of call.req.equipArr) {
+ let equip = await G.redis.get('equip', call.conn.uid, _id);
+ if (!equip) return call.error(globalThis.lng.equip_6);
+ if (equip.wearaId) return call.error(globalThis.lng.equip_7);
+ equipArr.push(equip);
+ }
+
+ let check = needEquip.map(v => {
+ return new Array(v.n).fill(1).map(v1 => {
+ return v.t;
+ });
+ }).reduce((a, b) => a.concat(b));
+
+ // 选择装备数量不对
+ if (check.length != equipArr.length) return call.error('', { code: -1, message: globalThis.lng.equip_starup_1 });
+
+ let val1 = PublicShared.eval(check.join('+'));
+ let val2 = PublicShared.eval(equipArr.map(e => e.equipId).join('+'));
+
+ if (val1 != val2) return call.error(globalThis.lng.equip_8);
+
+ await PlayerFun.cutEquip(call, call.req.equipArr);
+ }
+
+ await PlayerFun.cutNeed(call, needItem);
+ await EquipFun.changeEquipAttr(call, equip, { star: equip.star + 1 });
+
+ if (equip.star == 5) md_redPoint_check(call.conn, 'equip_star_5');
+
+ if (equip.wearaId) {
+ let hero = await G.redis.get('hero', call.conn.uid, equip.wearaId);
+ if (hero) {
+ hero.equip[G.gc.equip[equip.equipId].type] = EquipShared.fmtEquip(equip);
+ await HeroFun.changeHeroAttr(call, hero, { equip: hero.equip });
+ }
+ }
+
+ call.succ({});
+}
diff --git a/src/api_s2c/equip/ApiTakeOff.ts b/src/api_s2c/equip/ApiTakeOff.ts
new file mode 100644
index 0000000..4fbb050
--- /dev/null
+++ b/src/api_s2c/equip/ApiTakeOff.ts
@@ -0,0 +1,15 @@
+import { ApiCall } from "tsrpc";
+import { EquipFun } from '../../public/equip';
+import { ReqTakeOff, ResTakeOff } from "../../shared/protocols/equip/PtlTakeOff";
+import { ServiceType } from '../../shared/protocols/serviceProto';
+
+export default async function (call: ApiCall) {
+ let equip = await G.redis.get('equip', call.conn.uid, call.req.equipId);
+
+ if (!equip) return call.error(globalThis.lng.equip_1);
+ if (!equip.wearaId) return call.error(globalThis.lng.equip_9);
+
+ await EquipFun.changeEquipAttr(call, equip, { wearaId: '' });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/equip/ApiWear.ts b/src/api_s2c/equip/ApiWear.ts
new file mode 100644
index 0000000..d42d0b9
--- /dev/null
+++ b/src/api_s2c/equip/ApiWear.ts
@@ -0,0 +1,32 @@
+import { ApiCall } from "tsrpc";
+import { EquipFun } from '../../public/equip';
+import { HeroFun } from '../../public/hero';
+import { ReqWear, ResWear } from "../../shared/protocols/equip/PtlWear";
+import { ServiceType } from '../../shared/protocols/serviceProto';
+import { EquipShared } from '../../shared/public/equip';
+
+export default async function (call: ApiCall) {
+ let hero = await G.redis.get('hero', call.conn.uid, call.req.heroId);
+
+ if (!hero) return call.error(globalThis.lng.equip_10);
+ if (hero.lv < G.gc.herocom.equipOpenLv) return call.error(`英雄${G.gc.herocom.equipOpenLv}级开启`);
+
+ let equip = await G.redis.get('equip', call.conn.uid, call.req.equipId);
+
+ if (!equip) return call.error(globalThis.lng.equip_1);
+ if (equip.wearaId == hero._id) return call.error(globalThis.lng.equip_11);
+
+ if (hero.equip?.[G.gc.equip[equip.equipId].type]) {
+ let oldEquip = EquipShared.fmtEquip(hero.equip?.[G.gc.equip[equip.equipId].type]);
+ await EquipFun.changeEquipAttr(call, oldEquip, { wearaId: '' }, false);
+ }
+
+ await EquipFun.changeEquipAttr(call, equip, { wearaId: hero._id });
+
+ let wearData = hero.equip || {};
+ wearData[G.gc.equip[equip.equipId].type] = EquipShared.fmtEquip(equip);
+
+ await HeroFun.changeHeroAttr(call, hero, { equip: wearData });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/136Gift/ApiOpen.ts b/src/api_s2c/event/136Gift/ApiOpen.ts
new file mode 100644
index 0000000..0e76139
--- /dev/null
+++ b/src/api_s2c/event/136Gift/ApiOpen.ts
@@ -0,0 +1,23 @@
+import { ApiCall } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/136Gift/PtlOpen";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+
+ let db = await G.mongodb.cEvent('136Gift').findOne({ uid: call.uid, type: '136Gift' });
+
+ if (!db || db.refreshTime < PublicShared.getToDayZeroTime()) {
+ G.mongodb.cEvent('136Gift').updateOne(
+ { uid: call.uid, type: '136Gift' },
+ { $set: { recIndex: [], refreshTime: G.time } },
+ { upsert: true }
+ );
+ if (db?.recIndex) {
+ db.recIndex = [];
+ }
+ }
+
+ call.succ({
+ recIndex: db?.recIndex || []
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/136Gift/ApiRec.ts b/src/api_s2c/event/136Gift/ApiRec.ts
new file mode 100644
index 0000000..09592bd
--- /dev/null
+++ b/src/api_s2c/event/136Gift/ApiRec.ts
@@ -0,0 +1,47 @@
+import { ApiCall } from "tsrpc";
+import { PayFun } from '../../../public/pay';
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/event/136Gift/PtlRec";
+import { prizeType } from '../../../shared/protocols/type';
+import { PublicShared } from '../../../shared/public/public';
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let conf = G.gc.dixiaheishi['136Gift'][call.req.index];
+ let buyLog = await PayFun.getPayLog(call.uid, G.gc.dixiaheishi['136Gift'][0].payId);
+ let buy60 = buyLog.slice(-1)[0]?.eTime >= G.time;
+ if (!conf) return call.error('', { code: -1 });
+ if (!buy60 && conf.payId) return call.error('', { code: -2 });
+
+ let prize: prizeType[] = [];
+ let pushIndex: number[] = [];
+ let db = await G.mongodb.cEvent('136Gift').findOne({ uid: call.uid, type: '136Gift' });
+
+ if (call.req.index == 0) {
+ G.gc.dixiaheishi['136Gift'].forEach((c, i) => {
+ if (i == 0 || !c.payId || db.recIndex.includes(i)) return;
+ pushIndex.push(i);
+ prize.push(...G.gc.pay[c.payId].prize);
+ });
+ if (pushIndex.length < 1) return call.error('', { code: -4 });
+ } else {
+ if (db.recIndex.includes(call.req.index)) return call.error('', { code: -3 });
+ prize.push(...(conf.payId ? G.gc.pay[conf.payId].prize : conf.prize));
+ pushIndex.push(call.req.index);
+ }
+
+ prize = PublicShared.mergePrize(prize);
+ await PlayerFun.sendPrize(call, prize);
+
+ G.mongodb.cEvent('136Gift').updateOne(
+ { uid: call.uid, type: '136Gift' },
+ { $push: { recIndex: { $each: pushIndex } } }
+ );
+
+ // HongDianChange.sendChangeKey(call.uid, ['heishihd', 'heishiMrjx'])
+ HongDianChange.sendChangeKey(call.uid, ['heishihd'])
+
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/chuanshuozhilu/ApiOpen.ts b/src/api_s2c/event/chuanshuozhilu/ApiOpen.ts
new file mode 100644
index 0000000..27dd5d5
--- /dev/null
+++ b/src/api_s2c/event/chuanshuozhilu/ApiOpen.ts
@@ -0,0 +1,57 @@
+import { ApiCall } from "tsrpc";
+import { HuoDongFun } from "../../../public/huodongfun";
+import { PayFun } from "../../../public/pay";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/chuanshuozhilu/PtlOpen";
+import { player } from '../../../shared/protocols/user/type';
+import { PublicShared } from '../../../shared/public/public';
+import { Queue } from '../../../shared/public/queue';
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid);
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+
+ let db = await G.mongodb.cEvent(`chuanshuozhilu${call.req.hdid}`).findOne({ uid: call.uid, type: `chuanshuozhilu${call.req.hdid}` });
+
+ call.succ({
+ info: db?.info || {},
+ hdinfo: _hdinfo
+ });
+}
+
+type P = Pick;
+
+const cache: k_v> = {};
+const quene = new Queue();
+
+/**传说之路任务记录 */
+export async function event_cszl_record(player: player, hid: string | number, v: number, type: 'lv' | 'jieji') {
+ let call = await PayFun.getCall(player);
+ // @ts-ignore // 此活动的唯一标识 htype 为 3
+ let _hdList = await HuoDongFun.gethdList(call, 3)
+ for (let index = 0; index < _hdList.length; index++) {
+ const element = _hdList[index];
+ if (hid != element.data.hid) continue;
+
+ quene.enqueue(async () => {
+ let _dbType: `chuanshuozhilu${number}` = `chuanshuozhilu${element.hdid}`
+ if (!cache[player.uid]) cache[player.uid] = (await G.mongodb.cEvent(_dbType).findOne({ uid: player.uid, type: _dbType }))?.info || {};
+
+ if (!cache[player.uid][hid] || !cache[player.uid][hid][type] || cache[player.uid][hid][type] < v) {
+ await G.mongodb.cEvent(_dbType).updateOne(
+ { uid: player.uid, type: _dbType },
+ { $set: G.mongodb.createTreeObj({ key: `info.${hid}.${type}`, val: v }) },
+ { upsert: true }
+ );
+ }
+
+ if (!cache[player.uid][hid]) cache[player.uid][hid] = { lv: 0, jieji: 0 };
+ if (cache[player.uid][hid][type] < v) cache[player.uid][hid][type] = v;
+
+ G.server.sendMsgByUid(player.uid, 'msg_s2c/HongDianChange', ['huodonghd']);
+ });
+
+ }
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/chuanshuozhilu/ApiRec.ts b/src/api_s2c/event/chuanshuozhilu/ApiRec.ts
new file mode 100644
index 0000000..2dc6f24
--- /dev/null
+++ b/src/api_s2c/event/chuanshuozhilu/ApiRec.ts
@@ -0,0 +1,58 @@
+import { ApiCall } from "tsrpc";
+import { HuoDongFun } from "../../../public/huodongfun";
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/event/chuanshuozhilu/PtlRec";
+import { prizeType } from '../../../shared/protocols/type';
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+
+ let curTask = _hdinfo.data
+ if (call.req.type == 'task' && !curTask.task[call.req.index]) return call.errorCode(0);
+
+ let prize: prizeType[] = [];
+
+ let _dbType: `chuanshuozhilu${number}` = `chuanshuozhilu${call.req.hdid}`
+
+ let db = await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType });
+ let info: Partial = db?.info?.[curTask.hid] || {};
+ let rec = info.rec || [];
+
+ if (call.req.type == 'box') {
+ if (info.box) return call.errorCode(-1);
+ if (rec.length < curTask.box.total) return call.errorCode(-2);
+
+ prize.push(...curTask.box.prize);
+
+ G.mongodb.cEvent(_dbType).updateOne(
+ { uid: call.uid, type: _dbType },
+ { $set: G.mongodb.createTreeObj({ key: `info.${curTask.hid}.box`, val: true }) },
+ { upsert: true }
+ );
+ } else {
+ let conf = curTask.task[call.req.index];
+ let finish = info[conf.type] || 0;
+ if (finish < conf.total) return call.errorCode(-3);
+ if (rec.includes(call.req.index)) return call.errorCode(-4);
+
+ G.mongodb.cEvent(_dbType).updateOne(
+ { uid: call.uid, type: _dbType },
+ { $push: G.mongodb.createTreeObj({ key: `info.${curTask.hid}.rec`, val: call.req.index }) },
+ { upsert: true }
+ );
+
+ prize.push(...conf.prize);
+ }
+
+ await PlayerFun.sendPrize(call, prize);
+ HongDianChange.sendChangeKey(call.uid, ['huodonghd'])
+
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/diaoluoduihuan/ApiGet.ts b/src/api_s2c/event/diaoluoduihuan/ApiGet.ts
new file mode 100644
index 0000000..4d0304e
--- /dev/null
+++ b/src/api_s2c/event/diaoluoduihuan/ApiGet.ts
@@ -0,0 +1,49 @@
+import { ApiCall } from "tsrpc";
+import { HuoDongFun } from "../../../public/huodongfun";
+import { PlayerFun } from '../../../public/player';
+import { ReqGet, ResGet } from "../../../shared/protocols/event/diaoluoduihuan/PtlGet";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let num = call.req.nums || 1;
+ if (num < 1) return call.errorCode(-1);
+
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+
+ let conf = _hdinfo.data.event[call.req.type];
+ if (!conf[call.req.index] || conf[call.req.index].payId) return call.errorCode(-1);
+
+ let db = await G.mongodb.cEvent(`diaoluoduihuan${call.req.hdid}`).findOne({ uid: call.uid, type: `diaoluoduihuan${call.req.hdid}` });
+ let recordNum = db?.record?.[call.req.type]?.[call.req.index] || 0;
+ if (recordNum + num > conf[call.req.index].num) return call.errorCode(-2);
+
+ if (conf[call.req.index].need) {
+ let need = conf[call.req.index].need.map(item => (
+ { ...item, n: item.n * num }
+ ));
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+ }
+
+ let prize = conf[call.req.index].prize.map(item => (
+ { ...item, n: item.n * num }
+ ));
+
+ await PlayerFun.sendPrize(call, prize);
+
+ G.mongodb.cEvent(`diaoluoduihuan${call.req.hdid}`).updateOne(
+ { uid: call.uid, type: `diaoluoduihuan${call.req.hdid}` },
+ { $inc: G.mongodb.createTreeObj({ key: `record.${call.req.type}.${call.req.index}`, val: num }) },
+ { upsert: true }
+ );
+ HongDianChange.sendChangeKey(call.uid, ['huodonghd'])
+
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/diaoluoduihuan/ApiOpen.ts b/src/api_s2c/event/diaoluoduihuan/ApiOpen.ts
new file mode 100644
index 0000000..c587e29
--- /dev/null
+++ b/src/api_s2c/event/diaoluoduihuan/ApiOpen.ts
@@ -0,0 +1,44 @@
+import { ApiCall } from "tsrpc";
+import { HuoDongFun } from "../../../public/huodongfun";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/diaoluoduihuan/PtlOpen";
+import { prizeType } from '../../../shared/protocols/type';
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+
+ let db = await G.mongodb.cEvent(`diaoluoduihuan${call.req.hdid}`).findOne({ uid: call.uid, type: `diaoluoduihuan${call.req.hdid}` });
+
+
+ call.succ({
+ record: db?.record || {},
+ hdinfo: _hdinfo
+ });
+}
+
+/**
+ * 兑换掉落活动添加掉落物品
+ * 掉落活动 后端唯一识别标识 htype 2
+ */
+export async function event_dldh_addPrize(prize: prizeType[], call: ApiCall, time: number) {
+ if (time > G.gc.tanxian_com.maxGuaJiTime) time = G.gc.tanxian_com.maxGuaJiTime;
+ let _hdList = await HuoDongFun.gethdList(call, 2)
+ for (let index = 0; index < _hdList.length; index++) {
+ const element = _hdList[index];
+ // 这里能有活动,就已经过了时间的筛选,无需这个时间的判断,取消了
+ // if (G.time < PublicShared.getToDayZeroTime(call.conn.gud.cTime) + element.data.event.time) {
+
+ let rand = PublicShared.randomDropAny(element.data.diaoluo);
+ // @ts-ignore
+ let [n, s, a] = [rand.n, rand.s, rand.a]
+ if (n > 0) {
+ let multiply = Math.floor(time / s);
+ prize.push({ a: a, t: element.data.event.itemId, n: multiply * n });
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/huobanzhaomu/ApiOpen.ts b/src/api_s2c/event/huobanzhaomu/ApiOpen.ts
new file mode 100644
index 0000000..860e426
--- /dev/null
+++ b/src/api_s2c/event/huobanzhaomu/ApiOpen.ts
@@ -0,0 +1,14 @@
+import { ApiCall } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/huobanzhaomu/PtlOpen";
+
+export default async function (call: ApiCall) {
+
+ let db = await G.mongodb.cEvent('huobanzhaomu').findOne({ uid: call.uid, type: 'huobanzhaomu' });
+
+ call.succ({
+ finish: Object.fromEntries(G.gc.huobanzhaomu.map((conf, i) => {
+ return [i, conf.gudKey ? call.conn.gud[conf.gudKey] >= conf.total : db?.rec?.length >= G.gc.huobanzhaomu.length - 1];
+ })),
+ rec: db?.rec || []
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/huobanzhaomu/ApiRec.ts b/src/api_s2c/event/huobanzhaomu/ApiRec.ts
new file mode 100644
index 0000000..3b8cd45
--- /dev/null
+++ b/src/api_s2c/event/huobanzhaomu/ApiRec.ts
@@ -0,0 +1,32 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/event/huobanzhaomu/PtlRec";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let conf = G.gc.huobanzhaomu[call.req.index];
+ if (!conf) return call.error('', { code: -1 });
+ if (conf.gudKey && call.conn.gud[conf.gudKey] < conf.total) return call.error('', { code: -2 });
+
+ let db = await G.mongodb.cEvent('huobanzhaomu').findOne({ uid: call.uid, type: 'huobanzhaomu' });
+ if (db?.rec.includes(call.req.index)) return call.error('', { code: -3 });
+ if (!conf.gudKey && (db?.rec?.length || 0) < G.gc.huobanzhaomu.length - 1) return call.error('', { code: -4 });
+
+ await PlayerFun.sendPrize(call, conf.prize);
+
+ if (db?.rec?.length + 1 >= G.gc.huobanzhaomu.length) {
+ G.mongodb.collection('syncBtns').updateOne({ uid: call.uid }, { $set: { 'huobanzhaomu.active': false } }, { upsert: true });
+ }
+
+ G.mongodb.cEvent('huobanzhaomu').updateOne(
+ { uid: call.uid, type: 'huobanzhaomu' },
+ { $push: { rec: call.req.index } },
+ { upsert: true }
+ );
+
+ HongDianChange.sendChangeKey(call.uid, ['huobanzhaomuhd'])
+
+ call.succ({
+ prize: conf.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/jierihuodong/ApiGet.ts b/src/api_s2c/event/jierihuodong/ApiGet.ts
new file mode 100644
index 0000000..106e20d
--- /dev/null
+++ b/src/api_s2c/event/jierihuodong/ApiGet.ts
@@ -0,0 +1,35 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqGet, ResGet } from "../../../shared/protocols/event/jierihuodong/PtlGet";
+
+export default async function (call: ApiCall) {
+ let req = call.req;
+ let db = await G.mongodb.cEvent('jierihuodong').findOne({ uid: call.uid, type: 'jierihuodong' });
+
+ let conf = req.type == 'duihuan' ? G.gc.jierihuodong.duihuan : G.gc.jierihuodong.libao;
+ if (!conf[req.index]) return call.error('', { code: -1 });
+
+ let record = req.type == 'duihuan' ? (db?.recordDuihuan || {}) : (db?.recordLibao || {});
+ if (record[req.index] + req.num > conf[req.index].num) return call.error('', { code: -2 });
+
+ let need = conf[req.index].need.map(_n => {
+ return { ..._n, n: _n.n * req.num };
+ });
+
+ let prize = conf[req.index].prize.map(_p => {
+ return { ..._p, n: _p.n * req.num };
+ });
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+ await PlayerFun.sendPrize(call, prize);
+
+ G.mongodb.cEvent('jierihuodong').updateOne(
+ { uid: call.uid, type: 'jierihuodong' },
+ { $inc: G.mongodb.createTreeObj({ key: req.type == 'duihuan' ? `recordDuihuan.${req.index}` : `recordLibao.${req.index}`, val: req.num }) }
+ );
+
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/jierihuodong/ApiOpen.ts b/src/api_s2c/event/jierihuodong/ApiOpen.ts
new file mode 100644
index 0000000..56fa7e5
--- /dev/null
+++ b/src/api_s2c/event/jierihuodong/ApiOpen.ts
@@ -0,0 +1,29 @@
+import { ApiCall } from "tsrpc";
+import { ActionLog } from '../../../public/actionLog/actionLog';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/jierihuodong/PtlOpen";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+
+ let db = await G.mongodb.cEvent('jierihuodong').findOne({ uid: call.uid, type: 'jierihuodong' });
+ let recTask = db?.recTask || [];
+
+ if (!db || db.refreshTime < PublicShared.getToDayZeroTime()) {
+ G.mongodb.cEvent('jierihuodong').updateOne(
+ { uid: call.uid, type: 'jierihuodong' },
+ { $set: { refreshTime: G.time, recTask: [] } },
+ { upsert: true }
+ );
+ recTask = [];
+ }
+
+ let taskIds = [...new Set(G.gc.jierihuodong.huodongrenwu.map(r => r.taskId))];
+
+ call.succ({
+ recTask: recTask,
+ recLogin: db?.recLogin || [],
+ recordLibao: db?.recordLibao || {},
+ recordDuihuan: db?.recordDuihuan || {},
+ taskFinish: await ActionLog.getDayLog(call.uid, taskIds)
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/jierihuodong/ApiRec.ts b/src/api_s2c/event/jierihuodong/ApiRec.ts
new file mode 100644
index 0000000..8dd86fc
--- /dev/null
+++ b/src/api_s2c/event/jierihuodong/ApiRec.ts
@@ -0,0 +1,32 @@
+import { ApiCall } from "tsrpc";
+import { ActionLog } from '../../../public/actionLog/actionLog';
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/event/jierihuodong/PtlRec";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let req = call.req;
+ let db = await G.mongodb.cEvent('jierihuodong').findOne({ uid: call.uid, type: 'jierihuodong' });
+
+ let conf = req.type == 'login' ? G.gc.jierihuodong.denglufuli : G.gc.jierihuodong.huodongrenwu;
+ if (!conf[req.index]) return call.error('', { code: -1 });
+
+ let recIndex = req.type == 'login' ? (db?.recLogin || []) : (db?.recTask || []);
+ if (recIndex.includes(req.index)) return call.error('', { code: -2 });
+
+ let finish = req.type == 'login' ? call.conn.gud.loginDays : await ActionLog.getDayLog(call.uid, conf[req.index].taskId);
+ if (finish < conf[req.index].total) return call.error('', { code: -3 });
+
+ await PlayerFun.sendPrize(call, conf[req.index].prize);
+
+ G.mongodb.cEvent('jierihuodong').updateOne(
+ { uid: call.uid, type: 'jierihuodong' },
+ { $push: req.type == 'login' ? { recLogin: req.index } : { recTask: req.index } }
+ );
+
+ HongDianChange.sendChangeKey(call.uid, ['jierihd'])
+
+ call.succ({
+ prize: conf[req.index].prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/jijin/ApiCheckOpen.ts b/src/api_s2c/event/jijin/ApiCheckOpen.ts
new file mode 100644
index 0000000..f5bc066
--- /dev/null
+++ b/src/api_s2c/event/jijin/ApiCheckOpen.ts
@@ -0,0 +1,36 @@
+import { ApiCall } from "tsrpc";
+import { PayFun } from '../../../public/pay';
+import { jijinType } from "../../../shared/protocols/event/jijin/PtlOpen";
+import {ReqCheckOpen,ResCheckOpen} from "../../../shared/protocols/event/jijin/PtlCheckOpen";
+
+
+const type:jijinType[] = [
+ 'dengjijijin',
+ 'guanqiajijin',
+ 'dayjijin',
+ 'tianshujijin',
+]
+
+export default async function (call: ApiCall) {
+ let logs = await PayFun.getPayLog(call.uid);
+
+ let data = await G.mongodb.collection('event').find({ uid: call.uid, type: { $in: type}}).toArray();
+
+ let record = {}
+ for (const i of type) {
+ let payId = i == 'tianshujijin' ? 'zhongshenka' : i;
+ let isPay = logs?.[payId]?.length > 0
+
+ if(!isPay) record[i] = !isPay
+ else {
+ let rec = data.filter(v=>v.type==i)[0]?.rec
+ let popVal:any = rec && Object.values(rec).at(-1)
+ record[i] = !(popVal && popVal.pt && popVal.tq);
+ if(!record[i]){
+ G.mongodb.collection('syncBtns').updateOne({ uid: call.uid }, { $set: G.mongodb.createTreeObj({ key: i, val: { active: false } }) });
+ }
+ }
+ }
+
+ call.succ(record);
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/jijin/ApiOpen.ts b/src/api_s2c/event/jijin/ApiOpen.ts
new file mode 100644
index 0000000..9252b25
--- /dev/null
+++ b/src/api_s2c/event/jijin/ApiOpen.ts
@@ -0,0 +1,40 @@
+import { ApiCall, BaseConnection } from "tsrpc";
+import { PayFun } from '../../../public/pay';
+import { ReqOpen, ResOpen, jijinType } from "../../../shared/protocols/event/jijin/PtlOpen";
+import { payLog } from '../../../shared/protocols/pay/PtlGetList';
+import { PublicShared } from '../../../shared/public/public';
+
+/** 基金、dengjijijin
+ * 关卡基金、guanqiajijin
+ * 特别通行证、dayjijin
+ * 天数基金、tianshujijin
+ * */
+export default async function (call: ApiCall) {
+ let logs = await PayFun.getPayLog(call.uid);
+ let data = await G.mongodb.cEvent(call.req.type).findOne({ uid: call.uid, type: call.req.type });
+ let payId = call.req.type == 'tianshujijin' ? 'zhongshenka' : call.req.type;
+
+ call.succ({
+ isPay: logs?.[payId]?.length > 0,
+ rec: data?.rec || {},
+ finished: await getVal(call, logs)
+ });
+}
+
+export async function getVal(call: { conn: BaseConnection, req: ReqOpen; }, logs: k_v, type: jijinType | false = false) {
+ let val = 0;
+ let _type = type || call.req.type;
+
+ if (_type == 'dayjijin') {
+ val = PublicShared.getOpenServerDay() - G.gc.eventOpen.dayjijin.day + 1;
+ val = (await G.mongodb.collection('pata').findOne({ uid: call.conn.uid }))?.lv || 0;
+ } else if (_type == 'dengjijijin') {
+ val = call.conn.gud.lv;
+ } else if (_type == 'guanqiajijin') {
+ val = call.conn.gud.mapId;
+ } else if (_type == 'tianshujijin') {
+ val = call.conn.gud.loginDays
+ }
+ if (val < 0) val = 0;
+ return val;
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/jijin/ApiReceive.ts b/src/api_s2c/event/jijin/ApiReceive.ts
new file mode 100644
index 0000000..e9cf979
--- /dev/null
+++ b/src/api_s2c/event/jijin/ApiReceive.ts
@@ -0,0 +1,80 @@
+import { ApiCall } from "tsrpc";
+import { PayFun } from '../../../public/pay';
+import { PlayerFun } from '../../../public/player';
+import { ReqReceive, ResReceive } from "../../../shared/protocols/event/jijin/PtlReceive";
+import { PublicShared } from '../../../shared/public/public';
+import { HongDianChange } from "../../hongdian/fun";
+import { getVal } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ if (call.req.recIndexs.length < 1) return call.error(globalThis.lng.pata_getprize_1);
+ let data = await G.mongodb.cEvent(call.req.type).findOne({ uid: call.uid, type: call.req.type });
+
+ let conf = G.gc.jijin[call.req.type];
+
+ let isErr = conf.map((c, i) => i).intersection(call.req.recIndexs).length != call.req.recIndexs.length;
+ if (isErr) return call.error(globalThis.lng.pata_getprize_1);
+
+ let logs = await PayFun.getPayLog(call.uid);
+ let rec = data?.rec || {};
+ let val = await getVal(call, logs);
+ let payId = call.req.type == 'tianshujijin' ? 'zhongshenka' : call.req.type;
+ let isPay = logs?.[payId]?.length > 0;
+ let prize: atn[] = [];
+
+ for (let index of call.req.recIndexs) {
+ if (val < conf[index].total) return call.error(globalThis.lng.event_jijin_1);
+
+ // 配置获取奖励,判断是否存在
+ let hasPt = conf[index].pt.length > 0;
+ let hasTq = conf[index].tq.length > 0;
+ // 奖励不存在或奖励已被领取
+ let getPt = !hasPt || rec[index]?.pt == true;
+ let getTq = !hasTq || rec[index]?.tq == true;
+ // 非特权,普通奖励已经被领取,跳过当前循环
+ if (getPt && !isPay) continue;
+ // if (getPt && !getTq && !isPay) return call.error(globalThis.lng.event_jijin_2);
+ // 特权,全部奖励已被领取,跳过当前循环
+ if (getPt && getTq && isPay) continue;
+ // if (getPt && getTq) return call.error(globalThis.lng.event_jijin_3);
+
+ if (!rec[index]) rec[index] = { pt: false, tq: false };
+
+ if (hasPt && !getPt) {
+ prize.push(...conf[index].pt);
+ rec[index].pt = true;
+ }
+
+ if (hasTq && !getTq && isPay) {
+ prize.push(...conf[index].tq);
+ rec[index].tq = true;
+ }
+ }
+ // 没有领取到奖励,返回错误消息。
+ if(prize.length == 0) return call.error(globalThis.lng.event_jijin_3)
+ prize = PublicShared.mergePrize(prize);
+ await PlayerFun.sendPrize(call, prize);
+
+ await G.mongodb.cEvent(call.req.type).updateOne(
+ { uid: call.uid, type: call.req.type },
+ { $set: { rec: rec } },
+ { upsert: true }
+ );
+
+ HongDianChange.sendChangeKey(call.uid, ['jijinhd'])
+
+ call.succ({
+ rec: rec,
+ prize: prize
+ });
+
+ let ptLen = conf.filter(c => c.pt.length > 0).length;
+ let tqLen = conf.filter(c => c.tq.length > 0).length;
+ let recPtLen = Object.values(rec).filter(r => r.pt == true).length;
+ let recTqLen = Object.values(rec).filter(r => r.tq == true).length;
+
+ //奖励领取完 更新异步按钮
+ if (recPtLen >= ptLen && recTqLen >= tqLen) {
+ G.mongodb.collection('syncBtns').updateOne({ uid: call.uid }, { $set: G.mongodb.createTreeObj({ key: call.req.type, val: { active: false } }) });
+ }
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/kaifukuanghuan/ApiLoginPrize.ts b/src/api_s2c/event/kaifukuanghuan/ApiLoginPrize.ts
new file mode 100644
index 0000000..72f1258
--- /dev/null
+++ b/src/api_s2c/event/kaifukuanghuan/ApiLoginPrize.ts
@@ -0,0 +1,25 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqLoginPrize, ResLoginPrize } from "../../../shared/protocols/event/kaifukuanghuan/PtlLoginPrize";
+import { PublicShared } from '../../../shared/public/public';
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let day = PublicShared.getOpenServerDay(call.conn.gud.cTime);
+ let data = await G.mongodb.cEvent('kaifukuanghuan').findOne({ uid: call.uid, type: 'kaifukuanghuan' });
+
+ if (data.receiveLogin.length >= day) return call.error(globalThis.lng.event_kfkh_3);
+
+ let recIndex = Array(day).fill(1).map((v, i) => i).filter(i => !data.receiveLogin.includes(i));
+ let prize = recIndex.map(i => G.gc.kaifukuanghuan.loginPrize[i]).reduce((a, b) => a.concat(b));
+ let _prize = PublicShared.mergePrize(prize);
+
+ G.mongodb.cEvent('kaifukuanghuan').updateOne({ uid: call.uid, type: 'kaifukuanghuan' }, { $push: { receiveLogin: { $each: recIndex } } });
+ await PlayerFun.sendPrize(call, _prize);
+
+ HongDianChange.sendChangeKey(call.uid, ['kaifukuanghuanhd'])
+
+ call.succ({
+ prize: _prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/kaifukuanghuan/ApiOpen.ts b/src/api_s2c/event/kaifukuanghuan/ApiOpen.ts
new file mode 100644
index 0000000..e2d4d8b
--- /dev/null
+++ b/src/api_s2c/event/kaifukuanghuan/ApiOpen.ts
@@ -0,0 +1,107 @@
+import { ApiCall } from "tsrpc";
+import { Wjjl } from '../../../module/collection_wjjl';
+import { EmailFun } from '../../../public/email';
+import { PayFun } from '../../../public/pay';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/kaifukuanghuan/PtlOpen";
+import { player } from '../../../shared/protocols/user/type';
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let [isOpen, tips] = PublicShared.getOpenCond(call, "kaifukuanghuan")
+ if (!isOpen) return call.error('', { code: -1, message: tips });
+
+ let data = await G.mongodb.cEvent('kaifukuanghuan').findOne({ uid: call.uid, type: 'kaifukuanghuan' });
+
+ if (!data) {
+ data = {
+ _id: null,
+ uid: call.uid,
+ type: 'kaifukuanghuan',
+ buyShop: {},
+ receiveBox: [],
+ receiveTask: Object.fromEntries(Object.keys(G.gc.kaifukuanghuan.task).map(day => [day, []])),
+ receiveLogin: [],
+ };
+ G.mongodb.cEvent('kaifukuanghuan').insertOne(data);
+ }
+
+ let tasks = Object.values(G.gc.kaifukuanghuan.task as k_v<_gcType['kaifukuanghuan']['task']['1']>).map(tasks => tasks.map(task => task.taskType)).reduce((a, b) => a.concat(b));
+ let taskFinished = await getTaskVal(call.conn.gud, [...new Set(tasks)]);
+ let { _id, uid, type, ...ops } = data;
+
+ call.succ({
+ ...ops,
+ day: PublicShared.getOpenServerDay(call.conn.gud.cTime),
+ taskFinished: taskFinished
+ });
+}
+
+export async function reissuePrize(gud: player, lastTime: number, curTime: number) {
+ let cZeroTime = PublicShared.getToDayZeroTime(gud.cTime);
+
+ if (curTime > cZeroTime + 7 * 24 * 3600 && lastTime < cZeroTime + 7 * 24 * 3600) {
+ let loginDay = gud.loginDays;
+ let db = await G.mongodb.cEvent('kaifukuanghuan').findOne({ uid: gud.uid, type: 'kaifukuanghuan' });
+ let recLogin = db?.receiveLogin || [];
+ let prize: atn[] = [];
+ G.gc.kaifukuanghuan.loginPrize.forEach((v, i) => {
+ if (loginDay >= i + 1 && !recLogin.includes(i)) prize.push(...v);
+ });
+
+ prize.length > 0 && EmailFun.addEmail({
+ uid: gud.uid,
+ type: 'system',
+ title: G.gc.kaifukuanghuan.email.title,
+ content: G.gc.kaifukuanghuan.email.content,
+ prize: PublicShared.mergePrize(prize),
+ contentInsertArr: []
+ });
+ }
+}
+
+export async function getTaskVal(gud: player, taskTyps: string[]) {
+ let val: k_v = {};
+
+ taskTyps = taskTyps.filter(t => {
+ if (['power', 'helpHeros'].includes(t)) return true;
+ if (gud[t] != undefined) {
+ if (typeof gud[t] == 'number') val[t] = gud[t];
+ else if (t == 'wxcLv') val[t] = gud[t].lv;
+ else val[t] = 0;
+ return false;
+ } else {
+ return true;
+ }
+ });
+
+ for (let t of taskTyps) {
+ if (t == 'toDayLogin') val[t] = 1;
+ else if (t.indexOf('toDayPay') != -1) {
+ let daystr = t.split('_')[1] || '1';
+ let day = Number(daystr);
+ let zeroTime = PublicShared.getToDayZeroTime(gud.cTime);
+ val[t] = await PayFun.getPayDaysAllPayNum(gud.uid, zeroTime + (day - 1) * 24 * 3600, zeroTime + day * 24 * 3600);
+ } else if (t == 'zccg_level') {
+ val[t] = (await G.mongodb.collection('pata').findOne({ uid: gud.uid }))?.lv || 0;
+ } else if (t.indexOf('has_equip_color') != -1) {
+ let color = Number(t.split('_').last());
+ let lshd = G.server.uid_connections[gud.uid].lshd.equip || {};
+ if (Object.keys(lshd).length == 0) val[t] = 0;
+ else {
+ let meets = Object.entries(lshd).filter(v => G.gc.equip[v[0]].colour >= color);
+ if (meets.length > 0) {
+ val[t] = meets.map(v => v[1]).reduce((a, b) => a + b);
+ } else {
+ val[t] = 0;
+ }
+ }
+ } else {
+ // 竞技场默认取值 1000 ,不能为0
+ let _default = t == 'jjc_rank' ? 1000 : 0
+ val[t] = await Wjjl.getVal(gud.uid, t) || _default;
+ }
+ }
+
+ return val;
+}
+
diff --git a/src/api_s2c/event/kaifukuanghuan/ApiShopBuy.ts b/src/api_s2c/event/kaifukuanghuan/ApiShopBuy.ts
new file mode 100644
index 0000000..9e50b2a
--- /dev/null
+++ b/src/api_s2c/event/kaifukuanghuan/ApiShopBuy.ts
@@ -0,0 +1,34 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqShopBuy, ResShopBuy } from "../../../shared/protocols/event/kaifukuanghuan/PtlShopBuy";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let conf = G.gc.kaifukuanghuan.shop[call.req.index];
+ let buyNum = call.req.buyNum || 1;
+
+ if (!conf) return call.error(globalThis.lng.pata_getprize_1);
+ if (call.conn.gud.vip < conf.vip) return call.error(globalThis.lng.event_kfkh_4);
+ if (PublicShared.getOpenServerDay(call.conn.gud.cTime) < conf.day) return call.error(globalThis.lng.event_kfkh_5);
+
+ let data = await G.mongodb.cEvent('kaifukuanghuan').findOne({ uid: call.uid, type: 'kaifukuanghuan' });
+ let useBuyNum = data.buyShop[call.req.index] || 0;
+
+ if (buyNum > conf.buyNum - useBuyNum) return call.error(globalThis.lng.event_kfkh_6);
+
+ let needs = conf.need.map(need => { return { ...need, n: need.n * buyNum }; });
+ await PlayerFun.checkNeedIsMeet(call, needs);
+ await PlayerFun.cutNeed(call, needs);
+
+ let prizes = conf.prize.map(prize => { return { ...prize, n: prize.n * buyNum }; });
+ await PlayerFun.sendPrize(call, prizes);
+
+ G.mongodb.cEvent('kaifukuanghuan').updateOne(
+ { uid: call.uid, type: 'kaifukuanghuan' },
+ { $inc: G.mongodb.createTreeObj({ key: 'buyShop', k: `${call.req.index}`, val: buyNum }) }
+ );
+
+ call.succ({
+ prize: prizes
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/kaifukuanghuan/ApiTaskBox.ts b/src/api_s2c/event/kaifukuanghuan/ApiTaskBox.ts
new file mode 100644
index 0000000..31f86d8
--- /dev/null
+++ b/src/api_s2c/event/kaifukuanghuan/ApiTaskBox.ts
@@ -0,0 +1,31 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqTaskBox, ResTaskBox } from "../../../shared/protocols/event/kaifukuanghuan/PtlTaskBox";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+
+ let conf = G.gc.kaifukuanghuan.taskBoxPrize[call.req.index];
+
+ if (!conf) return call.error(globalThis.lng.pata_getprize_1);
+
+ let data = await G.mongodb.cEvent('kaifukuanghuan').findOne({ uid: call.uid, type: 'kaifukuanghuan' });
+
+ if (data.receiveBox.includes(call.req.index)) return call.error(globalThis.lng.event_jijin_3);
+
+ let finished = Object.values(data.receiveTask).map(fs => fs.length).reduce((a, b) => a + b);
+
+ if (finished < conf.total) return call.error(globalThis.lng.event_jijin_1);
+
+ G.mongodb.cEvent('kaifukuanghuan').updateOne(
+ { uid: call.uid, type: 'kaifukuanghuan' },
+ { $push: { receiveBox: call.req.index } }
+ );
+ await PlayerFun.sendPrize(call, conf.prize);
+
+ HongDianChange.sendChangeKey(call.uid, ['kaifukuanghuanhd'])
+
+ call.succ({
+ prize: conf.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/kaifukuanghuan/ApiTaskPrize.ts b/src/api_s2c/event/kaifukuanghuan/ApiTaskPrize.ts
new file mode 100644
index 0000000..75871c7
--- /dev/null
+++ b/src/api_s2c/event/kaifukuanghuan/ApiTaskPrize.ts
@@ -0,0 +1,41 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqTaskPrize, ResTaskPrize } from "../../../shared/protocols/event/kaifukuanghuan/PtlTaskPrize";
+import { PublicShared } from '../../../shared/public/public';
+import { HongDianChange } from "../../hongdian/fun";
+import { getTaskVal } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+
+ let conf: _gcType['kaifukuanghuan']['task']['1'][0] = G.gc.kaifukuanghuan.task[call.req.day]?.[call.req.index];
+
+ if (!conf) return call.error(globalThis.lng.pata_getprize_1);
+
+ let day = PublicShared.getOpenServerDay(call.conn.gud.cTime);
+
+ if (call.req.day > day) return call.error(globalThis.lng.event_kfkh_7);
+
+ let data = await G.mongodb.cEvent('kaifukuanghuan').findOne({ uid: call.uid, type: 'kaifukuanghuan' });
+
+ if (data.receiveTask[call.req.day].includes(call.req.index)) return call.error(globalThis.lng.event_jijin_3);
+
+ let finished = (await getTaskVal(call.conn.gud, [conf.taskType]))[conf.taskType] || 0;
+
+ if (conf.taskType == 'jjc_rank') {
+ if (finished > conf.total) return call.error(globalThis.lng.event_kfkh_8);
+ } else {
+ if (finished < conf.total) return call.error(globalThis.lng.event_kfkh_8);
+ }
+
+ G.mongodb.cEvent('kaifukuanghuan').updateOne(
+ { uid: call.uid, type: 'kaifukuanghuan' },
+ { $push: G.mongodb.createTreeObj({ key: `receiveTask.${call.req.day}`, val: call.req.index }) }
+ );
+ await PlayerFun.sendPrize(call, conf.prize);
+
+ HongDianChange.sendChangeKey(call.uid, ['kaifukuanghuanhd']);
+
+ call.succ({
+ prize: conf.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/leijichongzhi/ApiOpen.ts b/src/api_s2c/event/leijichongzhi/ApiOpen.ts
new file mode 100644
index 0000000..4aac3ce
--- /dev/null
+++ b/src/api_s2c/event/leijichongzhi/ApiOpen.ts
@@ -0,0 +1,32 @@
+import { ApiCall } from "tsrpc";
+import { HuoDongFun } from "../../../public/huodongfun";
+import { PayFun } from '../../../public/pay';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/leijichongzhi/PtlOpen";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+
+ let _dbType: `leijichongzhi${number}` = `leijichongzhi${call.req.hdid}`
+ let db = await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType });
+ let sTime = db?.sTime || PublicShared.getToDayZeroTime(G.time);
+
+ if (!db) {
+ G.mongodb.cEvent(_dbType).updateOne(
+ { uid: call.uid, type: _dbType },
+ { $set: { sTime: sTime, recIndex: [] } },
+ { upsert: true }
+ );
+ }
+
+ call.succ({
+ sTime: sTime,
+ recIndex: db?.recIndex || [],
+ payNum: await PayFun.getPayDaysAllPayNum(call.uid, _hdinfo.stime, _hdinfo.rtime),
+ hdinfo: _hdinfo
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/leijichongzhi/ApiRec.ts b/src/api_s2c/event/leijichongzhi/ApiRec.ts
new file mode 100644
index 0000000..77aa2ee
--- /dev/null
+++ b/src/api_s2c/event/leijichongzhi/ApiRec.ts
@@ -0,0 +1,37 @@
+import { ApiCall } from "tsrpc";
+import { HuoDongFun } from "../../../public/huodongfun";
+import { PayFun } from '../../../public/pay';
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/event/leijichongzhi/PtlRec";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+
+ let _dbType: `leijichongzhi${number}` = `leijichongzhi${call.req.hdid}`
+
+ let conf = _hdinfo.data.tasks[call.req.index];
+ if (!conf) return call.error('', { code: -1 });
+
+ let db = await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType });
+ if (db.recIndex.includes(call.req.index)) return call.error('', { code: -2 });
+
+ let payNum = await PayFun.getPayDaysAllPayNum(call.uid, _hdinfo.stime, _hdinfo.rtime);
+ if (payNum < conf.total) return call.error('', { code: -3 });
+
+ await PlayerFun.sendPrize(call, conf.prize);
+
+ G.mongodb.cEvent(_dbType).updateOne(
+ { uid: call.uid, type: _dbType },
+ { $push: { recIndex: call.req.index } }
+ );
+
+ HongDianChange.sendChangeKey(call.uid, ['huodonghd'])
+ call.succ({
+ prize: conf.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/niudanji/ApiLottery.ts b/src/api_s2c/event/niudanji/ApiLottery.ts
new file mode 100644
index 0000000..b6ab342
--- /dev/null
+++ b/src/api_s2c/event/niudanji/ApiLottery.ts
@@ -0,0 +1,35 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqLottery, ResLottery } from "../../../shared/protocols/event/niudanji/PtlLottery";
+import { PublicShared } from '../../../shared/public/public';
+import { pay2num } from './ApiOpen';
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let hasNum = pay2num(call.conn.gud);
+ if (hasNum < 1) return call.error('', { code: -1 });
+
+ let db = await G.mongodb.cEvent('niudanji').findOne({ uid: call.uid, type: 'niudanji' });
+ let useNum = db?.useNum || 0;
+
+ if (useNum >= hasNum) return call.error('', { code: -1 });
+
+ let random = (useNum != 0 && useNum % G.gc.niudanji.num2lottery == 0) ? G.gc.niudanji.lottery[0] : PublicShared.randomDropAny(G.gc.niudanji.lottery);
+ let prize = random.prize.random();
+
+ if (random.pmd) {
+ G.mongodb.collection('any').updateOne({ type: 'niudanlog' }, { $push: { data: { $each: [{ name: call.conn.gud.name, item: prize }], $slice: -30 } } }, { upsert: true });
+ }
+
+ await PlayerFun.sendPrize(call, [prize]);
+
+ G.mongodb.cEvent('niudanji').updateOne(
+ { uid: call.uid, type: 'niudanji' },
+ { $inc: { useNum: 1 } },
+ { upsert: true }
+ );
+ HongDianChange.sendChangeKey(call.uid, ['heishihd'])
+ call.succ({
+ prize: [prize]
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/niudanji/ApiOpen.ts b/src/api_s2c/event/niudanji/ApiOpen.ts
new file mode 100644
index 0000000..5baee80
--- /dev/null
+++ b/src/api_s2c/event/niudanji/ApiOpen.ts
@@ -0,0 +1,18 @@
+import { ApiCall } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/niudanji/PtlOpen";
+import { player } from '../../../shared/protocols/user/type';
+
+export default async function (call: ApiCall) {
+
+ let db = await G.mongodb.cEvent('niudanji').findOne({ uid: call.uid, type: 'niudanji' });
+
+ call.succ({
+ hasNum: pay2num(call.conn.gud),
+ useNum: db?.useNum || 0,
+ logs: (await G.mongodb.collection('any').findOne({ type: 'niudanlog' }))?.data || []
+ });
+}
+
+export function pay2num(player: player) {
+ return Math.floor(player.payExp / G.gc.niudanji.pay2num);
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/qirichongzhi/ApiOpen.ts b/src/api_s2c/event/qirichongzhi/ApiOpen.ts
new file mode 100644
index 0000000..e9c40a7
--- /dev/null
+++ b/src/api_s2c/event/qirichongzhi/ApiOpen.ts
@@ -0,0 +1,42 @@
+import { UpdateFilter } from 'mongodb';
+import { ApiCall } from "tsrpc";
+import { CollectionEvent } from '../../../module/collection_event';
+import { PayFun } from '../../../public/pay';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/qirichongzhi/PtlOpen";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+
+ let db = await G.mongodb.cEvent('qirichongzhi').findOne({ uid: call.uid, type: 'qirichongzhi' });
+ let update: UpdateFilter>;
+ let sTime = PublicShared.getToDayZeroTime(G.time);
+
+ if (!db) {
+ update = {
+ $set: { round: 0, sTime: sTime, recIndexs: [] }
+ };
+ } else {
+ if (db.sTime + G.gc.qirichongzhi[db.round].time < G.time) {
+
+ db.sTime = sTime;
+ db.round = G.gc.qirichongzhi[db.round + 1] == undefined ? db.round : db.round + 1;
+ db.recIndexs = [];
+
+ update = {
+ $set: { index: db.round, sTime: db.sTime, recIndex: [] }
+ };
+ } else {
+ sTime = db.sTime;
+ }
+ }
+
+ update && G.mongodb.cEvent('qirichongzhi').updateOne({ uid: call.uid, type: 'qirichongzhi' }, update, { upsert: true });
+ let round = db?.round || 0;
+
+ call.succ({
+ round: round,
+ sTime: sTime,
+ recIndexs: db?.recIndexs || [],
+ finished: await PayFun.getPayDaysAllPayNum(call.uid, sTime, sTime + G.gc.qirichongzhi[round].time)
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/qirichongzhi/ApiRec.ts b/src/api_s2c/event/qirichongzhi/ApiRec.ts
new file mode 100644
index 0000000..95cede5
--- /dev/null
+++ b/src/api_s2c/event/qirichongzhi/ApiRec.ts
@@ -0,0 +1,31 @@
+import { ApiCall } from "tsrpc";
+import { PayFun } from '../../../public/pay';
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/event/qirichongzhi/PtlRec";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let db = await G.mongodb.cEvent('qirichongzhi').findOne({ uid: call.uid, type: 'qirichongzhi' });
+ let round = db?.round || 0;
+ let conf = G.gc.qirichongzhi[round];
+
+ if (!db) return call.error('', { code: 0 });
+ if (!conf.tasks[call.req.index]) return call.error('', { code: -1 });
+ if (db.recIndexs.includes(call.req.index)) return call.error('', { code: -2 });
+
+ let finished = await PayFun.getPayDaysAllPayNum(call.uid, db.sTime, db.sTime + G.gc.qirichongzhi[round].time);
+ if (finished < conf.tasks[call.req.index].total) return call.error('', { code: -3 });
+
+ await PlayerFun.sendPrize(call, conf.tasks[call.req.index].prize);
+
+ G.mongodb.cEvent('qirichongzhi').updateOne(
+ { uid: call.uid, type: 'qirichongzhi' },
+ { $push: { recIndexs: call.req.index } }
+ );
+
+ HongDianChange.sendChangeKey(call.uid, ['qirileichonghd'])
+
+ call.succ({
+ prize: conf.tasks[call.req.index].prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/qiridenglu/ApiOpen.ts b/src/api_s2c/event/qiridenglu/ApiOpen.ts
new file mode 100644
index 0000000..7063e7b
--- /dev/null
+++ b/src/api_s2c/event/qiridenglu/ApiOpen.ts
@@ -0,0 +1,35 @@
+import { ApiCall } from "tsrpc";
+import { ActionLog } from '../../../public/actionLog/actionLog';
+import { HuoDongFun } from "../../../public/huodongfun";
+import { call } from "../../../public/player";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/qiridenglu/PtlOpen";
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+
+ let _dbType: `qiridenglu${number}` = `qiridenglu${call.req.hdid}`
+
+ let db = await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType });
+ let day = await ActionLog.getRetainLog(call.uid, `login_day_qiridenglu_${call.req.hdid}`);
+
+ call.succ({
+ loginDay: day,
+ recPrize: db?.recPrize || [],
+ hdinfo: _hdinfo
+ });
+}
+
+
+// 符合时间的七日登录活动记录天数
+export async function qiRiDengLuAddDay(call: call) {
+ // @ts-ignore
+ let _sDayhdList = await HuoDongFun.gethdList(call, 6)
+ _sDayhdList && _sDayhdList.forEach(element => {
+ ActionLog.addRetainLog(call.uid, { key: `login_day_qiridenglu_${element.hdid}`, val: 1 });
+ });
+}
+
diff --git a/src/api_s2c/event/qiridenglu/ApiRecPrize.ts b/src/api_s2c/event/qiridenglu/ApiRecPrize.ts
new file mode 100644
index 0000000..20341ce
--- /dev/null
+++ b/src/api_s2c/event/qiridenglu/ApiRecPrize.ts
@@ -0,0 +1,44 @@
+import { ApiCall } from "tsrpc";
+import { ActionLog } from '../../../public/actionLog/actionLog';
+import { HuoDongFun } from "../../../public/huodongfun";
+import { PlayerFun } from '../../../public/player';
+import { ReqRecPrize, ResRecPrize } from "../../../shared/protocols/event/qiridenglu/PtlRecPrize";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+ let conf = _hdinfo.data.arr
+ let _dbType: `qiridenglu${number}` = `qiridenglu${call.req.hdid}`
+
+
+ let recIndex = call.req.inedx;
+ if (!conf[recIndex]) return call.error('', { code: -1 });
+
+ let day = await ActionLog.getRetainLog(call.uid, `login_day_qiridenglu_${call.req.hdid}`);
+ if (conf[recIndex].day > day) return call.error('', { code: -2 });
+
+ let db = await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType });
+ if (db?.recPrize?.includes(recIndex)) return call.error('', { code: -3 });
+
+ await PlayerFun.sendPrize(call, conf[recIndex].prize);
+ G.mongodb.cEvent(_dbType).updateOne(
+ { uid: call.uid, type: _dbType },
+ { $push: { recPrize: recIndex } },
+ { upsert: true }
+ );
+
+ // 此活动可能有多个,此检测似乎不合适,先屏蔽
+ // if (db?.recPrize?.length + 1 >= conf.length) {
+ // G.mongodb.collection('syncBtns').updateOne({ uid: call.uid }, { $set: { 'qiridenglu.active': false } }, { upsert: true });
+ // }
+
+ HongDianChange.sendChangeKey(call.uid, ['huodonghd'])
+
+ call.succ({
+ prize: conf[recIndex].prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/shiwuleichong/ApiOpen.ts b/src/api_s2c/event/shiwuleichong/ApiOpen.ts
new file mode 100644
index 0000000..63aa21d
--- /dev/null
+++ b/src/api_s2c/event/shiwuleichong/ApiOpen.ts
@@ -0,0 +1,41 @@
+import { UpdateFilter } from 'mongodb';
+import { ApiCall } from "tsrpc";
+import { CollectionEvent } from '../../../module/collection_event';
+import { PayFun } from '../../../public/pay';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/shiwuleichong/PtlOpen";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let db = await G.mongodb.cEvent('15leichong').findOne({ uid: call.uid, type: '15leichong' });
+ let update: UpdateFilter>;
+ let sTime = PublicShared.getToDayZeroTime(G.time);
+
+ if (!db) {
+ update = {
+ $set: { index: 0, sTime: sTime, recIndex: [] }
+ };
+ } else {
+ if (db.sTime + G.gc.shiwuleichong.data[db.index].time < G.time) {
+
+ db.sTime = sTime;
+ db.index = G.gc.shiwuleichong.data[db.index + 1] == undefined ? db.index : db.index + 1;
+ db.recIndex = [];
+
+ update = {
+ $set: { index: db.index, sTime: db.sTime, recIndex: [] }
+ };
+ } else {
+ sTime = db.sTime;
+ }
+ }
+
+ update && G.mongodb.cEvent('15leichong').updateOne({ uid: call.uid, type: '15leichong' }, update, { upsert: true });
+ let index = db?.index || 0;
+
+ call.succ({
+ index: index,
+ sTime: sTime,
+ recIndex: db?.recIndex || [],
+ payDay: await PayFun.getPayDaysBuyPayNum(call.uid, sTime, sTime + G.gc.shiwuleichong.data[index].time, G.gc.shiwuleichong.dayPayNeed)
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/shiwuleichong/ApiRec.ts b/src/api_s2c/event/shiwuleichong/ApiRec.ts
new file mode 100644
index 0000000..f9cf51e
--- /dev/null
+++ b/src/api_s2c/event/shiwuleichong/ApiRec.ts
@@ -0,0 +1,26 @@
+import { ApiCall } from "tsrpc";
+import { PayFun } from '../../../public/pay';
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/event/shiwuleichong/PtlRec";
+
+export default async function (call: ApiCall) {
+ let db = await G.mongodb.cEvent('15leichong').findOne({ uid: call.uid, type: '15leichong' });
+ let confArr = G.gc.shiwuleichong.data[db.index];
+
+ if (!confArr.tasks[call.req.index]) return call.error('', { code: -1 });
+ if (db.recIndex.includes(call.req.index)) return call.error('', { code: -2 });
+
+ let payDay = await PayFun.getPayDaysBuyPayNum(call.uid, db.sTime, db.sTime + confArr.time, G.gc.shiwuleichong.dayPayNeed);
+ if (payDay < confArr.tasks[call.req.index].total) return call.error('', { code: -3 });
+
+ await PlayerFun.sendPrize(call, confArr.tasks[call.req.index].prize);
+
+ G.mongodb.cEvent('15leichong').updateOne(
+ { uid: call.uid, type: '15leichong' },
+ { $push: { recIndex: call.req.index } }
+ );
+
+ call.succ({
+ prize: confArr.tasks[call.req.index].prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/shouchong/ApiOpen.ts b/src/api_s2c/event/shouchong/ApiOpen.ts
new file mode 100644
index 0000000..010d12f
--- /dev/null
+++ b/src/api_s2c/event/shouchong/ApiOpen.ts
@@ -0,0 +1,11 @@
+import { ApiCall } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/shouchong/PtlOpen";
+
+export default async function (call: ApiCall) {
+ let data = await G.mongodb.cEvent('shouchong').findOne({ uid: call.uid, type: 'shouchong' });
+
+ call.succ({
+ payNum: call.conn.gud.payExp / 10,
+ receive: Object.fromEntries(Object.keys(G.gc.shouchong).map(k => [k, data?.receive?.[k] || []]))
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/shouchong/ApiReceive.ts b/src/api_s2c/event/shouchong/ApiReceive.ts
new file mode 100644
index 0000000..6e29d12
--- /dev/null
+++ b/src/api_s2c/event/shouchong/ApiReceive.ts
@@ -0,0 +1,56 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqReceive, ResReceive } from "../../../shared/protocols/event/shouchong/PtlReceive";
+import { PublicShared } from '../../../shared/public/public';
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+
+ let conf = G.gc.shouchong[call.req.k];
+
+ if (!conf) return call.error(globalThis.lng.pata_getprize_1);
+
+ let data = await G.mongodb.cEvent('shouchong').findOne({ uid: call.uid, type: 'shouchong' });
+
+ let recArr = data?.receive?.[call.req.k] || [];
+
+ if (call.conn.gud.payExp < conf.paynum) return call.error(globalThis.lng.event_kfkh_9);
+
+ if (recArr.length >= conf.prize.length) return call.error(globalThis.lng.event_kfkh_3);
+
+ if (recArr.slice(-1)[0] && PublicShared.getToDayZeroTime() < recArr.slice(-1)[0]) return call.error(globalThis.lng.event_kfkh_10);
+
+ await PlayerFun.sendPrize(call, conf.prize[recArr.length]);
+ await G.mongodb.cEvent('shouchong').updateOne(
+ { uid: call.uid, type: 'shouchong' },
+ { $push: G.mongodb.createTreeObj({ key: 'receive', k: call.req.k, val: G.time }) },
+ { upsert: true }
+ );
+
+ let recLen = data != null ? Object.values(data.receive).map(arr => arr.length).reduce((a, b) => a + b) + 1 : 1;
+ let allLen = Object.values(G.gc.shouchong).map(conf => conf.prize.length as number).reduce((a, b) => a + b);
+ if (data && recLen >= allLen) {
+ G.mongodb.collection('syncBtns').updateOne({ uid: call.uid }, { $set: { 'shouchong.active': false } }, { upsert: true });
+ }
+ HongDianChange.sendChangeKey(call.uid, ['shouchong'])
+
+ call.succ({
+ prize: conf.prize[recArr.length]
+ });
+}
+
+export async function getShouChongRedPoint(call: ApiCall) {
+ let res = { show: false };
+ let data = await G.mongodb.cEvent('shouchong').findOne({ uid: call.uid, type: 'shouchong' });
+
+ for (let [id, conf] of Object.entries(G.gc.shouchong)) {
+ let rec = data?.receive?.[id] || [];
+ if (call.conn.gud.payExp / 10 < conf.paynum || rec.length >= conf.prize.length) continue;
+ if (rec.length == 0 || rec.slice(-1)[0] < PublicShared.getToDayZeroTime(G.time)) {
+ res = { show: true };
+ break;
+ }
+ }
+
+ return res;
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/xianshilibao/fun.ts b/src/api_s2c/event/xianshilibao/fun.ts
new file mode 100644
index 0000000..f0663c6
--- /dev/null
+++ b/src/api_s2c/event/xianshilibao/fun.ts
@@ -0,0 +1,39 @@
+import { player } from '../../../shared/protocols/user/type';
+
+export function checkPlayerGift(old: player, cur: Partial) {
+ let payIds: string[] = [];
+ let keys = Object.keys(G.gc.xianshilibao);
+
+ for (let [k, v] of Object.entries(cur)) {
+ if (keys.filter(key => key.indexOf(k) != -1).length < 1) continue;
+
+ for (let tag = old[k] + 1; tag <= v; tag++) {
+ if (G.gc.xianshilibao[k + tag]) payIds.push(k + tag);
+ }
+ }
+
+ payIds.length > 0 && addGift(old.uid, payIds);
+}
+
+export async function addGift(uid: string, payIds: string[]) {
+
+ let insert = payIds.map(id => {
+ return {
+ payId: id,
+ eTime: G.time + G.gc.xianshilibao[id].time
+ };
+ });
+
+ G.mongodb.collection('syncBtns').updateOne(
+ { uid: uid },
+ {
+ //@ts-ignore
+ $push: {
+ 'xianshilibao.pays': { $each: insert }
+ }
+ },
+ { upsert: true }
+ );
+
+ G.server.sendMsgByUid(uid, 'msg_s2c/Xianshilibao', insert);
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/xianshizhaomu/ApiBuy.ts b/src/api_s2c/event/xianshizhaomu/ApiBuy.ts
new file mode 100644
index 0000000..774361a
--- /dev/null
+++ b/src/api_s2c/event/xianshizhaomu/ApiBuy.ts
@@ -0,0 +1,29 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqBuy, ResBuy } from "../../../shared/protocols/event/xianshizhaomu/PtlBuy";
+import { xszmdb } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let conf = G.gc.xianshizhaomu.gift[call.req.index];
+ if (!conf || conf.payId) return call.error('', { code: -1 });
+
+ let db = await xszmdb().findOne({ uid: call.uid, type: 'xianshizhaomu' });
+ if (db?.recordBuy?.[call.req.index] >= conf.num) return call.error('', { code: -1 });
+
+ if (conf.need.length > 0) {
+ await PlayerFun.checkNeedIsMeet(call, conf.need);
+ await PlayerFun.cutNeed(call, conf.need);
+ }
+
+ await PlayerFun.sendPrize(call, conf.prize);
+
+ xszmdb().updateOne(
+ { uid: call.uid, type: 'xianshizhaomu' },
+ { $inc: G.mongodb.createTreeObj({ key: `recordBuy.${call.req.index}`, val: 1 }) },
+ { upsert: true }
+ );
+
+ call.succ({
+ prize: conf.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/xianshizhaomu/ApiDuihuan.ts b/src/api_s2c/event/xianshizhaomu/ApiDuihuan.ts
new file mode 100644
index 0000000..7cf64f8
--- /dev/null
+++ b/src/api_s2c/event/xianshizhaomu/ApiDuihuan.ts
@@ -0,0 +1,29 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqDuihuan, ResDuihuan } from "../../../shared/protocols/event/xianshizhaomu/PtlDuihuan";
+import { xszmdb } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let conf = G.gc.xianshizhaomu.duihuan[call.req.index];
+ if (!conf || call.req.num <= 0) return call.error('', { code: -1 });
+
+ let db = await xszmdb().findOne({ uid: call.uid, type: 'xianshizhaomu' });
+ if ((db?.recordDuihuan?.[call.req.index] || 0) + call.req.num > conf.num) return call.error('', { code: -2 });
+
+ let need = conf.need.map(need => { return { ...need, n: need.n * call.req.num }; });
+ let prize = conf.prize.map(prize => { return { ...prize, n: prize.n * call.req.num }; });
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+ await PlayerFun.sendPrize(call, prize);
+
+ xszmdb().updateOne(
+ { uid: call.uid, type: 'xianshizhaomu' },
+ { $inc: G.mongodb.createTreeObj({ key: `recordDuihuan.${call.req.index}`, val: call.req.num }) },
+ { upsert: true }
+ );
+
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/xianshizhaomu/ApiLottery.ts b/src/api_s2c/event/xianshizhaomu/ApiLottery.ts
new file mode 100644
index 0000000..a345ba5
--- /dev/null
+++ b/src/api_s2c/event/xianshizhaomu/ApiLottery.ts
@@ -0,0 +1,45 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { Rank } from '../../../public/rank/rank';
+import { ReqLottery, ResLottery } from "../../../shared/protocols/event/xianshizhaomu/PtlLottery";
+import { prizeType } from '../../../shared/protocols/type';
+import { PublicShared } from '../../../shared/public/public';
+import { xszmdb } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let drop: number[] = G.gc.xianshizhaomu[call.req.type + 'Drop'];
+ let need: prizeType[] = G.gc.xianshizhaomu[call.req.type + 'Need'];
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+
+ let prize = G.gc.xianshizhaomu[call.req.type + 'Prize'];
+ let lotteryPrize: prizeType[] = [];
+ let db = await xszmdb().findOne({ uid: call.uid, type: 'xianshizhaomu' });
+ if (call.req.type == 'one' && db?.recordNum % G.gc.xianshizhaomu.oneReplace.num == 0) {
+ drop = G.gc.xianshizhaomu.oneReplace.drop;
+ }
+
+ drop.sort(() => Math.random() - .5);
+ for (let id of drop) {
+ lotteryPrize.push(...PublicShared.randomDropGroup(id));
+ }
+
+ await PlayerFun.cutNeed(call, need);
+ await PlayerFun.sendPrize(call, lotteryPrize.concat(prize));
+
+ xszmdb().updateOne(
+ { uid: call.uid, type: 'xianshizhaomu' },
+ { $inc: { recordNum: drop.length, recordOneNum: drop.length > 1 ? 0 : 1 } },
+ { upsert: true }
+ );
+
+ Rank.list.xszm.addNew({
+ ...await call.conn.getDefaultFightData(),
+ valArr: [(db?.recordNum || 0) + drop.length]
+ });
+
+ call.succ({
+ prize: prize,
+ lotteryPrize: lotteryPrize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/xianshizhaomu/ApiOpen.ts b/src/api_s2c/event/xianshizhaomu/ApiOpen.ts
new file mode 100644
index 0000000..8641766
--- /dev/null
+++ b/src/api_s2c/event/xianshizhaomu/ApiOpen.ts
@@ -0,0 +1,36 @@
+import { UpdateFilter } from 'mongodb';
+import { ApiCall } from "tsrpc";
+import { CollectionEvent } from '../../../module/collection_event';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/xianshizhaomu/PtlOpen";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+
+ let db = await xszmdb().findOne({ uid: call.uid, type: 'xianshizhaomu' });
+ let update: UpdateFilter>;
+ let res: Partial = {};
+
+ if (!db || db?.refreshTime < PublicShared.getToDayZeroTime(G.time)) {
+ update = {
+ $set: {
+ refreshTime: G.time,
+ recordBuy: {}
+ }
+ };
+ res.recordBuy = {};
+ }
+
+ update && xszmdb().updateOne({ uid: call.uid, type: 'xianshizhaomu' }, update, { upsert: true });
+
+ call.succ({
+ recordNum: db?.recordNum || 0,
+ recordBuy: db?.recordBuy || res.recordBuy,
+ recordPrize: db?.recordPrize || [],
+ recordOneNum: db?.recordOneNum || 0,
+ recordDuihuan: db?.recordDuihuan || {}
+ });
+}
+
+export function xszmdb() {
+ return G.mongodb.cEvent('xianshizhaomu');
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/xianshizhaomu/ApiRec.ts b/src/api_s2c/event/xianshizhaomu/ApiRec.ts
new file mode 100644
index 0000000..5306ba8
--- /dev/null
+++ b/src/api_s2c/event/xianshizhaomu/ApiRec.ts
@@ -0,0 +1,24 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/event/xianshizhaomu/PtlRec";
+import { xszmdb } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let conf = G.gc.xianshizhaomu.eventPrize[call.req.index];
+ if (!conf) return call.error('', { code: -1 });
+
+ let db = await xszmdb().findOne({ uid: call.uid, type: 'xianshizhaomu' });
+ if (!db?.recordNum || db.recordNum < conf.total || db?.recordPrize?.includes(call.req.index)) return call.error('', { code: -2 });
+
+ await PlayerFun.sendPrize(call, conf.prize);
+
+ xszmdb().updateOne(
+ { uid: call.uid, type: 'xianshizhaomu' },
+ { $push: { recordPrize: call.req.index } },
+ { upsert: true }
+ );
+
+ call.succ({
+ prize: conf.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/xinshoulibao/ApiOpen.ts b/src/api_s2c/event/xinshoulibao/ApiOpen.ts
new file mode 100644
index 0000000..76d35bc
--- /dev/null
+++ b/src/api_s2c/event/xinshoulibao/ApiOpen.ts
@@ -0,0 +1,42 @@
+import { UpdateFilter } from 'mongodb';
+import { ApiCall } from "tsrpc";
+import { CollectionEvent } from '../../../module/collection_event';
+import { PayFun } from '../../../public/pay';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/xinshoulibao/PtlOpen";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ // 后端加不加没多重要
+ // let [isOpen, tips] = PublicShared.getOpenCond(call, "xinshoulibao")
+ // if (!isOpen) return call.error('', { code: -1, message: tips });
+
+ let db = await G.mongodb.cEvent('xinshoulibao').findOne({ uid: call.uid, type: 'xinshoulibao' });
+ let update: UpdateFilter>;
+
+ if (!db) {
+ update = {
+ $set: { index: 0, sTime: PublicShared.getToDayZeroTime(G.time) }
+ };
+ } else {
+ if (db.sTime + G.gc.xinshoulibao[db.index].time < G.time) {
+
+ db.sTime = PublicShared.getToDayZeroTime(G.time);
+ db.index = G.gc.xinshoulibao[db.index + 1] == undefined ? db.index : db.index + 1;
+
+ update = {
+ $set: { index: db.index, sTime: db.sTime }
+ };
+
+ if (db.index == G.gc.xinshoulibao.length - 1) {
+ PayFun.setPayLog(call.uid, ...G.gc.xinshoulibao[db.index].pays.map(p => { return { payId: p.payId, val: [] }; }));
+ }
+ }
+ }
+
+ update && G.mongodb.cEvent('xinshoulibao').updateOne({ uid: call.uid, type: 'xinshoulibao' }, update, { upsert: true });
+
+ call.succ({
+ index: db?.index || 0,
+ sTime: db?.sTime || PublicShared.getToDayZeroTime(G.time)
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/yangchengmubiao/ApiBuy.ts b/src/api_s2c/event/yangchengmubiao/ApiBuy.ts
new file mode 100644
index 0000000..406b1ad
--- /dev/null
+++ b/src/api_s2c/event/yangchengmubiao/ApiBuy.ts
@@ -0,0 +1,31 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from "../../../public/player";
+import { ReqBuy, ResBuy } from "../../../shared/protocols/event/yangchengmubiao/PtlBuy";
+import { HongDianChange } from "../../hongdian/fun";
+import { YangChengMuBiaofun } from "./fun";
+
+export default async function (call: ApiCall) {
+ let initCon = await YangChengMuBiaofun.getCon(call)
+ let conf = initCon[call.req.hdid].data.gift[call.req.index];
+ if (!conf || conf.payId) return call.errorCode(-1);
+
+ let _mydata = await YangChengMuBiaofun.getMyData(call, call.req.hdid)
+ let buyNum = _mydata.record?.[call.req.index] || 0;
+ if (buyNum >= conf.buyNum) return call.errorCode(-3);
+
+ if (conf.need.length > 0) {
+ await PlayerFun.checkNeedIsMeet(call, conf.need);
+ await PlayerFun.cutNeed(call, conf.need);
+ }
+
+ let selectPrize = conf.prize
+ // 设置数据和发奖
+ await YangChengMuBiaofun.setMyData(call.uid, call.req.hdid, { $inc: G.mongodb.createTreeObj({ key: `record.${call.req.index}`, val: 1 }) })
+ await PlayerFun.sendPrize(call, selectPrize);
+
+ HongDianChange.sendChangeKey(call.uid, ['huodonghd']);
+
+ call.succ({
+ prize: selectPrize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/yangchengmubiao/ApiOpen.ts b/src/api_s2c/event/yangchengmubiao/ApiOpen.ts
new file mode 100644
index 0000000..89f91a9
--- /dev/null
+++ b/src/api_s2c/event/yangchengmubiao/ApiOpen.ts
@@ -0,0 +1,16 @@
+import { ApiCall } from "tsrpc";
+import { HuoDongFun } from "../../../public/huodongfun";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/yangchengmubiao/PtlOpen";
+import { YangChengMuBiaofun } from "./fun";
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+ let _mydata = await YangChengMuBiaofun.getMyData(call, call.req.hdid)
+ let changedata = { mydata: _mydata, hdinfo: _hdinfo }
+ call.succ(changedata);
+}
+
diff --git a/src/api_s2c/event/yangchengmubiao/ApiRec.ts b/src/api_s2c/event/yangchengmubiao/ApiRec.ts
new file mode 100644
index 0000000..1ba2ab4
--- /dev/null
+++ b/src/api_s2c/event/yangchengmubiao/ApiRec.ts
@@ -0,0 +1,53 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from "../../../public/player";
+import { ReqRec, ResRec } from "../../../shared/protocols/event/yangchengmubiao/PtlRec";
+import { HongDianChange } from "../../hongdian/fun";
+import { YangChengMuBiaofun } from "./fun";
+
+export default async function (call: ApiCall) {
+ // let hdids = await gethdids()
+ // if (!hdids.includes(call.req.hdid)) {
+ // // 活动时间过期
+ // return call.error('', { code: -1, message: globalThis.lng.yangchengmubiao_1 })
+ // }
+ let _yangchengcon = await YangChengMuBiaofun.getCon(call)
+ let _initCon = _yangchengcon[call.req.hdid] // 活动配置
+ let _con = _initCon.data.tasklist[call.req.type][call.req.taskid] // 任务配置
+ if (!_con) {
+ // 任务id 不存在
+ return call.error('', { code: -2, message: globalThis.lng.yangchengmubiao_2 })
+ }
+
+ let _mydata = await YangChengMuBiaofun.getMyData(call, call.req.hdid)
+ if (_mydata.taskval[call.req.taskid] < _con.pval) {
+ // 任务未完成
+ return call.error('', { code: -3, message: globalThis.lng.yangchengmubiao_3 })
+ }
+
+ if (_mydata.finishid[_con.type].includes(call.req.taskid)) {
+ // 任务已领取
+ return call.error('', { code: -4, message: globalThis.lng.yangchengmubiao_4 })
+ }
+
+ _mydata.finishid[_con.type].push(call.req.taskid)
+ let _setData = {}
+ // 轮次任务重置
+ if (_con.type == 2 && _mydata.lunci < _initCon.data.maxlun[1] && _mydata.finishid[call.req.type].length >= Object.keys(_initCon.data.tasklist[call.req.type]).length) {
+ _mydata = await YangChengMuBiaofun.refreTask(call, _mydata, call.req.hdid, 2)
+ _mydata.lunci += 1
+ _setData["taskval"] = _mydata.taskval
+ _setData["lunci"] = _mydata.lunci
+ }
+
+ // 设置任务改变数据
+ _setData["finishid"] = _mydata.finishid
+ await YangChengMuBiaofun.setMyData(call.uid, call.req.hdid, { $set: _setData })
+
+ // 发奖
+ let _prize: atn[] = _con.prize
+ await PlayerFun.sendPrize(call, _prize);
+
+ let changedata = { mydata: _mydata, prize: _prize }
+ HongDianChange.sendChangeKey(call.uid, ['huodonghd']);
+ call.succ(changedata);
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/yangchengmubiao/fun.ts b/src/api_s2c/event/yangchengmubiao/fun.ts
new file mode 100644
index 0000000..1a3ad36
--- /dev/null
+++ b/src/api_s2c/event/yangchengmubiao/fun.ts
@@ -0,0 +1,173 @@
+import { strict } from 'assert';
+import { ApiCall } from 'tsrpc';
+import { ReqAddHuoDong } from '../../../monopoly/protocols/PtlAddHuoDong';
+import { HuoDongFun } from '../../../public/huodongfun';
+import { TaskFun } from '../../../public/task';
+import { yangchengmubiao } from '../../../shared/protocols/event/yangchengmubiao/PtlOpen';
+import { PublicShared } from '../../../shared/public/public';
+
+
+export class YangChengMuBiaofun {
+ /**配置 */
+ static async getCon(call: ApiCall) {
+ let _con: { [id: string]: ReqAddHuoDong } = {}
+ let _hd = await HuoDongFun.gethdList(call, 1)
+ for (let index = 0; index < _hd.length; index++) {
+ const element = _hd[index];
+ if (element && element._id) delete element._id
+ _con[element.hdid] = element
+ }
+ return _con
+ }
+
+ /**获取所有符合时间的活动 */
+ static async gethdids(call: ApiCall) {
+ let _hdids = []
+ let _hd = await HuoDongFun.gethdList(call, 1)
+ for (let index = 0; index < _hd.length; index++) {
+ const element = _hd[index];
+ _hdids.push(element.hdid)
+ }
+ return _hdids
+ }
+
+ /**获取我的数据 */
+ static async getMyData(call: ApiCall, hdid: number) {
+ let db: any = await G.mongodb.cEvent(`yangchengmubiao${hdid}`).findOne({ uid: call.uid, type: `yangchengmubiao${hdid}`, hdid: hdid });
+ if (!db) {
+ db = await this.initData(call, hdid)
+ await G.mongodb.cEvent(`yangchengmubiao${hdid}`).updateOne(
+ { uid: call.uid, type: `yangchengmubiao${hdid}`, hdid: hdid },
+ { $set: db },
+ { upsert: true }
+ )
+ }
+ let { _id, ..._myData } = db
+ if (!PublicShared.chkSameDate(_myData.refresh, G.time)) {
+ // 刷新每日任务
+ _myData = await this.refreTask(call, _myData, hdid)
+ _myData.refresh = G.time
+ await this.setMyData(call.uid, hdid, { $set: { refresh: _myData.refresh, finishid: _myData.finishid, taskval: _myData.taskval } })
+ }
+ return _myData
+ }
+
+ /**初始数据 */
+ static async initData(call: ApiCall, hdid: number) {
+ let _initCon = await this.getCon(call)
+ let _con = _initCon[hdid]
+ let _r: yangchengmubiao = {
+ type: `yangchengmubiao${hdid}`,
+ uid: call.uid,
+ hdid: hdid,
+ taskval: await this.getTaskVal(call, hdid),
+ finishid: {
+ "1": [],
+ "2": [],
+ "3": [],
+ },
+ refresh: G.time,
+ lunci: 1,
+ record: {}
+ }
+ if (_con.data.tasklist["4"] && Object.keys(_con.data.tasklist["4"]).length > 0) _r.finishid["4"] = []
+ return _r
+ }
+
+ /**设置数据 */
+ static async setMyData(uid: string, hdid: number, set: {}) {
+ await G.mongodb.cEvent(`yangchengmubiao${hdid}`).updateOne(
+ { uid: uid, type: `yangchengmubiao${hdid}`, hdid: hdid },
+ set
+ )
+ }
+
+ /**获取所有taskid 及对应的值 */
+ static async getTaskVal(call: ApiCall, hdid: number) {
+ let _initCon = await this.getCon(call)
+ let _con = _initCon[hdid].data.tasklist
+ let _res = {}
+
+ let _tasks = {} // 所有任务 taskid 为key
+ Object.values(_con).map(l => {
+ return Object.assign(_tasks, l)
+ })
+
+ for (let index = 0; index < Object.keys(_tasks).length; index++) {
+ const element = Object.keys(_tasks)[index];
+ let _tmp = _tasks[element]
+ _tmp["id"] = element
+ _res[element] = await TaskFun.getTaskNval(call, _tmp)
+ }
+ return _res
+ }
+
+ /**刷新每日任务 */
+ static async refreTask(call: ApiCall, mydata: yangchengmubiao, hdid: number, type: 1 | 2 = 1) {
+ let _initCon = await this.getCon(call)
+ let _con = _initCon[hdid].data.tasklist[type]
+ if (!_con) return mydata
+ for (let index = 0; index < Object.keys(_con).length; index++) {
+ const element = Object.keys(_con)[index];
+ let _tmp = _con[element]
+ if (_tmp.type != type) continue
+
+ mydata.finishid[type] = []
+ let _initVal = (_tmp?.zero == 1) ? 0 : await TaskFun.getTaskNval(call, _tmp)
+ mydata.taskval[element] = _initVal
+ }
+ return mydata
+ }
+
+ /**设置任务 */
+ static async setTaskVal(call: ApiCall, stype: number, val: number, chkCall: Function, chkval: number = 0, isinc: number = 0, alchangeVal: Function, arg) {
+ let hdids = await this.gethdids(call)
+ if (hdids.length <= 0) return // 活动过期,不计数
+ let _initCon = await this.getCon(call)
+ for (let index = 0; index < hdids.length; index++) {
+ const hdid = hdids[index];
+ let _con = _initCon[hdid].data.tasklist
+ let _tasks = {}
+ Object.values(_con).map(l => {
+ return Object.assign(_tasks, l)
+ })
+
+ let _setData = {
+ $inc: {},
+ $set: {}
+ }
+ let isset = 0
+ for (let indextask = 0; indextask < Object.keys(_tasks).length; indextask++) {
+ const ele = Object.keys(_tasks)[indextask];
+ // 具体任务配置
+ let _taskCon = _tasks[ele]
+ if (_taskCon.stype != stype) continue
+
+ let _pval = _taskCon.pval
+ // 不符合任务要求
+ if (!(await chkCall(_taskCon["cond"], chkval, arg))) continue
+
+ // 根据需求改写
+ val = await alchangeVal(call, _taskCon, val, arg)
+
+ isset = 1
+ if (isinc == 1) { // 累加
+ _setData["$inc"][`taskval.${ele}`] = val
+ } else {
+ _setData["$set"][`taskval.${ele}`] = val
+ }
+ }
+
+ // 设置任务
+ if (isset == 1) {
+ await G.mongodb.collection('event').updateMany(
+ { uid: call.uid, type: { $regex: "yangchengmubiao" }, hdid: parseInt(hdid) },
+ _setData
+ )
+ }
+ }
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/yibaichou/ApiOpen.ts b/src/api_s2c/event/yibaichou/ApiOpen.ts
new file mode 100644
index 0000000..e7de25b
--- /dev/null
+++ b/src/api_s2c/event/yibaichou/ApiOpen.ts
@@ -0,0 +1,16 @@
+import { ApiCall } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/yibaichou/PtlOpen";
+import { PublicShared } from "../../../shared/public/public";
+
+export default async function (call: ApiCall) {
+
+ let [isOpen, tips] = PublicShared.getOpenCond(call, "yibaichou")
+ if (!isOpen) return call.error('', { code: -1, message: tips });
+
+ let db = await G.mongodb.cEvent('yibaichou').findOne({ uid: call.uid, type: 'yibaichou' });
+
+ call.succ({
+ loginRec: db?.loginRec || [],
+ onlineRec: db?.onlineRec || []
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/yibaichou/ApiRec.ts b/src/api_s2c/event/yibaichou/ApiRec.ts
new file mode 100644
index 0000000..fa8bbaf
--- /dev/null
+++ b/src/api_s2c/event/yibaichou/ApiRec.ts
@@ -0,0 +1,38 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/event/yibaichou/PtlRec";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let type = call.req.type;
+ let index = call.req.index;
+
+ let conf = G.gc.yibaichou[type + 'Prize'][index] as _gcType['yibaichou']['loginPrize'][0];
+ if (!conf) return call.error('', { code: -1 });
+
+ let finish = type == 'login' ? call.conn.gud.loginDays : call.conn.gud.onlineTime;
+ if (finish < conf.total) return call.error('', { code: -2 });
+
+ let db = await G.mongodb.cEvent('yibaichou').findOne({ uid: call.uid, type: 'yibaichou' });
+ let recArr: number[] = db?.[type + 'Rec'] || [];
+ if (recArr.includes(index)) return call.error('', { code: -3 });
+
+ await PlayerFun.sendPrize(call, conf.prize);
+
+ recArr.push(index);
+ G.mongodb.cEvent('yibaichou').updateOne(
+ { uid: call.uid, type: 'yibaichou' },
+ { $set: G.mongodb.createTreeObj({ key: type + 'Rec', val: recArr }) },
+ { upsert: true }
+ );
+
+ if (db?.loginRec?.length >= G.gc.yibaichou.loginPrize.length) {
+ G.mongodb.collection('syncBtns').updateOne({ uid: call.uid }, { $set: { 'yibaichou.active': false } }, { upsert: true });
+ }
+
+ HongDianChange.sendChangeKey(call.uid, ['yibaichouhd'])
+
+ call.succ({
+ prize: conf.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/yibaichou/ApiRecAll.ts b/src/api_s2c/event/yibaichou/ApiRecAll.ts
new file mode 100644
index 0000000..61a9cc5
--- /dev/null
+++ b/src/api_s2c/event/yibaichou/ApiRecAll.ts
@@ -0,0 +1,47 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqRecAll, ResRecAll } from "../../../shared/protocols/event/yibaichou/PtlRecAll";
+import { prizeType } from '../../../shared/protocols/type';
+
+export default async function (call: ApiCall) {
+
+ let db = await G.mongodb.cEvent('yibaichou').findOne({ uid: call.uid, type: 'yibaichou' });
+ let prize: prizeType[] = [];
+ let loginRec = db?.loginRec || [];
+ let onlineRec = db?.onlineRec || [];
+
+ G.gc.yibaichou.loginPrize.forEach((t, index) => {
+ if (call.conn.gud.loginDays >= t.total && !loginRec.includes(index)) {
+ prize.push(...t.prize);
+ loginRec.push(index);
+ }
+ });
+
+ G.gc.yibaichou.onlinePrize.forEach((t, index) => {
+ if (call.conn.gud.onlineTime >= t.total && !onlineRec.includes(index)) {
+ prize.push(...t.prize);
+ onlineRec.push(index);
+ }
+ });
+
+ if (prize.length > 0) {
+ prize = await PlayerFun.sendPrize(call, prize);
+ G.mongodb.cEvent('yibaichou').updateOne(
+ { uid: call.uid, type: 'yibaichou' },
+ { $set: { loginRec: loginRec, onlineRec: onlineRec } },
+ { upsert: true }
+ );
+ }
+
+ if (loginRec?.length >= G.gc.yibaichou.loginPrize.length) {
+ G.mongodb.collection('syncBtns').updateOne({ uid: call.uid }, { $set: { 'yibaichou.active': false } }, { upsert: true });
+ }
+
+ call.succ({
+ prize: prize,
+ change: {
+ loginRec: loginRec,
+ onlineRec: onlineRec
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/yuedujijin/ApiOpen.ts b/src/api_s2c/event/yuedujijin/ApiOpen.ts
new file mode 100644
index 0000000..cca950f
--- /dev/null
+++ b/src/api_s2c/event/yuedujijin/ApiOpen.ts
@@ -0,0 +1,50 @@
+import {ApiCall} from "tsrpc";
+import {PayFun} from '../../../public/pay';
+import {ReqOpen, ResOpen} from "../../../shared/protocols/event/yuedujijin/PtlOpen";
+import {player} from '../../../shared/protocols/user/type';
+
+export default async function (call: ApiCall) {
+ let type = call.req.type as `${number}jijin`;
+ if (!G.gc.pay[type]) return call.errorCode(-1);
+
+ await checkNewRound(call, type)
+
+ let db = await G.mongodb.cEvent(type).findOne({uid: call.uid, type: type});
+
+ let recLength = db?.rec?.length - (db?.round || 0) * 30
+ let rec = recLength ? (db?.rec?.slice(-recLength) || []) : []
+
+ call.succ({
+ rec: rec,
+ days: db?.days - (db?.round || 0) * 30 || 0,
+ round: db?.round
+ });
+}
+
+export async function addDay(player: player) {
+ for (let v of G.gc.yuedujijin) {
+ if ((await PayFun.getPayLog(player.uid, v.payId)).length > 0) {
+ let id = v.payId as `${number}jijin`;
+ G.mongodb.cEvent(id).updateOne(
+ {uid: player.uid, type: id},
+ {$inc: {days: 1}},
+ {upsert: true}
+ );
+ }
+ }
+}
+
+export async function checkNewRound(call, type) {
+ let db = await G.mongodb.cEvent(type).findOne({uid: call.uid, type: type});
+ let recLength = db?.rec?.length - (db?.round || 0) * 30
+ if (recLength==30) {
+ await G.mongodb.cEvent(type).updateOne({uid: call.uid, type: type}, {
+ $set: {
+ days: Math.ceil(db?.rec?.length / 30) * 30 - 1,
+ round: Math.ceil(db?.rec?.length / 30)
+ }
+ }, {upsert: true});
+
+ PayFun.setPayLog(call.uid, {payId: type, val: []});
+ }
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/yuedujijin/ApiRec.ts b/src/api_s2c/event/yuedujijin/ApiRec.ts
new file mode 100644
index 0000000..039f191
--- /dev/null
+++ b/src/api_s2c/event/yuedujijin/ApiRec.ts
@@ -0,0 +1,28 @@
+import {ApiCall} from "tsrpc";
+import {PlayerFun} from '../../../public/player';
+import {ReqRec, ResRec} from "../../../shared/protocols/event/yuedujijin/PtlRec";
+import {PayFun} from "../../../public/pay";
+
+export default async function (call: ApiCall) {
+ let type = call.req.type as `${number}jijin`;
+ let conf = G.gc.yuedujijin.find(v => v.payId == type);
+ if (!conf) return call.errorCode(-1);
+ if (!conf.prize[call.req.index]) return call.errorCode(-2);
+
+ let db = await G.mongodb.cEvent(type).findOne({uid: call.uid, type: type});
+ let day = db?.days - (db?.round || 0) * 30 || 0;
+ let recLength = db?.rec?.length % 30
+ let rec = recLength ? (db?.rec?.slice(-recLength % 30) || []) : []
+ if (call.req.index > day) return call.errorCode(-3);
+ if (rec.includes(call.req.index)) return call.errorCode(-4);
+
+
+ G.mongodb.cEvent(type).updateOne({uid: call.uid, type: type}, {$push: {rec: call.req.index}}, {upsert: true});
+
+
+ await PlayerFun.sendPrize(call, [].concat(conf.prize[call.req.index]));
+
+ call.succ({
+ prize: [].concat(conf.prize[call.req.index])
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/zhanling/ApiBuyLv.ts b/src/api_s2c/event/zhanling/ApiBuyLv.ts
new file mode 100644
index 0000000..f0485da
--- /dev/null
+++ b/src/api_s2c/event/zhanling/ApiBuyLv.ts
@@ -0,0 +1,35 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqBuyLv, ResBuyLv } from "../../../shared/protocols/event/zhanling/PtlBuyLv";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let lv = call.req.lv;
+
+ if (lv < 1) return call.error(globalThis.lng.pata_getprize_1);
+
+ let data = await G.mongodb.cEvent('zhanling').findOne({ uid: call.uid, type: 'zhanling' });
+
+ if (G.gc.zhanling.lv[data.lv + lv] == undefined) return call.error(globalThis.lng.pata_getprize_1);
+
+ let need = G.gc.zhanling.lvNeed.map(need => { return { ...need, n: need.n * lv }; });
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ let change: ResBuyLv['change'] = {};
+
+ change.lv = data.lv + lv;
+ change.exp = G.gc.zhanling.lv[change.lv];
+
+ G.mongodb.cEvent('zhanling').updateOne(
+ { uid: call.uid, type: 'zhanling' },
+ { $set: change }
+ );
+
+ HongDianChange.sendChangeKey(call.uid, ['zhuishalinghd'])
+
+ call.succ({
+ change: change
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/zhanling/ApiOpen.ts b/src/api_s2c/event/zhanling/ApiOpen.ts
new file mode 100644
index 0000000..023a3ff
--- /dev/null
+++ b/src/api_s2c/event/zhanling/ApiOpen.ts
@@ -0,0 +1,65 @@
+import { ApiCall } from "tsrpc";
+import { ZhanLingTasks } from '../../../public/zhanling';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/zhanling/PtlOpen";
+import { player } from '../../../shared/protocols/user/type';
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+
+ let data = await G.mongodb.cEvent('zhanling').findOne({ uid: call.uid, type: 'zhanling' });
+
+
+
+ if (data && PublicShared.getToDayZeroTime() > data.refreshTime) {
+ G.mongodb.cEvent('zhanling').updateOne({ uid: call.uid, type: 'zhanling' }, { $set: { refreshTime: G.time, taskRec: [] } });
+ }
+
+ let tasks = G.gc.zhanling.task.map(t => { return { type: t.type as 'day' | 'week' | 'round', key: t.taskId }; });
+ let taskFinished = await ZhanLingTasks.getLog(call.uid, tasks);
+
+ let result: { rec: {}; isPay: boolean; taskRec: any[]; taskFinished: k_v; refreshTime: number; lv: number; exp: number } = {
+ ...data,
+ taskFinished: taskFinished
+ }
+
+ if (!data){
+ result = {
+ lv: 1,
+ exp: 0,
+ rec: {},
+ isPay: false,
+ taskRec: [],
+ refreshTime: G.time,
+ taskFinished: taskFinished
+ }
+ G.mongodb.cEvent('zhanling').updateOne(
+ {uid: call.uid, type: 'zhanling'},
+ {
+ $set: {
+ lv: 1,
+ exp: 0,
+ rec: {},
+ isPay: false,
+ taskRec: [],
+ refreshTime: G.time
+ }
+ },
+ {upsert: true}
+ );
+ }
+
+ call.succ(result);
+}
+
+export async function payZhanLing(player: player) {
+ let zlData = await G.mongodb.cEvent('zhanling').findOne({ uid: player.uid, type: 'zhanling' });
+ let curLv = zlData?.lv || 1;
+ let maxLv = Number(Object.keys(G.gc.zhanling.lv).slice(-1)[0]);
+ let addLv = maxLv - curLv >= G.gc.zhanling.payAddLv ? G.gc.zhanling.payAddLv : maxLv - curLv;
+
+ await G.mongodb.cEvent('zhanling').updateOne(
+ { uid: player.uid, type: 'zhanling' },
+ { $set: { isPay: true, exp: G.gc.zhanling.lv[curLv + addLv], lv: curLv + addLv } },
+ { upsert: true }
+ );
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/zhanling/ApiRecPrize.ts b/src/api_s2c/event/zhanling/ApiRecPrize.ts
new file mode 100644
index 0000000..b5218fc
--- /dev/null
+++ b/src/api_s2c/event/zhanling/ApiRecPrize.ts
@@ -0,0 +1,61 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqRecPrize, ResRecPrize } from "../../../shared/protocols/event/zhanling/PtlRecPrize";
+import { PublicShared } from '../../../shared/public/public';
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ if (call.req.recIndexs.length < 1) return call.error(globalThis.lng.pata_getprize_1);
+
+ let conf = G.gc.zhanling.prize;
+ let isErr = conf.map((c, i) => i).intersection(call.req.recIndexs).length != call.req.recIndexs.length;
+
+ if (isErr) return call.error(globalThis.lng.pata_getprize_1);
+
+ let data = await G.mongodb.cEvent('zhanling').findOne({ uid: call.uid, type: 'zhanling' });
+ let rec = data.rec;
+ let val = data.lv;
+ let isPay = data.isPay;
+ let prize: atn[] = [];
+
+ for (let index of call.req.recIndexs) {
+ if (val < conf[index].lv) return call.error(globalThis.lng.event_jijin_1);
+
+ let hasPt = conf[index].pt.length > 0;
+ let hasTq = conf[index].tq.length > 0;
+ let getPt = !hasPt || rec[index]?.pt == true;
+ let getTq = !hasTq || rec[index]?.tq == true;
+
+ if (getPt && !getTq && !isPay) return call.error(globalThis.lng.event_jijin_2);
+ if (getPt && getTq) return call.error(globalThis.lng.event_jijin_3);
+
+ if (!rec[index]) rec[index] = { pt: false, tq: false };
+
+ if (hasPt && !getPt) {
+ prize.push(...conf[index].pt);
+ rec[index].pt = true;
+ }
+
+ if (hasTq && !getTq && isPay) {
+ prize.push(...conf[index].tq);
+ rec[index].tq = true;
+ }
+ }
+
+ prize = PublicShared.mergePrize(prize);
+ await PlayerFun.sendPrize(call, prize);
+
+ G.mongodb.cEvent('zhanling').updateOne(
+ { uid: call.uid, type: 'zhanling' },
+ { $set: { rec: rec } }
+ );
+
+ HongDianChange.sendChangeKey(call.uid, ['zhuishalinghd'])
+
+ call.succ({
+ prize: prize,
+ change: {
+ rec: rec
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/zhanling/ApiRecTask.ts b/src/api_s2c/event/zhanling/ApiRecTask.ts
new file mode 100644
index 0000000..d6ede99
--- /dev/null
+++ b/src/api_s2c/event/zhanling/ApiRecTask.ts
@@ -0,0 +1,57 @@
+import { ApiCall } from "tsrpc";
+import { eventType } from '../../../module/collection_event';
+import { PlayerFun } from '../../../public/player';
+import { ZhanLingTasks } from '../../../public/zhanling';
+import { ReqRecTask, ResRecTask } from "../../../shared/protocols/event/zhanling/PtlRecTask";
+import { HongDianChange } from "../../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let conf = G.gc.zhanling.task[call.req.index];
+
+ if (!conf) return call.error(globalThis.lng.event_kfkh_11);
+
+ let data = await G.mongodb.cEvent('zhanling').findOne({ uid: call.uid, type: 'zhanling' });
+
+ if (data.taskRec.includes(call.req.index)) return call.error(globalThis.lng.event_kfkh_12);
+
+ let taskVal = await ZhanLingTasks.getLog(call.uid, { type: conf.type as any, key: conf.taskId });
+
+ if (taskVal < conf.total) return call.error(globalThis.lng.event_kfkh_13);
+
+ conf.prize && await PlayerFun.sendPrize(call, conf.prize);
+
+ G.mongodb.cEvent('zhanling').updateOne(
+ { uid: call.uid, type: 'zhanling' },
+ { $push: { taskRec: call.req.index } }
+ );
+
+ HongDianChange.sendChangeKey(call.uid, ['zhuishalinghd']);
+
+ call.succ({
+ prize: conf.prize || [],
+ change: await addExp(call.uid, conf.exp, data)
+ });
+}
+
+export async function addExp(uid: string, exp: number, data?: eventType['zhanling']) {
+ if (!data) data = await G.mongodb.cEvent('zhanling').findOne({ uid: uid, type: 'zhanling' });
+ let change: ResRecTask['change'] = {};
+
+ change.exp = data.exp + exp;
+ if (G.gc.zhanling.lv[data.lv + 1] && change.exp >= G.gc.zhanling.lv[data.lv + 1]) {
+ let addLv = 1;
+
+ while (G.gc.zhanling.lv[data.lv + addLv] <= change.exp) {
+ addLv++;
+ }
+
+ change.lv = data.lv + addLv;
+ }
+
+ G.mongodb.cEvent('zhanling').updateOne(
+ { uid: uid, type: 'zhanling' },
+ { $set: change }
+ );
+
+ return change;
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/zhoulibao/ApiOpen.ts b/src/api_s2c/event/zhoulibao/ApiOpen.ts
new file mode 100644
index 0000000..5b25f7f
--- /dev/null
+++ b/src/api_s2c/event/zhoulibao/ApiOpen.ts
@@ -0,0 +1,27 @@
+import { ApiCall } from "tsrpc";
+import { PayFun } from '../../../public/pay';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/zhoulibao/PtlOpen";
+
+export default async function (call: ApiCall) {
+
+ let db = await G.mongodb.cEvent('zhoulibao').findOne({ uid: call.uid, type: 'zhoulibao' });
+
+ if (!db) {
+ G.mongodb.cEvent('zhoulibao').updateOne(
+ { uid: call.uid, type: 'zhoulibao' },
+ { $set: { sTime: G.time } },
+ { upsert: true }
+ );
+ } else if (db.sTime + G.gc.dixiaheishi.zhoulibao.time < G.time) {
+ db.sTime = G.time;
+ G.mongodb.cEvent('zhoulibao').updateOne(
+ { uid: call.uid, type: 'zhoulibao' },
+ { $set: { sTime: G.time } },
+ );
+ PayFun.setPayLog(call.uid, ...G.gc.dixiaheishi.zhoulibao.pays.map(p => { return { payId: p.payId, val: [] }; }));
+ }
+
+ call.succ({
+ sTime: db?.sTime || G.time
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/zixuanlibao/ApiBuy.ts b/src/api_s2c/event/zixuanlibao/ApiBuy.ts
new file mode 100644
index 0000000..910e00e
--- /dev/null
+++ b/src/api_s2c/event/zixuanlibao/ApiBuy.ts
@@ -0,0 +1,40 @@
+import { ApiCall } from "tsrpc";
+import { HuoDongFun } from "../../../public/huodongfun";
+import { PlayerFun } from '../../../public/player';
+import { ReqBuy, ResBuy } from "../../../shared/protocols/event/zixuanlibao/PtlBuy";
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+
+ let _dbType: `zixuanlibao${number}` = `zixuanlibao${call.req.hdid}`
+
+ let conf = _hdinfo.data.gift[call.req.index];
+ if (!conf || conf.payId) return call.errorCode(-1);
+
+ let selectPrize = conf.prize.map((v, i) => v[call.req.prizeIndex[i]]).filter(p => !!p);
+ if (selectPrize.length < conf.prize.length) return call.errorCode(-2);
+
+ let buyNum = (await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType }))?.record?.[call.req.index] || 0;
+ if (buyNum >= conf.buyNum) return call.errorCode(-3);
+
+ if (conf.need.length > 0) {
+ await PlayerFun.checkNeedIsMeet(call, conf.need);
+ await PlayerFun.cutNeed(call, conf.need);
+ }
+
+ await PlayerFun.sendPrize(call, selectPrize);
+
+ G.mongodb.cEvent(_dbType).updateOne(
+ { uid: call.uid, type: _dbType },
+ { $inc: G.mongodb.createTreeObj({ key: `record.${call.req.index}`, val: 1 }) },
+ { upsert: true }
+ );
+
+ call.succ({
+ prize: selectPrize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/event/zixuanlibao/ApiOpen.ts b/src/api_s2c/event/zixuanlibao/ApiOpen.ts
new file mode 100644
index 0000000..2b1016f
--- /dev/null
+++ b/src/api_s2c/event/zixuanlibao/ApiOpen.ts
@@ -0,0 +1,19 @@
+import { ApiCall } from "tsrpc";
+import { HuoDongFun } from "../../../public/huodongfun";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/event/zixuanlibao/PtlOpen";
+
+export default async function (call: ApiCall) {
+ let _hdinfo = await HuoDongFun.getHdidInfo(call, call.req.hdid)
+ if (!_hdinfo || Object.keys(_hdinfo).length <= 0) {
+ // 无此活动
+ return call.error('', { code: -1, message: globalThis.lng.huodong_open_1 })
+ }
+
+ let _dbType: `zixuanlibao${number}` = `zixuanlibao${call.req.hdid}`
+ let db = await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType });
+
+ call.succ({
+ record: db?.record || {},
+ hdinfo: _hdinfo
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/eventlist/ApihdGetList.ts b/src/api_s2c/eventlist/ApihdGetList.ts
new file mode 100644
index 0000000..24dfc45
--- /dev/null
+++ b/src/api_s2c/eventlist/ApihdGetList.ts
@@ -0,0 +1,11 @@
+import {ApiCall} from "tsrpc";
+import {HuoDongFun} from "../../public/huodongfun";
+import {ReqhdGetList, ReshdGetList} from "../../shared/protocols/eventlist/PtlhdGetList";
+import {HeroShared} from "../../shared/public/hero";
+
+export default async function (call: ApiCall) {
+
+ let _hdList = await HuoDongFun.gethdList(call)
+
+ call.succ({hdlist: _hdList});
+}
\ No newline at end of file
diff --git a/src/api_s2c/friend/ApiApply.ts b/src/api_s2c/friend/ApiApply.ts
new file mode 100644
index 0000000..1682be9
--- /dev/null
+++ b/src/api_s2c/friend/ApiApply.ts
@@ -0,0 +1,23 @@
+import { ApiCall } from "tsrpc";
+import { FriendManage } from '../../public/friend/manage';
+import { ReqApply, ResApply } from "../../shared/protocols/friend/PtlApply";
+
+export default async function (call: ApiCall) {
+ const my = await FriendManage.getFriend(call.uid);
+
+ if (my.data.myApplyList?.includes(call.uid)) return call.error(globalThis.lng.friend_1);
+ if (my.data.friendList.includes(call.req.uid)) return call.error(globalThis.lng.friend_2);
+ if (my.data.blacklist.includes(call.req.uid)) return call.error(globalThis.lng.friend_3);
+ if (my.data.friendList.length >= G.gc.friend.maxFriendNum) return call.error(globalThis.lng.friend_4);
+
+ const he = await FriendManage.getFriend(call.req.uid);
+ if (he) {
+ if (he.data.friendList.length >= G.gc.friend.maxFriendNum) return call.error('', { code: -1, message: globalThis.lng.friend_5 });
+ if (he.data.applyList.includes(call.uid)) return call.error('', { code: -2, message: globalThis.lng.friend_6 });
+ if (he.data.blacklist.includes(call.uid)) return call.error('', { code: -3, message: globalThis.lng.friend_7 });
+
+ he.addApply(call.uid);
+ }
+ my.addMyApply(call.req.uid);
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/friend/ApiDel.ts b/src/api_s2c/friend/ApiDel.ts
new file mode 100644
index 0000000..db9aa38
--- /dev/null
+++ b/src/api_s2c/friend/ApiDel.ts
@@ -0,0 +1,17 @@
+import { ApiCall } from "tsrpc";
+import { FriendManage } from '../../public/friend/manage';
+import { ReqDel, ResDel } from "../../shared/protocols/friend/PtlDel";
+
+export default async function (call: ApiCall) {
+ const my = await FriendManage.getFriend(call.uid);
+
+ if (!my.data.friendList.includes(call.req.uid)) return call.error(globalThis.lng.friend_8);
+
+ my.delFriend(call.req.uid);
+
+ const he = await FriendManage.getFriend(call.req.uid);
+
+ he?.delFriend(call.uid);
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/friend/ApiGift.ts b/src/api_s2c/friend/ApiGift.ts
new file mode 100644
index 0000000..e3f1915
--- /dev/null
+++ b/src/api_s2c/friend/ApiGift.ts
@@ -0,0 +1,53 @@
+import { ApiCall } from "tsrpc";
+import { FriendManage } from '../../public/friend/manage';
+import { PlayerFun } from '../../public/player';
+import { ReqGift, ResGift } from "../../shared/protocols/friend/PtlGift";
+import { PublicShared } from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let prize: atn[] = [];
+ let my = await FriendManage.getFriend(call.uid);
+ let change: ResGift['change'] = {};
+
+ if (call.req.type != 'yijian') {
+ if (!call.req.uid) return call.error(globalThis.lng.friend_9);
+ if (!my.data.friendList.includes(call.req.uid)) return call.error(globalThis.lng.friend_9);
+ }
+
+ switch (call.req.type) {
+ case 'get':
+ if (my.data.recGift.includes(call.req.uid)) return call.error(globalThis.lng.friend_10);
+ if (my.data.recGift.length >= G.gc.friend.maxGetGiftNum) return call.error(globalThis.lng.friend_11);
+ if (!my.data.getGift[call.req.uid] || my.data.getGift[call.req.uid] < PublicShared.getToDayZeroTime()) return call.error(globalThis.lng.friend_12);
+ prize.push(...PublicShared.randomDropGroup(G.gc.friend.giftPrize));
+ my.recGift(call.req.uid);
+ change.recGift = my.data.recGift;
+ break;
+ case 'send':
+ if (my.data.sendGift.includes(call.req.uid)) return call.error(globalThis.lng.friend_13);
+ if (my.data.sendGift.length >= G.gc.friend.maxSendGiftNum) return call.error(globalThis.lng.friend_14);
+ my.sendGift(call.req.uid);
+ change.sendGift = my.data.sendGift;
+ break;
+ case 'yijian':
+ if (my.data.recGift.length < G.gc.friend.maxGetGiftNum && Object.keys(my.data.getGift).length > my.data.recGift.length) {
+ let recUids = Object.keys(my.data.getGift).difference(my.data.recGift).slice(0, G.gc.friend.maxGetGiftNum - my.data.recGift.length);
+ prize.push(...PublicShared.randomDropGroup(G.gc.friend.giftPrize, recUids.length));
+ my.recGift(recUids);
+ change.recGift = my.data.recGift;
+ }
+ if (my.data.sendGift.length < G.gc.friend.maxSendGiftNum && my.data.sendGift.length < my.data.friendList.length) {
+ let sendUids = my.data.friendList.difference(my.data.sendGift).slice(0, G.gc.friend.maxSendGiftNum - my.data.sendGift.length);
+ my.sendGift(sendUids);
+ change.sendGift = my.data.sendGift;
+ }
+ break;
+ }
+
+ prize.length > 0 && await PlayerFun.sendPrize(call, prize);
+
+ call.succ({
+ prize: prize,
+ change: change
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/friend/ApiList.ts b/src/api_s2c/friend/ApiList.ts
new file mode 100644
index 0000000..9f89283
--- /dev/null
+++ b/src/api_s2c/friend/ApiList.ts
@@ -0,0 +1,40 @@
+import {ApiCall} from "tsrpc";
+import {FriendManage} from '../../public/friend/manage';
+import {ReqList, ResList} from "../../shared/protocols/friend/PtlList";
+import {player} from "../../shared/protocols/user/type";
+
+export default async function (call: ApiCall) {
+ const my = await FriendManage.getFriend(call.uid);
+ var res:player[] = []
+ switch (call.req) {
+ case 'tuijian':
+ let noFindList = [...my.data.friendList, ...my.data.blacklist, call.uid]
+ res = await G.mongodb.collection('user').aggregate([
+ {$match: {uid: {$nin: noFindList}}},
+ {$sample: {size: G.gc.friend.tuijianNum}}
+ ]).toArray();
+ break;
+ case 'friend':
+ res = await G.redis.gets('user', ...my.data.friendList.map(uid => [uid] as [string]))
+ break;
+ case 'apply':
+ // 预防申请列表出现脏数据(过滤已添加好友)
+ res = await G.redis.gets('user', ...my.data.applyList.filter(uid => my.data.friendList.indexOf(uid) == -1).map(uid => [uid] as [string]));
+ break;
+ case 'black':
+ res = await G.redis.gets('user', ...my.data.blacklist.map(uid => [uid] as [string]))
+ break;
+
+ }
+ // 排序:在线 > 离线时间
+ res.sort((a, b) => {
+ let x = a.loginTime > a.logoutTime ? 1 : a.logoutTime
+ let y = b.loginTime > b.logoutTime ? 1 : b.logoutTime
+ return x - y
+ })
+ return call.succ(res)
+}
+
+
+
+
diff --git a/src/api_s2c/friend/ApiOpen.ts b/src/api_s2c/friend/ApiOpen.ts
new file mode 100644
index 0000000..f5879fb
--- /dev/null
+++ b/src/api_s2c/friend/ApiOpen.ts
@@ -0,0 +1,14 @@
+import { ApiCall } from "tsrpc";
+import { FriendManage } from '../../public/friend/manage';
+import { ReqOpen, ResOpen } from "../../shared/protocols/friend/PtlOpen";
+import { PublicShared } from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ const my = await FriendManage.getFriend(call.uid);
+
+ if (PublicShared.getToDayZeroTime() > my.data.refreshTime) {
+ my.refreshTime();
+ }
+
+ call.succ(my.data);
+}
\ No newline at end of file
diff --git a/src/api_s2c/friend/ApiRespond.ts b/src/api_s2c/friend/ApiRespond.ts
new file mode 100644
index 0000000..f71e900
--- /dev/null
+++ b/src/api_s2c/friend/ApiRespond.ts
@@ -0,0 +1,27 @@
+import { ApiCall } from "tsrpc";
+import { FriendManage } from '../../public/friend/manage';
+import { ReqRespond, ResRespond } from "../../shared/protocols/friend/PtlRespond";
+
+export default async function (call: ApiCall) {
+ const my = await FriendManage.getFriend(call.uid);
+
+ if (!my.data.applyList.includes(call.req.uid)) return call.error(globalThis.lng.friend_15);
+
+ const he = await FriendManage.getFriend(call.req.uid);
+
+ if (call.req.agree) {
+ if (my.data.friendList.includes(call.req.uid)) return call.error(globalThis.lng.friend_16);
+ if (my.data.blacklist.includes(call.req.uid)) return call.error(globalThis.lng.friend_17);
+ if (my.data.friendList.length >= G.gc.friend.maxFriendNum) return call.error(globalThis.lng.friend_18);
+
+ if (he) {
+ if (he.data.friendList.length >= G.gc.friend.maxFriendNum) return call.error(globalThis.lng.friend_19);
+ he.addFriend(call.uid);
+ }
+
+ my.addFriend(call.req.uid);
+ }
+ my.delApply(call.req.uid);
+ he?.delMyApply(call.uid);
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/friend/ApiRmBlackList.ts b/src/api_s2c/friend/ApiRmBlackList.ts
new file mode 100644
index 0000000..ec2c9af
--- /dev/null
+++ b/src/api_s2c/friend/ApiRmBlackList.ts
@@ -0,0 +1,23 @@
+import { ApiCall } from "tsrpc";
+import { FriendManage } from '../../public/friend/manage';
+import { ReqRmBlackList, ResRmBlackList } from "../../shared/protocols/friend/PtlRmBlackList";
+
+export default async function (call: ApiCall) {
+ const my = await FriendManage.getFriend(call.uid);
+
+ if (call.req.rm) {
+ if (!my.data.blacklist.includes(call.req.uid)) return call.error(globalThis.lng.friend_20);
+ my.delBlack(call.req.uid);
+ } else {
+ const he = await FriendManage.getFriend(call.req.uid);
+
+ if (he) {
+ if (my.data.blacklist.includes(call.req.uid)) return call.error(globalThis.lng.friend_21);
+ if (my.data.friendList.includes(call.req.uid)) my.delFriend(call.req.uid);
+ if (he.data.friendList.includes(call.uid)) he.delFriend(call.uid);
+ my.addBlack(call.req.uid);
+ }
+ }
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/friend/ApiSearch.ts b/src/api_s2c/friend/ApiSearch.ts
new file mode 100644
index 0000000..e15f2a1
--- /dev/null
+++ b/src/api_s2c/friend/ApiSearch.ts
@@ -0,0 +1,11 @@
+import { ApiCall } from "tsrpc";
+import { ReqSearch, ResSearch } from "../../shared/protocols/friend/PtlSearch";
+
+export default async function (call: ApiCall) {
+
+ let player = await G.mongodb.collection('user').findOne({ name: call.req.name });
+
+ if (!player) return call.error('', { code: -1, message: globalThis.lng.friend_22 });
+
+ call.succ(player);
+}
\ No newline at end of file
diff --git a/src/api_s2c/ganbutexun/ApiChallenge.ts b/src/api_s2c/ganbutexun/ApiChallenge.ts
new file mode 100644
index 0000000..d4f0c55
--- /dev/null
+++ b/src/api_s2c/ganbutexun/ApiChallenge.ts
@@ -0,0 +1,73 @@
+import { ApiCall } from "tsrpc";
+import { FightFun } from '../../public/fight';
+import { PlayerFun } from "../../public/player";
+import { formatNpcData } from '../../shared/fightControl/fightFun';
+import { ReqChallenge, ResChallenge } from "../../shared/protocols/ganbutexun/PtlChallenge";
+
+export default async function (call: ApiCall) {
+ let heroid = call.req.id;
+ let conf = G.gc.ganbutexun[heroid];
+ // 判断开启条件
+ // 判断关卡进度 TODO
+ let isUnlock = Object.entries(conf.cond).every(v => call.conn.gud[v[0]] >= v[1]);
+ if (!isUnlock) {
+ return call.error('', { code: -1 });
+ }
+ let need = [conf.need];
+ await PlayerFun.checkNeedIsMeet(call, need);
+ // 战斗 TODO
+
+ let prize = [];
+ let addnum = 0;
+ let fightNum = (await G.mongodb.collection('gbtx').findOne({ uid: call.uid }))?.fightNum?.[call.req.id] || 0;
+ fightNum + 1;
+
+ let lv = fightNum % 6 + fightNum;
+ let npc = formatNpcData(conf.battle, null, lv);
+ const result = FightFun.fight([await call.conn.getDefaultFightData(), npc]);
+ const isWin = result.winSide == 0;
+
+ if (isWin) {
+ addnum = G.gc.common.gbtxcom.gbtxadd;
+
+ let data = await G.redis.get('gbtx', call.uid, 'luck');
+ let prizeArr = JSON.parse(JSON.stringify(conf.prize));
+ let obj = {};
+ obj['luck.' + call.req.id] = addnum;
+ data[call.req.id] = data[call.req.id] || 0;
+ prize = (data[call.req.id] > 0 && data[call.req.id] % 6 == 5) ? prizeArr.map((item) => {
+ item.n *= 2;
+ return item;
+ }) : prizeArr;
+ data[call.req.id] += addnum;
+ G.redis.set('gbtx', call.uid, 'luck', data);
+
+ await PlayerFun.cutNeed(call, need);
+ await PlayerFun.addItem(call, prize);
+
+ G.mongodb.collection('gbtx').updateOne(
+ { uid: call.uid },
+ {
+ $inc: obj
+ },
+ {
+ upsert: true
+ }
+ );
+ }
+
+ G.mongodb.collection('gbtx').updateOne(
+ { uid: call.uid },
+ {
+ $inc: G.mongodb.createTreeObj({ key: `fightNum.${call.req.id}`, val: 1 })
+ },
+ {
+ upsert: true
+ }
+ );
+ return call.succ({
+ addluck: addnum,
+ prize: prize,
+ fightobj: result
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/ganbutexun/ApiOpen.ts b/src/api_s2c/ganbutexun/ApiOpen.ts
new file mode 100644
index 0000000..5793de8
--- /dev/null
+++ b/src/api_s2c/ganbutexun/ApiOpen.ts
@@ -0,0 +1,14 @@
+import { ApiCall } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../shared/protocols/ganbutexun/PtlOpen";
+
+export default async function (call: ApiCall) {
+ // 返回幸运值
+
+ let data = await G.mongodb.collection('gbtx').findOne({ uid: call.uid }) || { luck: {}, _id: null, uid: '', fightNum: {} };
+ let { _id, uid, ...ops } = data;
+
+ G.redis.set('gbtx', call.uid, ops);
+ call.succ({
+ luck: data.luck
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/ganhai/ApiFast.ts b/src/api_s2c/ganhai/ApiFast.ts
new file mode 100644
index 0000000..566b31b
--- /dev/null
+++ b/src/api_s2c/ganhai/ApiFast.ts
@@ -0,0 +1,30 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ZhanLingTasks } from '../../public/zhanling';
+import { ReqFast, ResFast } from "../../shared/protocols/ganhai/PtlFast";
+import { HongDianChange } from "../hongdian/fun";
+import { GanHaiRed, calculatePrize } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let dbData = await G.mongodb.collection('ganhai').findOne({ uid: call.uid });
+
+ if (dbData.ship == null) return call.error('', { code: -1 });
+ if (dbData.ship.sTime + G.gc.ganhai.ships[dbData.ship.index].time < G.time) return call.error('', { code: -2 });
+
+ await PlayerFun.checkNeedIsMeet(call, G.gc.ganhai.ships[dbData.ship.index].kshsNeed);
+ await PlayerFun.cutNeed(call, G.gc.ganhai.ships[dbData.ship.index].kshsNeed);
+ let prize = calculatePrize(dbData.ship, G.time);
+ await PlayerFun.sendPrize(call, prize);
+
+ G.mongodb.collection('ganhai').updateOne({ uid: call.uid }, { $set: { ship: null } });
+ HongDianChange.sendChangeKey(call.uid, ['gonghuihd']);
+ ZhanLingTasks.addLog(call.uid, 'week', `ganhai_finish`);
+ GanHaiRed.addList(call.uid, null);
+
+ call.succ({
+ prize: prize,
+ change: {
+ ship: null,
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/ganhai/ApiFight.ts b/src/api_s2c/ganhai/ApiFight.ts
new file mode 100644
index 0000000..83396c1
--- /dev/null
+++ b/src/api_s2c/ganhai/ApiFight.ts
@@ -0,0 +1,52 @@
+import { ApiCall } from "tsrpc";
+import { FightFun } from '../../public/fight';
+import { PlayerFun } from '../../public/player';
+import { ReqFight, ResFight } from "../../shared/protocols/ganhai/PtlFight";
+import { prizeType } from '../../shared/protocols/type';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let dbData = await G.mongodb.collection('ganhai').findOne({ uid: call.uid });
+ let index = call.req.index;
+ let fightNum = dbData.useFightNum + 1;
+ let toShipUid = dbData.ships[index]?.player?.player?.uid;
+ let toShip
+ if(toShipUid){
+ toShip = (await G.mongodb.collection('ganhai').findOne({ uid: toShipUid })).ship;
+ }
+
+ if (fightNum > G.gc.ganhai.fightNum) return call.error('', { code: -1 });
+ if (!toShip) return call.error('', { code: -2 });
+ if (toShip.beFightNum >= G.gc.ganhai.ships[toShip.index].ldNum) return call.error('', { code: -3 });
+
+ G.mongodb.collection('ganhai').updateOne({ uid: call.uid }, { $set: { ships: dbData.ships, useFightNum: fightNum } });
+
+ let change: ResFight['change'] = {
+ useFightNum: fightNum,
+ ships: dbData.ships
+ };
+ let result = FightFun.fight([await call.conn.getDefaultFightData(), toShip.player]);
+ result.otherData = { shipIndex: toShip.index };
+
+ FightFun.saveLog(call.uid, 'ganhai', result);
+ FightFun.saveLog(toShip.player.player.uid, 'ganhai', {...result,winSide:result.winSide?0:1});
+
+ let prize: prizeType[] = [];
+
+ if (result.winSide == 0) {
+ // 我方胜利加1
+ toShip.beFightNum++;
+ G.mongodb.collection('ganhai').updateOne({ uid: toShip.player.player.uid }, { $inc: { 'ship.beFightNum': 1 } });
+
+ let conf = G.gc.ganhai.ships[toShip.index];
+ prize = conf.prize.slice(1).map(atn => ({ ...atn, n: Math.floor(atn.n * conf.ldRatio) }));
+ await PlayerFun.sendPrize(call, prize);
+ }
+
+ HongDianChange.sendChangeKey(call.uid, ['gonghuihd']);
+ call.succ({
+ prize: prize,
+ result: result,
+ change: change
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/ganhai/ApiLog.ts b/src/api_s2c/ganhai/ApiLog.ts
new file mode 100644
index 0000000..0bd1bc9
--- /dev/null
+++ b/src/api_s2c/ganhai/ApiLog.ts
@@ -0,0 +1,7 @@
+import { ApiCall } from "tsrpc";
+import { FightFun } from '../../public/fight';
+import { ReqLog, ResLog } from "../../shared/protocols/ganhai/PtlLog";
+
+export default async function (call: ApiCall) {
+ call.succ(await FightFun.readLog(call.uid, 'ganhai'));
+}
\ No newline at end of file
diff --git a/src/api_s2c/ganhai/ApiOpen.ts b/src/api_s2c/ganhai/ApiOpen.ts
new file mode 100644
index 0000000..37c78c1
--- /dev/null
+++ b/src/api_s2c/ganhai/ApiOpen.ts
@@ -0,0 +1,181 @@
+import {ApiCall} from "tsrpc";
+import {PlayerFun} from '../../public/player';
+import {ZhanLingTasks} from '../../public/zhanling';
+import {ReqOpen, ResOpen} from "../../shared/protocols/ganhai/PtlOpen";
+import {PublicShared} from '../../shared/public/public';
+import {HongDianChange} from "../hongdian/fun";
+import { isArray } from "mathjs";
+
+export default async function (call: ApiCall) {
+
+ let dbData = await G.mongodb.collection('ganhai').findOne({uid: call.uid});
+
+ if (!dbData) {
+ var shipIndexs = randomMyShips();
+
+ var ships = await randomShips(call.uid);
+ await G.mongodb.collection('ganhai').updateOne({uid: call.uid}, {
+ $set: {
+ myShips: shipIndexs,
+ ships: ships
+ }
+ }, {upsert: true});
+ }
+
+ /**
+ * 处理已经被掠夺3次的商船
+ */
+ let resShips = dbData?.ships
+ if (resShips) {
+ let npc = []
+ let ids = resShips.filter(i=>!!i).map(i => {
+ let uid = i.player?.player?.uid
+ if (uid) return uid
+ else npc.push(i)
+ })
+ let playerDbData = await G.mongodb.collection('ganhai').find({uid: {$in: ids}}).toArray();
+ resShips = playerDbData.map(i => i.ship).filter(Boolean)
+ resShips = [...resShips, ...npc]
+ await G.mongodb.collection('ganhai').updateOne({uid: call.uid}, {$set: {ships: resShips}}, {upsert: true});
+ }
+
+
+ let res: ResOpen = {
+ ship: dbData?.ship || null,
+ ships: resShips || ships,
+ myShips: dbData?.myShips || shipIndexs,
+ useFightNum: dbData?.useFightNum || 0,
+ useEscortNum: dbData?.useEscortNum || 0,
+ useRefreshNum: dbData?.useRefreshNum || 0,
+ };
+
+ if (!dbData || dbData.refreshTime < PublicShared.getToDayZeroTime()) {
+ var refresObj = {
+ refreshTime: G.time,
+ useFightNum: 0,
+ useEscortNum: 0,
+ useRefreshNum: 0
+ };
+ await G.mongodb.collection('ganhai').updateOne({uid: call.uid}, {$set: refresObj}, {upsert: true});
+ }
+
+ if (dbData?.ship?.sTime && dbData.ship.sTime + G.gc.ganhai.ships[dbData.ship.index].time < G.time) {
+ let prize = calculatePrize(dbData.ship, dbData.ship.sTime + G.gc.ganhai.ships[dbData.ship.index].time);
+ await PlayerFun.sendPrize(call, prize);
+ dbData.ship = null;
+ await G.mongodb.collection('ganhai').updateOne({uid: call.uid}, {$set: {ship: null}}, {upsert: true});
+ res.prize = prize;
+
+ GanHaiRed.addList(call.uid, null);
+ ZhanLingTasks.addLog(call.uid, 'week', `ganhai_finish`);
+ HongDianChange.sendChangeKey(call.uid, ['gonghuihd']);
+ }
+
+ call.succ(res);
+}
+
+export function randomMyShips(isDj = false, yjdj = false) {
+ let shipIndexs: number[] = [];
+ for (let i = 0; i < 4; i++) {
+ let ship = PublicShared.randomDropAny(G.gc.ganhai.ships);
+ shipIndexs.push(G.gc.ganhai.ships.findIndex(s => s.name == ship.name));
+ }
+ if (isDj) {
+ shipIndexs[3] = 3;
+ }
+ if (yjdj) {
+ shipIndexs = [3]
+ }
+ return shipIndexs;
+}
+
+export async function randomShips(uid: string) {
+ // let shipss = await G.mongodb.collection('ganhai').find({uid: {$nin: [uid]}}).toArray();
+ // console.log(shipss[0])
+ // 过滤不存在的用户
+ let ships = await G.mongodb.collection('ganhai').aggregate([
+ {
+ "$match": {
+ uid: {$nin: [uid]}
+ }
+ },{
+ "$lookup": {
+ "from": "user",
+ "localField": "uid",
+ "foreignField": "uid",
+ "as": "userInfo"
+ }
+ },{
+ "$match": {
+ "userInfo": {$ne: []}
+ }
+ }
+
+ ]).toArray()
+ ships = ships.filter(s => s.ship != null && s.ship.beFightNum < G.gc.ganhai.ships[s.ship.index].ldNum);
+ ships.sort(() => Math.random() - .5);
+ return ships.slice(0, 5).map(s => s.ship);
+}
+
+export function calculatePrize(ship: ResOpen['ship'], time: number) {
+ let conf = G.gc.ganhai.ships[ship.index];
+ let zeroTime = PublicShared.getToDayZeroTime(time);
+ let second = time - zeroTime;
+ let multiple = 1;
+
+ for (let [start, end] of G.gc.ganhai.doubleTime) {
+ if (second >= start && second <= end) {
+ multiple = 2;
+ break;
+ }
+ }
+
+ let ratio = conf.ldRatio;
+ let ldMultiple = ship.beFightNum * ratio;
+ let prize1 = conf.prize.slice(0, 1);
+ let prize2 = conf.prize.slice(1);
+
+ let prize = [...prize1, ...prize2.map(atn => {
+ let n = atn.n;
+ if (ldMultiple > 0) {
+ n = atn.n - Math.floor(atn.n * ldMultiple);
+ }
+ return {...atn, n: n};
+ })];
+
+ return prize.filter(p => p.n > 0).map(p => {
+ return {...p, n: p.n * multiple};
+ });
+}
+
+export class GanHaiRed {
+ static sends: k_v = {};
+ static checkList: k_v = {};
+
+ static async init() {
+
+ //let dbs = await G.mongodb.collection('ganhai').find({}).toArray();
+ //let obj = Object.fromEntries(dbs.map(db => [db.uid, db.ship]));
+ let dbs = await G.mongodb.find('ganhai',{},['uid','ship.sTime','ship.index']);
+ let obj = Object.fromEntries(dbs.map(db => [db.uid, db.ship]));
+
+ Object.assign(this.checkList, obj);
+ }
+
+ static addList(uid: string, ship: ResOpen['ship']) {
+ this.checkList[uid] = ship;
+ if (ship) {
+ this.sends[uid] = false;
+ }
+ }
+
+ static check() {
+ Object.entries(this.checkList).forEach(v => {
+ let [uid, ship] = v;
+ if (!this.sends[uid] && ship?.sTime && ship?.sTime + G.gc.ganhai.ships[ship.index].time < G.time) {
+ G.server.sendMsgByUid(uid, 'msg_s2c/HongDianChange', ['gonghuihd']);
+ this.sends[uid] = true;
+ }
+ });
+ }
+};
\ No newline at end of file
diff --git a/src/api_s2c/ganhai/ApiRefresh.ts b/src/api_s2c/ganhai/ApiRefresh.ts
new file mode 100644
index 0000000..a74c25a
--- /dev/null
+++ b/src/api_s2c/ganhai/ApiRefresh.ts
@@ -0,0 +1,15 @@
+import { ApiCall } from "tsrpc";
+import { ReqRefresh, ResRefresh } from "../../shared/protocols/ganhai/PtlRefresh";
+import { randomShips } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let ships = await randomShips(call.uid);
+
+ G.mongodb.collection('ganhai').updateOne({ uid: call.uid }, { $set: { ships: ships } });
+
+ call.succ({
+ change: {
+ ships: ships
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/ganhai/ApiRefreshShip.ts b/src/api_s2c/ganhai/ApiRefreshShip.ts
new file mode 100644
index 0000000..f26b19e
--- /dev/null
+++ b/src/api_s2c/ganhai/ApiRefreshShip.ts
@@ -0,0 +1,46 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ReqRefreshShip, ResRefreshShip } from "../../shared/protocols/ganhai/PtlRefreshShip";
+import { randomMyShips } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let dbData = await G.mongodb.collection('ganhai').findOne({ uid: call.uid });
+ if (dbData.ship != null) return call.error('', { code: -1 });
+ let reNum = dbData.useRefreshNum
+
+ let _refresh: boolean = false
+ let _yijianzuigao: boolean = false
+
+
+ if (call.req?.yjzg) {
+ _yijianzuigao = true
+ let need = G.gc.ganhai.oneClickNeed;
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+ } else {
+ reNum += 1;
+ if (reNum > G.gc.ganhai.refreshNum) {
+ let _maxNum = G.gc.ganhai.refreshMaxNeed;
+ let need = G.gc.ganhai.refreshNeed.map(_need => {
+ return {
+ ..._need,
+ n: ((reNum - 1) * 20) > _maxNum ? _maxNum : (reNum - 1) * 20
+ };
+ });
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+ }
+ _refresh = reNum % G.gc.ganhai.num == 0
+ }
+
+ let shipIndex = randomMyShips(_refresh,_yijianzuigao);
+
+ G.mongodb.collection('ganhai').updateOne({ uid: call.uid }, { $set: { myShips: shipIndex, useRefreshNum: reNum } });
+
+ call.succ({
+ change: {
+ myShips: shipIndex,
+ useRefreshNum: reNum
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/ganhai/ApiSelect.ts b/src/api_s2c/ganhai/ApiSelect.ts
new file mode 100644
index 0000000..998b98e
--- /dev/null
+++ b/src/api_s2c/ganhai/ApiSelect.ts
@@ -0,0 +1,33 @@
+import { ApiCall } from "tsrpc";
+import { ReqSelect, ResSelect } from "../../shared/protocols/ganhai/PtlSelect";
+import { HongDianChange } from "../hongdian/fun";
+import { GanHaiRed, randomMyShips } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ let dbData = await G.mongodb.collection('ganhai').findOne({ uid: call.uid });
+ let escortNum = dbData.useEscortNum + 1;
+
+ if (escortNum > G.gc.ganhai.escortNum) return call.error('', { code: 0 });
+ if (dbData.ship != null) return call.error('', { code: -1 });
+ if (dbData.myShips[call.req.index] == undefined) return call.error('', { code: -2 });
+
+ let obj = {
+ index: dbData.myShips[call.req.index],
+ sTime: G.time,
+ beFightNum: 0,
+ player: await call.conn.getDefaultFightData()
+ };
+ let shipIndex = randomMyShips();
+
+ G.mongodb.collection('ganhai').updateOne({ uid: call.uid }, { $set: { myShips: shipIndex, ship: obj, useEscortNum: escortNum } });
+ HongDianChange.sendChangeKey(call.uid, ['gonghuihd']);
+ GanHaiRed.addList(call.uid, obj);
+
+ call.succ({
+ change: {
+ ship: obj,
+ myShips: shipIndex,
+ useEscortNum: escortNum
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiApply.ts b/src/api_s2c/gonghui/ApiApply.ts
new file mode 100644
index 0000000..b9ba1f5
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiApply.ts
@@ -0,0 +1,21 @@
+import { ApiCall } from "tsrpc";
+import { ReqApply, ResApply } from "../../shared/protocols/gonghui/PtlApply";
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ if (call.conn.gud.ghLevel == 3) return call.error(globalThis.lng.gonghui_1);
+ let GHdata = await call.conn.gonghui
+ const index = GHdata.data.applyList.findIndex(a => a.uid == call.req.uid);
+
+ if (index == -1) return call.error(globalThis.lng.gonghui_2);
+
+ if (call.req.apply) {
+ GHdata.apply(call.req.uid);
+ } else {
+ GHdata.data.applyList.splice(index, 1);
+ GHdata.updateDb({ $set: { applyList: GHdata.data.applyList } });
+ }
+ HongDianChange.sendChangeKey(call.uid, ['gonghuihd'])
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiApplyAll.ts b/src/api_s2c/gonghui/ApiApplyAll.ts
new file mode 100644
index 0000000..3890e65
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiApplyAll.ts
@@ -0,0 +1,17 @@
+import { ApiCall } from "tsrpc";
+import { ReqApplyAll, ResApplyAll } from "../../shared/protocols/gonghui/PtlApplyAll";
+
+export default async function (call: ApiCall) {
+ let GHdata = await call.conn.gonghui
+ if (call.conn.gud.ghLevel == 3) return call.error(globalThis.lng.gonghui_1);
+ if (GHdata.data.applyList.length < 1) return call.error(globalThis.lng.gonghui_3);
+
+ if (call.req) {
+ GHdata.apply(...GHdata.data.applyList.map(a => a.uid));
+ } else {
+ GHdata.data.applyList = [];
+ GHdata.updateDb({ $set: { applyList: [] } });
+ }
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiApplyList.ts b/src/api_s2c/gonghui/ApiApplyList.ts
new file mode 100644
index 0000000..175aa66
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiApplyList.ts
@@ -0,0 +1,19 @@
+import { ApiCall } from "tsrpc";
+import { ReqApplyList, ResApplyList } from "../../shared/protocols/gonghui/PtlApplyList";
+
+export default async function (call: ApiCall) {
+ let GHdata = await call.conn.gonghui
+ if (GHdata.data.applyList?.length > 0) {
+
+ let players = await G.redis.gets('user', ...GHdata.data.applyList.map(a => [a.uid] as [string]));
+
+ call.succ(players.map((p, i) => {
+ return {
+ player: p,
+ time: GHdata.data.applyList[i].time
+ };
+ }));
+ } else {
+ call.succ([]);
+ }
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiChange.ts b/src/api_s2c/gonghui/ApiChange.ts
new file mode 100644
index 0000000..5713099
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiChange.ts
@@ -0,0 +1,22 @@
+import { ApiCall } from "tsrpc";
+import { GongHuiFun } from '../../public/gonghui/gonghui';
+import { GHManage } from '../../public/gonghui/manage';
+import { PlayerFun } from '../../public/player';
+import { ReqChange, ResChange } from "../../shared/protocols/gonghui/PtlChange";
+
+export default async function (call: ApiCall) {
+
+ if (call.conn.gud.ghLevel > 2) return call.error(globalThis.lng.gonghui_1);
+ if (call.conn.gud.ghLevel != 1 && call.req.name) return call.error(globalThis.lng.gonghui_4);
+
+ await GongHuiFun.checkSetArgs(call.req);
+
+ await PlayerFun.checkNeedIsMeet(call, G.gc.shili_com.changeNameNeed);
+
+ await PlayerFun.cutNeed(call, G.gc.shili_com.changeNameNeed);
+
+ (await GHManage.getGH(call.conn.gud.ghId)).updateSetting(call.req);
+
+ call.succ(call.req);
+
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiCreate.ts b/src/api_s2c/gonghui/ApiCreate.ts
new file mode 100644
index 0000000..8991c1f
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiCreate.ts
@@ -0,0 +1,50 @@
+import { ApiCall } from "tsrpc";
+import { MongodbCollections } from '../../module/mongodb';
+import { GongHuiFun } from '../../public/gonghui/gonghui';
+import { GHManage } from '../../public/gonghui/manage';
+import { PlayerFun } from '../../public/player';
+import { ReqCreate, ResCreate } from "../../shared/protocols/gonghui/PtlCreate";
+
+export default async function (call: ApiCall) {
+ if ((call.conn.gud.ghExitTime || 0) + G.gc.com.Guild_CD.value > G.time) {
+ return call.error(globalThis.lng.gonghui_5);
+ }
+
+ if (call.conn.gud.ghId) return call.error(globalThis.lng.gonghui_6);
+
+ if (call.conn.gud.vip < G.gc.shili_com.createVip) return call.error(globalThis.lng.gonghui_7);
+
+ await PlayerFun.checkNeedIsMeet(call, G.gc.shili_com.createNeed);
+
+ await GongHuiFun.checkSetArgs(call.req);
+
+ await PlayerFun.cutNeed(call, G.gc.shili_com.createNeed);
+
+ const data: MongodbCollections['gonghui'] = {
+ lv: 1,
+ exp: 0,
+ name: call.req.name,
+ players: [
+ {
+ uid: call.uid,
+ level: 1,
+ joinTime: G.time
+ }
+ ],
+ setting: {
+ ...call.req.setting,
+ joinLv: G.gc.shili_com.defaultJoinLv,
+ notice: G.gc.shili_com.defaultNotice,
+ autoJoin: G.gc.shili_com.defaultAutoJoin,
+ },
+ createTime: G.time,
+ createPlayer: { name: call.conn.gud.name, uid: call.uid },
+ };
+ const _id = await GongHuiFun.db.insertOne(data);
+
+ await GHManage.addNew({ ...data, _id: G.mongodb.conversionId(_id.insertedId) });
+
+ await PlayerFun.addAttr(call, { ghId: G.mongodb.conversionId(_id.insertedId), ghName: call.req.name, ghLevel: 1 });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiDissolve.ts b/src/api_s2c/gonghui/ApiDissolve.ts
new file mode 100644
index 0000000..7648e06
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiDissolve.ts
@@ -0,0 +1,12 @@
+import { ApiCall } from "tsrpc";
+import { GHManage } from '../../public/gonghui/manage';
+import { ReqDissolve, ResDissolve } from "../../shared/protocols/gonghui/PtlDissolve";
+
+export default async function (call: ApiCall) {
+
+ if (call.conn.gud.ghLevel != 1) return call.error(globalThis.lng.gonghui_8);
+
+ GHManage.remove(call.conn.gud.ghId);
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiExit.ts b/src/api_s2c/gonghui/ApiExit.ts
new file mode 100644
index 0000000..6e8b9d0
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiExit.ts
@@ -0,0 +1,13 @@
+import { ApiCall } from "tsrpc";
+import { ReqExit, ResExit } from "../../shared/protocols/gonghui/PtlExit";
+
+export default async function (call: ApiCall) {
+
+ if (call.conn.gud.ghLevel == 1) {
+ return call.error(globalThis.lng.gonghui_9);
+ }
+
+ (await call.conn.gonghui).delPlayer(call.uid);
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiFbBuyNum.ts b/src/api_s2c/gonghui/ApiFbBuyNum.ts
new file mode 100644
index 0000000..3c33e77
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiFbBuyNum.ts
@@ -0,0 +1,19 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ReqFbBuyNum, ResFbBuyNum } from "../../shared/protocols/gonghui/PtlFbBuyNum";
+
+export default async function (call: ApiCall) {
+ let _buyNum = (await G.mongodb.collection('gonghuiUser').findOne({ uid: call.uid }))?.fuben?.addNum || 0;
+ let shiliConfFightNumBuyNeed = G.gc.shili_com.fightNumBuyNeed
+ let atn = shiliConfFightNumBuyNeed[_buyNum] || shiliConfFightNumBuyNeed[shiliConfFightNumBuyNeed.length - 1]
+ await PlayerFun.checkNeedIsMeet(call, [atn]);
+ await PlayerFun.cutNeed(call, [atn]);
+ // 策划特别强调加上(到时候别又搞取消。。。。。。。。。。。。。。。。。。。。。。。。。)
+ if (_buyNum >= shiliConfFightNumBuyNeed.length) {
+ return call.error('', { code: -1, message: globalThis.lng.gonghui_10 })
+ }
+
+ G.mongodb.collection('gonghuiUser').updateOne({ uid: call.uid }, { $inc: { 'fuben.fightNum': 1, 'fuben.addNum': 1 } });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiFbFight.ts b/src/api_s2c/gonghui/ApiFbFight.ts
new file mode 100644
index 0000000..0960ed4
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiFbFight.ts
@@ -0,0 +1,70 @@
+import { ApiCall } from "tsrpc";
+import { FightFun } from '../../public/fight';
+import { PlayerFun } from '../../public/player';
+import { formatNpcData } from '../../shared/fightControl/fightFun';
+import { ReqFbFight, ResFbFight } from "../../shared/protocols/gonghui/PtlFbFight";
+import { PublicShared } from '../../shared/public/public';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+
+ let gh = await call.conn.gonghui;
+ let conf = G.gc.shili_fb[gh.data.fuben.id];
+
+ if (!conf) return call.error(globalThis.lng.gonghui_11);
+
+ let dbData = await G.mongodb.collection('gonghuiUser').findOne({ uid: call.uid });
+
+ if (dbData.fuben.fightNum < 1) return call.error(globalThis.lng.gonghui_12);
+
+ if (await gh.getIsFightBoss()) return call.error(globalThis.lng.gonghui_13);
+
+ await gh.changeIsFightBoss(true);
+
+ let npc = formatNpcData(conf.npc);
+ Object.entries(gh.data.fuben.bossInfo).forEach(role => {
+ Object.assign(npc.roles[role[0]].attr, role[1]);
+ });
+
+ let result = FightFun.fight([
+ {
+ ...await call.conn.getDefaultFightData()
+ },
+ npc
+ ], 30, 'pve');
+ if (!gh.data.fuben.dps[call.uid]) gh.data.fuben.dps[call.uid] = result.totalDamage[0];
+ else gh.data.fuben.dps[call.uid] += result.totalDamage[0];
+ // winSide == 0 战斗胜利
+ if (result.winSide == 0) {
+
+ await G.mongodb.collection('gonghuiFb').insertOne({ ghId: gh.data._id, fbId: gh.data.fuben.id, rankList: gh.data.fuben.dps });
+
+ gh.sendeMail(gh.data.fuben.id, Object.keys(gh.data.fuben.dps).map(uid => [uid, gh.data.fuben.dps[uid]]));
+
+ gh.data.fuben = {
+ id: (Number(gh.data.fuben.id) + 1).toString(),
+ dps: {},
+ bossInfo: {},
+ };
+
+ gh.addExp(conf.gongxianprize);
+ } else {
+ Object.entries(result.fightData[1].roles).forEach(role => {
+ gh.data.fuben.bossInfo[role[0]] = { hp: role[1].attr.hp, maxHp: role[1].attr.maxHp };
+ });
+ }
+
+ gh.updateDb({ $set: { fuben: gh.data.fuben } });
+ gh.changeIsFightBoss(false);
+
+ let prize = conf.fightPrize.map(v => PublicShared.randomDropGroup(v)).reduce((a, b) => a.concat(b));
+
+ await PlayerFun.sendPrize(call, prize);
+ G.mongodb.collection('gonghuiUser').updateOne({ uid: call.uid }, { $inc: { 'fuben.fightNum': -1 } });
+ HongDianChange.sendChangeKey(call.uid, ['gonghuihd']);
+
+ call.succ({
+ prize: prize,
+ result: result
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiFbOpen.ts b/src/api_s2c/gonghui/ApiFbOpen.ts
new file mode 100644
index 0000000..ab90881
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiFbOpen.ts
@@ -0,0 +1,42 @@
+import { ApiCall } from "tsrpc";
+import { ReqFbOpen, ResFbOpen } from "../../shared/protocols/gonghui/PtlFbOpen";
+import { PublicShared } from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let res: ResFbOpen = { fightNum: 0, addNum: 0, rankList: [] };
+ let conf = G.gc.shili_fb[call.req.fbId];
+ let gh = await call.conn.gonghui;
+
+ if (Number(call.req.fbId) > Number(gh.data.fuben.id)) return call.error(globalThis.lng.gonghui_14);
+ if (!conf) return call.error(globalThis.lng.gonghui_15);
+ if (call.req.fbId != gh.data.fuben.id) {
+ let md = await G.mongodb.collection('gonghuiFb').findOne({ ghId: gh.data._id, fbId: call.req.fbId });
+ let uids = Object.keys(md.rankList);
+ let players = await G.redis.gets('user', ...uids.map(uid => [uid] as [string]));
+ res.rankList = players.map(p => {
+ return {
+ player: p,
+ dps: md.rankList[p.uid]
+ };
+ });
+ } else {
+ let uids = Object.keys(gh.data.fuben.dps);
+ let players = await G.redis.gets('user', ...uids.map(uid => [uid] as [string]));
+ res.rankList = players.map(p => {
+ return {
+ player: p,
+ dps: gh.data.fuben.dps[p.uid]
+ };
+ });
+ }
+
+ let mdMy = (await G.mongodb.collection('gonghuiUser').findOne({ uid: call.uid }))?.fuben;
+ if (!mdMy || PublicShared.getToDayZeroTime() > mdMy.refreshTime) {
+ mdMy = {
+ fightNum: G.gc.shili_com.fightNum,
+ refreshTime: G.time
+ };
+ G.mongodb.collection('gonghuiUser').updateOne({ uid: call.uid }, { $set: { fuben: mdMy } }, { upsert: true });
+ }
+ call.succ({ ...res, fightNum: mdMy.fightNum, addNum: mdMy?.addNum||0 });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiGetList.ts b/src/api_s2c/gonghui/ApiGetList.ts
new file mode 100644
index 0000000..c877660
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiGetList.ts
@@ -0,0 +1,25 @@
+import { ApiCall } from "tsrpc";
+import { GHManage } from '../../public/gonghui/manage';
+import { ReqGetList, ResGetList } from "../../shared/protocols/gonghui/PtlGetList";
+
+export default async function (call: ApiCall) {
+
+ let arr: ResGetList['list'] = [];
+ let GHData = await GHManage.getGHList();
+ let ghs = Object.values(GHData).map(item => item.data);
+ let allRoles = await G.mongodb.collection('user').find().toArray();
+ let zhanlis = Object.fromEntries(allRoles.map(r => [r.uid, r.power]));
+
+ for (let gh of ghs) {
+ let uids = gh.players.map(p => p.uid);
+ let zhanli = uids.map(u => (zhanlis[u] || 0)).reduce((a, b) => a + b);
+ arr.push({
+ gh: gh,
+ zhanli: zhanli
+ });
+ }
+
+ call.succ({
+ list: arr
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiJoin.ts b/src/api_s2c/gonghui/ApiJoin.ts
new file mode 100644
index 0000000..50247b1
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiJoin.ts
@@ -0,0 +1,34 @@
+import { ApiCall } from "tsrpc";
+import { GHManage } from '../../public/gonghui/manage';
+import { ReqJoin, ResJoin } from "../../shared/protocols/gonghui/PtlJoin";
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ if ((call.conn.gud.ghExitTime || 0) + G.gc.com.Guild_CD.value > G.time) {
+ return call.error(globalThis.lng.gonghui_5);
+ }
+
+ if (call.conn.gud.ghId) return call.error(globalThis.lng.gonghui_16);
+
+ const gh = await GHManage.getGH(call.req.id);
+
+ if (!gh) return call.error(globalThis.lng.gonghui_17);
+
+ if (gh.data.players.length >= gh.maxPlayerNum) return call.error(globalThis.lng.gonghui_18);
+
+ if (call.conn.gud.lv < gh.data.setting.joinLv) return call.error(globalThis.lng.gonghui_19);
+
+ if (gh.data.setting.autoJoin) {
+ gh.addPlayer(call.conn.gud);
+ } else {
+ gh.addApply(call.conn.gud);
+ let _ghUsers = await gh.getAllPlayers();
+ _ghUsers.forEach(ele => {
+ if (ele.player.ghLevel != 3) {
+ HongDianChange.sendChangeKey(ele.player.uid, ['gonghuihd'])
+ }
+ })
+ }
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiJx.ts b/src/api_s2c/gonghui/ApiJx.ts
new file mode 100644
index 0000000..4bfc054
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiJx.ts
@@ -0,0 +1,33 @@
+import { ApiCall } from "tsrpc";
+import { GHManage } from '../../public/gonghui/manage';
+import { PlayerFun } from '../../public/player';
+import { ReqJx, ResJx } from "../../shared/protocols/gonghui/PtlJx";
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ const conf = G.gc.shili_com.juanxian[call.req.index];
+
+ if (!conf) return call.error(globalThis.lng.gonghui_20);
+
+ const data = await G.mongodb.collection('gonghuiUser').findOne({ uid: call.uid });
+ const jx = data?.jx || { refreshTime: G.time, record: {} };
+
+ let num = conf.maxNum;
+ if (conf.vipAddNum.length > 0) {
+ if (conf.vipAddNum[call.conn.gud.vip] != undefined) num += conf.vipAddNum[call.conn.gud.vip];
+ else num += conf.vipAddNum.last();
+ }
+ if (jx.record[call.req.index] >= num) return call.error(globalThis.lng.gonghui_21);
+
+ await PlayerFun.checkNeedIsMeet(call, conf.need);
+ await PlayerFun.cutNeed(call, conf.need);
+ await PlayerFun.sendPrize(call, conf.prize);
+ await (await GHManage.getGH(call.conn.gud.ghId)).juanxian(call.req.index, call.uid);
+
+ G.mongodb.collection('gonghuiUser').updateOne({ uid: call.uid }, { $inc: G.mongodb.createTreeObj({ key: 'jx', k: `record.${call.req.index}`, val: 1 }) });
+ HongDianChange.sendChangeKey(call.uid, ['gonghuihd', 'taskhd', 'huodonghd'])
+ call.succ({
+ change: {},
+ prize: conf.prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiJxOpen.ts b/src/api_s2c/gonghui/ApiJxOpen.ts
new file mode 100644
index 0000000..495ee0a
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiJxOpen.ts
@@ -0,0 +1,17 @@
+import { ApiCall } from "tsrpc";
+import { ReqJxOpen, ResJxOpen } from "../../shared/protocols/gonghui/PtlJxOpen";
+import { PublicShared } from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+
+ const data = await G.mongodb.collection('gonghuiUser').findOne({ uid: call.uid });
+ const jx = data?.jx || { record: {}, refreshTime: -1 };
+
+ if (PublicShared.getToDayZeroTime() > jx.refreshTime) {
+ jx.record = {};
+ jx.refreshTime = G.time;
+ G.mongodb.collection('gonghuiUser').updateOne({ uid: call.uid }, { $set: { jx: jx } }, { upsert: true });
+ }
+
+ call.succ(jx);
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiList.ts b/src/api_s2c/gonghui/ApiList.ts
new file mode 100644
index 0000000..8e017e6
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiList.ts
@@ -0,0 +1,8 @@
+import { ApiCall } from "tsrpc";
+import { GHManage } from '../../public/gonghui/manage';
+import { ReqList, ResList } from "../../shared/protocols/gonghui/PtlList";
+
+export default async function (call: ApiCall) {
+
+ call.succ(await (await GHManage.getGH(call.conn.gud.ghId)).getAllPlayers());
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiManage.ts b/src/api_s2c/gonghui/ApiManage.ts
new file mode 100644
index 0000000..f4c294b
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiManage.ts
@@ -0,0 +1,23 @@
+import { ApiCall } from "tsrpc";
+import { ReqManage, ResManage } from "../../shared/protocols/gonghui/PtlManage";
+
+export default async function (call: ApiCall) {
+ if (call.conn.gud.ghLevel >= 3) return call.error(globalThis.lng.gonghui_1);
+ let GHdata = await call.conn.gonghui
+ const player = GHdata.data.players.find(p => p.uid == call.req.uid);
+
+ if (!player) return call.error(globalThis.lng.gonghui_22);
+ if (player.uid == call.uid) return call.error(globalThis.lng.gonghui_23);
+ if (player.level == call.req.level) return call.error(globalThis.lng.gonghui_15);
+ //管理只可以踢人
+ if (call.conn.gud.ghLevel == 2 && (player.level == 1 || player.level == 2)) return call.error(globalThis.lng.gonghui_1);
+
+ if (call.req.level > 0) {
+ if (call.req.level == 1) GHdata.managePlayer(call.uid, player.level);
+ GHdata.managePlayer(call.req.uid, call.req.level);
+ } else {
+ GHdata.delPlayer(call.req.uid);
+ }
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiOpen.ts b/src/api_s2c/gonghui/ApiOpen.ts
new file mode 100644
index 0000000..2fe7302
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiOpen.ts
@@ -0,0 +1,8 @@
+import { ApiCall } from "tsrpc";
+import { GHManage } from '../../public/gonghui/manage';
+import { ReqOpen, ResOpen } from "../../shared/protocols/gonghui/PtlOpen";
+
+export default async function (call: ApiCall) {
+
+ call.succ((await GHManage.getGH(call.conn.gud.ghId)).data);
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiTanHe.ts b/src/api_s2c/gonghui/ApiTanHe.ts
new file mode 100644
index 0000000..6b74652
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiTanHe.ts
@@ -0,0 +1,16 @@
+import { ApiCall } from "tsrpc";
+import { ReqTanHe, ResTanHe } from "../../shared/protocols/gonghui/PtlTanHe";
+
+export default async function (call: ApiCall) {
+ let GHdata = await call.conn.gonghui;
+ let createPlayer = await G.redis.get('user', GHdata.data.createPlayer.uid);
+
+ if (GHdata.data.tanhe) call.error(globalThis.lng.gonghui_24);
+
+ if (createPlayer && (G.time - createPlayer.logoutTime > G.gc.shili_com.tanheTime || G.time - createPlayer.loginTime > G.gc.shili_com.tanheTime)) {
+ await GHdata.tanhe(call.uid);
+ call.succ({});
+ } else {
+ call.error(globalThis.lng.gonghui_25);
+ }
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiTaskOpen.ts b/src/api_s2c/gonghui/ApiTaskOpen.ts
new file mode 100644
index 0000000..2433e89
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiTaskOpen.ts
@@ -0,0 +1,31 @@
+import { ApiCall } from "tsrpc";
+import { ActionLog } from '../../public/actionLog/actionLog';
+import { ReqTaskOpen, ResTaskOpen } from "../../shared/protocols/gonghui/PtlTaskOpen";
+import { PublicShared } from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let gh = await call.conn.gonghui;
+ let data = (await G.mongodb.collection('gonghuiUser').findOne({ uid: call.uid }))?.task;
+
+ if (!gh.data.task || PublicShared.getToDayZeroTime() > gh.data.task.refreshTime) {
+ gh.data.task = {
+ finised: 0,
+ refreshTime: G.time
+ };
+ gh.updateDb({ $set: { task: gh.data.task } });
+ }
+
+ if (!data || PublicShared.getToDayZeroTime() > data.refreshTime) {
+ data = {
+ ghRec: [],
+ myRec: [],
+ refreshTime: G.time
+ };
+ G.mongodb.collection('gonghuiUser').updateOne({ uid: call.uid }, { $set: { task: data } }, { upsert: true });
+ }
+
+ call.succ({
+ ...data,
+ progress: await ActionLog.getDayLog(call.uid, ...G.gc.shili_com.task.map(t => t.taskId))
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiTaskReceive.ts b/src/api_s2c/gonghui/ApiTaskReceive.ts
new file mode 100644
index 0000000..fa15dfd
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiTaskReceive.ts
@@ -0,0 +1,43 @@
+import { ApiCall } from "tsrpc";
+import { ActionLog } from '../../public/actionLog/actionLog';
+import { PlayerFun } from '../../public/player';
+import { ReqTaskReceive, ResTaskReceive } from "../../shared/protocols/gonghui/PtlTaskReceive";
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let prize: atn[];
+ let gh = await call.conn.gonghui;
+ let data = await G.mongodb.collection('gonghuiUser').findOne({ uid: call.uid });
+
+ if (call.req.type == 'gh') {
+
+
+ if (!G.gc.shili_com.ghTask[call.req.index]) return call.error(globalThis.lng.gonghui_15);
+ if (G.gc.shili_com.ghTask[call.req.index].total > gh.data.task.finised) return call.error(globalThis.lng.gonghui_26);
+ if (data.task.ghRec.includes(call.req.index)) return call.error(globalThis.lng.gonghui_27);
+
+ prize = G.gc.shili_com.ghTask[call.req.index].prize;
+
+ G.mongodb.collection('gonghuiUser').updateOne({ uid: call.uid }, { $push: { 'task.ghRec': call.req.index } });
+ } else {
+
+ if (!G.gc.shili_com.task[call.req.index]) return call.error(globalThis.lng.gonghui_15);
+ if (G.gc.shili_com.task[call.req.index].total > await ActionLog.getDayLog(call.uid, G.gc.shili_com.task[call.req.index].taskId)) return call.error(globalThis.lng.gonghui_26);
+ if (data.task.myRec.includes(call.req.index)) return call.error(globalThis.lng.gonghui_27);
+
+ prize = G.gc.shili_com.task[call.req.index].prize;
+
+ G.mongodb.collection('gonghuiUser').updateOne({ uid: call.uid }, { $push: { 'task.myRec': call.req.index } });
+
+ gh.data.task.finised++;
+ gh.updateDb({ $inc: { 'task.finised': 1 } });
+
+ G.gc.shili_com.task[call.req.index].addExp && gh.addExp(G.gc.shili_com.task[call.req.index].addExp);
+ }
+
+ await PlayerFun.sendPrize(call, prize);
+ HongDianChange.sendChangeKey(call.uid, ['gonghuihd']);
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghui/ApiUpWz.ts b/src/api_s2c/gonghui/ApiUpWz.ts
new file mode 100644
index 0000000..621248a
--- /dev/null
+++ b/src/api_s2c/gonghui/ApiUpWz.ts
@@ -0,0 +1,22 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ReqUpWz, ResUpWz } from "../../shared/protocols/gonghui/PtlUpWz";
+
+export default async function (call: ApiCall) {
+
+ const conf = G.gc.shili_wz[call.req.type];
+ const nextLv = call.conn.gud.ghwz[call.req.type] + 1;
+
+ if (!conf) return call.error(globalThis.lng.gonghui_15);
+ if (!conf[nextLv]) return call.error(globalThis.lng.gonghui_28);
+
+ await PlayerFun.checkNeedIsMeet(call, conf[nextLv].need);
+ await PlayerFun.cutNeed(call, conf[nextLv].need);
+
+ let change = Object.assign({}, call.conn.gud.ghwz);
+ change[call.req.type]++;
+
+ await PlayerFun.addAttr(call, { ghwz: change });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghuibaozang/ApiLottery.ts b/src/api_s2c/gonghuibaozang/ApiLottery.ts
new file mode 100644
index 0000000..d9f6a8d
--- /dev/null
+++ b/src/api_s2c/gonghuibaozang/ApiLottery.ts
@@ -0,0 +1,96 @@
+import { ApiCall } from "tsrpc";
+import { ChatFun } from '../../public/chat';
+import { GongHuiBaoZang } from '../../public/gonghuibaozang';
+import { PlayerFun } from '../../public/player';
+import { ReqLottery, ResLottery } from "../../shared/protocols/gonghuibaozang/PtlLottery";
+import { PublicShared } from '../../shared/public/public';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let need: atn[];
+ let prize: atn[];
+ // @ts-ignore
+ need = G.gc.com.GuildDraw_Cos.value;
+ // let need = [{ a: 'item', t: '17', n: 1 }]
+ let diaoluoid = G.gc.com.GuildDraw_Fall.value;
+ let _tmp;
+
+ if (call.req.type == 1) {
+ // 抽奖一次
+ await PlayerFun.checkNeedIsMeet(call, need);
+ prize = [];
+ prize = prize.concat(PublicShared.randomDropGroup(diaoluoid, call.req.type));
+ _tmp = {
+ prize: prize,
+ name: call.conn.gud.name,
+ ctime: G.time,
+ uid: call.uid
+ };
+ // await G.mongodb.collection('ghbzcjlog').insertOne(_tmp);
+ GongHuiBaoZang.newMsg(_tmp);
+
+ } else if (call.req.type == 10) {
+ // 抽奖十次
+ need = need.map(_n => {
+ return { ..._n, n: _n.n * call.req.type };
+ });
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+
+ prize = [];
+ prize = prize.concat(PublicShared.randomDropGroup(diaoluoid, call.req.type));
+ let _setData = [];
+ for (let index = 0; index < call.req.type; index++) {
+ const element = prize[index];
+ _tmp = {
+ prize: [element],
+ name: call.conn.gud.name,
+ ctime: G.time,
+ uid: call.uid
+ };
+ _setData.push(_tmp);
+ }
+ GongHuiBaoZang.newMsg(_setData);
+
+ }
+
+ need && await PlayerFun.cutNeed(call, need);
+ await PlayerFun.sendPrize(call, prize);
+
+ // let playName;
+ // if (prize[0].a == "item") {
+ // playName = G.gc.item[prize[0].t].name;
+ // } else if (prize[0].a == "hero") {
+ // playName = G.gc.hero[prize[0].t].name;
+ // } else if (prize[0].a == "equip") {
+ // playName = G.gc.equip[prize[0].t].name;
+ // } else if (prize[0].a == "shiwu") {
+ // playName = G.gc.shiwu[prize[0].t].name;
+ // } else {
+ // playName = "钻石";
+ // }
+
+ for (let index = 0; index < prize.length; index++) {
+ const element = prize[index];
+
+ if (element.a == "item" && G.gc.item[element.t].type == 3){
+ let playName = G.gc.item[element.t].name
+ ChatFun.newMsg({
+ type: 'local',
+ msg: G.gc.pmd.guild_pmd,
+ time: G.time,
+ sender: 'system',
+ otherData: {
+ pmd: true,
+ args: [call.conn.gud.name, playName]
+ }
+ });
+ }
+ }
+
+ HongDianChange.sendChangeKey(call.uid, ['gonghuihd'])
+
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonghuibaozang/ApiOpen.ts b/src/api_s2c/gonghuibaozang/ApiOpen.ts
new file mode 100644
index 0000000..8104368
--- /dev/null
+++ b/src/api_s2c/gonghuibaozang/ApiOpen.ts
@@ -0,0 +1,12 @@
+import { ApiCall } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../shared/protocols/gonghuibaozang/PtlOpen";
+
+export default async function (call: ApiCall) {
+ /**查询所有抽奖日志 */
+ let result = await G.mongodb.collection('ghbzcjlog').findOne({ type: "gonghuibaozang_msg"})
+ let _res = result?.list || []
+
+ call.succ({
+ cjlog: _res
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonglukuangbiao/ApiBuy.ts b/src/api_s2c/gonglukuangbiao/ApiBuy.ts
new file mode 100644
index 0000000..d336c43
--- /dev/null
+++ b/src/api_s2c/gonglukuangbiao/ApiBuy.ts
@@ -0,0 +1,24 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ReqBuy, ResBuy } from "../../shared/protocols/gonglukuangbiao/PtlBuy";
+
+export default async function (call: ApiCall) {
+ call.req.num = Math.floor(call.req.num);
+ if (call.req.num <= 0) return call.error('', { code: 0 });
+
+ let db = await G.mongodb.collection('wanted').findOne({ uid: call.uid });
+ if (db.toDayBuyNum + call.req.num > G.gc.gonglukuangbiao.vipBuyFightNum[call.conn.gud.vip]) return call.error('', { code: -1 });
+
+ let _con = JSON.parse(JSON.stringify(G.gc.gonglukuangbiao.buyFightNumNeed))
+ let need = []
+ for (let index = db.toDayBuyNum; index < db.toDayBuyNum + call.req.num; index++) {
+ need.push(_con[index])
+ }
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ G.mongodb.collection('wanted').updateOne({ uid: call.uid }, { $inc: { toDayBuyNum: call.req.num } });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonglukuangbiao/ApiFight.ts b/src/api_s2c/gonglukuangbiao/ApiFight.ts
new file mode 100644
index 0000000..0479816
--- /dev/null
+++ b/src/api_s2c/gonglukuangbiao/ApiFight.ts
@@ -0,0 +1,85 @@
+import math from "mathjs";
+import { ApiCall } from "tsrpc";
+import { FightFun } from '../../public/fight';
+import { PlayerFun } from '../../public/player';
+import { ReqFight, ResFight } from "../../shared/protocols/gonglukuangbiao/PtlFight";
+import { PublicShared } from '../../shared/public/public';
+import { HongDianChange } from "../hongdian/fun";
+
+export default async function (call: ApiCall) {
+ let conf = G.gc.gonglukuangbiao.config[call.req.index];
+ if (!conf) return call.error('', { code: -1 });
+
+ let db = await G.mongodb.collection('wanted').findOne({ uid: call.uid });
+ if (db.toDayUseNum >= G.gc.gonglukuangbiao.fightNum + db.toDayBuyNum) return call.error('', { code: -2 });
+
+ let enemy = db.enemys[call.req.index];
+ let result = FightFun.fight([await call.conn.getDefaultFightData(), enemy]);
+ let res: ResFight = { result: result };
+ let addWanted = 0;
+
+ let _wanted = enemy["wanted"] || 0;
+ let _indexConf = Object.values(G.gc.gonglukuangbiao.wanted).filter(e => e.wanted[0] <= _wanted && _wanted <= e.wanted[1]);
+ if (!_indexConf) return call.error('', { code: -2 });
+ let _qdSuccess: boolean = false
+ let _prize: atn[]
+
+ if (result.winSide == 0) {
+ let lv = enemy.player.lv
+ _prize = [{ a: "attr", t: "jinbi", n: Math.floor(eval(_indexConf[0].jinbi)) }]
+
+ let _fA = Math.max(0, 1 - (db?.toDayBeiFightNum || 0) * 0.1)
+ let _fB = 1 - (Math.max(0, Number(((call.conn.gud.lv - enemy.player.lv) * 0.1).toFixed(1))))
+ let _qdPro = Math.max(_indexConf[0].fightsppro[1], _indexConf[0].fightsppro[0] * _fA * _fB)
+ _qdSuccess = PublicShared.randomNum(1, 100) > _qdPro ? false : true
+ // npc
+ if (enemy.player.isNpc && _qdSuccess) {
+ _prize = _prize.concat(G.gc.gonglukuangbiao.drop1.map(dlz => PublicShared.randomDropGroup(dlz)).reduce((a, b) => a.concat(b)))
+ }
+
+ if (!enemy.player.isNpc) {
+ if (_qdSuccess) {
+ let _userSP = await G.mongodb.collection('item').find({ uid: enemy.player.uid, itemId: { $in: G.gc.gonglukuangbiao.qdusersp } }).toArray()
+ _qdSuccess = _userSP && _userSP.length > 0 ? true : false
+ if (_qdSuccess) _prize = _prize.concat([{ a: "item", t: _userSP.random().itemId, n: 1 }])
+ }
+ G.mongodb.collection('wanted').findOne({ uid: enemy.player.uid }).then(db => {
+ let w = db.wanted - 2 < 0 ? 0 : db.wanted - 2;
+ let num = db?.toDayBeiFightNum ? (db?.toDayBeiFightNum + 1) : 1
+ G.mongodb.collection('wanted').updateOne({ uid: enemy.player.uid }, { $set: { wanted: w, toDayBeiFightNum: num } });
+ });
+
+ }
+
+ // addWanted = conf.killHonor;
+ // if (enemy.player.isNpc || call.conn.gud.lv - enemy.player.lv <= 10) {
+ // let winNum = db.toDayWin[call.req.index] * 10;
+ // let round = conf.round.default - winNum < conf.round.min ? conf.round.min : conf.round.default;
+ // let isRound = PublicShared.randomNum(1, 100) <= round;
+ // let dropArr = isRound ? G.gc.gonglukuangbiao.drop1 : G.gc.gonglukuangbiao.drop2;
+ // if (dropArr.length > 0) {
+ // let prize = dropArr.map(id => PublicShared.randomDropGroup(id)).reduce((a, b) => a.concat(b));
+ // prize = PublicShared.mergePrize(prize);
+ // res.prize = prize;
+ // await PlayerFun.sendPrize(call, prize);
+ // }
+ // }
+
+ // if (!enemy.player.isNpc) {
+ // G.mongodb.collection('wanted').findOne({ uid: enemy.player.uid }).then(db => {
+ // let w = db.wanted - 2 < 0 ? 0 : db.wanted - 2;
+ // G.mongodb.collection('wanted').updateOne({ uid: enemy.player.uid }, { $set: { wanted: w } });
+ // });
+ // }
+
+ G.mongodb.collection('wanted').updateOne({ uid: call.uid }, { $inc: G.mongodb.createTreeObj({ key: `toDayWin.${_indexConf[0].index}`, val: 1 }) });
+ _prize && await PlayerFun.sendPrize(call, _prize);
+ }
+
+ addWanted = _qdSuccess ? _indexConf[0].spwanted : _indexConf[0].addwanted
+ G.mongodb.collection('wanted').updateOne({ uid: call.uid }, { $inc: { wanted: addWanted, toDayUseNum: 1 } });
+
+ HongDianChange.sendChangeKey(call.uid, ['taskhd', 'huodonghd'])
+ res.prize = _prize || []
+ call.succ(res);
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonglukuangbiao/ApiOpen.ts b/src/api_s2c/gonglukuangbiao/ApiOpen.ts
new file mode 100644
index 0000000..5ed4763
--- /dev/null
+++ b/src/api_s2c/gonglukuangbiao/ApiOpen.ts
@@ -0,0 +1,110 @@
+import {ApiCall} from "tsrpc";
+import {CollectionWanted} from '../../module/collection_wanted';
+import {ChatFun} from '../../public/chat';
+import {FightFun} from '../../public/fight';
+import {formatNpcData} from '../../shared/fightControl/fightFun';
+import {joinFightData} from '../../shared/fightControl/fightType';
+import {ReqOpen, ResOpen} from "../../shared/protocols/gonglukuangbiao/PtlOpen";
+import {player} from '../../shared/protocols/user/type';
+import {PublicShared} from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+
+ let db: Partial = await G.mongodb.collection('wanted').findOne({uid: call.uid}) || {};
+
+ if (!db.refreshTime || db.refreshTime < PublicShared.getToDayZeroTime()) {
+ let cut = G.gc.gonglukuangbiao.timeDeduct;
+ let w = (db?.wanted || 0) - cut < 0 ? 0 : db.wanted - cut;
+
+ db.wanted = w;
+ db.toDayWin = {
+ '0': 0,
+ '1': 0,
+ '2': 0
+ };
+ db.toDayBuyNum = 0;
+ db.toDayUseNum = 0;
+ db.toDayBeiFightNum = 0;
+ db.refreshTime = G.time;
+
+ G.mongodb.collection('wanted').updateOne({uid: call.uid}, {
+ $set: {
+ wanted: db.wanted,
+ toDayWin: db.toDayWin,
+ toDayBuyNum: db.toDayBuyNum,
+ toDayUseNum: db.toDayUseNum,
+ toDayBeiFightNum: db.toDayBeiFightNum,
+ refreshTime: G.time,
+ }
+ }, {upsert: true});
+ }
+ if (!db.enemys) {
+ db.enemys = await refreshEnemys(call);
+ G.mongodb.collection('wanted').updateOne({uid: call.uid}, {
+ $set: {
+ enemys: db.enemys
+ }
+ }, {upsert: true});
+ }
+
+ call.succ(db as any);
+}
+
+export async function refreshEnemys(call: ApiCall) {
+ let section = [call.conn.gud.mapId - 8, call.conn.gud.mapId + 8];
+ //let allUser = Object.values(await G.redis.get('user')).filter(u => u.mapId >= section[0] && u.mapId <= section[1] && u.uid != call.uid);
+ //let dbUser = await G.mongodb.collection('wanted').find({uid: {$in: allUser.map(u => u.uid)}}).toArray();
+
+ let allUser = await G.mongodb.find('user',{
+ $and: [
+ { mapId: { $gte: section[0] } },
+ { mapid: { $lte: section[1] } },
+ { uid: { $ne: call.uid } }
+ ]
+ }, ['uid']);
+ let dbUser = await G.mongodb.find('wanted',{uid: {$in: allUser.map(u => u.uid)}},['uid','wanted']);
+
+ let enemys: joinFightData[] = [];
+
+ let configs = G.gc.gonglukuangbiao.config.reverse()
+ for (let idx = 0; idx < configs.length; idx++) {
+ let conf = configs[idx]
+ let needMax = configs[idx + 1]?.need || G.gc.gonglukuangbiao.wanted[idx].wanted[1]
+ let filter = dbUser.filter(u => conf.need <= u.wanted && u.wanted < needMax);
+ let uids = filter.map(f => f.uid);
+ dbUser.remove(u => uids.includes(u.uid));
+ let enemy = uids.length > 0 ? await FightFun.getPlayerFightData(uids.random()) : formatNpcData(conf.npc.random());
+ if (!enemy) enemy = formatNpcData(conf.npc.random())
+ if (enemy.player.isNpc) enemy.player.name = G.gc.gonglukuangbiao.npcname.random()
+ enemy["wanted"] = !enemy.player.isNpc ?
+ filter.filter(u => u.uid = enemy.player.uid)[0].wanted :
+ PublicShared.randomNum(G.gc.gonglukuangbiao.wanted[idx].wanted[0], G.gc.gonglukuangbiao.wanted[idx].wanted[1])
+ enemys.push(enemy);
+ }
+
+ return enemys.reverse();
+}
+
+export async function checkNewDay(gud: player, last: number, cur: number) {
+
+ G.mongodb.collection('wanted').findOne({uid: gud.uid}).then(db => {
+ if (!db) return;
+ let cut = G.gc.gonglukuangbiao.timeDeduct;
+ let w = db.wanted - cut < 0 ? 0 : db.wanted - cut;
+ G.mongodb.collection('wanted').updateOne({uid: gud.uid}, {$set: {wanted: w}});
+
+ if (w >= G.gc.gonglukuangbiao.config[0].need) {
+
+ ChatFun.newMsg({
+ type: 'local',
+ msg: G.gc.pmd.glkb_pmd,
+ time: G.time,
+ sender: 'system',
+ otherData: {
+ pmd: true,
+ args: [gud.name]
+ }
+ });
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gonglukuangbiao/ApiRefresh.ts b/src/api_s2c/gonglukuangbiao/ApiRefresh.ts
new file mode 100644
index 0000000..a4e4067
--- /dev/null
+++ b/src/api_s2c/gonglukuangbiao/ApiRefresh.ts
@@ -0,0 +1,18 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ReqRefresh, ResRefresh } from "../../shared/protocols/gonglukuangbiao/PtlRefresh";
+import { refreshEnemys } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+
+ if (!call.req.free) {
+ let need = G.gc.gonglukuangbiao.refreshNeed;
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+ }
+
+ let enemys = await refreshEnemys(call);
+ G.mongodb.collection('wanted').updateOne({ uid: call.uid }, { $set: { enemys: enemys } });
+
+ call.succ({ enemys: enemys });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gongyu/mingdao/ApiActive.ts b/src/api_s2c/gongyu/mingdao/ApiActive.ts
new file mode 100644
index 0000000..f482643
--- /dev/null
+++ b/src/api_s2c/gongyu/mingdao/ApiActive.ts
@@ -0,0 +1,25 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqActive, ResActive } from "../../../shared/protocols/gongyu/mingdao/PtlActive";
+import { getFinished } from './fun';
+
+export default async function (call: ApiCall) {
+ let id = Number(call.req.id);
+ if (!G.gc.mingdao[id]) return call.errorCode(-1);
+ if (call.conn.gud.shoucangping[id]) return call.errorCode(-2);
+
+ let frontId = id - 1;
+ if (G.gc.mingdao[frontId] && call.conn.gud.shoucangping[frontId] < G.gc.mingdao[frontId].level) return call.errorCode(-3);
+
+ let finish = await getFinished(call.conn, G.gc.mingdao[id].condition.map(c => c[0]));
+
+ for (let cond of G.gc.mingdao[id].condition) {
+ if (finish[cond[0]] < cond[1]) return call.errorCode(-4);
+ }
+
+ let send = Object.assign({}, call.conn.gud.shoucangping);
+ send[id] = 1;
+ await PlayerFun.addAttr(call, { shoucangping: send });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gongyu/mingdao/ApiOpen.ts b/src/api_s2c/gongyu/mingdao/ApiOpen.ts
new file mode 100644
index 0000000..0ced3fa
--- /dev/null
+++ b/src/api_s2c/gongyu/mingdao/ApiOpen.ts
@@ -0,0 +1,49 @@
+import { ApiCall, BaseConnection } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/gongyu/mingdao/PtlOpen";
+import { hongdianVal } from '../../../shared/protocols/hongdian/PtlGet';
+import { getFinished } from './fun';
+
+export default async function (call: ApiCall) {
+ let db = await G.mongodb.collection('mingdao').findOne({ uid: call.uid });
+ let types = [...new Set(Object.values(G.gc.mingdao).map(conf => conf.condition.map(cond => cond[0])).reduce((a, b) => a.concat(b)))];
+
+ call.succ({
+ list: Object.fromEntries(Object.keys(G.gc.mingdao).map(id => {
+ return [id, {
+ pre: db?.list?.[id]?.pre || 0,
+ recPrize: db?.list?.[id]?.recPrize || []
+ }];
+ })),
+ taskFinished: await getFinished(call.conn, types)
+ });
+}
+
+export async function md_redPoint(call: BaseConnection): Promise {
+ if (Object.keys(call.gud.shoucangping || {}).length >= Object.keys(G.gc.mingdao).length) return { show: false };
+
+
+ let next = Object.keys(call.gud.shoucangping || {}).length + 1;
+ let front = next - 1;
+ let conf = G.gc.mingdao[next];
+ if (G.gc.mingdao[front] && call.gud.shoucangping[front] < G.gc.mingdao[front].level) return { show: false };
+
+ let types = [...conf.condition.map(v => v[0])];
+ let finish = await getFinished(call, types);
+ let meetLen = conf.condition.filter(v => finish[v[0]] >= v[1]).length;
+ if (meetLen < conf.condition.length) return { show: false };
+
+ return { show: true };
+}
+
+function md_cur_condArr(call: BaseConnection) {
+ let next = Object.keys(call.gud.shoucangping || {}).length + 1;
+ let conf = G.gc.mingdao[next];
+
+ if (!conf) return [];
+ return conf.condition.map(v => v[0]);
+}
+
+export function md_redPoint_check(call: BaseConnection, type: string) {
+ if (!call || !md_cur_condArr(call).includes(type)) return;
+ G.server.sendMsgByUid(call.uid, 'msg_s2c/HongDianChange', ['mingdao']);
+}
\ No newline at end of file
diff --git a/src/api_s2c/gongyu/mingdao/ApiRecPrize.ts b/src/api_s2c/gongyu/mingdao/ApiRecPrize.ts
new file mode 100644
index 0000000..0b30a44
--- /dev/null
+++ b/src/api_s2c/gongyu/mingdao/ApiRecPrize.ts
@@ -0,0 +1,27 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqRecPrize, ResRecPrize } from "../../../shared/protocols/gongyu/mingdao/PtlRecPrize";
+
+export default async function (call: ApiCall) {
+ let id = call.req.id;
+ let recId = call.req.recId;
+
+ if (!G.gc.mingdao[id]) return call.errorCode(-1);
+ if (!G.gc.mingdao[id].reward[recId]) return call.errorCode(-2);
+ if (call.conn.gud.shoucangping[id] < Number(recId)) return call.errorCode(-3);
+
+ let recArr = (await G.mongodb.collection('mingdao').findOne({ uid: call.uid }))?.list?.[id]?.recPrize || [];
+ if (recArr.includes(recId)) return call.errorCode(-4);
+
+ await PlayerFun.sendPrize(call, [].concat(G.gc.mingdao[id].reward[recId]));
+
+ G.mongodb.collection('mingdao').updateOne(
+ { uid: call.uid },
+ { $push: G.mongodb.createTreeObj({ key: `list.${id}.recPrize`, val: recId }) },
+ { upsert: true }
+ );
+
+ call.succ({
+ prize: [].concat(G.gc.mingdao[id].reward[recId])
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gongyu/mingdao/ApiRepair.ts b/src/api_s2c/gongyu/mingdao/ApiRepair.ts
new file mode 100644
index 0000000..b8e30d8
--- /dev/null
+++ b/src/api_s2c/gongyu/mingdao/ApiRepair.ts
@@ -0,0 +1,57 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqRepair, ResRepair } from "../../../shared/protocols/gongyu/mingdao/PtlRepair";
+import { prizeType } from '../../../shared/protocols/type';
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let id = call.req.id;
+ if (!G.gc.mingdao[id]) return call.errorCode(-1);
+
+ let conf = G.gc.mingdao[id];
+ if (call.conn.gud.shoucangping[id] >= conf.level) return call.errorCode(-2);
+
+ let need: prizeType[] = [];
+ let itemNeed = { ...conf.need, n: conf.need.n * call.req.num };
+ let itemNum = await PlayerFun.getAtnNum(call, itemNeed);
+
+ if (itemNum < itemNeed.n) {
+ if (itemNum > 0) {
+ need.push({ ...itemNeed, n: itemNum });
+ }
+ need.push({ ...G.gc.mingdao_com.changeNeed, n: G.gc.mingdao_com.changeNeed.n * itemNeed.n - itemNum });
+ } else {
+ need.push(itemNeed);
+ }
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ let multiple = new Array(call.req.num).fill(1).map(v => PublicShared.randomDropAny(G.gc.mingdao_com.crit).multiple);
+ let addExp = multiple.map(v => v * G.gc.mingdao_com.addExp).reduce((a, b) => a + b);// G.gc.mingdao_com.addExp * multiple * call.req.num;
+ let curExp = (await G.mongodb.collection('mingdao').findOne({ uid: call.uid }))?.list?.[id]?.pre || 0;
+ let newExp = 0;
+
+ if (curExp + addExp >= conf.needExp) {
+ newExp = curExp + addExp - conf.needExp;
+ let send = Object.assign({}, call.conn.gud.shoucangping);
+ send[id] += 1;
+ await PlayerFun.addAttr(call, { shoucangping: send });
+
+ if (send[id] >= conf.level && G.gc.mingdao[~~id + 1]) {
+ G.server.sendMsgByUid(call.uid, 'msg_s2c/HongDianChange', ['mingdao']);
+ }
+ } else {
+ newExp = curExp + addExp;
+ }
+
+ G.mongodb.collection('mingdao').updateOne(
+ { uid: call.uid },
+ { $set: G.mongodb.createTreeObj({ key: `list.${id}.pre`, val: newExp }) },
+ { upsert: true }
+ );
+
+ call.succ({
+ multiple: multiple,
+ pre: newExp
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/gongyu/mingdao/fun.ts b/src/api_s2c/gongyu/mingdao/fun.ts
new file mode 100644
index 0000000..a91472c
--- /dev/null
+++ b/src/api_s2c/gongyu/mingdao/fun.ts
@@ -0,0 +1,43 @@
+import { BaseConnection } from 'tsrpc';
+import { Wjjl } from '../../../module/collection_wjjl';
+import { ActionLog } from '../../../public/actionLog/actionLog';
+
+
+function getPeijianGteColor5ID(){
+ var ids = [];
+ for(let id in G.gc.peijian){
+ if (G.gc.peijian[id].colour >= 5){
+ ids.push(id);
+ }
+ }
+ return ids;
+}
+let peijianGteColor5ID;
+
+
+export async function getFinished(conn: BaseConnection, types: string[]) {
+
+ if(!peijianGteColor5ID){
+ peijianGteColor5ID = getPeijianGteColor5ID();
+ // console.log('peijianGteColor5ID',peijianGteColor5ID);
+ }
+
+ let obj: k_v = {};
+ for (let type of types) {
+ if (type == 'power') obj[type] = await Wjjl.getVal(conn.uid, 'power');
+ else if (conn.gud[type] != undefined) obj[type] = conn.gud[type];
+ else if (type == 'use_attr_rmbmoney') obj[type] = await ActionLog.getRetainLog(conn.uid, 'use_attr_rmbmoney');
+ else if (type == 'zccg') obj[type] = (await G.mongodb.collection('pata').findOne({ uid: conn.uid }))?.lv || 0;
+ else if (type == 'equip_star_5') {
+ //let equips = await G.redis.get('equip', conn.uid);
+ //obj[type] = Object.values(equips).filter(e => e.star >= 5).length;
+ obj[type] = await G.mongodb.collection('equip').count({ uid: conn.uid, star: { $gte: 5 } });
+ } else if (type == 'peijian_colour_5') {
+ //let peijians = await G.redis.get('peijian', conn.uid);
+ //obj[type] = Object.values(peijians).filter(p => G.gc.peijian[p.peijianId].colour >= 5).length;
+ obj[type] = await G.mongodb.collection('peijian').count({ uid: conn.uid, peijianId: { $in: peijianGteColor5ID } });
+ }
+ }
+
+ return obj;
+}
\ No newline at end of file
diff --git a/src/api_s2c/gongyu/xunlianjihua/ApiReset.ts b/src/api_s2c/gongyu/xunlianjihua/ApiReset.ts
new file mode 100644
index 0000000..4ef8227
--- /dev/null
+++ b/src/api_s2c/gongyu/xunlianjihua/ApiReset.ts
@@ -0,0 +1,18 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqReset, ResReset } from "../../../shared/protocols/gongyu/xunlianjihua/PtlReset";
+
+export default async function (call: ApiCall) {
+
+ const need = [{ a: 'attr', t: 'rmbmoney', n: 50 }];
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+ await PlayerFun.addAttr(call, {
+ skills: {},
+ fightSkills: {},
+ useTujianLvPoint: 0,
+ });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gongyu/xunlianjihua/ApiUpSkill.ts b/src/api_s2c/gongyu/xunlianjihua/ApiUpSkill.ts
new file mode 100644
index 0000000..4caa4e2
--- /dev/null
+++ b/src/api_s2c/gongyu/xunlianjihua/ApiUpSkill.ts
@@ -0,0 +1,26 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqUpSkill, ResUpSkill } from "../../../shared/protocols/gongyu/xunlianjihua/PtlUpSkill";
+import { PlayerShared } from '../../../shared/public/player';
+
+export default async function (call: ApiCall) {
+
+ let id = call.req.skillId;
+ let conf = G.gc.xunlianjihua[id];
+ let allPoints = (G.gc.playerLv[call.conn.gud.lv].tujianlv + (PlayerShared.getMingDaoBuff(call.conn.gud, 'zjgy_xld') || 0));
+ let points = allPoints - call.conn.gud.useTujianLvPoint;
+ let skills = Object.assign({}, call.conn.gud.skills);
+
+ if (!conf) return call.error(globalThis.lng.gongyu_1);
+ if (call.conn.gud.useTujianLvPoint < conf.cond) return call.error(globalThis.lng.gongyu_2);
+ if (conf.front[0] && (!skills[conf.front[0]] || skills[conf.front[0]] < conf.front[1])) return call.error(globalThis.lng.gongyu_3);
+ if (skills[id] >= conf.lv) return call.errorCode(-1);
+ if (points < conf.need) return call.errorCode(-2);
+
+ if (!skills[id]) skills[id] = 1;
+ else skills[id]++;
+
+ await PlayerFun.addAttr(call, { skills: skills, useTujianLvPoint: call.conn.gud.useTujianLvPoint + conf.need });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/gongyu/zuozhanjihua/ApiSetSkill.ts b/src/api_s2c/gongyu/zuozhanjihua/ApiSetSkill.ts
new file mode 100644
index 0000000..0d5dfeb
--- /dev/null
+++ b/src/api_s2c/gongyu/zuozhanjihua/ApiSetSkill.ts
@@ -0,0 +1,19 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqSetSkill, ResSetSkill } from "../../../shared/protocols/gongyu/zuozhanjihua/PtlSetSkill";
+
+export default async function (call: ApiCall) {
+
+
+ const args = call.req;
+ const skillIds = Object.values(args).filter(id => id != '');
+
+ if (skillIds.isDuplication()) return call.error(globalThis.lng.gongyu_4);
+ if (skillIds.filter(id => G.gc.xunlianjihua[id] == undefined).length > 0) return call.error(globalThis.lng.gongyu_5);
+ if (skillIds.filter(id => call.conn.gud.skills[id] == undefined).length > 0) return call.error(globalThis.lng.gongyu_6);
+ if (skillIds.filter(id => G.gc.xunlianjihua[id].use == 0).length > 0) return call.error(globalThis.lng.gongyu_7);
+
+ await PlayerFun.addAttr(call, { fightSkills: args });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/jfs/ApiBuyNum.ts b/src/api_s2c/hbzb/jfs/ApiBuyNum.ts
new file mode 100644
index 0000000..2f553a9
--- /dev/null
+++ b/src/api_s2c/hbzb/jfs/ApiBuyNum.ts
@@ -0,0 +1,37 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqBuyNum, ResBuyNum } from "../../../shared/protocols/hbzb/jfs/PtlBuyNum";
+import { prizeType } from '../../../shared/protocols/type';
+import { PublicShared } from '../../../shared/public/public';
+import { HongDianChange } from "../../hongdian/fun";
+import { checkIsOpen } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ if (!checkIsOpen()) return call.error(globalThis.lng.hbzb_7);
+ let num = Math.floor(call.req.num);
+ if (num < 1) return call.error(globalThis.lng.gongyu_4);
+ let dbData = await G.mongodb.cPlayerInfo('hbzb').findOne({ uid: call.uid, type: 'hbzb' });
+ let buyNum = dbData.data.buyFightNum;
+ let maxNum = G.gc.hbzb.jfsBuyFightNum[call.conn.gud.vip] || G.gc.hbzb.jfsBuyFightNum.slice(-1)[0];
+
+ if (buyNum + num > maxNum) return call.error(globalThis.lng.hbzb_8);
+
+
+ let need: prizeType[] = [];
+ for (let n = 1; n <= num; n++) {
+ let cn = buyNum + n;
+ let conf = G.gc.hbzb.jfsBuyFightNumNeed.find(c => cn >= c.nums[0] && cn <= c.nums[1]);
+ need.push(...conf.need);
+ }
+ need = PublicShared.mergePrize(need);
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ await G.mongodb.cPlayerInfo('hbzb').updateOne(
+ { uid: call.uid, type: 'hbzb' },
+ { $set: { 'data.buyFightNum': buyNum + num } }
+ );
+ HongDianChange.sendChangeKey(call.uid, ['hbzbhd'])
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/jfs/ApiFight.ts b/src/api_s2c/hbzb/jfs/ApiFight.ts
new file mode 100644
index 0000000..da42824
--- /dev/null
+++ b/src/api_s2c/hbzb/jfs/ApiFight.ts
@@ -0,0 +1,64 @@
+import { ApiCall } from "tsrpc";
+import { FightFun } from '../../../public/fight';
+import { PlayerFun } from '../../../public/player';
+import { Rank } from '../../../public/rank/rank';
+import { ReqFight, ResFight } from "../../../shared/protocols/hbzb/jfs/PtlFight";
+import { PublicShared } from '../../../shared/public/public';
+import { HongDianChange } from "../../hongdian/fun";
+import { checkIsOpen } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ if (!checkIsOpen()) return call.error(globalThis.lng.hbzb_7);
+ let dbData = await G.mongodb.cPlayerInfo('hbzb').findOne({ uid: call.uid, type: 'hbzb' });
+ let data = dbData.data;
+
+ if (data.useFightNum >= data.buyFightNum + G.gc.hbzb.jfsFightNum) return call.errorCode(-3);
+
+ let enemy = data.enemy.find(e => e.data.player.uid == call.req.uid);
+ if (!enemy) return call.errorCode(-2);
+ if (enemy.result != null) return call.errorCode(-1);
+
+ let myData = await call.conn.getDefaultFightData();
+ let result = FightFun.fight([myData, enemy.data]);
+ enemy.result = result.winSide;
+
+ let addJf = PublicShared.randomNum(30, 35);
+ if (result.winSide == 0) addJf = addJf;
+ else addJf = 0;
+
+ result.winSide == 0 && Rank.list.hbzbLocal.addNew({
+ ...myData,
+ valArr: [data.jifen + addJf]
+ });
+
+ let prize = result.winSide == 0 ? G.gc.hbzb.jfsFightWinPrize.map(i => { return { ...i, n: addJf }; }) : [];
+ await PlayerFun.sendPrize(call, prize);
+
+ let change: ResFight['change'] = { enemy: data.enemy, useFightNum: data.useFightNum + 1, jifen: data.jifen + addJf };
+ if (data.enemy.filter(e => e.result == null).length < 1) {
+ let callRes = await G.clientCross.callApi('hbzb/jfs/GetEnemy', { uid: call.uid, auto: true });
+ change.enemy = callRes.res.enemy.map(e => { return { ...e, result: null }; });
+ }
+
+ await G.mongodb.cPlayerInfo('hbzb').updateOne(
+ { uid: call.uid, type: 'hbzb' },
+ { $set: { 'data.enemy': change.enemy, 'data.useFightNum': change.useFightNum, 'data.jifen': change.jifen }, $inc: { 'data.winNum': result.winSide == 0 ? 1 : 0 } }
+ );
+
+ G.clientCross.sendMsg('msg_cross/HbzbJfsLog', {
+ uid: call.conn.uid,
+ toUid: enemy.data.player.uid,
+ log: result
+ });
+
+ HongDianChange.sendChangeKey(call.uid, ['hbzbhd']);
+
+ call.succ({
+ result: result,
+ prize: prize,
+ change: {
+ ...change,
+ rank: await Rank.list.hbzbLocal.getRankSortByOne(call.uid)
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/jfs/ApiGetLog.ts b/src/api_s2c/hbzb/jfs/ApiGetLog.ts
new file mode 100644
index 0000000..47e41eb
--- /dev/null
+++ b/src/api_s2c/hbzb/jfs/ApiGetLog.ts
@@ -0,0 +1,6 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetLog, ResGetLog } from "../../../shared/protocols/hbzb/jfs/PtlGetLog";
+
+export default async function (call: ApiCall) {
+ call.succ((await G.clientCross.callApi('hbzb/jfs/GetLog', { uid: call.uid })).res || []);
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/jfs/ApiOpen.ts b/src/api_s2c/hbzb/jfs/ApiOpen.ts
new file mode 100644
index 0000000..f6cdd10
--- /dev/null
+++ b/src/api_s2c/hbzb/jfs/ApiOpen.ts
@@ -0,0 +1,48 @@
+import { ApiCall } from "tsrpc";
+import { Rank } from '../../../public/rank/rank';
+import { ReqOpen, ResOpen } from "../../../shared/protocols/hbzb/jfs/PtlOpen";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let dbData = await G.mongodb.cPlayerInfo('hbzb').findOne({ uid: call.uid, type: 'hbzb' });
+ let data: typeof dbData.data = dbData?.data || {} as any;
+
+ if (dbData == null) {
+ Rank.list.hbzbLocal.addNew({
+ ...await call.conn.getDefaultFightData(),
+ valArr: [1000]
+ });
+ }
+
+ if (!data.refreshTime || data.refreshTime < PublicShared.getToDayZeroTime()) {
+ data.winNum = 0;
+ data.buyFightNum = 0;
+ data.useFightNum = 0;
+ data.refreshTime = G.time;
+ data.winRecPrize = [];
+ data.useRefreshNum = 0;
+
+ if (!data.enemy) {
+ data.jifen = 1000;
+ let callRes = await G.clientCross.callApi('hbzb/jfs/GetEnemy', { uid: call.uid, auto: true });
+ if (callRes.res.enemy.length)
+ data.enemy = callRes.res.enemy.map(e => { return { ...e, result: null }; });
+ }
+
+ G.mongodb.cPlayerInfo('hbzb').updateOne(
+ { uid: call.uid, type: 'hbzb' },
+ { $set: { data: data } },
+ { upsert: true }
+ );
+ }
+
+ call.succ({
+ ...data,
+ rank: await Rank.list.hbzbLocal.getRankSortByOne(call.uid)
+ });
+}
+
+export function checkIsOpen() {
+ let weekZeroTime = PublicShared.getToWeekMondayZeroTime();
+ return G.time >= weekZeroTime + G.gc.hbzb.jfsOpenTime[0] && G.time <= weekZeroTime + G.gc.hbzb.jfsOpenTime[1];
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/jfs/ApiRec.ts b/src/api_s2c/hbzb/jfs/ApiRec.ts
new file mode 100644
index 0000000..6b47e63
--- /dev/null
+++ b/src/api_s2c/hbzb/jfs/ApiRec.ts
@@ -0,0 +1,24 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqRec, ResRec } from "../../../shared/protocols/hbzb/jfs/PtlRec";
+import { HongDianChange } from "../../hongdian/fun";
+import { checkIsOpen } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ if (!checkIsOpen()) return call.error(globalThis.lng.hbzb_7);
+ let dbData = await G.mongodb.cPlayerInfo('hbzb').findOne({ uid: call.uid, type: 'hbzb' });
+
+ if (dbData.data.winRecPrize.includes(call.req.index)) return call.error(globalThis.lng.hbzb_9);
+ if (dbData.data.winNum < G.gc.hbzb.jfsFightWinNumPrize[call.req.index].total) return call.error(globalThis.lng.hbzb_10);
+
+ await PlayerFun.sendPrize(call, G.gc.hbzb.jfsFightWinNumPrize[call.req.index].prize);
+
+ await G.mongodb.cPlayerInfo('hbzb').updateOne(
+ { uid: call.uid, type: 'hbzb' },
+ { $set: { 'data.winRecPrize': [...dbData.data.winRecPrize, call.req.index] } }
+ );
+ HongDianChange.sendChangeKey(call.uid, ['hbzbhd'])
+ call.succ({
+ prize: G.gc.hbzb.jfsFightWinNumPrize[call.req.index].prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/jfs/ApiRefresh.ts b/src/api_s2c/hbzb/jfs/ApiRefresh.ts
new file mode 100644
index 0000000..09c496f
--- /dev/null
+++ b/src/api_s2c/hbzb/jfs/ApiRefresh.ts
@@ -0,0 +1,30 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqRefresh, ResRefresh } from "../../../shared/protocols/hbzb/jfs/PtlRefresh";
+import { checkIsOpen } from './ApiOpen';
+
+export default async function (call: ApiCall) {
+ if (!checkIsOpen()) return call.error(globalThis.lng.hbzb_7);
+ let dbData = await G.mongodb.cPlayerInfo('hbzb').findOne({ uid: call.uid, type: 'hbzb' });
+ let refreshNum = dbData.data.useRefreshNum;
+
+ if (refreshNum >= G.gc.hbzb.jfsRefreshNum) {
+ await PlayerFun.checkNeedIsMeet(call, G.gc.hbzb.jfsRefreshNeed);
+ await PlayerFun.cutNeed(call, G.gc.hbzb.jfsRefreshNeed);
+ }
+
+ let change: ResRefresh['change'] = {};
+ change.useRefreshNum = dbData.data.useRefreshNum + 1;
+
+ let callRes = await G.clientCross.callApi('hbzb/jfs/GetEnemy', { uid: call.uid, auto: false });
+ change.enemy = callRes.res.enemy.map(e => { return { ...e, result: null }; });
+
+ await G.mongodb.cPlayerInfo('hbzb').updateOne(
+ { uid: call.uid, type: 'hbzb' },
+ { $set: { 'data.enemy': change.enemy, 'data.useRefreshNum': change.useRefreshNum } }
+ );
+
+ call.succ({
+ change: change
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/zbs/ApiBuyNum.ts b/src/api_s2c/hbzb/zbs/ApiBuyNum.ts
new file mode 100644
index 0000000..a3055c9
--- /dev/null
+++ b/src/api_s2c/hbzb/zbs/ApiBuyNum.ts
@@ -0,0 +1,34 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../../public/player';
+import { ReqBuyNum, ResBuyNum } from "../../../shared/protocols/hbzb/zbs/PtlBuyNum";
+import { prizeType } from '../../../shared/protocols/type';
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let num = Math.floor(call.req.num);
+ if (num < 1) return call.error(globalThis.lng.gongyu_4);
+ let dbData = await G.mongodb.cPlayerInfo('hbzbZbs').findOne({ uid: call.uid, type: 'hbzbZbs' });
+ let buyNum = dbData?.data?.buyFightNum || 0;
+ let maxNum = G.gc.hbzb.zbsBuyFightNum[call.conn.gud.vip] || G.gc.hbzb.zbsBuyFightNum.slice(-1)[0];
+
+ if (buyNum + num > maxNum) return call.error(globalThis.lng.hbzb_8);
+
+
+ let need: prizeType[] = [];
+ for (let n = 1; n <= num; n++) {
+ let cn = buyNum + n;
+ let conf = G.gc.hbzb.zbsBuyFightNumNeed.find(c => cn >= c.nums[0] && cn <= c.nums[1]);
+ need.push(...conf.need);
+ }
+ need = PublicShared.mergePrize(need);
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ await G.mongodb.cPlayerInfo('hbzbZbs').updateOne(
+ { uid: call.uid, type: 'hbzbZbs' },
+ { $set: { 'data.buyFightNum': buyNum + num } },
+ { upsert: true }
+ );
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/zbs/ApiFight.ts b/src/api_s2c/hbzb/zbs/ApiFight.ts
new file mode 100644
index 0000000..0f91591
--- /dev/null
+++ b/src/api_s2c/hbzb/zbs/ApiFight.ts
@@ -0,0 +1,60 @@
+import { ApiCall } from "tsrpc";
+import { FightFun } from '../../../public/fight';
+import { PlayerFun } from '../../../public/player';
+import { ReqFight, ResFight } from "../../../shared/protocols/hbzb/zbs/PtlFight";
+
+export default async function (call: ApiCall) {
+ let dbData = await G.mongodb.cPlayerInfo('hbzbZbs').findOne({ uid: call.uid, type: 'hbzbZbs' });
+ let data = dbData.data;
+ if(!data) return call.errorCode(1);
+ if (data.failCd && data.failCd + G.gc.hbzb.zbsFightFailCd > G.time) return call.errorCode(0);
+ if (data.useFightNum >= data.buyFightNum + G.gc.hbzb.zbsFightNum) return call.errorCode(-1);
+
+ let enemy = data.enemy.find(e => e.data.player.uid == call.req.uid);
+ if (!enemy) return call.errorCode(-2);
+
+ let eRank = (await G.clientCross.callApi('hbzb/zbs/GetStatus', { uid: enemy.data.player.uid })).res.status;
+ if (eRank != enemy.rank) return call.errorCode(-3);
+
+ let change: ResFight['change'] = {};
+ let mRank = (await G.clientCross.callApi('hbzb/zbs/GetStatus', { uid: call.uid })).res.status;
+ let my = await call.conn.getDefaultFightData();
+ let result = FightFun.fight([my, enemy.data]);
+
+ if (result.winSide == 0 && mRank > eRank) {
+ G.clientCross?.sendMsg('msg_cross/HbzbChangeRank', {
+ uid: call.uid,
+ toUid: enemy.data.player.uid
+ });
+ }
+
+ G.clientCross?.sendMsg('msg_cross/HbzbZbsLog', {
+ uid: call.uid,
+ toUid: enemy.data.player.uid,
+ log: result
+ });
+
+ change.useFightNum = data.useFightNum + 1;
+ if (result.winSide != 0) change.failCd = G.time;
+
+ G.mongodb.cPlayerInfo('hbzbZbs').updateOne(
+ { uid: call.uid, type: 'hbzbZbs' },
+ {
+ $set: G.mongodb.createTreeObj(...Object.entries(change).map(v => {
+ return {
+ key: `data.${v[0]}`,
+ val: v[1]
+ };
+ }))
+ }
+ );
+
+ let prize = result.winSide == 0 ? G.gc.hbzb.zbsFightWinPrize : G.gc.hbzb.zbsFightFailPrize;
+ await PlayerFun.sendPrize(call, prize);
+
+ call.succ({
+ change: change,
+ result: result,
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/zbs/ApiGetLog.ts b/src/api_s2c/hbzb/zbs/ApiGetLog.ts
new file mode 100644
index 0000000..aedc90d
--- /dev/null
+++ b/src/api_s2c/hbzb/zbs/ApiGetLog.ts
@@ -0,0 +1,6 @@
+import { ApiCall } from "tsrpc";
+import { ReqGetLog, ResGetLog } from "../../../shared/protocols/hbzb/zbs/PtlGetLog";
+
+export default async function (call: ApiCall) {
+ call.succ((await G.clientCross.callApi('hbzb/zbs/GetLog', { uid: call.uid })).res);
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/zbs/ApiOpen.ts b/src/api_s2c/hbzb/zbs/ApiOpen.ts
new file mode 100644
index 0000000..4a22555
--- /dev/null
+++ b/src/api_s2c/hbzb/zbs/ApiOpen.ts
@@ -0,0 +1,41 @@
+import { ApiCall } from "tsrpc";
+import { ReqOpen, ResOpen } from "../../../shared/protocols/hbzb/zbs/PtlOpen";
+import { PublicShared } from '../../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ if (G.time < PublicShared.getToWeekMondayZeroTime() + G.gc.hbzb.zbsOpenTime[0]) return call.error(globalThis.lng.hbzb_11);
+
+ let status = (await G.clientCross.callApi('hbzb/zbs/GetStatus', { uid: call.uid })).res.status;
+ if (status == -1) return call.errorCode(-1);
+
+ let dbData = await G.mongodb.cPlayerInfo('hbzbZbs').findOne({ uid: call.uid, type: 'hbzbZbs' });
+ let data: typeof dbData.data = dbData?.data || {} as any;
+ if (!data.refreshTime || data.refreshTime < PublicShared.getToDayZeroTime()) {
+ data.winNum = 0;
+ data.buyFightNum = 0;
+ data.useFightNum = 0;
+ data.refreshTime = G.time;
+ data.winRecPrize = [];
+
+ if (!data.enemy) {
+ let callRes = await G.clientCross.callApi('hbzb/zbs/GetEnemy', { uid: call.uid });
+ data.enemy = callRes.res.enemy;
+ }
+
+ G.mongodb.cPlayerInfo('hbzbZbs').updateOne(
+ { uid: call.uid, type: 'hbzbZbs' },
+ { $set: { data: data } },
+ { upsert: true }
+ );
+ }
+
+ call.succ({
+ ...data,
+ rank: status
+ });
+}
+
+export function checkIsOpen() {
+ let weekZeroTime = PublicShared.getToWeekMondayZeroTime();
+ return G.time >= weekZeroTime + G.gc.hbzb.zbsOpenTime[0] && G.time <= weekZeroTime + G.gc.hbzb.zbsOpenTime[1];
+}
\ No newline at end of file
diff --git a/src/api_s2c/hbzb/zbs/ApiRefresh.ts b/src/api_s2c/hbzb/zbs/ApiRefresh.ts
new file mode 100644
index 0000000..430667d
--- /dev/null
+++ b/src/api_s2c/hbzb/zbs/ApiRefresh.ts
@@ -0,0 +1,17 @@
+import { ApiCall } from "tsrpc";
+import { ReqRefresh, ResRefresh } from "../../../shared/protocols/hbzb/zbs/PtlRefresh";
+
+export default async function (call: ApiCall) {
+
+ let callRes = await G.clientCross.callApi('hbzb/zbs/GetEnemy', { uid: call.uid });
+
+ G.mongodb.cPlayerInfo('hbzbZbs').updateOne(
+ { uid: call.uid, type: 'hbzbZbs' },
+ { $set: { 'data.enemy': callRes.res.enemy } },
+ { upsert: true }
+ );
+
+ call.succ({
+ ...callRes.res
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiAwake.ts b/src/api_s2c/hero/ApiAwake.ts
new file mode 100644
index 0000000..d691fc7
--- /dev/null
+++ b/src/api_s2c/hero/ApiAwake.ts
@@ -0,0 +1,21 @@
+import { ApiCall } from "tsrpc";
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ReqAwake, ResAwake } from "../../shared/protocols/hero/PtlAwake";
+
+export default async function (call: ApiCall) {
+ let hero = await G.redis.get('hero', call.uid, call.req._id);
+ if (!hero) return call.error('', { code: -1 });
+
+ let awake = hero.awake || 0;
+ let conf = G.gc.hero_jx[awake + 1];
+ if (!conf) return call.error('', { code: -2 });
+
+ let need = [].concat(...conf.item_cos, { a: 'item', t: hero.heroId, n: conf.HeroDebris_Cos });
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ await HeroFun.changeHeroAttr(call, hero, {awake: awake + 1});
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiChangePos.ts b/src/api_s2c/hero/ApiChangePos.ts
new file mode 100644
index 0000000..0895cb2
--- /dev/null
+++ b/src/api_s2c/hero/ApiChangePos.ts
@@ -0,0 +1,62 @@
+import { ApiCall } from "tsrpc";
+import { Wjjl } from '../../module/collection_wjjl';
+import { PlayerFun } from '../../public/player';
+import { ReqChangePos, ResChangePos } from "../../shared/protocols/hero/PtlChangePos";
+import {TaskFun} from "../../public/task";
+
+export const maxPosNum = 6;
+
+export default async function (call: ApiCall) {
+ let hero = await G.redis.get('hero', call.uid, call.req.id);
+ if (!hero) return call.error(globalThis.lng.hero_1);
+
+ let heroPos = Object.assign({}, call.conn.heroPos);
+ let fightHeros = call.conn.gud.fightHeros.map(id => id);
+ let posArr = Object.keys(heroPos).filter(pos => call.conn.gud.lv >= G.gc.herocom.szHeroLimit[pos]);
+ let idArr = Object.values(heroPos).filter(v => v != '');
+
+ if (call.conn.gud.helpHeros.find(v => v._id == call.req.id)) return call.error('', { code: -1 });
+ if (idArr.includes(call.req.id)) return call.error(globalThis.lng.hero_2);
+ if (call.req.pos && !posArr.includes(call.req.pos)) return call.error(globalThis.lng.hero_3);
+
+ let matrixPos = JSON.parse(JSON.stringify(call.conn.gud.matrixPos));
+
+ if (call.req.state == 'set') {
+ if (idArr.length == posArr.length) return call.error(posArr.length < maxPosNum ? globalThis.lng.hero_5 : globalThis.lng.hero_4);
+ if (fightHeros.includes(hero.heroId.toString())) return call.errorCode(-2);
+ let setPos = call.req.pos;
+ heroPos[setPos] = call.req.id;
+
+ for (let type in matrixPos) {
+ if (!matrixPos[type][setPos]) matrixPos[type][setPos] = call.req.id;
+ // else {
+ // for (let pos = 1; pos <= maxPosNum; pos++) {
+ // if (!matrixPos[type][pos]) matrixPos[type][pos] = call.req.id;
+ // }
+ // }
+ }
+ } else if (call.req.state == 'change') {
+ if (heroPos[call.req.pos]) {
+ let unLoadHero = await G.redis.get('hero', call.uid, heroPos[call.req.pos]);
+ unLoadHero && fightHeros.removeOne(id => id == unLoadHero.heroId);
+ }
+ if (fightHeros.includes(hero.heroId.toString())) return call.errorCode(-2);
+
+ for (let type in matrixPos) {
+ for (let pos in matrixPos[type]) {
+ if (pos == call.req.pos) {
+ matrixPos[type][pos] = call.req.id;
+ }
+ }
+ }
+
+ heroPos[call.req.pos] = call.req.id;
+ }
+ fightHeros.push(hero.heroId.toString());
+
+ Wjjl.setVal(call.uid, 'fight_hero_colour_4', fightHeros.map(id => G.gc.hero[id].colour).filter(c => c >= 4).length);
+
+ await PlayerFun.addAttr(call, { heroPos: heroPos, fightHeros: fightHeros, matrixPos: matrixPos });
+ call.succ(heroPos);
+ call.conn.refreshPower();
+}
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiGetList.ts b/src/api_s2c/hero/ApiGetList.ts
new file mode 100644
index 0000000..e9db5af
--- /dev/null
+++ b/src/api_s2c/hero/ApiGetList.ts
@@ -0,0 +1,39 @@
+import { ApiCall } from "tsrpc";
+import { RedisCollections2 } from '../../module/redis';
+import { ReqGetList, ResGetList } from "../../shared/protocols/hero/PtlGetList";
+
+export default async function (call: ApiCall) {
+ let list: ResGetList['list'] = {};
+ let kvList: k_v = {};
+ let arrList = await G.mongodb.collection('hero').find({ uid: call.uid }).toArray();
+
+ let heroCon = G.gc.hero;
+ let color = {};
+ let maxherolv = 0;
+ arrList.forEach(v => {
+ let d = G.mongodb.conversionIdObj(v);
+ kvList[G.formatRedisKey(d._id)] = d;
+ list[d._id] = d;
+
+ if (v.lv > maxherolv) maxherolv = v.lv;
+ if (!color[heroCon[v.heroId].colour]) color[heroCon[v.heroId].colour] = 0;
+ color[heroCon[v.heroId].colour] += 1;
+ });
+ // 记录玩家最大等级,颜色相关数据 注册任务用
+ await G.mongodb.collection('playerInfo', 'usertasklog').updateOne({ uid: call.conn.uid, type: 'usertasklog' },
+ { $set: { maxherolv: maxherolv, herocolor: color } }, { upsert: true });
+
+ G.redis.set('hero', call.uid, kvList);
+
+ let recLshd = await G.mongodb.collection('playerInfo', 'lshd_hero').findOne({ uid: call.conn.uid, type: 'lshd_hero' });
+ let { uid, _id, type, ...heros } = (recLshd || {});
+
+
+ call.conn.lshd.hero = heros || {};
+ call.succ({
+ list: list,
+ pos: call.conn.heroPos,
+ lshd: heros || {},
+ gbzj: (await G.mongodb.cPlayerInfo('gbzj').findOne({ uid: call.uid, type: 'gbzj' }))?.rec || {}
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiJinJie.ts b/src/api_s2c/hero/ApiJinJie.ts
new file mode 100644
index 0000000..c9c51c3
--- /dev/null
+++ b/src/api_s2c/hero/ApiJinJie.ts
@@ -0,0 +1,70 @@
+import { ApiCall } from "tsrpc";
+import { Wjjl } from '../../module/collection_wjjl';
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ResGetList } from '../../shared/protocols/hero/PtlGetList';
+import { ReqJinJie, ResJinJie } from "../../shared/protocols/hero/PtlJinJie";
+import { ServiceType } from '../../shared/protocols/serviceProto';
+import { HeroShared } from '../../shared/public/hero';
+import { event_cszl_record } from '../event/chuanshuozhilu/ApiOpen';
+import { PublicShared } from "../../shared/public/public";
+
+export default async function (call: ApiCall) {
+
+ let hero = await G.redis.get('hero', call.uid, call.req.id);
+
+ if (!hero) return call.error(globalThis.lng.hero_1);
+ if (G.gc.herogrow[G.gc.hero[hero.heroId].jjup] == undefined) return call.error(globalThis.lng.hero_6);
+ if (G.gc.herogrow[G.gc.hero[hero.heroId].jjup][hero.jieji + 1] == undefined) return call.error(globalThis.lng.hero_7);
+ if (G.gc.herogrow[G.gc.hero[hero.heroId].jjup][hero.jieji + 1].lv > hero.lv) return call.error(globalThis.lng.hero_8);
+
+ let need = HeroShared.getHeroJinJieNeed(hero.heroId, hero.jieji);
+ let needItem = need.filter(v => v.a != 'hero');
+ let needHero = need.filter(v => v.a == 'hero');
+
+ await PlayerFun.checkNeedIsMeet(call, needItem);
+
+ if (needHero.length > 0) {
+ if (!call.req.idArr || call.req.idArr.length < 1) return call.error(globalThis.lng.hero_9);
+ if (call.req.idArr.includes(call.req.id)) return call.error(globalThis.lng.hero_10);
+ if (Object.values(call.conn.heroPos).concat(call.conn.gud.helpHeros.map(h => h._id)).intersection(call.req.idArr).length > 0) return call.error(globalThis.lng.hero_11);
+
+ let check = needHero.map(v => {
+ return new Array(v.n).fill(1).map(v1 => {
+ return v.t;
+ });
+ }).reduce((a, b) => a.concat(b));
+
+ if (call.req.idArr.length != check.length) return call.error(globalThis.lng.hero_12);
+
+ let selectHeros: ResGetList['list'][''][] = [];
+ for (let _id of call.req.idArr) {
+ let _hero = await G.redis.get('hero', call.uid, _id);
+ if (!_hero) return call.error(globalThis.lng.hero_1);
+ selectHeros.push(_hero);
+ }
+
+ let val1 = PublicShared.eval(check.join('+'));
+ let val2 = PublicShared.eval(selectHeros.map(v => v.heroId).join('+'));
+
+ if (val1 != val2) return call.error(globalThis.lng.hero_13);
+ await PlayerFun.cutHero(call, call.req.idArr);
+ }
+
+ await PlayerFun.cutNeed(call, needItem);
+ await HeroFun.changeHeroAttr(call, hero, {
+ jieji: hero.jieji + 1
+ });
+
+ Wjjl.setVal(call.uid, `has_hero_jieji_${hero.jieji}`, 1, false);
+
+ let help = call.conn.gud.helpHeros.find(v => v._id == call.req.id);
+ if (help) {
+ help.jieji = hero.jieji + 1;
+ await PlayerFun.addAttr(call, { helpHeros: call.conn.gud.helpHeros });
+ }
+
+ event_cszl_record(call.conn.gud, hero.heroId, hero.jieji, 'jieji');
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiLvUp.ts b/src/api_s2c/hero/ApiLvUp.ts
new file mode 100644
index 0000000..b5c3757
--- /dev/null
+++ b/src/api_s2c/hero/ApiLvUp.ts
@@ -0,0 +1,54 @@
+import { ApiCall } from "tsrpc";
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ReqLvUp, ResLvUp } from "../../shared/protocols/hero/PtlLvUp";
+import { ServiceType } from '../../shared/protocols/serviceProto';
+import { HeroShared } from '../../shared/public/hero';
+import { event_cszl_record } from '../event/chuanshuozhilu/ApiOpen';
+import { HongDianChange } from "../hongdian/fun";
+import {PublicShared} from "../../shared/public/public";
+
+export default async function (call: ApiCall) {
+ let hero = await G.redis.get('hero', call.uid, call.req.id);
+ let up = call.req.up || 1
+ if (!hero) return call.errorCode(-1);
+ if (hero.lv >= call.conn.gud.lv * 3 || hero.lv + up > call.conn.gud.lv * 3) return call.errorCode(-2);
+
+ let need = []
+ new Array(up).fill(1).map((v, i) => {
+ need.push(...HeroShared.getHeroLvUpNeed(hero.heroId, hero.lv + i));
+ })
+
+ need = PublicShared.mergePrize(need);
+
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+ await HeroFun.changeHeroAttr(call, hero, {
+ lv: hero.lv + up
+ });
+ event_cszl_record(call.conn.gud, hero.heroId, hero.lv, 'lv')
+
+ HongDianChange.sendChangeKey(call.uid, ['taskhd', 'huodonghd']);
+
+ call.succ({ lv: hero.lv });
+}
+
+
+
+// export default async function (call: ApiCall) {
+// let hero = await G.redis.get('hero', call.uid, call.req.id);
+// if (!hero) return call.errorCode(-1);
+// if (hero.lv >= call.conn.gud.lv * 3) return call.errorCode(-2);
+//
+// let need = HeroShared.getHeroLvUpNeed(hero.heroId, hero.lv);
+// await PlayerFun.checkNeedIsMeet(call, need);
+// await PlayerFun.cutNeed(call, need);
+// await HeroFun.changeHeroAttr(call, hero, {
+// lv: hero.lv + 1
+// });
+// event_cszl_record(call.conn.gud, hero.heroId, hero.lv, 'lv')
+//
+// HongDianChange.sendChangeKey(call.uid, ['taskhd', 'huodonghd']);
+//
+// call.succ({ lv: hero.lv });
+// }
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiPotency.ts b/src/api_s2c/hero/ApiPotency.ts
new file mode 100644
index 0000000..b17157f
--- /dev/null
+++ b/src/api_s2c/hero/ApiPotency.ts
@@ -0,0 +1,25 @@
+import { ApiCall } from "tsrpc";
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ReqPotency, ResPotency } from "../../shared/protocols/hero/PtlPotency";
+
+export default async function (call: ApiCall) {
+ if (!G.gc.hero_qianneng[call.req.type]) return call.error(globalThis.lng.hero_14);
+
+ let hero = await G.redis.get('hero', call.uid, call.req._id);
+ let qiannneg = hero.qiannneg || Object.fromEntries(Object.keys(G.gc.hero_qianneng).map(k => [k, 0]));
+ let nextLv = qiannneg[call.req.type] + 1;
+
+ if (nextLv - Math.min(...Object.values(qiannneg)) > 1) return call.error(globalThis.lng.hero_15);
+
+ let need = G.gc.hero_qianneng[call.req.type][nextLv].need;
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ qiannneg[call.req.type]++;
+ await HeroFun.changeHeroAttr(call, hero, {
+ qiannneg: qiannneg
+ });
+
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiRec.ts b/src/api_s2c/hero/ApiRec.ts
new file mode 100644
index 0000000..c935cf7
--- /dev/null
+++ b/src/api_s2c/hero/ApiRec.ts
@@ -0,0 +1,22 @@
+import { ApiCall } from "tsrpc";
+import { PlayerFun } from '../../public/player';
+import { ReqRec, ResRec } from "../../shared/protocols/hero/PtlRec";
+
+export default async function (call: ApiCall) {
+ if (!call.conn.lshd.hero[call.req.heroId]) return call.errorCode(-1);
+
+ let rec = (await G.mongodb.cPlayerInfo('gbzj').findOne({ uid: call.uid, type: 'gbzj' }))?.rec || {};
+ if (rec[call.req.heroId]) return call.errorCode(-2);
+
+ G.mongodb.cPlayerInfo('gbzj').updateOne(
+ { uid: call.uid, type: 'gbzj' },
+ { $set: G.mongodb.createTreeObj({ key: `rec.${call.req.heroId}`, val: true }) },
+ { upsert: true }
+ );
+
+ await PlayerFun.sendPrize(call, G.gc.hero[call.req.heroId].prize);
+
+ call.succ({
+ prize: G.gc.hero[call.req.heroId].prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiReset.ts b/src/api_s2c/hero/ApiReset.ts
new file mode 100644
index 0000000..bcdb67a
--- /dev/null
+++ b/src/api_s2c/hero/ApiReset.ts
@@ -0,0 +1,89 @@
+import { ApiCall } from "tsrpc";
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ReqReset, ResReset } from "../../shared/protocols/hero/PtlReset";
+import { prizeType } from '../../shared/protocols/type';
+import { PublicShared } from "../../shared/public/public";
+
+export default async function (call: ApiCall) {
+ let req = call.req;
+ if (req.type == 'qs' && Object.values(call.conn.gud.heroPos).filter(_id => _id != '').concat(call.conn.gud.helpHeros.map(h => h._id)).intersection(req._ids).length > 0) return call.errorCode(-1);
+
+ let heros = (await HeroFun.getHeros(call, req._ids)).filter(h => !!h);
+ if (heros.length < req._ids.length) return call.errorCode(-2);
+
+ let prize: prizeType[] = [];
+ if (req.type == 'yl') {
+ for (let hero of heros) {
+ if (hero.lv <= 1 && hero.jieji == 0) {
+ let item = G.gc.item[hero.heroId];
+ if (item) {
+ prize.push({ a: 'item', t: item.id, n: item.num });
+ }
+ }
+ let p = await HeroFun.delHero(call, hero);
+ prize.push(...p);
+ }
+ prize = PublicShared.mergePrize(prize);
+ prize.forEach(p => {
+ if (p.t == 'jinbi') p.n = Math.floor(p.n * G.gc.guanlidiaodu.hero_cz_jinbi);
+ });
+ return call.succ({
+ prize: prize
+ });
+ } else if (req.type == 'cz') {
+ // if (heros.filter(h => h.lv <= 1).length > 0) return call.errorCode(-10);
+
+ let need = G.gc.guanlidiaodu.hero_cz_need.map(n => {
+ return {
+ ...n,
+ n: n.n * heros.length
+ };
+ });
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ let oneHeros = heros.filter(v => v.lv <= 1 && v.jieji == 0 ).map(v => v._id);
+
+ for (let hero of heros) {
+
+ if (hero.lv > 1 || hero.jieji > 0) {
+ let p = await HeroFun.delHero(call, hero);
+ let { _id, uid, ...ops } = hero;
+ await HeroFun.changeHeroAttr(call, hero, ops);
+ prize.push(...p);
+ } else {
+ let item = G.gc.item[hero.heroId];
+ if (item) {
+ prize.push({ a: 'item', t: item.id, n: item.num });
+ }
+ }
+ }
+
+ oneHeros.length > 0 && await PlayerFun.cutHero(call, oneHeros);
+ } else if (req.type == 'qs') {
+ if (heros.filter(h => h.lv > 1 || h.jieji > 0).length > 0) return call.errorCode(-20);
+
+ let need = G.gc.guanlidiaodu.hero_qs_need.map(n => {
+ return {
+ ...n,
+ n: n.n * heros.length
+ };
+ });
+ await PlayerFun.checkNeedIsMeet(call, need);
+ await PlayerFun.cutNeed(call, need);
+
+ await PlayerFun.cutHero(call, heros.map(h => h._id));
+ prize.push(...heros.map(c => G.gc.guanlidiaodu.hero_qs_prize[G.gc.hero[c.heroId].star] as any[]).reduce((a, b) => a.concat(b)));
+ }
+
+ prize.forEach(p => {
+ if (p.t == 'jinbi') p.n = Math.floor(p.n * G.gc.guanlidiaodu.hero_cz_jinbi);
+ });
+ prize = PublicShared.mergePrize(prize);
+ await PlayerFun.sendPrize(call, prize);
+
+ call.succ({
+ prize: prize
+ });
+}
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiTalent.ts b/src/api_s2c/hero/ApiTalent.ts
new file mode 100644
index 0000000..af1a9f1
--- /dev/null
+++ b/src/api_s2c/hero/ApiTalent.ts
@@ -0,0 +1,33 @@
+import { ApiCall } from "tsrpc";
+import { HeroFun } from '../../public/hero';
+import { ReqTalent, ResTalent } from "../../shared/protocols/hero/PtlTalent";
+
+export default async function (call: ApiCall) {
+ let typeConf = G.gc.hero_tf[call.req.type];
+ if (!typeConf) return call.error('', { code: -1 });
+
+ let hero = await G.redis.get('hero', call.uid, call.req._id);
+ if (!hero) return call.error('', { code: -2 });
+
+ let talent = hero.talent || Object.fromEntries(Object.keys(G.gc.hero_tf).map(t => [t, 0]));
+ let conf = typeConf[talent[call.req.type] + 1];
+ if (!conf) return call.error('', { code: -3 });
+
+ let pre = conf.unlock;
+ // if (pre && talent[pre] < Object.keys(pre).length) return call.error('', { code: -4 });
+ if (pre.length > 0) {
+ for (let type of pre) {
+ if (talent[type] < Object.values(G.gc.hero_tf[type]).slice(-1)[0].lv) return call.error('', { code: -4 });
+ }
+ }
+
+ let allPoint = G.gc.hero_jx[hero.awake]?.talent_point || 0;
+ let usePoints = Object.entries(talent).map(v => new Array(v[1]).fill(1).map((_v, i) => G.gc.hero_tf[v[0]][i + 1].cos)).reduce((a, b) => a.concat(b));
+ let usePoint = usePoints.length > 0 ? usePoints.reduce((a, b) => a + b) : 0;
+
+ if (allPoint - usePoint < conf.cos) return call.error('', { code: -4 });
+ talent[call.req.type]++;
+
+ await HeroFun.changeHeroAttr(call, hero, {talent: talent});
+ call.succ({});
+}
\ No newline at end of file
diff --git a/src/api_s2c/hero/ApiWeaponUp.ts b/src/api_s2c/hero/ApiWeaponUp.ts
new file mode 100644
index 0000000..ee43e58
--- /dev/null
+++ b/src/api_s2c/hero/ApiWeaponUp.ts
@@ -0,0 +1,63 @@
+import { ApiCall } from "tsrpc";
+import { HeroFun } from '../../public/hero';
+import { PlayerFun } from '../../public/player';
+import { ReqWeaponUp, ResWeaponUp } from "../../shared/protocols/hero/PtlWeaponUp";
+import { PublicShared } from '../../shared/public/public';
+
+export default async function (call: ApiCall) {
+ let hero = await G.redis.get('hero', call.uid, call.req.id);
+ let heroConf = G.gc.hero[hero?.heroId];
+
+ if (!hero) return call.error(globalThis.lng.hero_1);
+ if (!heroConf.zhuanshu) return call.error(globalThis.lng.hero_16);
+ if (hero.lv < G.gc.herocom.zswqOpenLv) return call.error(`英雄达到${G.gc.herocom.zswqOpenLv}级开启`);
+
+ let weapon = Object.assign({}, hero.weapon || { jieji: 0, star: 0, starProbability: 0 });
+ let weaponConf = G.gc.zhuanshu[heroConf.zhuanshu];
+
+ if (call.req.type == 'jieji') {
+ if (!weaponConf[weapon.jieji + 1]) return call.error(globalThis.lng.hero_17);
+ if (weapon.star < Object.values(weaponConf[weapon.jieji]).slice(-1)[0].star) return call.error(globalThis.lng.hero_18);
+
+ let need = weaponConf[weapon.jieji + 1][0].need;
+ await PlayerFun.checkNeedIsMeet(call, need);
+
+ weapon.jieji += 1;
+ weapon.star = 0;
+ await PlayerFun.cutNeed(call, need);
+ await HeroFun.changeHeroAttr(call, hero, {
+ weapon: weapon
+ });
+
+ call.succ({});
+ } else if (call.req.type == 'star') {
+ if (!weaponConf[weapon.jieji][weapon.star + 1]) return call.error(globalThis.lng.hero_19);
+
+ let need = weaponConf[weapon.jieji][weapon.star + 1].need;
+ await PlayerFun.checkNeedIsMeet(call, need);
+
+ await PlayerFun.cutNeed(call, need);
+
+ let starFail: boolean;
+ let randomNum = PublicShared.randomNum(1, 100);
+ let vipAdd = 0;
+ if (G.gc.herocom.zswqVip[call.conn.gud.vip] == undefined) vipAdd += G.gc.herocom.zswqVip.last();
+ else vipAdd += G.gc.herocom.zswqVip[call.conn.gud.vip];
+ let probability = (weapon.starProbability + vipAdd + weaponConf[weapon.jieji][weapon.star + 1].probability) * 100;
+ if (randomNum <= probability) {
+ weapon.star += 1;
+ weapon.starProbability = 0;
+ starFail = false;
+ } else {
+ weapon.starProbability += 0.01;
+ starFail = true;
+ }
+ await HeroFun.changeHeroAttr(call, hero, {
+ weapon: weapon
+ });
+
+ call.succ({
+ starFail: starFail
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/api_s2c/hongdian/ApiGet.ts b/src/api_s2c/hongdian/ApiGet.ts
new file mode 100644
index 0000000..2973dca
--- /dev/null
+++ b/src/api_s2c/hongdian/ApiGet.ts
@@ -0,0 +1,160 @@
+import { ApiCall } from "tsrpc";
+import { DiXiaQianZhuangFun } from "../../public/dixiaqianzhuang";
+import { DxltFun } from "../../public/dxlt";
+import { GongHuiFun } from "../../public/gonghui/gonghui";
+import { JJCFun } from "../../public/jjc";
+import { KuangDongfun } from "../../public/kuangdong";
+import { LingZhuLaiXifun } from "../../public/lingzhulaixi";
+import { SignFun } from "../../public/sign";
+import { TaskFun } from "../../public/task";
+import { WangZheRongYaofun } from "../../public/wzry";
+import { XstaskFun } from "../../public/xstask";
+import { ReqGet, ResGet, hongdianKey } from "../../shared/protocols/hongdian/PtlGet";
+import { PublicShared } from '../../shared/public/public';
+import { getShouChongRedPoint } from '../event/shouchong/ApiReceive';
+import { md_redPoint } from '../gongyu/mingdao/ApiOpen';
+import { HongDianFun, HuoDongHongDianFun } from "./fun";
+
+const defaultKeys: hongdianKey[] = ['jiuba', 'jiaotang', 'shouchong', 'clslhd', 'dixiaqianzhuanghd', 'gonghuihd', 'hbzbhd', 'jjchd', 'taskhd',
+ 'xstaskhd', 'lingzhulaixihd', 'dxlthd', 'wzcjhd', 'slzdhd', 'qjzzdhd', 'kuangdonghd', 'qiandaohd', 'kaifukuanghuanhd', 'jijinhd', 'zhuishalinghd',
+ 'yibaichouhd', 'huobanzhaomuhd', 'qirileichonghd', 'jierihd', 'kbzzhd', 'wzryhd', 'yuedujijin', 'mingdao', 'patahd',
+ 'heishihd', 'huodonghd', 'renown'];
+
+export default async function (call: ApiCall) {
+
+ let res: ResGet = {};
+ let keys = call.req.length < 1 ? [] : call.req;
+ let toDayZeroTime = PublicShared.getToDayZeroTime();
+
+ //正常跑完引导的等级
+ if(call.conn.gud.lv >= 7){
+ for (let key of keys) {
+ switch (key) {
+ case 'jiuba':
+ case 'jiaotang':
+ let db = await G.mongodb.collection('playerInfo', key).findOne({ uid: call.uid, type: key });
+ res[key] = { show: (!db || toDayZeroTime >= db.freeTime) ? true : false };
+ break;
+ case 'shouchong':
+ res[key] = await getShouChongRedPoint(call);
+ break;
+ case 'dixiaqianzhuanghd':
+ res[key] = await DiXiaQianZhuangFun.getHongDian(call);
+ break;
+ case 'taskhd':
+ res[key] = await TaskFun.getHongDian(call);
+ break;
+ case 'xstaskhd':
+ res[key] = await XstaskFun.getHongDian(call);
+ break;
+ case 'gonghuihd':
+ res[key] = await GongHuiFun.getHongDian(call);
+ break;
+ case 'jjchd':
+ res[key] = await JJCFun.getHongDian(call);
+ break;
+ case 'hbzbhd':
+ res[key] = await HongDianFun.hbzBgetHongDian(call);
+ break;
+ case 'clslhd':
+ res[key] = await HongDianFun.clslgetHongDian(call);
+ break;
+ case 'lingzhulaixihd':
+ // 讨伐海盗
+ res[key] = await LingZhuLaiXifun.getHongDian(call);
+ break;
+ case 'dxlthd':
+ // 地下擂台
+ res[key] = await DxltFun.getHongDian(call);
+ break;
+ case 'wzcjhd':
+ // 物资筹集
+ res[key] = await HongDianFun.mrslGetHongDian(call);
+ break;
+ case 'slzdhd':
+ // 势力争夺
+ res[key] = await HongDianFun.slzdGetHongDian(call);
+ break;
+ case 'qjzzdhd':
+ // 清缴真主党
+ res[key] = await HongDianFun.qjzzdGetHongDian(call);
+ break;
+ case 'kuangdonghd':
+ // 底盘争夺
+ res[key] = await KuangDongfun.getHongDian(call);
+ break;
+ case 'qiandaohd':
+ // 签到
+ res[key] = await SignFun.getHongDian(call);
+ break;
+ case 'kaifukuanghuanhd':
+ // 开服狂欢红点
+ res[key] = await HuoDongHongDianFun.kfkhHongDian(call);
+ break;
+ case 'jijinhd':
+ // 基金
+ res[key] = await HuoDongHongDianFun.jijinHongDian(call);
+ break;
+ case 'zhuishalinghd':
+ // 追杀令红点
+ res[key] = await HuoDongHongDianFun.zhuishalingHongDian(call);
+ break;
+ case 'yibaichouhd':
+ // 一百抽红点
+ res[key] = await HuoDongHongDianFun.yibaichouHongDian(call);
+ break;
+ case 'huobanzhaomuhd':
+ // 伙伴招募红点
+ res[key] = await HuoDongHongDianFun.huobanzhaomuHongDian(call);
+ break;
+ case 'qirileichonghd':
+ // 七日累充红点
+ res[key] = await HuoDongHongDianFun.qirileichongHongDian(call);
+ break;
+ case 'jierihd':
+ // 节日红点
+ res[key] = await HuoDongHongDianFun.jieriHongDian(call);
+ break;
+ case 'kbzzhd':
+ // 恐怖战争
+ res[key] = await HongDianFun.kongbuzzHongDian(call);
+ break;
+ case 'wzryhd':
+ // 王者荣耀
+ res[key] = await WangZheRongYaofun.getHongDian(call);
+ break;
+ case 'yuedujijin':
+ //月度基金
+ res[key] = await HuoDongHongDianFun.yuedujijinHongDian(call);
+ break;
+ case 'mingdao':
+ res[key] = await md_redPoint(call.conn);
+ break;
+ // case 'heishiMrjx':
+ // // 黑市-每日精选--集合到heishihd查询,待删除,需前端配合
+ // res[key] = await HuoDongHongDianFun.heiShiHongDian(call);
+ // break;
+ // case 'jitianhaoli':
+ // // 黑市-积天豪礼--集合到heishihd查询,待删除,需前端配合
+ // res[key] = await HuoDongHongDianFun.heiShiLCHongDian(call);
+ // break;
+ case 'heishihd':
+ // 黑市红点
+ res[key] = await HuoDongHongDianFun.heiShihd(call)
+ break;
+ case 'huodonghd':
+ res[key] = await HuoDongHongDianFun.houtaihdHongDian(call);
+ break;
+ case 'patahd':
+ // 黑暗塔红点
+ res[key] = await HongDianFun.pataHongDian(call);
+ break;
+ case 'renown':
+ res[key] = await HongDianFun.renownHongDian(call);
+ break;
+ }
+ }
+ }
+
+ call.succ(res);
+}
\ No newline at end of file
diff --git a/src/api_s2c/hongdian/fun.ts b/src/api_s2c/hongdian/fun.ts
new file mode 100644
index 0000000..f23a593
--- /dev/null
+++ b/src/api_s2c/hongdian/fun.ts
@@ -0,0 +1,833 @@
+import { ApiCall } from 'tsrpc';
+import { ReqAddHuoDong } from '../../monopoly/protocols/PtlAddHuoDong';
+import { ActionLog } from '../../public/actionLog/actionLog';
+import { HuoDongFun } from '../../public/huodongfun';
+import { PataFun } from '../../public/pata';
+import { PayFun } from '../../public/pay';
+import { ZhanLingTasks } from '../../public/zhanling';
+import { jijinType } from '../../shared/protocols/event/jijin/PtlOpen';
+import { hongdianKey, hongdianVal } from '../../shared/protocols/hongdian/PtlGet';
+import { payLog } from '../../shared/protocols/pay/PtlGetList';
+import { PublicShared } from '../../shared/public/public';
+import { clslDb } from '../conglinshoulie/ApiOpen';
+import { getVal } from '../event/jijin/ApiOpen';
+import { getTaskVal } from '../event/kaifukuanghuan/ApiOpen';
+import { YangChengMuBiaofun } from '../event/yangchengmubiao/fun';
+import { checkIsOpen } from '../hbzb/jfs/ApiOpen';
+import { PlayerShared } from "../../shared/public/player";
+import { kbzzUserDb } from '../kbzz/ApiOpen';
+import {number} from "mathjs";
+import {PlayerFun} from "../../public/player";
+
+export class HongDianFun {
+ /**黑榜争霸红点 */
+ static async hbzBgetHongDian(call: ApiCall) {
+ let _res: hongdianVal = {
+ show: false
+ };
+ if (!checkIsOpen()) return _res;
+ let data = await G.mongodb.cPlayerInfo('hbzb').findOne({ uid: call.uid, type: 'hbzb' });
+ let _mydata = (data && data.data && data.data.refreshTime >= PublicShared.getToDayZeroTime()) ? data.data : { winNum: 0, buyFightNum: 0, useFightNum: 0, refreshTime: G.time, winRecPrize: [], useRefreshNum: 0 };
+ if (_mydata.useFightNum < _mydata.buyFightNum + G.gc.hbzb.jfsFightNum) {
+ _res.show = true;
+ }
+ if (!_res.show) {
+ let _con = JSON.parse(JSON.stringify(G.gc.hbzb.jfsFightWinNumPrize));
+ for (let index = 0; index < _con.length; index++) {
+ const element = _con[index];
+ if (_mydata.winRecPrize.includes(index)) continue;
+ if (_mydata.winNum < element.total) continue;
+ _res.show = true;
+ break;
+ }
+ }
+ return _res;
+ }
+
+ /**丛林狩猎红点 */
+ static async clslgetHongDian(call: ApiCall) {
+ let _res: hongdianVal = {
+ show: false
+ };
+ let weekZeroTime = PublicShared.getToWeekMondayZeroTime();
+ if (G.time < weekZeroTime + G.gc.clsl_com.fightTime[0] || G.time > weekZeroTime + G.gc.clsl_com.fightTime[1]) return _res;
+ let _mydata = await clslDb().findOne({ uid: call.uid, type: 'clsl' });
+ let useNum = _mydata?.useFightNum || 0;
+ let buyNum = _mydata?.buyFightNum || 0;
+ if (useNum < buyNum + G.gc.clsl_com.fightNum) {
+ _res.show = true;
+ }
+
+ if (!_res.show) {
+ let fightWinNum = _mydata?.fightWinNum || 0;
+ let _con = JSON.parse(JSON.stringify(G.gc.clsl_com.fightWinPrize));
+ for (let index = 0; index < _con.length; index++) {
+ const element = _con[index];
+ if (_mydata?.recWinPrize?.includes(index)) continue;
+ if (fightWinNum < element.total) continue;
+ _res.show = true;
+ break;
+ }
+ }
+ return _res;
+ }
+
+ /**
+ * 每日试炼 物资筹集 红点
+ * types.money 休闲区
+ * types.exp 物资部
+ * types.qhs 加工仓库
+ * _mydata.data.numInfo.[type].['0'] 下标‘0’原本是根据难度设定次数,改为次数共享后,取‘0’值统一计算次数
+ **/
+ static async mrslGetHongDian(call: ApiCall) {
+ let _res = {
+ show: false
+ };
+ let _mydata = await G.mongodb.cPlayerInfo('meirishilian').findOne({ uid: call.uid, type: 'meirishilian' });
+ let types = ['money', 'exp', 'qhs'];
+ for(let type of types) {
+ let buyNum = _mydata?.data?.numInfo?.[type]?.['0']?.buyFightNum || 0;
+ let useNum = _mydata?.data?.numInfo?.[type]?.['0']?.useFightNum || 0;
+ _res.show = useNum < buyNum + (PlayerShared.getMingDaoBuff(call.conn.gud, 'wzsj_free') || 0) + G.gc.meirishilian_com.fightNum
+ if(_res.show) break
+ }
+ return _res;
+ }
+
+ /**势力争夺 红点 */
+ static async slzdGetHongDian(call: ApiCall) {
+ let _res = {
+ show: false
+ };
+ let db = await G.mongodb.collection('slzdUser').findOne({ uid: call.uid });
+
+ let _mydata = (db && db.data && db.data.refreshTime >= PublicShared.getToDayZeroTime()) ? db.data : { fightNum: G.gc.slzd.ctorFightNum, winNum: 0, winRec: [] };
+ if (_mydata.fightNum >= 1) {
+ _res.show = true;
+ }
+
+ if (!_res.show) {
+ let _con = JSON.parse(JSON.stringify(G.gc.slzd.fightWinNumPrize));
+ for (let index = 0; index < _con.length; index++) {
+ const element = _con[index];
+ if (_mydata.winRec.includes(index)) continue;
+ if (_mydata.winNum < element.total) continue;
+ _res.show = true;
+ break;
+ }
+ }
+ return _res;
+ }
+
+ /**清缴真主党 红点 */
+ static async qjzzdGetHongDian(call: ApiCall) {
+ let _res = {
+ show: false
+ };
+ return _res
+ let data = await G.mongodb.collection('scheduler').findOne({ type: 'qjzzd' });
+ if (!data) return _res; // 功能未开放
+ let db = await G.mongodb.cPlayerInfo('qjzzd').findOne({ uid: call.uid, type: 'qjzzd' });
+
+ let myData = (db && db.refreshTime >= data.lastRunTime) ? db : { refreshTime: data.lastRunTime, useFightNum: 0, maxDps: 0 };
+ if (myData.useFightNum < G.gc.qjzzd.fightNum) {
+ _res.show = true;
+ }
+ return _res;
+ }
+
+ /**恐怖战争 红点 */
+ static async kongbuzzHongDian(call: ApiCall) {
+ let _res = {
+ show: false
+ };
+ let second = G.time - PublicShared.getToWeekMondayZeroTime();
+ if (second >= G.gc.kbzz.time.apply[0] && second < G.gc.kbzz.time.apply[1]) {
+ // 报名时间
+ let state = await G.mongodb.cPlayerInfo('kbzzApply').findOne({ uid: call.uid, type: 'kbzzApply' });
+ let apply = state?.apply || false;
+ if (!apply) {
+ _res.show = true;
+ return _res;
+ }
+ } else {
+ let dbData = await kbzzUserDb().findOne({ uid: call.uid, type: 'kbzzUser' });
+ let myData = dbData ? dbData : { score: G.gc.kbzz.playerScore, recScorePrize: [], toDayScore: 0, fightNum: G.gc.kbzz.fightNum };
+ let conf = G.gc.kbzz.scorePrize;
+ for (let index = 0; index < conf.length; index++) {
+ const element = conf[index];
+ if (myData.recScorePrize.includes(index)) continue;
+ if (myData.toDayScore < element.total) continue;
+ _res.show = true;
+ break;
+ }
+ }
+ return _res;
+ }
+
+ /**斩草除根(爬塔) 红点 */
+ static async pataHongDian(call: ApiCall) {
+ let _res = {
+ show: false,
+ val: {
+ shopItems: {
+ show: false
+ },
+ saodang: {
+ show: false
+ },
+ reward: {
+ show: false
+ }
+ }
+ };
+ let _conf = G.gc.patacom;
+ let _conList = Object.keys(_conf).sort((a, b) => Number(a) - Number(b));
+ let _myData = await PataFun.getInfo(call.uid);
+ for (let index = 0; index < _conList.length; index++) {
+ const element = Number(_conList[index]);
+ // 未通关 已经经过排序,可以直接 break
+ if (_myData.lv <= element) break
+ /**已经领取 */
+ if (_myData.gotarr.indexOf(element) != -1) continue
+ _res.show = true
+ _res.val.reward.show = true
+ }
+ // 扫荡判断
+ let max = G.gc.com.pata_saodang.value + (PlayerShared.getMingDaoBuff(call.conn.gud, "zccg_sd") || 0);
+ let prize = G.gc.pata[_myData.lv - 1]?.sdprize;
+ _res.val.saodang.show = max - (_myData.saodangNum || 0) > 0 && !!prize
+ _res.show = _res.show || _res.val.saodang.show
+ // 商店判断
+ // 个人爬塔商店购买情况
+ let shopData = await G.redis.get('shop', call.uid, '7'); // 商店编号7,未理清商店id存放的数据表,后续该出尽量改为数据库读取
+ if(shopData) {
+ let {buyNum, shopItems} = shopData
+ // 获取爬塔商店商品
+ for(let index in shopItems) {
+ let x = shopItems[index]
+ if(x.needZCCG > 0 && x.needZCCG < _myData.lv && (buyNum && !buyNum[index])) {
+ // 验证是否达到购买条件
+ let isOk = await (await PlayerFun.checkNeedIsMeet(call, x.buyNeed, false)).isOk
+ if(isOk) {
+ _res.show = true
+ _res.val.shopItems.show = true
+ }
+ }
+ }
+ }
+ return _res;
+ }
+
+ /**名望免费礼包及特权领取 红点 */
+ static async renownHongDian(call: ApiCall) {
+ let _res = {
+ show: false
+ };
+ let _conf = G.gc.mw_com.gift
+ let _myData = await G.mongodb.collection('playerInfo', 'juewei').findOne({ uid: call.conn.uid, type: 'juewei' });
+ // 无数据,有免费礼包
+ if (!_myData) {
+ _res.show = true
+ return _res
+ }
+
+ for (let index = 0; index < _conf.length; index++) {
+ const element = _conf[index];
+ if (index == 0 && PublicShared.getToDayZeroTime(_myData.tequan.recTime || 0) == PublicShared.getToDayZeroTime(G.time)) {
+ // 特权红点
+ let buyLog = await PayFun.getPayLog(call.uid, element.payId);
+ if (buyLog.length > 0) {
+ _res.show = true
+ return _res
+ }
+ }
+
+ // 不是免费
+ if (element.payId) continue
+
+ /**已经领取最大次数 */
+ if ((_myData.record?.[index] || 0) >= element.buyNum) continue
+ _res.show = true
+ break
+ }
+ return _res;
+ }
+
+}
+
+
+export class HuoDongHongDianFun {
+ /**所有可支持后台活动 红点 */
+ static async houtaihdHongDian(call: ApiCall) {
+ let _res = {
+ show: false,
+ val: {
+ hdid: [],
+ htype: [],
+ hdxq: {}
+ }
+ };
+ let _hdList = []
+ for (let i = 0; i < 8; i++){
+ _hdList.push(...await HuoDongFun.gethdList(call, i + 1))
+ }
+ // let _hdList = await HuoDongFun.gethdList(call)
+ for (let index = 0; index < _hdList.length; index++) {
+ const element = _hdList[index];
+ let ishd: hongdianVal = { show: false }
+ if (element.htype == 1) {
+ // 检测 htype 1 养成目标活动红点
+ ishd = await this.yangchengmubiaoHongDian(call, element)
+ }
+
+ if (element.htype == 2) {
+ // 检测 htype 2 掉落兑换活动红点
+ ishd = await this.diaoluoduihuanHongDian(call, element)
+ }
+
+ if (element.htype == 3) {
+ // 检测 htype 3 传说之路活动红点
+ ishd = await this.chuanshuozhiluHongDian(call, element)
+ }
+
+ if (element.htype == 4) {
+ // 检测 htype 4 自选礼包活动红点
+ ishd = await this.zixuanlibaoHongDian(call, element)
+ }
+
+ if (element.htype == 5) {
+ // 检测 htype 5 累计充值活动红点
+ ishd = await this.leijichongzhiHongDian(call, element)
+ }
+
+ if (element.htype == 6) {
+ // 检测 htype 6 七日登录活动红点
+ ishd = await this.qiridengluHongDian(call, element)
+ }
+
+ // 此活动有红点
+ if (ishd.show) {
+ _res.show = true
+ _res.val.hdid.push(element.hdid)
+ if (_res.val.htype.indexOf(element.htype) == -1) _res.val.htype.push(element.htype)
+ _res.val.hdxq[element.hdid] = ishd
+ }
+ }
+ return _res;
+ }
+
+ /**开服狂欢红点 */
+ static async kfkhHongDian(call: ApiCall) {
+ let _res: hongdianVal = {
+ show: false
+ };
+ let [isOpen, tips] = PublicShared.getOpenCond(call, "kaifukuanghuan")
+ if (!isOpen) return _res;
+
+ let db = await G.mongodb.cEvent('kaifukuanghuan').findOne({ uid: call.uid, type: 'kaifukuanghuan' });
+ let data = db || {
+ receiveLogin: [],
+ receiveBox: [],
+ receiveTask: Object.fromEntries(Object.keys(G.gc.kaifukuanghuan.task).map(day => [day, []]))
+ };
+ // 登录奖励
+ let day = PublicShared.getOpenServerDay(call.conn.gud.cTime);
+ if (data.receiveLogin.length < day) _res.show = true;
+
+ // 宝箱奖励
+ if (!_res.show) {
+ let _con = G.gc.kaifukuanghuan.taskBoxPrize;
+ let finished = Object.values(data.receiveTask).map(fs => fs.length).reduce((a, b) => a + b);
+ for (let index = 0; index < _con.length; index++) {
+ const element = _con[index];
+ if (data.receiveBox.includes(index)) continue;
+ if (finished < element.total) continue;
+ _res.show = true;
+ }
+ }
+
+ // 任务奖励
+ if (!_res.show) {
+ let _taskcon = G.gc.kaifukuanghuan.task;
+ let tasks = Object.values(G.gc.kaifukuanghuan.task as k_v<_gcType['kaifukuanghuan']['task']['1']>).map(tasks => tasks.map(task => task.taskType)).reduce((a, b) => a.concat(b));
+ let taskFinished = await getTaskVal(call.conn.gud, [...new Set(tasks)]);
+ let _keys = Object.keys(_taskcon);
+ for (let index = 0; index < _keys.length; index++) {
+ const element = _taskcon[_keys[index]];
+
+ for (let indexTask = 0; indexTask < element.length; indexTask++) {
+ const _tmp = element[indexTask];
+ if (parseInt(_keys[index]) > day) break; // 未开放
+ if (data.receiveTask[_keys[index]].includes(indexTask)) continue;
+ // 重复领取 和 条件未满足
+ if (_tmp.taskType != 'jjc_rank') {
+ if ((taskFinished[_tmp.taskType] || 0) < _tmp.total) continue;
+ } else {
+ if ((taskFinished[_tmp.taskType] || 0) > _tmp.total) continue;
+ }
+
+ _res.show = true;
+ break;
+ }
+
+ if (_res.show) break;
+ }
+ }
+ return _res;
+ }
+
+ /**基金红点 */
+ static async jijinHongDian(call: ApiCall) {
+ let _res: hongdianVal = {
+ show: false,
+ val: {
+ keys: []
+ }
+ };
+ let jijintype: jijinType[] = ["dengjijijin", "guanqiajijin", "dayjijin", "tianshujijin"];
+ let logs = await PayFun.getPayLog(call.uid);
+ for (let index = 0; index < jijintype.length; index++) {
+ const element = jijintype[index];
+ let conf = G.gc.jijin[element];
+
+ // 相关数据
+ let data = await G.mongodb.cEvent(element).findOne({ uid: call.uid, type: element });
+ let rec = data?.rec || {}; // 领取数据
+ let val = await getVal(call, logs, element);
+ let payId = element == 'tianshujijin' ? 'zhongshenka' : element;
+ let isPay = logs?.[payId]?.length > 0;
+ for (let taskindex = 0; taskindex < conf.length; taskindex++) {
+ const elementtask = conf[taskindex];
+
+ if (val < elementtask.total) continue; // 未完成
+ let hasPt = elementtask.pt.length > 0;
+ let hasTq = elementtask.tq.length > 0;
+ let getPt = !hasPt || rec[taskindex]?.pt == true;
+ let getTq = !hasTq || rec[taskindex]?.tq == true;
+
+ if (getPt && !getTq && !isPay) continue; // 购买礼包后才可以领取奖励
+ if (getPt && getTq) continue; // 奖励已领取
+
+ _res.show = true;
+ _res.val.keys.push(element);
+ break;
+ }
+ // if (_res.show) break;
+ }
+ return _res;
+ }
+
+ /**追杀令红点 */
+ static async zhuishalingHongDian(call: ApiCall) {
+ let _res: hongdianVal = {
+ show: false,
+ val: {
+ "task": [],
+ "zhanling": 0
+ }
+ };
+
+ let [isOpen, tips] = PublicShared.getOpenCond(call, "zhanling")
+ if (!isOpen) return _res;
+
+ // 任务奖励
+ let conf = G.gc.zhanling.task;
+ let _mydata = await G.mongodb.cEvent('zhanling').findOne({ uid: call.uid, type: 'zhanling' });
+ let tasks = G.gc.zhanling.task.map(t => { return { type: t.type as 'day' | 'week' | 'round', key: t.taskId }; });
+ let taskFinished = await ZhanLingTasks.getLog(call.uid, tasks);
+ for (let index = 0; index < conf.length; index++) {
+ const element = conf[index];
+ if (element.taskId == 'tqexp' && !_mydata?.isPay) continue;
+ if ((_mydata?.taskRec || []).includes(index)) continue;
+ // let taskVal = await ActionLog.getDayLog(call.uid, element.taskId);
+ let _key = `${element.type}@${element.taskId}`;
+ let taskVal = taskFinished[_key];
+ if (taskVal < element.total) continue;
+ _res.show = true;
+ if (!_res.val["task"].includes(element.type)) {
+ _res.val["task"].push(element.type);
+ }
+ // break; 前端要求加 key
+ }
+
+ // 战令奖励
+ let rec = _mydata?.rec || {};
+ let val = _mydata?.lv || 0;
+ let isPay = _mydata?.isPay;
+ let _conf = G.gc.zhanling.prize;
+ for (let zlindex = 0; zlindex < _conf.length; zlindex++) {
+ const zlelement = _conf[zlindex];
+ if (val < zlelement.lv) continue; // 未完成
+ let hasPt = zlelement.pt.length > 0;
+ let hasTq = zlelement.tq.length > 0;
+ let getPt = !hasPt || rec[zlindex]?.pt == true;
+ let getTq = !hasTq || rec[zlindex]?.tq == true;
+
+ if (getPt && !getTq && !isPay) continue; // 购买礼包后才可以领取奖励
+ if (getPt && getTq) continue; // 奖励已领取
+
+ _res.show = true;
+ _res.val["zhanling"] = 1;
+ break;
+ }
+ return _res;
+ }
+
+ /**七日登录红点 */
+ static async qiridengluHongDian(call: ApiCall, hdCon: ReqAddHuoDong) {
+ let _res: hongdianVal = {
+ show: false
+ };
+ let _con = hdCon.data.arr;
+ let day = await ActionLog.getRetainLog(call.uid, `login_day_qiridenglu_${hdCon.hdid}`);
+ let _dbType: `qiridenglu${number}` = `qiridenglu${hdCon.hdid}`
+ let _mydata = await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType });
+ for (let index = 0; index < _con.length; index++) {
+ const element = _con[index];
+ if (element.day > day) continue;
+ if (_mydata?.recPrize?.includes(index)) continue;
+ _res.show = true;
+ break;
+ }
+ return _res;
+ }
+
+ // 一百抽 子函数
+ static async yibaochouhd(conf, finish: number, recArr: number[]) {
+ let ishd: 0 | 1 = 0;
+ for (let index = 0; index < conf.length; index++) {
+ const element = conf[index];
+ if (finish < element.total) continue;
+ if (recArr.includes(index)) continue;
+ ishd = 1;
+ break;
+ }
+ return ishd;
+ }
+
+ /**一百抽红点 */
+ static async yibaichouHongDian(call: ApiCall) {
+ let _res: hongdianVal = {
+ show: false
+ };
+ let [isOpen, tips] = PublicShared.getOpenCond(call, "yibaichou")
+ if (!isOpen) return _res;
+
+ let _con = G.gc.yibaichou;
+ let _type = ['online', 'login'];
+ let _mydata = await G.mongodb.cEvent('yibaichou').findOne({ uid: call.uid, type: 'yibaichou' });
+ for (let index = 0; index < _type.length; index++) {
+ const element = _type[index];
+
+ let conf = G.gc.yibaichou[element + 'Prize'];
+ let finish = element == 'login' ? call.conn.gud.loginDays : call.conn.gud.onlineTime;
+ let recArr: number[] = _mydata?.[element + 'Rec'] || [];
+ let ishd = await this.yibaochouhd(conf, finish, recArr);
+ if (ishd == 1) {
+ _res.show = true;
+ break;
+ }
+ }
+ return _res;
+ }
+
+ /**伙伴招募红点 */
+ static async huobanzhaomuHongDian(call: ApiCall) {
+ let _res: hongdianVal = {
+ show: false
+ };
+
+ let [isOpen, tips] = PublicShared.getOpenCond(call, "huobanzhaomu")
+ if (!isOpen) return _res;
+
+ let _con = G.gc.huobanzhaomu;
+ let _mydata = await G.mongodb.cEvent('huobanzhaomu').findOne({ uid: call.uid, type: 'huobanzhaomu' });
+ for (let index = 0; index < _con.length; index++) {
+ const element = _con[index];
+ if (_mydata?.rec.includes(index)) continue; // 已领取
+ if (element.gudKey && call.conn.gud[element.gudKey] < element.total) continue; // 未达成
+ if (!element.gudKey && (_mydata?.rec?.length || 0) < _con.length - 1) continue; // 大奖资格不够
+ _res.show = true;
+ break;
+ }
+ return _res;
+ }
+
+ /**累计充值红点 */
+ static async leijichongzhiHongDian(call: ApiCall, hdCon: ReqAddHuoDong) {
+ let _res: hongdianVal = {
+ show: false
+ };
+ let _dbType: `leijichongzhi${number}` = `leijichongzhi${hdCon.hdid}`
+ let _con = hdCon.data.tasks;
+ let db = await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType });
+ let _mydata = db || { sTime: PublicShared.getToDayZeroTime(G.time), recIndex: [] };
+ let payNum = await PayFun.getPayDaysAllPayNum(call.uid, hdCon.stime, hdCon.rtime);
+ for (let index = 0; index < _con.length; index++) {
+ const element = _con[index];
+ if (_mydata.recIndex.includes(index)) continue;
+ if (payNum < element.total) continue;
+ _res.show = true;
+ break;
+ }
+ return _res;
+ }
+
+ /**七日累充红点 */
+ static async qirileichongHongDian(call: ApiCall) {
+ let _res: hongdianVal = {
+ show: false
+ };
+ let db = await G.mongodb.cEvent('qirichongzhi').findOne({ uid: call.uid, type: 'qirichongzhi' });
+ let _mydata = db || { round: 0, sTime: PublicShared.getToDayZeroTime(G.time), recIndexs: [] };
+ let _con = G.gc.qirichongzhi[_mydata.round];
+ let finished = await PayFun.getPayDaysAllPayNum(call.uid, _mydata.sTime, _mydata.sTime + G.gc.qirichongzhi[_mydata.round].time);
+ for (let index = 0; index < _con.tasks.length; index++) {
+ const element = _con.tasks[index];
+ if (_mydata.recIndexs.includes(index)) continue;
+ if (finished < element.total) continue;
+ _res.show = true;
+ break;
+ }
+ return _res;
+ }
+
+ /**节日 子函数 */
+ static async jieriHD(call: ApiCall, _conf, recIndex, _type, _finish: number) {
+ let ishd: 0 | 1 = 0;
+ for (let index = 0; index < _conf.length; index++) {
+ const element = _conf[index];
+ if (_type == 'task') _finish = await ActionLog.getDayLog(call.uid, element.taskId);
+ if (_finish < element.total) continue;
+ if (recIndex.includes(index)) continue;
+ ishd = 1;
+ break;
+ }
+ return ishd;
+ }
+
+ /**节日红点 */
+ static async jieriHongDian(call: ApiCall) {
+ let _res: hongdianVal = {
+ show: false
+ };
+ let db = await G.mongodb.cEvent('jierihuodong').findOne({ uid: call.uid, type: 'jierihuodong' });
+ let _mydata = db || { refreshTime: G.time, recTask: [], recLogin: [] };
+ let _types = ['login', 'task'];
+ let finish = call.conn.gud.loginDays;
+ for (let index = 0; index < _types.length; index++) {
+ const element = _types[index];
+ let _conf = element == 'login' ? G.gc.jierihuodong.denglufuli : G.gc.jierihuodong.huodongrenwu;
+ let recIndex = element == 'login' ? (_mydata?.recLogin || []) : (_mydata?.recTask || []);
+ let ishd = await this.jieriHD(call, _conf, recIndex, element, finish);
+ if (ishd == 1) {
+ _res.show = true;
+ break;
+ }
+ }
+ return _res;
+ }
+
+ /**养成目标红点 */
+ static async yangchengmubiaoHongDian(call: ApiCall, hdCon: ReqAddHuoDong) {
+ let _res: hongdianVal = {
+ show: false,
+ };
+
+ let _hdCon = hdCon.data;
+ let _mydata = await YangChengMuBiaofun.getMyData(call, hdCon.hdid);
+
+ let _tasks = {}; // 所有任务 taskid 为key
+ Object.values(_hdCon.tasklist).map(l => {
+ return Object.assign(_tasks, l);
+ });
+
+ let _ishd = 0;
+ for (let indextask = 0; indextask < Object.keys(_tasks).length; indextask++) {
+ const elementtask = Object.keys(_tasks)[indextask];
+ let _tmp = _tasks[elementtask];
+ if (_tmp.pval <= (_mydata.taskval[elementtask] || 0) && !_mydata.finishid[_tmp.type].includes(parseInt(elementtask))) {
+ // 任务完成且没有领取
+ _res.show = true;
+ _ishd = 1;
+ break;
+ }
+ }
+
+ if (_ishd != 1) {
+ let _gift = _hdCon.gift.filter(l => !l.payId && l.need.length <= 0);
+ for (let indexgift = 0; indexgift < _gift.length; indexgift++) {
+ const elementgift = _gift[indexgift];
+ let buyNum = _mydata.record?.[indexgift] || 0;
+ if (buyNum < elementgift.buyNum) {
+ _res.show = true;
+ break;
+ }
+ }
+ }
+ return _res;
+ }
+
+ /**掉落兑换红点 */
+ static async diaoluoduihuanHongDian(call: ApiCall, hdCon: ReqAddHuoDong): Promise {
+ let _dbType: `diaoluoduihuan${number}` = `diaoluoduihuan${hdCon.hdid}`
+ // 取出用户已领取的数据
+ let data = await G.mongodb.cEvent(_dbType).findOne({uid: call.uid, type: _dbType})
+ // 循环活动商店,判断免费与领取
+ let confEvent = Object.keys(hdCon.data.event).filter(k => Array.isArray(hdCon.data.event[k]))
+ for(let key of confEvent){
+ let item = hdCon.data.event[key]
+ for(let i in item) {
+ if(item[i].free && !(data && data.record && data.record[key] && data.record[key][i])) return {show: true}
+ }
+ }
+ return { show: false };
+ }
+
+ /**传说之路 */
+ static async chuanshuozhiluHongDian(call: ApiCall, hdCon: ReqAddHuoDong): Promise {
+ let _dbType: `chuanshuozhilu${number}` = `chuanshuozhilu${hdCon.hdid}`
+
+ let task = hdCon.data
+ let db = await G.mongodb.cEvent(_dbType).findOne({ uid: call.uid, type: _dbType });
+ let info: Partial = db?.info?.[task.hid] || {};
+
+ for (let conf of task.task) {
+ if (info[conf.type] >= conf.total && !(info.rec || []).includes(conf.idx)) return { show: true };
+ }
+
+ if (info.rec?.length >= task.box.total && !info.box) return { show: true };
+
+ return { show: false };
+ }
+
+ /**自选礼包红点 */
+ static async zixuanlibaoHongDian(call: ApiCall, hdCon: ReqAddHuoDong): Promise