From 766dcdec3a887468a9099a8a794d795021034772 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 30 Sep 2025 15:52:54 +0200 Subject: [PATCH] Published code to public --- .gitignore | 2 + README.md | 0 app.js | 69 ++ logger.js | 46 ++ logs/app.log | 220 +++++++ package-lock.json | 1558 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 29 + public/index.html | 26 + public/script.js | 105 +++ public/style.css | 121 ++++ security.js | 166 +++++ 11 files changed, 2342 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app.js create mode 100644 logger.js create mode 100644 logs/app.log create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/index.html create mode 100644 public/script.js create mode 100644 public/style.css create mode 100644 security.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cef0f40 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +files/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/app.js b/app.js new file mode 100644 index 0000000..d0fbe50 --- /dev/null +++ b/app.js @@ -0,0 +1,69 @@ +const express = require('express'); +const path = require('path'); +const fs = require('fs'); +const app = express(); +const { logger, initializeLogging } = require('./logger'); +const { setupSecurity } = require('./security'); + +const FILES_DIR = path.join(__dirname, 'files'); + +// Initialize the logging system +initializeLogging(); + +// Setup security middlewares +setupSecurity(app); + +app.use(express.static(path.join(__dirname, 'public'))); + +// List directory contents +app.get('/api/list', (req, res) => { + const subpath = req.query.path || ''; + const dirPath = path.join(FILES_DIR, subpath); + + if (!dirPath.startsWith(FILES_DIR)) return res.status(400).send('Invalid path.'); + + fs.readdir(dirPath, { withFileTypes: true }, (err, items) => { + if (err) return res.status(500).send('Error reading directory.'); + + const result = items.map(item => ({ + name: item.name, + isDirectory: item.isDirectory() + })); + + res.json(result); + }); +}); + +// Search for files recursively +function searchFiles(dir, term, basePath = '') { + let results = []; + + const items = fs.readdirSync(dir, { withFileTypes: true }); + for (const item of items) { + const fullPath = path.join(dir, item.name); + const relPath = path.join(basePath, item.name); + + if (item.isDirectory()) { + results = results.concat(searchFiles(fullPath, term, relPath)); + } else if (item.name.toLowerCase().includes(term.toLowerCase())) { + results.push(relPath); + } + } + return results; +} + +app.get('/api/search', (req, res) => { + const term = req.query.q || ''; + const results = searchFiles(FILES_DIR, term); + res.json(results); +}); + +// Download endpoint +app.get('/api/download', (req, res) => { + const filePath = path.join(FILES_DIR, req.query.path); + if (!filePath.startsWith(FILES_DIR)) return res.status(400).send('Invalid file path.'); + res.download(filePath); +}); + +const PORT = 3300; +app.listen(PORT, () => console.log(`Server running at http://localhost:${PORT}`)); diff --git a/logger.js b/logger.js new file mode 100644 index 0000000..835ba95 --- /dev/null +++ b/logger.js @@ -0,0 +1,46 @@ +const fs = require('fs'); +const winston = require('winston'); + +// Create a logs directory if it doesn't exist +if (!fs.existsSync('logs')) { + fs.mkdirSync('logs'); +} + +// Define custom log levels +const customLevels = { + levels: { + error: 0, + warn: 1, + info: 2 + }, + colors: { + error: 'bold white redBG', + warn: 'bold red', + info: 'yellow' + }, +}; + +// Add colors to winston +winston.addColors(customLevels.colors); + +// Configure winston logger +const logger = winston.createLogger({ + levels: customLevels.levels, + format: winston.format.combine( + winston.format.colorize(), + winston.format.timestamp(), + winston.format.printf(({ timestamp, level, message }) => { + return `${timestamp} ${level}: ${message}`; + }) + ), + transports: [ + new winston.transports.Console(), + new winston.transports.File({ filename: 'logs/app.log' }) + ] +}); + +const initializeLogging = () => { + logger.info('Logging system initialized'); +}; + +module.exports = { logger, initializeLogging }; diff --git a/logs/app.log b/logs/app.log new file mode 100644 index 0000000..6f89aee --- /dev/null +++ b/logs/app.log @@ -0,0 +1,220 @@ +2025-05-14T13:48:37.911Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T13:48:37.914Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-05-14T13:48:37.914Z info: Logging system initialized +2025-05-14T13:48:37.915Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T13:48:37.915Z warn: Helmet security is disabled for testing purposes +2025-05-14T13:48:37.916Z info: CORS configured with specific settings +2025-05-14T13:48:37.917Z info: Cookie security applied +2025-05-14T13:48:37.917Z info: Rate limiting middleware applied to all routes +2025-05-14T13:48:37.917Z info: DDoS protection middleware applied +2025-05-14T13:48:37.918Z info: Slow down protection applied +2025-05-14T13:49:15.725Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T13:49:15.728Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-05-14T13:49:15.729Z info: Logging system initialized +2025-05-14T13:49:15.729Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T13:49:15.729Z warn: Helmet security is disabled for testing purposes +2025-05-14T13:49:15.730Z info: CORS configured with specific settings +2025-05-14T13:49:15.731Z info: Cookie security applied +2025-05-14T13:49:15.731Z info: Rate limiting middleware applied to all routes +2025-05-14T13:49:15.731Z info: DDoS protection middleware applied +2025-05-14T13:49:15.733Z info: Slow down protection applied +2025-05-14T13:51:18.900Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T13:51:18.904Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-05-14T13:51:18.904Z info: Logging system initialized +2025-05-14T13:51:18.905Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T13:51:18.905Z warn: Helmet security is disabled for testing purposes +2025-05-14T13:51:18.906Z info: CORS configured with specific settings +2025-05-14T13:51:18.907Z info: Cookie security applied +2025-05-14T13:51:18.907Z info: Rate limiting middleware applied to all routes +2025-05-14T13:51:18.907Z info: DDoS protection middleware applied +2025-05-14T13:51:18.908Z info: Slow down protection applied +2025-05-14T13:52:04.019Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T13:52:04.022Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-05-14T13:52:04.022Z info: Logging system initialized +2025-05-14T13:52:04.022Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T13:52:04.023Z warn: Helmet security is disabled for testing purposes +2025-05-14T13:52:04.024Z info: CORS configured with specific settings +2025-05-14T13:52:04.024Z info: Cookie security applied +2025-05-14T13:52:04.025Z info: Rate limiting middleware applied to all routes +2025-05-14T13:52:04.025Z info: DDoS protection middleware applied +2025-05-14T13:52:04.026Z info: Slow down protection applied +2025-05-14T13:57:33.023Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T13:57:33.026Z error: Failed to apply rate limiting middleware +2025-05-14T13:57:33.027Z info: Logging system initialized +2025-05-14T13:57:33.027Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T13:57:33.028Z warn: Helmet security is disabled for testing purposes +2025-05-14T13:57:33.029Z info: CORS configured with specific settings +2025-05-14T13:57:33.029Z info: Cookie security applied +2025-05-14T13:57:33.029Z error: Failed to apply rate limiting middleware +2025-05-14T13:57:33.030Z info: DDoS protection middleware applied +2025-05-14T13:57:33.031Z info: Slow down protection applied +2025-05-14T13:58:54.910Z info: Logging system initialized +2025-05-14T13:58:54.912Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T13:58:54.915Z info: Rate limiting middleware applied to all routes +2025-05-14T13:58:54.915Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T13:58:54.915Z warn: Helmet security is disabled for testing purposes +2025-05-14T13:58:54.916Z info: CORS configured with specific settings +2025-05-14T13:58:54.916Z info: Cookie security applied +2025-05-14T13:58:54.916Z error: Failed to apply rate limiting middleware +2025-05-14T13:58:54.917Z info: DDoS protection middleware applied +2025-05-14T13:58:54.918Z info: Slow down protection applied +2025-05-14T13:59:45.313Z info: Logging system initialized +2025-05-14T13:59:45.316Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T13:59:45.318Z info: Rate limiting middleware applied to all routes +2025-05-14T13:59:45.318Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T13:59:45.319Z warn: Helmet security is disabled for testing purposes +2025-05-14T13:59:45.319Z info: CORS configured with specific settings +2025-05-14T13:59:45.319Z info: Cookie security applied +2025-05-14T13:59:45.320Z error: Failed to apply rate limiting middleware +2025-05-14T13:59:45.320Z info: DDoS protection middleware applied +2025-05-14T13:59:45.321Z info: Slow down protection applied +2025-05-14T14:00:15.802Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T14:00:15.805Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-05-14T14:00:15.806Z info: Logging system initialized +2025-05-14T14:00:15.806Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T14:00:15.806Z warn: Helmet security is disabled for testing purposes +2025-05-14T14:00:15.808Z info: CORS configured with specific settings +2025-05-14T14:00:15.808Z info: Cookie security applied +2025-05-14T14:00:15.808Z info: Rate limiting middleware applied to all routes +2025-05-14T14:00:15.809Z info: DDoS protection middleware applied +2025-05-14T14:00:15.810Z info: Slow down protection applied +2025-05-14T14:01:36.502Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T14:01:36.504Z info: Logging system initialized +2025-05-14T14:01:36.506Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-05-14T14:01:36.506Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T14:01:36.506Z warn: Helmet security is disabled for testing purposes +2025-05-14T14:01:36.508Z info: CORS configured with specific settings +2025-05-14T14:01:36.508Z info: Cookie security applied +2025-05-14T14:01:36.508Z info: Rate limiting middleware applied to all routes +2025-05-14T14:01:36.508Z info: DDoS protection middleware applied +2025-05-14T14:01:36.509Z info: Slow down protection applied +2025-05-14T14:03:58.188Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T14:03:58.194Z info: Logging system initialized +2025-05-14T14:03:58.198Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-05-14T14:03:58.199Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T14:03:58.199Z warn: Helmet security is disabled for testing purposes +2025-05-14T14:03:58.201Z info: CORS configured with specific settings +2025-05-14T14:03:58.201Z info: Cookie security applied +2025-05-14T14:03:58.201Z info: Rate limiting middleware applied to all routes +2025-05-14T14:03:58.202Z info: DDoS protection middleware applied +2025-05-14T14:03:58.203Z info: Slow down protection applied +2025-05-14T14:04:27.919Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T14:04:27.922Z info: Logging system initialized +2025-05-14T14:04:27.925Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-05-14T14:04:27.926Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T14:04:27.927Z warn: Helmet security is disabled for testing purposes +2025-05-14T14:04:27.928Z info: CORS configured with specific settings +2025-05-14T14:04:27.929Z info: Cookie security applied +2025-05-14T14:04:27.929Z info: Rate limiting middleware applied to all routes +2025-05-14T14:04:27.930Z info: DDoS protection middleware applied +2025-05-14T14:04:27.931Z info: Slow down protection applied +2025-05-14T14:04:52.718Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-05-14T14:04:52.720Z info: Logging system initialized +2025-05-14T14:04:52.723Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-05-14T14:04:52.724Z warn: HTTPS redirect is disabled for testing purposes +2025-05-14T14:04:52.727Z info: Helmet middleware applied with custom settings +2025-05-14T14:04:52.727Z info: CORS configured with specific settings +2025-05-14T14:04:52.728Z info: Cookie security applied +2025-05-14T14:04:52.730Z info: Rate limiting middleware applied to all routes +2025-05-14T14:04:52.730Z info: DDoS protection middleware applied +2025-05-14T14:04:52.732Z info: Slow down protection applied +2025-06-04T02:25:57.385Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-06-04T02:25:57.398Z info: Logging system initialized +2025-06-04T02:25:57.409Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-06-04T02:25:57.410Z warn: HTTPS redirect is disabled for testing purposes +2025-06-04T02:25:57.414Z info: Helmet middleware applied with custom settings +2025-06-04T02:25:57.466Z info: CORS configured with specific settings +2025-06-04T02:25:57.467Z info: Cookie security applied +2025-06-04T02:25:57.468Z info: Rate limiting middleware applied to all routes +2025-06-04T02:25:57.468Z info: DDoS protection middleware applied +2025-06-04T02:25:57.472Z info: Slow down protection applied +2025-08-19T05:52:26.188Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-08-19T05:52:26.192Z info: Logging system initialized +2025-08-19T05:52:26.196Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-08-19T05:52:26.197Z warn: HTTPS redirect is disabled for testing purposes +2025-08-19T05:52:26.200Z info: Helmet middleware applied with custom settings +2025-08-19T05:52:26.201Z info: CORS configured with specific settings +2025-08-19T05:52:26.201Z info: Cookie security applied +2025-08-19T05:52:26.202Z info: Rate limiting middleware applied to all routes +2025-08-19T05:52:26.202Z info: DDoS protection middleware applied +2025-08-19T05:52:26.204Z info: Slow down protection applied +2025-09-04T19:42:43.365Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-09-04T19:42:43.372Z info: Logging system initialized +2025-09-04T19:42:43.383Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-09-04T19:42:43.388Z warn: HTTPS redirect is disabled for testing purposes +2025-09-04T19:42:43.770Z info: Helmet middleware applied with custom settings +2025-09-04T19:42:43.771Z info: CORS configured with specific settings +2025-09-04T19:42:43.774Z info: Cookie security applied +2025-09-04T19:42:43.775Z info: Rate limiting middleware applied to all routes +2025-09-04T19:42:43.776Z info: DDoS protection middleware applied +2025-09-04T19:42:43.780Z info: Slow down protection applied +2025-09-07T12:55:42.608Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-09-07T12:55:42.609Z info: Logging system initialized +2025-09-07T12:55:42.625Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-09-07T12:55:42.681Z warn: HTTPS redirect is disabled for testing purposes +2025-09-07T12:55:42.688Z info: Helmet middleware applied with custom settings +2025-09-07T12:55:42.693Z info: CORS configured with specific settings +2025-09-07T12:55:42.693Z info: Cookie security applied +2025-09-07T12:55:42.694Z info: Rate limiting middleware applied to all routes +2025-09-07T12:55:42.698Z info: DDoS protection middleware applied +2025-09-07T12:55:42.699Z info: Slow down protection applied +2025-09-09T06:59:08.924Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-09-09T06:59:08.926Z info: Logging system initialized +2025-09-09T06:59:08.930Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-09-09T06:59:08.930Z warn: HTTPS redirect is disabled for testing purposes +2025-09-09T06:59:08.994Z info: Helmet middleware applied with custom settings +2025-09-09T06:59:08.996Z info: CORS configured with specific settings +2025-09-09T06:59:08.997Z info: Cookie security applied +2025-09-09T06:59:08.997Z info: Rate limiting middleware applied to all routes +2025-09-09T06:59:09.002Z info: DDoS protection middleware applied +2025-09-09T06:59:09.004Z info: Slow down protection applied +2025-09-09T06:59:12.597Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-09-09T06:59:12.600Z info: Logging system initialized +2025-09-09T06:59:12.604Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-09-09T06:59:12.605Z warn: HTTPS redirect is disabled for testing purposes +2025-09-09T06:59:12.608Z info: Helmet middleware applied with custom settings +2025-09-09T06:59:12.608Z info: CORS configured with specific settings +2025-09-09T06:59:12.609Z info: Cookie security applied +2025-09-09T06:59:12.609Z info: Rate limiting middleware applied to all routes +2025-09-09T06:59:12.610Z info: DDoS protection middleware applied +2025-09-09T06:59:12.611Z info: Slow down protection applied +2025-09-09T07:00:40.009Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-09-09T07:00:40.011Z info: Logging system initialized +2025-09-09T07:00:40.015Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-09-09T07:00:40.015Z warn: HTTPS redirect is disabled for testing purposes +2025-09-09T07:00:40.018Z info: Helmet middleware applied with custom settings +2025-09-09T07:00:40.018Z info: CORS configured with specific settings +2025-09-09T07:00:40.019Z info: Cookie security applied +2025-09-09T07:00:40.019Z info: Rate limiting middleware applied to all routes +2025-09-09T07:00:40.020Z info: DDoS protection middleware applied +2025-09-09T07:00:40.021Z info: Slow down protection applied +2025-09-09T07:12:38.021Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-09-09T07:12:38.023Z info: Logging system initialized +2025-09-09T07:12:38.027Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-09-09T07:12:38.027Z warn: HTTPS redirect is disabled for testing purposes +2025-09-09T07:12:38.030Z info: Helmet middleware applied with custom settings +2025-09-09T07:12:38.031Z info: CORS configured with specific settings +2025-09-09T07:12:38.031Z info: Cookie security applied +2025-09-09T07:12:38.083Z info: Rate limiting middleware applied to all routes +2025-09-09T07:12:38.083Z info: DDoS protection middleware applied +2025-09-09T07:12:38.088Z info: Slow down protection applied +2025-09-09T07:14:15.687Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-09-09T07:14:15.691Z info: Logging system initialized +2025-09-09T07:14:15.696Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-09-09T07:14:15.696Z warn: HTTPS redirect is disabled for testing purposes +2025-09-09T07:14:15.701Z info: Helmet middleware applied with custom settings +2025-09-09T07:14:15.701Z info: CORS configured with specific settings +2025-09-09T07:14:15.702Z info: Cookie security applied +2025-09-09T07:14:15.703Z info: Rate limiting middleware applied to all routes +2025-09-09T07:14:15.703Z info: DDoS protection middleware applied +2025-09-09T07:14:15.706Z info: Slow down protection applied +2025-09-09T07:14:43.210Z info: DDoS protection initialized with burst: 10, limit: 15 +2025-09-09T07:14:43.212Z info: Logging system initialized +2025-09-09T07:14:43.215Z info: Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs +2025-09-09T07:14:43.216Z warn: HTTPS redirect is disabled for testing purposes +2025-09-09T07:14:43.218Z info: Helmet middleware applied with custom settings +2025-09-09T07:14:43.218Z info: CORS configured with specific settings +2025-09-09T07:14:43.219Z info: Cookie security applied +2025-09-09T07:14:43.219Z info: Rate limiting middleware applied to all routes +2025-09-09T07:14:43.219Z info: DDoS protection middleware applied +2025-09-09T07:14:43.220Z info: Slow down protection applied diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bda577a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1558 @@ +{ + "name": "edubooks", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "edubooks", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "body-parser": "^1.20.3", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "ddos": "^0.2.1", + "dotenv": "^16.4.7", + "express": "^4.21.2", + "express-rate-limit": "^7.5.0", + "express-slow-down": "^2.0.3", + "express-sslify": "^1.2.0", + "helmet": "^8.1.0", + "megajs": "^1.3.5", + "mysql2": "^3.12.0", + "mysql2-promise": "^0.1.4", + "validator": "^13.15.0", + "winston": "^3.17.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha512-tOIuy1/SK/dr94ZA0ckDohKXNeBNqZ4us6PjMVLs5h1w2GBB6uPtOknp2+VF4F/zcy9LI70W+Z+pE2Soajky1w==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/bn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-2.0.0.tgz", + "integrity": "sha512-NmOLApC80+n+P28y06yHgwGlOCkq/X4jRh5s590959FZXSrM+I/61h0xxuIaYsg0mD44mEAZYG/rnclWuRoz+A==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cardinal": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.4.tgz", + "integrity": "sha512-3MxV0o9wOpQcobrcSrRpaSxlYkohCcZu0ytOjJUww/Yo/223q4Ecloo7odT+M0SI5kPgb1JhvSaF4EEuVXOLAQ==", + "license": "MIT", + "dependencies": { + "ansicolors": "~0.2.1", + "redeyed": "~0.4.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ddos": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ddos/-/ddos-0.2.1.tgz", + "integrity": "sha512-IDTS5NBK0PzbYWqXhZyIVkrKGdvC+lEfOUF8HWWDYdvH8pr4s0eQNDNgWmaSQhZWe8GXQcyqujdQXklML4d9LQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.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==", + "license": "Apache-2.0", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/double-ended-queue": { + "version": "2.0.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.0.0-0.tgz", + "integrity": "sha512-t5ouWOpItmHrm0J0+bX/cFrIjBFWnJkk5LbIJq6bbU/M4aLX2c3LrM4QYsBptwvlPe3WzdpQefQ0v1pe/A5wjg==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/express-slow-down": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/express-slow-down/-/express-slow-down-2.0.3.tgz", + "integrity": "sha512-vATCiFd8uQHtTeK5/Q0nLUukhZh+RV5zkcHxLQr0X5dEFVEYqzVXEe48nW23Z49fwtR+ApD9zn9sZRisTCR99w==", + "license": "MIT", + "dependencies": { + "express-rate-limit": "7" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "express": "4 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/express-sslify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/express-sslify/-/express-sslify-1.2.0.tgz", + "integrity": "sha512-OOf2B3MxAVjEXPPWl4Z19wA2oMH+RCULJVhejPwuhiDDClr9QczZz5ycABLSnnN+oY8JcLs32ghs9cxOj0vi+w==", + "license": "MIT" + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "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/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/helmet": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", + "integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==", + "license": "MIT", + "engines": { + "node": ">=18.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==", + "license": "MIT", + "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/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/logform/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/lru.min": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", + "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/megajs": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/megajs/-/megajs-1.3.7.tgz", + "integrity": "sha512-DqEkY8UaFGAcsyh0oxGe+llQuiPIJFdrt1iaxVvq/2HjozNJeF13FXEcq6/7aJlfs8IUYrHcv8I8G6Q40jD2Ug==", + "license": "MIT", + "dependencies": { + "pumpify": "^2.0.1", + "stream-skip": "^1.0.3" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "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==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/mysql2": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.1.tgz", + "integrity": "sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2-promise": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mysql2-promise/-/mysql2-promise-0.1.4.tgz", + "integrity": "sha512-/h8ubU/36aIPpbfB6CENw9ZdbzIhZMZOIbstJUHVKp4J9JBRSLScrYImVx+3yZilgag732UhpQMMK5+ktdhLCw==", + "license": "MIT", + "dependencies": { + "mysql2": "^0.15.7", + "q": "^1.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mysql2-promise/node_modules/lru-cache": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "integrity": "sha512-dVmQmXPBlTgFw77hm60ud//l2bCuDKkqC2on1EBoM7s9Urm9IQDrnujwZ93NFnAq0dVZ0HBXTS7PwEG+YE7+EQ==", + "license": "MIT" + }, + "node_modules/mysql2-promise/node_modules/mysql2": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-0.15.8.tgz", + "integrity": "sha512-3x5o6C20bfwJYPSoT74MOoad7/chJoq4qXHDL5VAuRBBrIyErovLoj04Dz/5EY9X2kTxWSGNiTegtxpROTd2YQ==", + "license": "MIT", + "dependencies": { + "bn.js": "2.0.0", + "cardinal": "0.4.4", + "double-ended-queue": "2.0.0-0", + "named-placeholders": "0.1.3", + "readable-stream": "1.0.33" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/mysql2-promise/node_modules/named-placeholders": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-0.1.3.tgz", + "integrity": "sha512-Mt79RtxZ6MYTIEemPGv/YDKpbuavcAyGHb0r37xB2mnE5jej3uBzc4+nzOeoZ4nZiii1M32URKt9IjkSTZAmTA==", + "license": "MIT", + "dependencies": { + "lru-cache": "2.5.0" + } + }, + "node_modules/mysql2-promise/node_modules/readable-stream": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "integrity": "sha512-72KxhcKi8bAvHP/cyyWSP+ODS5ef0DIRs0OzrhGXw31q41f19aoELCbvd42FjhpyEDxQMRiiC5rq9rfE5PzTqg==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/mysql2-promise/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "license": "MIT", + "dependencies": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "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.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redeyed": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", + "integrity": "sha512-pnk1vsaNLu1UAAClKsImKz9HjBvg9i8cbRqTRzJbiCjGF0fZSMqpdcA5W3juO3c4etFvTrabECkq9wjC45ZyxA==", + "license": "MIT", + "dependencies": { + "esprima": "~1.0.4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "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/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.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==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" + }, + "node_modules/stream-skip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-skip/-/stream-skip-1.0.3.tgz", + "integrity": "sha512-2rB0uBiOnYSQwJxJ3wZLher+fz0yyXQxKuKnVTsidHmkqvC8rWZ2AbX50ZVdz7fsL6zkYkqaN/pPD0RldKIbpQ==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/validator": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.0.tgz", + "integrity": "sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/winston": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..99e3eff --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "edubooks", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "body-parser": "^1.20.3", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "ddos": "^0.2.1", + "dotenv": "^16.4.7", + "express": "^4.21.2", + "express-rate-limit": "^7.5.0", + "express-slow-down": "^2.0.3", + "express-sslify": "^1.2.0", + "helmet": "^8.1.0", + "megajs": "^1.3.5", + "mysql2": "^3.12.0", + "mysql2-promise": "^0.1.4", + "validator": "^13.15.0", + "winston": "^3.17.0" + } +} diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..886931a --- /dev/null +++ b/public/index.html @@ -0,0 +1,26 @@ + + + + + Eduvos Books + + + + +
+

Eduvos Books

+

+ Please note. These books are cracked copies and NOT official retail copies. + I am not liable for any incorrect or unofficial pdf files. Also note that if + something was to go wrong, the site will be shut down WITHOUT notice. +

+ + + + + +
+ + + + diff --git a/public/script.js b/public/script.js new file mode 100644 index 0000000..ed11088 --- /dev/null +++ b/public/script.js @@ -0,0 +1,105 @@ +const fileList = document.getElementById('file-list'); +const searchBox = document.getElementById('search'); +const breadcrumb = document.getElementById('breadcrumb'); +let currentPath = ''; + +function pathJoin(...parts) { + return parts.filter(Boolean).join('/'); +} + +function fetchDirectory(path = '') { + fetch(`/api/list?path=${encodeURIComponent(path)}`) + .then(res => res.json()) + .then(data => { + currentPath = path; + renderBreadcrumb(path); + renderList(data); + }); +} + +function renderBreadcrumb(path) { + breadcrumb.innerHTML = ''; + const parts = path.split('/').filter(Boolean); + let accum = ''; + + const root = document.createElement('span'); + root.textContent = 'Home'; + root.onclick = () => fetchDirectory(''); + breadcrumb.appendChild(root); + + parts.forEach((part, index) => { + accum = pathJoin(accum, part); + const sep = document.createElement('span'); + sep.className = 'separator'; + sep.textContent = ' / '; + breadcrumb.appendChild(sep); + + const crumb = document.createElement('span'); + crumb.textContent = part; + crumb.onclick = () => fetchDirectory(parts.slice(0, index + 1).join('/')); + breadcrumb.appendChild(crumb); + }); +} + +function renderList(items) { + fileList.innerHTML = ''; + + const folders = items.filter(i => i.isDirectory); + const files = items.filter(i => !i.isDirectory); + + folders.forEach(item => { + const li = document.createElement('li'); + li.className = 'folder'; + li.textContent = `📁 ${item.name}`; + li.onclick = () => fetchDirectory(pathJoin(currentPath, item.name)); + fileList.appendChild(li); + }); + + files.forEach(item => { + const li = document.createElement('li'); + li.textContent = item.name; + + const link = document.createElement('a'); + link.href = `/api/download?path=${encodeURIComponent(pathJoin(currentPath, item.name))}`; + link.textContent = 'Download'; + link.className = 'download-link'; + link.onclick = e => e.stopPropagation(); + + li.appendChild(link); + fileList.appendChild(li); + }); +} + +function searchFiles(term) { + fetch(`/api/search?q=${encodeURIComponent(term)}`) + .then(res => res.json()) + .then(results => { + breadcrumb.innerHTML = ''; + fileList.innerHTML = ''; + + results.forEach(relPath => { + const li = document.createElement('li'); + li.textContent = relPath; + + const link = document.createElement('a'); + link.href = `/api/download?path=${encodeURIComponent(relPath)}`; + link.textContent = 'Download'; + link.className = 'download-link'; + link.onclick = e => e.stopPropagation(); + + li.appendChild(link); + fileList.appendChild(li); + }); + }); +} + +searchBox.addEventListener('input', e => { + const term = e.target.value.trim(); + if (term.length === 0) { + fetchDirectory(); + } else { + searchFiles(term); + } +}); + +fetchDirectory(); \ No newline at end of file diff --git a/public/style.css b/public/style.css new file mode 100644 index 0000000..148b12e --- /dev/null +++ b/public/style.css @@ -0,0 +1,121 @@ +:root { + --bg: #2c2c2d; + --card-bg: #232222; + --primary: #007aff; + --border: #1a1919; + --text: #c2c2c9; + } + + body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + background: var(--bg); + color: var(--text); + } + + .container { + max-width: 900px; + margin: 0 auto; + padding: 20px; + background: var(--card-bg); + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.1); + border-radius: 12px; + margin-top: 40px; + } + + h1 { + font-size: 24px; + margin-bottom: 20px; + } + + input[type="text"] { + width: 96%; + padding: 14px; + font-size: 16px; + border: 1px solid var(--border); + border-radius: 10px; + margin-bottom: 16px; + background-color: #1e1e1e; /* dark background */ + color: #f5f5f5; /* light text */ + border: 1px solid #444; /* subtle border */ + } + + .breadcrumb { + display: flex; + flex-wrap: wrap; + margin-bottom: 16px; + gap: 4px; + font-size: 15px; + } + + .breadcrumb span { + color: var(--primary); + cursor: pointer; + } + + .breadcrumb .separator { + color: #999; + } + + .file-list { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + } + + .file-list li { + display: flex; + justify-content: space-between; + align-items: center; + padding: 14px; + border-bottom: 1px solid var(--border); + font-size: 16px; + transition: background 0.2s ease; + } + + .file-list li.folder { + color: var(--primary); + font-weight: 500; + cursor: pointer; + } + + .file-list li.folder:hover { + background: #262626; + } + + a.download-link { + color: var(--primary); + text-decoration: none; + font-size: 14px; + } + + a.download-link:hover { + text-decoration: underline; + } + + @media (max-width: 600px) { + h1 { + font-size: 20px; + } + + input[type="text"] { + font-size: 14px; + padding: 12px; + background-color: #1e1e1e; /* dark background */ + color: #f5f5f5; /* light text */ + border: 1px solid #444; /* subtle border */ + } + + + .file-list li { + font-size: 15px; + padding: 12px; + } + + a.download-link { + font-size: 13px; + } + } + \ No newline at end of file diff --git a/security.js b/security.js new file mode 100644 index 0000000..b6b0bf9 --- /dev/null +++ b/security.js @@ -0,0 +1,166 @@ +const rateLimit = require('express-rate-limit'); +const helmet = require('helmet'); +const cors = require('cors'); +const express = require('express'); +const Ddos = require('ddos'); +const sslify = require('express-sslify'); +const cookieParser = require('cookie-parser'); +const slowDown = require('express-slow-down'); +const { logger } = require('./logger'); +const validator = require('validator'); + +// Feature Toggle Booleans +const enableDdosProtection = true; +const enableRateLimiting = true; +const enableHelmet = true; +const enableCORS = true; +const enableHttpsRedirect = false; +const enableCookieSecurity = true; +const enableSlowDown = true; + +// Initialize DDoS protection with default configuration +let ddos; +if (enableDdosProtection) { + try { + ddos = new Ddos({ burst: 10, limit: 15 }); + logger.info({ message: 'DDoS protection initialized with burst: 10, limit: 15' }); + } catch (error) { + logger.error({ message: 'Failed to initialize DDoS protection', error }); + } +} + +// Function to apply security middlewares to the app +const setupSecurity = (app) => { + + app.set('trust proxy', 'loopback'); + + // Configure rate limiting + let limiter; + if (enableRateLimiting) { + try { + limiter = rateLimit({ + windowMs: 5 * 60 * 1000, // 15 minutes + max: 300, // Limit each IP to 100 requests per windowMs + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: false, // Disable the `X-RateLimit-*` headers + }); + logger.info({ message: 'Rate limiting configured with windowMs: 15 minutes, max: 100 requests per windowMs' }); + } catch (error) { + logger.error({ message: 'Failed to configure rate limiting', error }); + } + } + // Apply HTTPS redirect if enabled + if (enableHttpsRedirect) { + try { + app.use(sslify.HTTPS({ trustProtoHeader: true })); + logger.info({ message: 'HTTPS redirect middleware applied' }); + } catch (error) { + logger.error({ message: 'Failed to apply HTTPS redirect middleware', error }); + } + } else { + logger.warn({ message: 'HTTPS redirect is disabled for testing purposes' }); + } + + // Apply Helmet to secure HTTP headers + if (enableHelmet) { + try { + app.use(helmet()); + app.use(helmet.contentSecurityPolicy({ + directives: { + defaultSrc: ["'self'"], + scriptSrc: ["'self'", "'unsafe-inline'", "'unsafe-eval'"], + styleSrc: ["'self'", "'unsafe-inline'"], + imgSrc: ["'self'", "data:", "https:"], + connectSrc: ["'self'"], + fontSrc: ["'self'"], + objectSrc: ["'none'"], + upgradeInsecureRequests: [] + } + })); + app.use(helmet.frameguard({ action: 'deny' })); + app.use(helmet.xssFilter()); + app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true, preload: true })); + logger.info({ message: 'Helmet middleware applied with custom settings' }); + } catch (error) { + logger.error({ message: 'Failed to apply Helmet middleware', error }); + } + } else { + logger.warn({ message: 'Helmet security is disabled for testing purposes' }); + } + + // Apply CORS if enabled + if (enableCORS) { + try { + app.use(cors({ + origin: ['https://ourdomain.co.za'], + methods: ['GET', 'POST'], + allowedHeaders: ['Content-Type', 'Authorization'] + })); + logger.info({ message: 'CORS configured with specific settings' }); + } catch (error) { + logger.error({ message: 'Failed to apply CORS settings', error }); + } + } else { + logger.warn({ message: 'CORS is disabled for testing purposes' }); + } + + // Apply Cookie security if enabled + if (enableCookieSecurity) { + try { + app.use(cookieParser()); + app.use((req, res, next) => { + res.cookie('name', 'value', { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'Strict' }); + next(); + }); + logger.info({ message: 'Cookie security applied' }); + } catch (error) { + logger.error({ message: 'Failed to apply cookie security', error }); + } + } else { + logger.warn({ message: 'Cookie security is disabled for testing purposes' }); + } + + // Apply rate limiting if enabled + if (enableRateLimiting) { + try { + app.use(limiter); + logger.info({ message: 'Rate limiting middleware applied to all routes' }); + } catch (error) { + logger.error({ message: 'Failed to apply rate limiting middleware', error }); + } + } else { + logger.warn({ message: 'Rate limiting is disabled for testing purposes' }); + } + + // Apply DDoS protection if enabled + if (enableDdosProtection) { + try { + app.use(ddos.express); + logger.info({ message: 'DDoS protection middleware applied' }); + } catch (error) { + logger.error({ message: 'Failed to apply DDoS protection middleware', error }); + } + } else { + logger.warn({ message: 'DDoS protection is disabled for testing purposes' }); + } + + // Apply slow down protection if enabled + if (enableSlowDown) { + try { + app.use(slowDown({ + windowMs: 15 * 60 * 1000, // 15 minutes + delayAfter: 100, // Delay after 100 requests + delayMs: () => 500 // Apply a fixed 500ms delay after exceeding the threshold + })); + logger.info({ message: 'Slow down protection applied' }); + } catch (error) { + logger.error({ message: 'Failed to apply slow down protection', error }); + } + } else { + logger.warn({ message: 'Slow down protection is disabled for testing purposes' }); + } + + +}; + +module.exports = { setupSecurity };