vipkee commited on
Commit
063458c
·
1 Parent(s): 2a169ac

Add application file

Browse files
.env.example ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ # Server mode: 'stdio' or 'rest'
2
+ MCP_MODE=stdio
3
+
4
+ # REST server settings (only used if MCP_MODE=rest)
5
+ MCP_PORT=9593
6
+ MCP_ENDPOINT=/rest
.eslintrc.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "parser": "@typescript-eslint/parser",
3
+ "extends": [
4
+ "eslint:recommended",
5
+ "plugin:@typescript-eslint/recommended"
6
+ ],
7
+ "parserOptions": {
8
+ "ecmaVersion": 2022,
9
+ "sourceType": "module"
10
+ },
11
+ "rules": {
12
+ "@typescript-eslint/explicit-function-return-type": "off",
13
+ "@typescript-eslint/no-explicit-any": "warn",
14
+ "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }]
15
+ }
16
+ }
.gitignore ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dependencies
2
+ node_modules/
3
+ npm-debug.log*
4
+ yarn-debug.log*
5
+ yarn-error.log*
6
+
7
+ # Build output
8
+ #dist/
9
+ build/
10
+
11
+ # Environment variables
12
+ .env
13
+ .env.local
14
+ .env.development.local
15
+ .env.test.local
16
+ .env.production.local
17
+
18
+ # Operating System Files
19
+ .DS_Store
20
+ Thumbs.db
21
+
22
+ # IDE and Editor files
23
+ .idea/
24
+ .vscode/
25
+ *.swp
26
+ *.swo
27
+
28
+ # TypeScript cache
29
+ *.tsbuildinfo
30
+
31
+ # Logs
32
+ logs
33
+ *.log
Dockerfile ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:22.12-alpine AS builder
2
+
3
+ COPY ./ /app
4
+
5
+ WORKDIR /app
6
+
7
+ RUN --mount=type=cache,target=/root/.npm npm install
8
+ RUN npm run build
9
+
10
+ FROM node:22.12-alpine AS release
11
+
12
+ WORKDIR /app
13
+
14
+ # Copy necessary files from the builder stage
15
+ COPY --from=builder /app/dist /app/dist
16
+ COPY --from=builder /app/package.json /app/package.json
17
+ COPY --from=builder /app/package-lock.json /app/package-lock.json
18
+ COPY --from=builder /app/src/public/tailwind.css /app/src/public/tailwind.css
19
+ COPY --from=builder /app/src/public/styles.css /app/src/public/styles.css
20
+
21
+ ENV NODE_ENV=production
22
+
23
+ RUN npm ci --ignore-scripts --omit-dev
24
+
25
+ ENTRYPOINT ["node", "dist/index.js"]
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2023-present Suncture Healthcare MCP Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
chatmcp.yaml ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ params:
2
+ type: object
3
+ properties:
4
+ # No required authentication keys for this MCP server
5
+ required: []
6
+
7
+ rest:
8
+ name: suncture-healthcare
9
+ port: 9593
10
+ endpoint: /rest
11
+
12
+ npx:
13
+ command: |
14
+ MCP_MODE=stdio npx -y suncture-healthcare-mcp
15
+ config: |
16
+ {
17
+ "mcpServers": {
18
+ "suncture-healthcare": {
19
+ "command": "npx",
20
+ "args": [
21
+ "-y",
22
+ "suncture-healthcare-mcp"
23
+ ],
24
+ "env": {
25
+ "MCP_MODE": "stdio"
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ docker:
32
+ command: |
33
+ docker run -i --rm -e MCP_MODE=stdio mcp/suncture-healthcare
34
+ config: |
35
+ {
36
+ "mcpServers": {
37
+ "suncture-healthcare": {
38
+ "command": "docker",
39
+ "args": [
40
+ "run",
41
+ "-i",
42
+ "--rm",
43
+ "-e",
44
+ "MCP_MODE=stdio",
45
+ "mcp/suncture-healthcare"
46
+ ],
47
+ "env": {}
48
+ }
49
+ }
50
+ }
package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
package.json ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "suncture-healthcare-mcp",
3
+ "version": "1.0.0",
4
+ "description": "Healthcare MCP Server with medical tools for AI assistants",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "suncture-healthcare-mcp": "./dist/bin.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc && node scripts/fix-shebangs.js",
12
+ "build:css": "npx tailwindcss -i ./src/public/styles.css -o ./src/public/tailwind.css",
13
+ "start": "node dist/index.js",
14
+ "dev": "ts-node src/index.ts",
15
+ "prepare": "npm run build",
16
+ "prepublishOnly": "npm test && npm run lint",
17
+ "lint": "eslint src/**/*.ts",
18
+ "test": "echo \"No tests specified\" && exit 0",
19
+ "test-sse": "node scripts/test-sse-client.js"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md",
24
+ "LICENSE"
25
+ ],
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/wilforlan/suncture-mcp.git"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "keywords": [
34
+ "healthcare",
35
+ "mcp",
36
+ "medical",
37
+ "ai",
38
+ "assistant",
39
+ "claude",
40
+ "model-context-protocol"
41
+ ],
42
+ "author": "Isaac Williams, Suncture",
43
+ "license": "MIT",
44
+ "dependencies": {
45
+ "@chatmcp/sdk": "^1.0.5",
46
+ "@modelcontextprotocol/sdk": "^1.9.0",
47
+ "@tailwindcss/forms": "^0.5.10",
48
+ "@types/cors": "^2.8.17",
49
+ "concurrently": "^8.2.2",
50
+ "cors": "^2.8.5",
51
+ "express": "^4.18.2",
52
+ "node-fetch": "^3.3.2",
53
+ "tailwindcss": "^4.1.4",
54
+ "zod": "^3.22.0"
55
+ },
56
+ "devDependencies": {
57
+ "@types/express": "^4.17.21",
58
+ "@types/node": "^20.5.0",
59
+ "@typescript-eslint/eslint-plugin": "^6.4.0",
60
+ "@typescript-eslint/parser": "^6.4.0",
61
+ "eslint": "^8.47.0",
62
+ "ts-node": "^10.9.1",
63
+ "typescript": "^5.1.6"
64
+ },
65
+ "engines": {
66
+ "node": ">=18.0.0"
67
+ }
68
+ }
postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
scripts/fix-shebangs.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+
3
+ import { readFileSync, writeFileSync, chmodSync } from 'fs';
4
+ import { join } from 'path';
5
+
6
+ // This script adds the shebang line to bin.js after TypeScript compilation
7
+ // and makes the file executable
8
+
9
+ const binFilePath = join(process.cwd(), 'dist', 'bin.js');
10
+
11
+ try {
12
+ const content = readFileSync(binFilePath, 'utf8');
13
+
14
+ // Only add shebang if it doesn't already exist
15
+ if (!content.startsWith('#!/usr/bin/env node')) {
16
+ const newContent = `#!/usr/bin/env node\n${content}`;
17
+ writeFileSync(binFilePath, newContent);
18
+ console.log('Added shebang to bin.js');
19
+ }
20
+
21
+ // Make the file executable (chmod +x)
22
+ chmodSync(binFilePath, '755');
23
+ console.log('Made bin.js executable');
24
+ } catch (error) {
25
+ console.error('Error fixing shebangs:', error);
26
+ process.exit(1);
27
+ }
scripts/test-sse-client.js ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+
3
+ // Simple test client for the SSE server
4
+ import fetch from 'node-fetch';
5
+
6
+ const PORT = process.env.PORT || 3001;
7
+ const SERVER_URL = `http://localhost:${PORT}`;
8
+
9
+ // Test connectivity to the server
10
+ async function testSSEConnection() {
11
+ console.log(`Testing connection to ${SERVER_URL}/sse`);
12
+
13
+ try {
14
+ // First test if the server is running with a simple fetch
15
+ const response = await fetch(`${SERVER_URL}/sse`);
16
+ console.log(`Server response status: ${response.status}`);
17
+
18
+ if (response.status === 200) {
19
+ console.log('Connection successful! Server is responding correctly.');
20
+ console.log('Set up an EventSource to test real-time updates:');
21
+
22
+ // In a browser, you'd use:
23
+ // const eventSource = new EventSource('http://localhost:3001/sse');
24
+ // eventSource.onmessage = (event) => {
25
+ // console.log('Received message:', event.data);
26
+ // };
27
+ // eventSource.onerror = (error) => {
28
+ // console.error('EventSource error:', error);
29
+ // };
30
+ } else {
31
+ console.error(`Server returned unexpected status: ${response.status}`);
32
+ }
33
+ } catch (error) {
34
+ console.error('Error connecting to server:', error);
35
+ console.log('\nPossible issues:');
36
+ console.log('1. Ensure the server is running (npm run dev)');
37
+ console.log('2. Check if another process is using port 3001');
38
+ console.log('3. Verify network settings and firewall rules');
39
+ }
40
+ }
41
+
42
+ testSSEConnection();
src/bin.ts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+
3
+ import { runServer } from "./index.js";
4
+
5
+ // Run the server when executed directly
6
+ runServer().catch((error) => {
7
+ console.error("Fatal error in bin.ts:", error);
8
+ process.exit(1);
9
+ });
src/controllers/server.ts ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import express from "express";
2
+ import cors from 'cors';
3
+ import path from "path";
4
+ import { fileURLToPath } from "url";
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
7
+ import { ServerOptions } from "../types/index.js";
8
+ import routes from "../routes/index.js";
9
+ import fs from 'fs';
10
+
11
+ // Get the directory name of the current module
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = path.dirname(__filename);
14
+
15
+ /**
16
+ * Configure the Express server with all necessary middleware and routes
17
+ * @param server The MCP server instance
18
+ * @returns An Express app configured and ready to use
19
+ */
20
+ export function configureExpressApp(server: McpServer) {
21
+ const app = express();
22
+ const transportMap = new Map<string, SSEServerTransport>();
23
+
24
+ // Enable CORS for all origins
25
+ app.use(cors({
26
+ origin: '*',
27
+ methods: ['GET', 'POST', 'OPTIONS'],
28
+ allowedHeaders: ['Content-Type', 'Authorization']
29
+ }));
30
+
31
+ // Serve static files - with proper path resolution for both dev and prod environments
32
+ const distPublicPath = path.join(__dirname, '../../dist/public');
33
+ const srcPublicPath = path.join(__dirname, '../../src/public');
34
+
35
+ // Check if we're running in production (dist directory) or development
36
+ if (fs.existsSync(distPublicPath)) {
37
+ console.log('Serving static files from dist/public directory');
38
+ app.use('/static', express.static(distPublicPath));
39
+ } else {
40
+ console.log('Serving static files from src/public directory');
41
+ app.use('/static', express.static(srcPublicPath));
42
+ }
43
+
44
+ // Use the routes defined in routes/index.ts
45
+ app.use('/', routes);
46
+
47
+ // Configure SSE endpoint
48
+ app.get("/sse", async (req, res) => {
49
+ console.error(`Received SSE connection request from ${req.ip}`);
50
+
51
+ // Set headers for SSE
52
+ res.setHeader('Content-Type', 'text/event-stream');
53
+ res.setHeader('Cache-Control', 'no-cache');
54
+ res.setHeader('Connection', 'keep-alive');
55
+
56
+ // Create the full URL for messages endpoint
57
+ const messagesUrl = `/messages`;
58
+ console.error(`Creating SSE transport with messagesUrl=${messagesUrl}`);
59
+ const transport = new SSEServerTransport(messagesUrl, res);
60
+ console.error(`Created SSE transport with sessionId=${transport.sessionId}`);
61
+ transportMap.set(transport.sessionId, transport);
62
+ await server.connect(transport);
63
+ console.error(`Connected transport with sessionId=${transport.sessionId} to MCP server`);
64
+ });
65
+
66
+ // Configure messages endpoint
67
+ app.post("/messages", (req, res) => {
68
+ const sessionId = req.query.sessionId as string;
69
+ console.error(`Received message for sessionId=${sessionId}`);
70
+ if (!sessionId) {
71
+ console.error('Message received without sessionId');
72
+ res.status(400).json({ error: 'sessionId is required' });
73
+ return;
74
+ }
75
+
76
+ const transport = transportMap.get(sessionId);
77
+ if (transport) {
78
+ console.error(`Found transport for sessionId=${sessionId}, handling message`);
79
+ transport.handlePostMessage(req, res);
80
+ } else {
81
+ console.error(`No transport found for sessionId=${sessionId}`);
82
+ res.status(404).json({ error: 'Session not found' });
83
+ }
84
+ });
85
+
86
+ return app;
87
+ }
88
+
89
+ /**
90
+ * Run the server with the specified options
91
+ * @param server The MCP server instance
92
+ * @param options Server configuration options
93
+ */
94
+ export async function runExpressServer(server: McpServer, options: ServerOptions = {}): Promise<void> {
95
+ const port = options.port || parseInt(process.env.MCP_PORT || "3001");
96
+ const endpoint = options.endpoint || process.env.MCP_ENDPOINT || "/sse";
97
+
98
+ // Configure and start Express server
99
+ const app = configureExpressApp(server);
100
+
101
+ // Start the server
102
+ app.listen(port, () => {
103
+ console.error(`Healthcare MCP Server running on port ${port}`);
104
+ console.error(`SSE URL: http://localhost:${port}${endpoint}`);
105
+ console.error(`Messages URL: http://localhost:${port}/messages`);
106
+ });
107
+ }
src/index.ts ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { registerHealthTools } from "./tools/healthTools.js";
4
+ import { runExpressServer } from "./controllers/server.js";
5
+ import { ServerOptions } from "./types/index.js";
6
+
7
+ // Server instance - exported for potential programmatic use
8
+ export const server = new McpServer({
9
+ name: "suncture-healthcare",
10
+ version: "1.0.0",
11
+ capabilities: {
12
+ resources: {},
13
+ tools: {},
14
+ },
15
+ });
16
+
17
+ // Register all healthcare tools with the server
18
+ registerHealthTools(server);
19
+
20
+ /**
21
+ * Run the MCP server
22
+ * @param options Optional server configuration options
23
+ * @returns A promise that resolves when the server is running
24
+ */
25
+ export async function runServer(options?: ServerOptions): Promise<void> {
26
+ // Get configuration from options or environment variables
27
+ const mode = options?.mode || process.env.MCP_MODE || "sse";
28
+
29
+ try {
30
+ // Check if mode is SSE and set up SSE server
31
+ if (mode === "sse") {
32
+ try {
33
+ console.error(`Setting up SSE server...`);
34
+ await runExpressServer(server, options);
35
+ return;
36
+ } catch (error) {
37
+ console.error("Failed to initialize SSE transport:", error);
38
+ console.error("Falling back to stdio mode.");
39
+ // Fall back to stdio mode if SSE transport is not available
40
+ }
41
+ }
42
+ // Check if mode is REST (legacy support)
43
+ else if (mode === "rest") {
44
+ try {
45
+ // Dynamically import the REST transport module
46
+ const { RestServerTransport } = await import("@chatmcp/sdk/server/rest.js");
47
+
48
+ const port = options?.port || parseInt(process.env.MCP_PORT || "3001");
49
+ const endpoint = options?.endpoint || process.env.MCP_ENDPOINT || "/rest";
50
+
51
+ const transport = new RestServerTransport({
52
+ port,
53
+ endpoint,
54
+ });
55
+ await server.connect(transport);
56
+ await transport.startServer();
57
+ console.error(`Healthcare MCP Server running in REST mode on port ${port} with endpoint ${endpoint}`);
58
+ return;
59
+ } catch (error) {
60
+ console.error("Failed to initialize REST transport. Falling back to stdio mode.", error);
61
+ // Fall back to stdio mode if REST transport is not available
62
+ }
63
+ }
64
+
65
+ // Default to stdio mode
66
+ const transport = new StdioServerTransport();
67
+ await server.connect(transport);
68
+ console.error("Healthcare MCP Server running on stdio");
69
+ } catch (error) {
70
+ console.error("Fatal error running server:", error);
71
+ throw error; // Rethrow to allow calling code to handle errors
72
+ }
73
+ }
74
+
75
+ // Auto-run the server if this file is executed directly (not imported as a module)
76
+ if (import.meta.url === `file://${process.argv[1]}`) {
77
+ runServer().catch((error) => {
78
+ console.error("Fatal error in main():", error);
79
+ process.exit(1);
80
+ });
81
+ }
src/public/styles.css ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ /* Import the Outer font */
6
+ @font-face {
7
+ font-family: 'Outer';
8
+ src: url('/static/fonts/Outer.otf') format('opentype');
9
+ font-weight: normal;
10
+ font-style: normal;
11
+ font-display: swap;
12
+ }
13
+
14
+ /* Custom styles */
15
+ body {
16
+ font-family: 'Outer', system-ui, sans-serif;
17
+ background-color: #111827;
18
+ color: #F9FAFB;
19
+ }
20
+
21
+ /* Add any additional custom styles here */
22
+
23
+ /* Import Outer Sans font */
24
+ @import url('https://api.fontshare.com/v2/css?f[]=outer-sans@1,800,500,400,700,600&display=swap');
25
+
26
+ /* Custom components */
27
+ @layer components {
28
+ .btn {
29
+ @apply px-6 py-3 rounded-lg font-semibold transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2;
30
+ }
31
+
32
+ .btn-primary {
33
+ @apply bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500;
34
+ }
35
+
36
+ .btn-secondary {
37
+ @apply bg-secondary-100 text-secondary-900 hover:bg-secondary-200 focus:ring-secondary-500;
38
+ }
39
+
40
+ .card {
41
+ @apply bg-white rounded-xl shadow-soft p-6 transition-all duration-200;
42
+ }
43
+
44
+ .card-hover {
45
+ @apply hover:shadow-hover hover:-translate-y-1;
46
+ }
47
+
48
+ .form-input {
49
+ @apply rounded-lg border-secondary-200 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50;
50
+ }
51
+ }
52
+
53
+ /* Custom base styles */
54
+ @layer base {
55
+ body {
56
+ @apply bg-gray-50 text-secondary-900 font-sans;
57
+ }
58
+
59
+ h1, h2, h3, h4, h5, h6 {
60
+ @apply font-heading font-bold text-secondary-900;
61
+ }
62
+
63
+ h1 {
64
+ @apply text-4xl md:text-5xl;
65
+ }
66
+
67
+ h2 {
68
+ @apply text-3xl md:text-4xl;
69
+ }
70
+
71
+ h3 {
72
+ @apply text-2xl md:text-3xl;
73
+ }
74
+
75
+ a {
76
+ @apply text-primary-600 hover:text-primary-700 transition-colors duration-200;
77
+ }
78
+ }
src/public/tailwind.css ADDED
@@ -0,0 +1,1395 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *, ::before, ::after {
2
+ --tw-border-spacing-x: 0;
3
+ --tw-border-spacing-y: 0;
4
+ --tw-translate-x: 0;
5
+ --tw-translate-y: 0;
6
+ --tw-rotate: 0;
7
+ --tw-skew-x: 0;
8
+ --tw-skew-y: 0;
9
+ --tw-scale-x: 1;
10
+ --tw-scale-y: 1;
11
+ --tw-pan-x: ;
12
+ --tw-pan-y: ;
13
+ --tw-pinch-zoom: ;
14
+ --tw-scroll-snap-strictness: proximity;
15
+ --tw-gradient-from-position: ;
16
+ --tw-gradient-via-position: ;
17
+ --tw-gradient-to-position: ;
18
+ --tw-ordinal: ;
19
+ --tw-slashed-zero: ;
20
+ --tw-numeric-figure: ;
21
+ --tw-numeric-spacing: ;
22
+ --tw-numeric-fraction: ;
23
+ --tw-ring-inset: ;
24
+ --tw-ring-offset-width: 0px;
25
+ --tw-ring-offset-color: #fff;
26
+ --tw-ring-color: rgb(59 130 246 / 0.5);
27
+ --tw-ring-offset-shadow: 0 0 #0000;
28
+ --tw-ring-shadow: 0 0 #0000;
29
+ --tw-shadow: 0 0 #0000;
30
+ --tw-shadow-colored: 0 0 #0000;
31
+ --tw-blur: ;
32
+ --tw-brightness: ;
33
+ --tw-contrast: ;
34
+ --tw-grayscale: ;
35
+ --tw-hue-rotate: ;
36
+ --tw-invert: ;
37
+ --tw-saturate: ;
38
+ --tw-sepia: ;
39
+ --tw-drop-shadow: ;
40
+ --tw-backdrop-blur: ;
41
+ --tw-backdrop-brightness: ;
42
+ --tw-backdrop-contrast: ;
43
+ --tw-backdrop-grayscale: ;
44
+ --tw-backdrop-hue-rotate: ;
45
+ --tw-backdrop-invert: ;
46
+ --tw-backdrop-opacity: ;
47
+ --tw-backdrop-saturate: ;
48
+ --tw-backdrop-sepia: ;
49
+ --tw-contain-size: ;
50
+ --tw-contain-layout: ;
51
+ --tw-contain-paint: ;
52
+ --tw-contain-style: ;
53
+ }
54
+
55
+ ::backdrop {
56
+ --tw-border-spacing-x: 0;
57
+ --tw-border-spacing-y: 0;
58
+ --tw-translate-x: 0;
59
+ --tw-translate-y: 0;
60
+ --tw-rotate: 0;
61
+ --tw-skew-x: 0;
62
+ --tw-skew-y: 0;
63
+ --tw-scale-x: 1;
64
+ --tw-scale-y: 1;
65
+ --tw-pan-x: ;
66
+ --tw-pan-y: ;
67
+ --tw-pinch-zoom: ;
68
+ --tw-scroll-snap-strictness: proximity;
69
+ --tw-gradient-from-position: ;
70
+ --tw-gradient-via-position: ;
71
+ --tw-gradient-to-position: ;
72
+ --tw-ordinal: ;
73
+ --tw-slashed-zero: ;
74
+ --tw-numeric-figure: ;
75
+ --tw-numeric-spacing: ;
76
+ --tw-numeric-fraction: ;
77
+ --tw-ring-inset: ;
78
+ --tw-ring-offset-width: 0px;
79
+ --tw-ring-offset-color: #fff;
80
+ --tw-ring-color: rgb(59 130 246 / 0.5);
81
+ --tw-ring-offset-shadow: 0 0 #0000;
82
+ --tw-ring-shadow: 0 0 #0000;
83
+ --tw-shadow: 0 0 #0000;
84
+ --tw-shadow-colored: 0 0 #0000;
85
+ --tw-blur: ;
86
+ --tw-brightness: ;
87
+ --tw-contrast: ;
88
+ --tw-grayscale: ;
89
+ --tw-hue-rotate: ;
90
+ --tw-invert: ;
91
+ --tw-saturate: ;
92
+ --tw-sepia: ;
93
+ --tw-drop-shadow: ;
94
+ --tw-backdrop-blur: ;
95
+ --tw-backdrop-brightness: ;
96
+ --tw-backdrop-contrast: ;
97
+ --tw-backdrop-grayscale: ;
98
+ --tw-backdrop-hue-rotate: ;
99
+ --tw-backdrop-invert: ;
100
+ --tw-backdrop-opacity: ;
101
+ --tw-backdrop-saturate: ;
102
+ --tw-backdrop-sepia: ;
103
+ --tw-contain-size: ;
104
+ --tw-contain-layout: ;
105
+ --tw-contain-paint: ;
106
+ --tw-contain-style: ;
107
+ }
108
+
109
+ /*
110
+ ! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com
111
+ */
112
+
113
+ /*
114
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
115
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
116
+ */
117
+
118
+ *,
119
+ ::before,
120
+ ::after {
121
+ box-sizing: border-box;
122
+ /* 1 */
123
+ border-width: 0;
124
+ /* 2 */
125
+ border-style: solid;
126
+ /* 2 */
127
+ border-color: #e5e7eb;
128
+ /* 2 */
129
+ }
130
+
131
+ ::before,
132
+ ::after {
133
+ --tw-content: '';
134
+ }
135
+
136
+ /*
137
+ 1. Use a consistent sensible line-height in all browsers.
138
+ 2. Prevent adjustments of font size after orientation changes in iOS.
139
+ 3. Use a more readable tab size.
140
+ 4. Use the user's configured `sans` font-family by default.
141
+ 5. Use the user's configured `sans` font-feature-settings by default.
142
+ 6. Use the user's configured `sans` font-variation-settings by default.
143
+ 7. Disable tap highlights on iOS
144
+ */
145
+
146
+ html,
147
+ :host {
148
+ line-height: 1.5;
149
+ /* 1 */
150
+ -webkit-text-size-adjust: 100%;
151
+ /* 2 */
152
+ -moz-tab-size: 4;
153
+ /* 3 */
154
+ -o-tab-size: 4;
155
+ tab-size: 4;
156
+ /* 3 */
157
+ font-family: Outer Sans, system-ui, sans-serif;
158
+ /* 4 */
159
+ font-feature-settings: normal;
160
+ /* 5 */
161
+ font-variation-settings: normal;
162
+ /* 6 */
163
+ -webkit-tap-highlight-color: transparent;
164
+ /* 7 */
165
+ }
166
+
167
+ /*
168
+ 1. Remove the margin in all browsers.
169
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
170
+ */
171
+
172
+ body {
173
+ margin: 0;
174
+ /* 1 */
175
+ line-height: inherit;
176
+ /* 2 */
177
+ }
178
+
179
+ /*
180
+ 1. Add the correct height in Firefox.
181
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
182
+ 3. Ensure horizontal rules are visible by default.
183
+ */
184
+
185
+ hr {
186
+ height: 0;
187
+ /* 1 */
188
+ color: inherit;
189
+ /* 2 */
190
+ border-top-width: 1px;
191
+ /* 3 */
192
+ }
193
+
194
+ /*
195
+ Add the correct text decoration in Chrome, Edge, and Safari.
196
+ */
197
+
198
+ abbr:where([title]) {
199
+ -webkit-text-decoration: underline dotted;
200
+ text-decoration: underline dotted;
201
+ }
202
+
203
+ /*
204
+ Remove the default font size and weight for headings.
205
+ */
206
+
207
+ h1,
208
+ h2,
209
+ h3,
210
+ h4,
211
+ h5,
212
+ h6 {
213
+ font-size: inherit;
214
+ font-weight: inherit;
215
+ }
216
+
217
+ /*
218
+ Reset links to optimize for opt-in styling instead of opt-out.
219
+ */
220
+
221
+ a {
222
+ color: inherit;
223
+ text-decoration: inherit;
224
+ }
225
+
226
+ /*
227
+ Add the correct font weight in Edge and Safari.
228
+ */
229
+
230
+ b,
231
+ strong {
232
+ font-weight: bolder;
233
+ }
234
+
235
+ /*
236
+ 1. Use the user's configured `mono` font-family by default.
237
+ 2. Use the user's configured `mono` font-feature-settings by default.
238
+ 3. Use the user's configured `mono` font-variation-settings by default.
239
+ 4. Correct the odd `em` font sizing in all browsers.
240
+ */
241
+
242
+ code,
243
+ kbd,
244
+ samp,
245
+ pre {
246
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
247
+ /* 1 */
248
+ font-feature-settings: normal;
249
+ /* 2 */
250
+ font-variation-settings: normal;
251
+ /* 3 */
252
+ font-size: 1em;
253
+ /* 4 */
254
+ }
255
+
256
+ /*
257
+ Add the correct font size in all browsers.
258
+ */
259
+
260
+ small {
261
+ font-size: 80%;
262
+ }
263
+
264
+ /*
265
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
266
+ */
267
+
268
+ sub,
269
+ sup {
270
+ font-size: 75%;
271
+ line-height: 0;
272
+ position: relative;
273
+ vertical-align: baseline;
274
+ }
275
+
276
+ sub {
277
+ bottom: -0.25em;
278
+ }
279
+
280
+ sup {
281
+ top: -0.5em;
282
+ }
283
+
284
+ /*
285
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
286
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
287
+ 3. Remove gaps between table borders by default.
288
+ */
289
+
290
+ table {
291
+ text-indent: 0;
292
+ /* 1 */
293
+ border-color: inherit;
294
+ /* 2 */
295
+ border-collapse: collapse;
296
+ /* 3 */
297
+ }
298
+
299
+ /*
300
+ 1. Change the font styles in all browsers.
301
+ 2. Remove the margin in Firefox and Safari.
302
+ 3. Remove default padding in all browsers.
303
+ */
304
+
305
+ button,
306
+ input,
307
+ optgroup,
308
+ select,
309
+ textarea {
310
+ font-family: inherit;
311
+ /* 1 */
312
+ font-feature-settings: inherit;
313
+ /* 1 */
314
+ font-variation-settings: inherit;
315
+ /* 1 */
316
+ font-size: 100%;
317
+ /* 1 */
318
+ font-weight: inherit;
319
+ /* 1 */
320
+ line-height: inherit;
321
+ /* 1 */
322
+ letter-spacing: inherit;
323
+ /* 1 */
324
+ color: inherit;
325
+ /* 1 */
326
+ margin: 0;
327
+ /* 2 */
328
+ padding: 0;
329
+ /* 3 */
330
+ }
331
+
332
+ /*
333
+ Remove the inheritance of text transform in Edge and Firefox.
334
+ */
335
+
336
+ button,
337
+ select {
338
+ text-transform: none;
339
+ }
340
+
341
+ /*
342
+ 1. Correct the inability to style clickable types in iOS and Safari.
343
+ 2. Remove default button styles.
344
+ */
345
+
346
+ button,
347
+ input:where([type='button']),
348
+ input:where([type='reset']),
349
+ input:where([type='submit']) {
350
+ -webkit-appearance: button;
351
+ /* 1 */
352
+ background-color: transparent;
353
+ /* 2 */
354
+ background-image: none;
355
+ /* 2 */
356
+ }
357
+
358
+ /*
359
+ Use the modern Firefox focus style for all focusable elements.
360
+ */
361
+
362
+ :-moz-focusring {
363
+ outline: auto;
364
+ }
365
+
366
+ /*
367
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
368
+ */
369
+
370
+ :-moz-ui-invalid {
371
+ box-shadow: none;
372
+ }
373
+
374
+ /*
375
+ Add the correct vertical alignment in Chrome and Firefox.
376
+ */
377
+
378
+ progress {
379
+ vertical-align: baseline;
380
+ }
381
+
382
+ /*
383
+ Correct the cursor style of increment and decrement buttons in Safari.
384
+ */
385
+
386
+ ::-webkit-inner-spin-button,
387
+ ::-webkit-outer-spin-button {
388
+ height: auto;
389
+ }
390
+
391
+ /*
392
+ 1. Correct the odd appearance in Chrome and Safari.
393
+ 2. Correct the outline style in Safari.
394
+ */
395
+
396
+ [type='search'] {
397
+ -webkit-appearance: textfield;
398
+ /* 1 */
399
+ outline-offset: -2px;
400
+ /* 2 */
401
+ }
402
+
403
+ /*
404
+ Remove the inner padding in Chrome and Safari on macOS.
405
+ */
406
+
407
+ ::-webkit-search-decoration {
408
+ -webkit-appearance: none;
409
+ }
410
+
411
+ /*
412
+ 1. Correct the inability to style clickable types in iOS and Safari.
413
+ 2. Change font properties to `inherit` in Safari.
414
+ */
415
+
416
+ ::-webkit-file-upload-button {
417
+ -webkit-appearance: button;
418
+ /* 1 */
419
+ font: inherit;
420
+ /* 2 */
421
+ }
422
+
423
+ /*
424
+ Add the correct display in Chrome and Safari.
425
+ */
426
+
427
+ summary {
428
+ display: list-item;
429
+ }
430
+
431
+ /*
432
+ Removes the default spacing and border for appropriate elements.
433
+ */
434
+
435
+ blockquote,
436
+ dl,
437
+ dd,
438
+ h1,
439
+ h2,
440
+ h3,
441
+ h4,
442
+ h5,
443
+ h6,
444
+ hr,
445
+ figure,
446
+ p,
447
+ pre {
448
+ margin: 0;
449
+ }
450
+
451
+ fieldset {
452
+ margin: 0;
453
+ padding: 0;
454
+ }
455
+
456
+ legend {
457
+ padding: 0;
458
+ }
459
+
460
+ ol,
461
+ ul,
462
+ menu {
463
+ list-style: none;
464
+ margin: 0;
465
+ padding: 0;
466
+ }
467
+
468
+ /*
469
+ Reset default styling for dialogs.
470
+ */
471
+
472
+ dialog {
473
+ padding: 0;
474
+ }
475
+
476
+ /*
477
+ Prevent resizing textareas horizontally by default.
478
+ */
479
+
480
+ textarea {
481
+ resize: vertical;
482
+ }
483
+
484
+ /*
485
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
486
+ 2. Set the default placeholder color to the user's configured gray 400 color.
487
+ */
488
+
489
+ input::-moz-placeholder, textarea::-moz-placeholder {
490
+ opacity: 1;
491
+ /* 1 */
492
+ color: #9ca3af;
493
+ /* 2 */
494
+ }
495
+
496
+ input::placeholder,
497
+ textarea::placeholder {
498
+ opacity: 1;
499
+ /* 1 */
500
+ color: #9ca3af;
501
+ /* 2 */
502
+ }
503
+
504
+ /*
505
+ Set the default cursor for buttons.
506
+ */
507
+
508
+ button,
509
+ [role="button"] {
510
+ cursor: pointer;
511
+ }
512
+
513
+ /*
514
+ Make sure disabled buttons don't get the pointer cursor.
515
+ */
516
+
517
+ :disabled {
518
+ cursor: default;
519
+ }
520
+
521
+ /*
522
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
523
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
524
+ This can trigger a poorly considered lint error in some tools but is included by design.
525
+ */
526
+
527
+ img,
528
+ svg,
529
+ video,
530
+ canvas,
531
+ audio,
532
+ iframe,
533
+ embed,
534
+ object {
535
+ display: block;
536
+ /* 1 */
537
+ vertical-align: middle;
538
+ /* 2 */
539
+ }
540
+
541
+ /*
542
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
543
+ */
544
+
545
+ img,
546
+ video {
547
+ max-width: 100%;
548
+ height: auto;
549
+ }
550
+
551
+ /* Make elements with the HTML hidden attribute stay hidden by default */
552
+
553
+ [hidden]:where(:not([hidden="until-found"])) {
554
+ display: none;
555
+ }
556
+
557
+ [type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {
558
+ -webkit-appearance: none;
559
+ -moz-appearance: none;
560
+ appearance: none;
561
+ background-color: #fff;
562
+ border-color: #6b7280;
563
+ border-width: 1px;
564
+ border-radius: 0px;
565
+ padding-top: 0.5rem;
566
+ padding-right: 0.75rem;
567
+ padding-bottom: 0.5rem;
568
+ padding-left: 0.75rem;
569
+ font-size: 1rem;
570
+ line-height: 1.5rem;
571
+ --tw-shadow: 0 0 #0000;
572
+ }
573
+
574
+ [type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {
575
+ outline: 2px solid transparent;
576
+ outline-offset: 2px;
577
+ --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
578
+ --tw-ring-offset-width: 0px;
579
+ --tw-ring-offset-color: #fff;
580
+ --tw-ring-color: #2563eb;
581
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
582
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
583
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
584
+ border-color: #2563eb;
585
+ }
586
+
587
+ input::-moz-placeholder, textarea::-moz-placeholder {
588
+ color: #6b7280;
589
+ opacity: 1;
590
+ }
591
+
592
+ input::placeholder,textarea::placeholder {
593
+ color: #6b7280;
594
+ opacity: 1;
595
+ }
596
+
597
+ ::-webkit-datetime-edit-fields-wrapper {
598
+ padding: 0;
599
+ }
600
+
601
+ ::-webkit-date-and-time-value {
602
+ min-height: 1.5em;
603
+ text-align: inherit;
604
+ }
605
+
606
+ ::-webkit-datetime-edit {
607
+ display: inline-flex;
608
+ }
609
+
610
+ ::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {
611
+ padding-top: 0;
612
+ padding-bottom: 0;
613
+ }
614
+
615
+ select {
616
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
617
+ background-position: right 0.5rem center;
618
+ background-repeat: no-repeat;
619
+ background-size: 1.5em 1.5em;
620
+ padding-right: 2.5rem;
621
+ -webkit-print-color-adjust: exact;
622
+ print-color-adjust: exact;
623
+ }
624
+
625
+ [multiple],[size]:where(select:not([size="1"])) {
626
+ background-image: initial;
627
+ background-position: initial;
628
+ background-repeat: unset;
629
+ background-size: initial;
630
+ padding-right: 0.75rem;
631
+ -webkit-print-color-adjust: unset;
632
+ print-color-adjust: unset;
633
+ }
634
+
635
+ [type='checkbox'],[type='radio'] {
636
+ -webkit-appearance: none;
637
+ -moz-appearance: none;
638
+ appearance: none;
639
+ padding: 0;
640
+ -webkit-print-color-adjust: exact;
641
+ print-color-adjust: exact;
642
+ display: inline-block;
643
+ vertical-align: middle;
644
+ background-origin: border-box;
645
+ -webkit-user-select: none;
646
+ -moz-user-select: none;
647
+ user-select: none;
648
+ flex-shrink: 0;
649
+ height: 1rem;
650
+ width: 1rem;
651
+ color: #2563eb;
652
+ background-color: #fff;
653
+ border-color: #6b7280;
654
+ border-width: 1px;
655
+ --tw-shadow: 0 0 #0000;
656
+ }
657
+
658
+ [type='checkbox'] {
659
+ border-radius: 0px;
660
+ }
661
+
662
+ [type='radio'] {
663
+ border-radius: 100%;
664
+ }
665
+
666
+ [type='checkbox']:focus,[type='radio']:focus {
667
+ outline: 2px solid transparent;
668
+ outline-offset: 2px;
669
+ --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
670
+ --tw-ring-offset-width: 2px;
671
+ --tw-ring-offset-color: #fff;
672
+ --tw-ring-color: #2563eb;
673
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
674
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
675
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
676
+ }
677
+
678
+ [type='checkbox']:checked,[type='radio']:checked {
679
+ border-color: transparent;
680
+ background-color: currentColor;
681
+ background-size: 100% 100%;
682
+ background-position: center;
683
+ background-repeat: no-repeat;
684
+ }
685
+
686
+ [type='checkbox']:checked {
687
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
688
+ }
689
+
690
+ @media (forced-colors: active) {
691
+ [type='checkbox']:checked {
692
+ -webkit-appearance: auto;
693
+ -moz-appearance: auto;
694
+ appearance: auto;
695
+ }
696
+ }
697
+
698
+ [type='radio']:checked {
699
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
700
+ }
701
+
702
+ @media (forced-colors: active) {
703
+ [type='radio']:checked {
704
+ -webkit-appearance: auto;
705
+ -moz-appearance: auto;
706
+ appearance: auto;
707
+ }
708
+ }
709
+
710
+ [type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {
711
+ border-color: transparent;
712
+ background-color: currentColor;
713
+ }
714
+
715
+ [type='checkbox']:indeterminate {
716
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");
717
+ border-color: transparent;
718
+ background-color: currentColor;
719
+ background-size: 100% 100%;
720
+ background-position: center;
721
+ background-repeat: no-repeat;
722
+ }
723
+
724
+ @media (forced-colors: active) {
725
+ [type='checkbox']:indeterminate {
726
+ -webkit-appearance: auto;
727
+ -moz-appearance: auto;
728
+ appearance: auto;
729
+ }
730
+ }
731
+
732
+ [type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
733
+ border-color: transparent;
734
+ background-color: currentColor;
735
+ }
736
+
737
+ [type='file'] {
738
+ background: unset;
739
+ border-color: inherit;
740
+ border-width: 0;
741
+ border-radius: 0;
742
+ padding: 0;
743
+ font-size: unset;
744
+ line-height: inherit;
745
+ }
746
+
747
+ [type='file']:focus {
748
+ outline: 1px solid ButtonText;
749
+ outline: 1px auto -webkit-focus-ring-color;
750
+ }
751
+
752
+ body {
753
+ --tw-bg-opacity: 1;
754
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));
755
+ font-family: Outer Sans, system-ui, sans-serif;
756
+ --tw-text-opacity: 1;
757
+ color: rgb(76 29 149 / var(--tw-text-opacity, 1));
758
+ }
759
+
760
+ h1, h2, h3, h4, h5, h6 {
761
+ font-family: Outer Sans, system-ui, sans-serif;
762
+ font-weight: 700;
763
+ --tw-text-opacity: 1;
764
+ color: rgb(76 29 149 / var(--tw-text-opacity, 1));
765
+ }
766
+
767
+ h1 {
768
+ font-size: 2.25rem;
769
+ line-height: 2.5rem;
770
+ }
771
+
772
+ @media (min-width: 768px) {
773
+ h1 {
774
+ font-size: 3rem;
775
+ line-height: 1;
776
+ }
777
+ }
778
+
779
+ h2 {
780
+ font-size: 1.875rem;
781
+ line-height: 2.25rem;
782
+ }
783
+
784
+ @media (min-width: 768px) {
785
+ h2 {
786
+ font-size: 2.25rem;
787
+ line-height: 2.5rem;
788
+ }
789
+ }
790
+
791
+ h3 {
792
+ font-size: 1.5rem;
793
+ line-height: 2rem;
794
+ }
795
+
796
+ @media (min-width: 768px) {
797
+ h3 {
798
+ font-size: 1.875rem;
799
+ line-height: 2.25rem;
800
+ }
801
+ }
802
+
803
+ a {
804
+ --tw-text-opacity: 1;
805
+ color: rgb(37 99 235 / var(--tw-text-opacity, 1));
806
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
807
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
808
+ transition-duration: 200ms;
809
+ }
810
+
811
+ a:hover {
812
+ --tw-text-opacity: 1;
813
+ color: rgb(29 78 216 / var(--tw-text-opacity, 1));
814
+ }
815
+
816
+ .btn {
817
+ border-radius: 0.5rem;
818
+ padding-left: 1.5rem;
819
+ padding-right: 1.5rem;
820
+ padding-top: 0.75rem;
821
+ padding-bottom: 0.75rem;
822
+ font-weight: 600;
823
+ transition-property: all;
824
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
825
+ transition-duration: 200ms;
826
+ }
827
+
828
+ .btn:focus {
829
+ outline: 2px solid transparent;
830
+ outline-offset: 2px;
831
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
832
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
833
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
834
+ --tw-ring-offset-width: 2px;
835
+ }
836
+
837
+ .btn-primary {
838
+ --tw-bg-opacity: 1;
839
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));
840
+ --tw-text-opacity: 1;
841
+ color: rgb(255 255 255 / var(--tw-text-opacity, 1));
842
+ }
843
+
844
+ .btn-primary:hover {
845
+ --tw-bg-opacity: 1;
846
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity, 1));
847
+ }
848
+
849
+ .btn-primary:focus {
850
+ --tw-ring-opacity: 1;
851
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1));
852
+ }
853
+
854
+ .card {
855
+ border-radius: 1rem;
856
+ --tw-bg-opacity: 1;
857
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
858
+ padding: 1.5rem;
859
+ --tw-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
860
+ --tw-shadow-colored: 0 4px 20px var(--tw-shadow-color);
861
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
862
+ transition-property: all;
863
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
864
+ transition-duration: 200ms;
865
+ }
866
+
867
+ .card-hover:hover {
868
+ --tw-translate-y: -0.25rem;
869
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
870
+ --tw-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
871
+ --tw-shadow-colored: 0 10px 25px var(--tw-shadow-color);
872
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
873
+ }
874
+
875
+ .static {
876
+ position: static;
877
+ }
878
+
879
+ .mx-auto {
880
+ margin-left: auto;
881
+ margin-right: auto;
882
+ }
883
+
884
+ .mb-1 {
885
+ margin-bottom: 0.25rem;
886
+ }
887
+
888
+ .mb-16 {
889
+ margin-bottom: 4rem;
890
+ }
891
+
892
+ .mb-2 {
893
+ margin-bottom: 0.5rem;
894
+ }
895
+
896
+ .mb-3 {
897
+ margin-bottom: 0.75rem;
898
+ }
899
+
900
+ .mb-4 {
901
+ margin-bottom: 1rem;
902
+ }
903
+
904
+ .mb-6 {
905
+ margin-bottom: 1.5rem;
906
+ }
907
+
908
+ .mb-8 {
909
+ margin-bottom: 2rem;
910
+ }
911
+
912
+ .ml-3 {
913
+ margin-left: 0.75rem;
914
+ }
915
+
916
+ .ml-4 {
917
+ margin-left: 1rem;
918
+ }
919
+
920
+ .mr-2 {
921
+ margin-right: 0.5rem;
922
+ }
923
+
924
+ .mr-4 {
925
+ margin-right: 1rem;
926
+ }
927
+
928
+ .mt-16 {
929
+ margin-top: 4rem;
930
+ }
931
+
932
+ .mt-2 {
933
+ margin-top: 0.5rem;
934
+ }
935
+
936
+ .mt-4 {
937
+ margin-top: 1rem;
938
+ }
939
+
940
+ .mt-6 {
941
+ margin-top: 1.5rem;
942
+ }
943
+
944
+ .mt-8 {
945
+ margin-top: 2rem;
946
+ }
947
+
948
+ .flex {
949
+ display: flex;
950
+ }
951
+
952
+ .grid {
953
+ display: grid;
954
+ }
955
+
956
+ .h-10 {
957
+ height: 2.5rem;
958
+ }
959
+
960
+ .h-12 {
961
+ height: 3rem;
962
+ }
963
+
964
+ .h-2\.5 {
965
+ height: 0.625rem;
966
+ }
967
+
968
+ .h-6 {
969
+ height: 1.5rem;
970
+ }
971
+
972
+ .h-8 {
973
+ height: 2rem;
974
+ }
975
+
976
+ .w-10 {
977
+ width: 2.5rem;
978
+ }
979
+
980
+ .w-12 {
981
+ width: 3rem;
982
+ }
983
+
984
+ .w-2\.5 {
985
+ width: 0.625rem;
986
+ }
987
+
988
+ .w-6 {
989
+ width: 1.5rem;
990
+ }
991
+
992
+ .w-8 {
993
+ width: 2rem;
994
+ }
995
+
996
+ .w-full {
997
+ width: 100%;
998
+ }
999
+
1000
+ .max-w-7xl {
1001
+ max-width: 80rem;
1002
+ }
1003
+
1004
+ .max-w-md {
1005
+ max-width: 28rem;
1006
+ }
1007
+
1008
+ .flex-shrink-0 {
1009
+ flex-shrink: 0;
1010
+ }
1011
+
1012
+ .grid-cols-1 {
1013
+ grid-template-columns: repeat(1, minmax(0, 1fr));
1014
+ }
1015
+
1016
+ .grid-cols-2 {
1017
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1018
+ }
1019
+
1020
+ .flex-col {
1021
+ flex-direction: column;
1022
+ }
1023
+
1024
+ .items-center {
1025
+ align-items: center;
1026
+ }
1027
+
1028
+ .justify-center {
1029
+ justify-content: center;
1030
+ }
1031
+
1032
+ .justify-between {
1033
+ justify-content: space-between;
1034
+ }
1035
+
1036
+ .gap-6 {
1037
+ gap: 1.5rem;
1038
+ }
1039
+
1040
+ .gap-8 {
1041
+ gap: 2rem;
1042
+ }
1043
+
1044
+ .space-y-6 > :not([hidden]) ~ :not([hidden]) {
1045
+ --tw-space-y-reverse: 0;
1046
+ margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
1047
+ margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
1048
+ }
1049
+
1050
+ .divide-x > :not([hidden]) ~ :not([hidden]) {
1051
+ --tw-divide-x-reverse: 0;
1052
+ border-right-width: calc(1px * var(--tw-divide-x-reverse));
1053
+ border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse)));
1054
+ }
1055
+
1056
+ .divide-gray-200 > :not([hidden]) ~ :not([hidden]) {
1057
+ --tw-divide-opacity: 1;
1058
+ border-color: rgb(229 231 235 / var(--tw-divide-opacity, 1));
1059
+ }
1060
+
1061
+ .overflow-auto {
1062
+ overflow: auto;
1063
+ }
1064
+
1065
+ .overflow-hidden {
1066
+ overflow: hidden;
1067
+ }
1068
+
1069
+ .whitespace-pre-wrap {
1070
+ white-space: pre-wrap;
1071
+ }
1072
+
1073
+ .rounded {
1074
+ border-radius: 0.25rem;
1075
+ }
1076
+
1077
+ .rounded-2xl {
1078
+ border-radius: 1.5rem;
1079
+ }
1080
+
1081
+ .rounded-full {
1082
+ border-radius: 9999px;
1083
+ }
1084
+
1085
+ .rounded-lg {
1086
+ border-radius: 0.5rem;
1087
+ }
1088
+
1089
+ .rounded-md {
1090
+ border-radius: 0.375rem;
1091
+ }
1092
+
1093
+ .rounded-xl {
1094
+ border-radius: 1rem;
1095
+ }
1096
+
1097
+ .border {
1098
+ border-width: 1px;
1099
+ }
1100
+
1101
+ .border-b {
1102
+ border-bottom-width: 1px;
1103
+ }
1104
+
1105
+ .border-t {
1106
+ border-top-width: 1px;
1107
+ }
1108
+
1109
+ .border-gray-200 {
1110
+ --tw-border-opacity: 1;
1111
+ border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));
1112
+ }
1113
+
1114
+ .border-primary-100 {
1115
+ --tw-border-opacity: 1;
1116
+ border-color: rgb(219 234 254 / var(--tw-border-opacity, 1));
1117
+ }
1118
+
1119
+ .border-transparent {
1120
+ border-color: transparent;
1121
+ }
1122
+
1123
+ .bg-gray-50 {
1124
+ --tw-bg-opacity: 1;
1125
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));
1126
+ }
1127
+
1128
+ .bg-green-500 {
1129
+ --tw-bg-opacity: 1;
1130
+ background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));
1131
+ }
1132
+
1133
+ .bg-indigo-600 {
1134
+ --tw-bg-opacity: 1;
1135
+ background-color: rgb(79 70 229 / var(--tw-bg-opacity, 1));
1136
+ }
1137
+
1138
+ .bg-primary-100 {
1139
+ --tw-bg-opacity: 1;
1140
+ background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1));
1141
+ }
1142
+
1143
+ .bg-primary-50 {
1144
+ --tw-bg-opacity: 1;
1145
+ background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));
1146
+ }
1147
+
1148
+ .bg-primary-600 {
1149
+ --tw-bg-opacity: 1;
1150
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));
1151
+ }
1152
+
1153
+ .bg-white {
1154
+ --tw-bg-opacity: 1;
1155
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
1156
+ }
1157
+
1158
+ .p-2 {
1159
+ padding: 0.5rem;
1160
+ }
1161
+
1162
+ .p-4 {
1163
+ padding: 1rem;
1164
+ }
1165
+
1166
+ .p-6 {
1167
+ padding: 1.5rem;
1168
+ }
1169
+
1170
+ .p-8 {
1171
+ padding: 2rem;
1172
+ }
1173
+
1174
+ .px-4 {
1175
+ padding-left: 1rem;
1176
+ padding-right: 1rem;
1177
+ }
1178
+
1179
+ .px-8 {
1180
+ padding-left: 2rem;
1181
+ padding-right: 2rem;
1182
+ }
1183
+
1184
+ .py-12 {
1185
+ padding-top: 3rem;
1186
+ padding-bottom: 3rem;
1187
+ }
1188
+
1189
+ .py-3 {
1190
+ padding-top: 0.75rem;
1191
+ padding-bottom: 0.75rem;
1192
+ }
1193
+
1194
+ .py-6 {
1195
+ padding-top: 1.5rem;
1196
+ padding-bottom: 1.5rem;
1197
+ }
1198
+
1199
+ .pt-4 {
1200
+ padding-top: 1rem;
1201
+ }
1202
+
1203
+ .font-mono {
1204
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1205
+ }
1206
+
1207
+ .font-sans {
1208
+ font-family: Outer Sans, system-ui, sans-serif;
1209
+ }
1210
+
1211
+ .text-3xl {
1212
+ font-size: 1.875rem;
1213
+ line-height: 2.25rem;
1214
+ }
1215
+
1216
+ .text-4xl {
1217
+ font-size: 2.25rem;
1218
+ line-height: 2.5rem;
1219
+ }
1220
+
1221
+ .text-base {
1222
+ font-size: 1rem;
1223
+ line-height: 1.5rem;
1224
+ }
1225
+
1226
+ .text-lg {
1227
+ font-size: 1.125rem;
1228
+ line-height: 1.75rem;
1229
+ }
1230
+
1231
+ .text-sm {
1232
+ font-size: 0.875rem;
1233
+ line-height: 1.25rem;
1234
+ }
1235
+
1236
+ .text-xl {
1237
+ font-size: 1.25rem;
1238
+ line-height: 1.75rem;
1239
+ }
1240
+
1241
+ .font-bold {
1242
+ font-weight: 700;
1243
+ }
1244
+
1245
+ .font-medium {
1246
+ font-weight: 500;
1247
+ }
1248
+
1249
+ .font-semibold {
1250
+ font-weight: 600;
1251
+ }
1252
+
1253
+ .lowercase {
1254
+ text-transform: lowercase;
1255
+ }
1256
+
1257
+ .text-primary-600 {
1258
+ --tw-text-opacity: 1;
1259
+ color: rgb(37 99 235 / var(--tw-text-opacity, 1));
1260
+ }
1261
+
1262
+ .text-primary-700 {
1263
+ --tw-text-opacity: 1;
1264
+ color: rgb(29 78 216 / var(--tw-text-opacity, 1));
1265
+ }
1266
+
1267
+ .text-secondary-600 {
1268
+ --tw-text-opacity: 1;
1269
+ color: rgb(124 58 237 / var(--tw-text-opacity, 1));
1270
+ }
1271
+
1272
+ .text-secondary-700 {
1273
+ --tw-text-opacity: 1;
1274
+ color: rgb(109 40 217 / var(--tw-text-opacity, 1));
1275
+ }
1276
+
1277
+ .text-secondary-900 {
1278
+ --tw-text-opacity: 1;
1279
+ color: rgb(76 29 149 / var(--tw-text-opacity, 1));
1280
+ }
1281
+
1282
+ .text-white {
1283
+ --tw-text-opacity: 1;
1284
+ color: rgb(255 255 255 / var(--tw-text-opacity, 1));
1285
+ }
1286
+
1287
+ .shadow-sm {
1288
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
1289
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
1290
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1291
+ }
1292
+
1293
+ .shadow-soft {
1294
+ --tw-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
1295
+ --tw-shadow-colored: 0 4px 20px var(--tw-shadow-color);
1296
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1297
+ }
1298
+
1299
+ /* Import the Outer font */
1300
+
1301
+ @font-face {
1302
+ font-family: 'Outer';
1303
+
1304
+ src: url('/static/fonts/Outer.otf') format('opentype');
1305
+
1306
+ font-weight: normal;
1307
+
1308
+ font-style: normal;
1309
+
1310
+ font-display: swap;
1311
+ }
1312
+
1313
+ /* Custom styles */
1314
+
1315
+ body {
1316
+ font-family: 'Outer', system-ui, sans-serif;
1317
+ background-color: #111827;
1318
+ color: #F9FAFB;
1319
+ }
1320
+
1321
+ /* Add any additional custom styles here */
1322
+
1323
+ /* Import Outer Sans font */
1324
+
1325
+ /* Custom components */
1326
+
1327
+ /* Custom base styles */
1328
+
1329
+ .hover\:bg-indigo-700:hover {
1330
+ --tw-bg-opacity: 1;
1331
+ background-color: rgb(67 56 202 / var(--tw-bg-opacity, 1));
1332
+ }
1333
+
1334
+ .focus\:ring-2:focus {
1335
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1336
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1337
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
1338
+ }
1339
+
1340
+ .focus\:ring-indigo-500:focus {
1341
+ --tw-ring-opacity: 1;
1342
+ --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity, 1));
1343
+ }
1344
+
1345
+ .focus\:ring-offset-2:focus {
1346
+ --tw-ring-offset-width: 2px;
1347
+ }
1348
+
1349
+ @media (min-width: 640px) {
1350
+ .sm\:px-6 {
1351
+ padding-left: 1.5rem;
1352
+ padding-right: 1.5rem;
1353
+ }
1354
+ }
1355
+
1356
+ @media (min-width: 768px) {
1357
+ .md\:mt-0 {
1358
+ margin-top: 0px;
1359
+ }
1360
+
1361
+ .md\:flex {
1362
+ display: flex;
1363
+ }
1364
+
1365
+ .md\:grid-cols-2 {
1366
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1367
+ }
1368
+
1369
+ .md\:grid-cols-4 {
1370
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1371
+ }
1372
+
1373
+ .md\:items-center {
1374
+ align-items: center;
1375
+ }
1376
+
1377
+ .md\:justify-between {
1378
+ justify-content: space-between;
1379
+ }
1380
+
1381
+ .md\:p-12 {
1382
+ padding: 3rem;
1383
+ }
1384
+ }
1385
+
1386
+ @media (min-width: 1024px) {
1387
+ .lg\:grid-cols-4 {
1388
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1389
+ }
1390
+
1391
+ .lg\:px-8 {
1392
+ padding-left: 2rem;
1393
+ padding-right: 2rem;
1394
+ }
1395
+ }
src/routes/index.ts ADDED
@@ -0,0 +1,395 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import express, { Request, Response } from "express";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
+ import fs from "fs";
5
+
6
+ // Get the directory name of the current module
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ // Create router
11
+ const router = express.Router();
12
+
13
+ // Root endpoint with landing page
14
+ router.get("/", (req: Request, res: Response) => {
15
+ // Try to read the tailwind CSS file
16
+ let tailwindCss = "";
17
+ try {
18
+ const cssPath = path.join(__dirname, "../../src/public/tailwind.css");
19
+ tailwindCss = fs.readFileSync(cssPath, "utf8");
20
+ } catch (error) {
21
+ console.error("Could not load tailwind styles:", error);
22
+ }
23
+
24
+ const landingPage = `
25
+ <!DOCTYPE html>
26
+ <html lang="en">
27
+ <head>
28
+ <meta charset="UTF-8">
29
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
30
+ <title>Suncture Corp MCP</title>
31
+ <link rel="stylesheet" href="https://api.fontshare.com/v2/css?f[]=outer-sans@1,800,500,400,700,600&display=swap">
32
+ <link rel="stylesheet" href="/tailwind.css">
33
+ <style>
34
+ ${tailwindCss}
35
+ </style>
36
+ </head>
37
+ <body class="bg-gray-50 text-secondary-900 font-sans">
38
+ <header class="bg-white shadow-sm">
39
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
40
+ <div class="flex justify-between items-center">
41
+ <div class="flex items-center">
42
+ <div class="flex-shrink-0">
43
+ <h1 class="text-3xl font-bold text-secondary-900">@</h1>
44
+ </div>
45
+ <div class="ml-4">
46
+ <h1 class="text-3xl font-bold text-secondary-900">Suncture Corp.</h1>
47
+ <p class="text-secondary-600">Model Context Protocol Server</p>
48
+ </div>
49
+ </div>
50
+ <div>
51
+ <a href="https://suncture.io" target="_blank" class="mt-6 flex w-full items-center justify-center rounded-md border border-transparent bg-indigo-600 px-8 py-3 text-base font-medium text-white hover:bg-indigo-700 focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 focus:outline-hidden">
52
+ <span class="flex items-center">
53
+ Try it out
54
+ </span>
55
+ </a>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ </header>
60
+
61
+ <main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
62
+ <!-- Hero section -->
63
+ <div class="bg-white rounded-2xl shadow-soft overflow-hidden mb-16">
64
+ <div class="grid md:grid-cols-2 gap-8">
65
+ <div class="p-8 md:p-12 flex flex-col justify-center">
66
+ <h2 class="text-4xl font-bold text-secondary-900 mb-6">Advanced Healthcare Tools for AI Assistants</h2>
67
+ <p class="text-lg text-secondary-700 mb-8">Enhance your AI models with specialized healthcare capabilities, delivering accurate and valuable medical information to users.</p>
68
+ <div>
69
+ <a href="#tools" class="btn btn-primary">Explore Healthcare Tools</a>
70
+ </div>
71
+ </div>
72
+ <div class="bg-primary-50 p-8 md:p-12 flex items-center justify-center">
73
+ <div class="rounded-xl bg-white shadow-soft p-6 w-full max-w-md">
74
+ <div class="flex items-center mb-4">
75
+ <div class="w-10 h-10 rounded-full bg-primary-100 flex items-center justify-center text-primary-600 mr-4">
76
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
77
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
78
+ </svg>
79
+ </div>
80
+ <div>
81
+ <h3 class="font-semibold text-lg">Server Status</h3>
82
+ <p class="text-sm text-secondary-600">Running at <code>${req.protocol}://${req.get('host')}</code></p>
83
+ </div>
84
+ </div>
85
+ <div class="border-t border-gray-200 pt-4 mt-4">
86
+ <div class="flex justify-between mb-2">
87
+ <span class="text-secondary-600">Server Name</span>
88
+ <span class="font-medium">suncture-healthcare</span>
89
+ </div>
90
+ <div class="flex justify-between mb-2">
91
+ <span class="text-secondary-600">Version</span>
92
+ <span class="font-medium">1.0.0</span>
93
+ </div>
94
+ <div class="flex justify-between">
95
+ <span class="text-secondary-600">Transport Type</span>
96
+ <span class="font-medium">SSE</span>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </div>
103
+
104
+ <!-- Benefits section -->
105
+ <section class="mb-16">
106
+ <h2 class="text-3xl font-bold text-secondary-900 mb-8">Key Benefits</h2>
107
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
108
+ <div class="card card-hover">
109
+ <div class="rounded-full w-12 h-12 flex items-center justify-center bg-primary-100 text-primary-600 mb-4">
110
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
111
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
112
+ </svg>
113
+ </div>
114
+ <h3 class="text-xl font-semibold mb-3">Enhanced Healthcare Capabilities</h3>
115
+ <p class="text-secondary-700">Extend AI assistants with specialized tools, providing accurate and detailed medical information.</p>
116
+ </div>
117
+ <div class="card card-hover">
118
+ <div class="rounded-full w-12 h-12 flex items-center justify-center bg-primary-100 text-primary-600 mb-4">
119
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
120
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z" />
121
+ </svg>
122
+ </div>
123
+ <h3 class="text-xl font-semibold mb-3">Expert Knowledge</h3>
124
+ <p class="text-secondary-700">Access medical databases and resources with vetted, reliable healthcare information.</p>
125
+ </div>
126
+ <div class="card card-hover">
127
+ <div class="rounded-full w-12 h-12 flex items-center justify-center bg-primary-100 text-primary-600 mb-4">
128
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
129
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" />
130
+ </svg>
131
+ </div>
132
+ <h3 class="text-xl font-semibold mb-3">User-Friendly Integration</h3>
133
+ <p class="text-secondary-700">Simple integration through the Model Context Protocol makes implementation straightforward.</p>
134
+ </div>
135
+ <div class="card card-hover">
136
+ <div class="rounded-full w-12 h-12 flex items-center justify-center bg-primary-100 text-primary-600 mb-4">
137
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
138
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
139
+ </svg>
140
+ </div>
141
+ <h3 class="text-xl font-semibold mb-3">Secure & Private</h3>
142
+ <p class="text-secondary-700">Built with strong security protocols to maintain privacy of health-related queries.</p>
143
+ </div>
144
+ </div>
145
+ </section>
146
+
147
+ <!-- Tools section -->
148
+ <section id="tools" class="mb-16">
149
+ <h2 class="text-3xl font-bold text-secondary-900 mb-8">Available Healthcare Tools</h2>
150
+
151
+ <div class="space-y-6">
152
+ <div class="card overflow-hidden border border-primary-100">
153
+ <div class="bg-primary-50 p-6 border-b border-primary-100">
154
+ <div class="flex items-center">
155
+ <div class="rounded-full w-10 h-10 flex items-center justify-center bg-primary-600 text-white mr-4">
156
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
157
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
158
+ </svg>
159
+ </div>
160
+ <h3 class="text-xl font-semibold">Health Recommendations</h3>
161
+ </div>
162
+ </div>
163
+ <div class="p-6">
164
+ <p class="mb-4">Get personalized health screening and preventive care recommendations based on age, sex, and pregnancy status.</p>
165
+ <div class="bg-gray-50 rounded-lg p-4 font-mono text-sm overflow-auto">
166
+ <pre class="whitespace-pre-wrap">Tool: get-health-recommendations
167
+ Parameters:
168
+ - age: number (0-120)
169
+ - sex: "male" | "female"
170
+ - pregnant: boolean (optional)</pre>
171
+ </div>
172
+ </div>
173
+ </div>
174
+
175
+ <div class="card overflow-hidden border border-primary-100">
176
+ <div class="bg-primary-50 p-6 border-b border-primary-100">
177
+ <div class="flex items-center">
178
+ <div class="rounded-full w-10 h-10 flex items-center justify-center bg-primary-600 text-white mr-4">
179
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
180
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" />
181
+ </svg>
182
+ </div>
183
+ <h3 class="text-xl font-semibold">Medication Information</h3>
184
+ </div>
185
+ </div>
186
+ <div class="p-6">
187
+ <p class="mb-4">Look up detailed information about medications, including usage, dosage, warnings, and side effects.</p>
188
+ <div class="bg-gray-50 rounded-lg p-4 font-mono text-sm overflow-auto">
189
+ <pre class="whitespace-pre-wrap">Tool: lookup-medication
190
+ Parameters:
191
+ - medicationName: string</pre>
192
+ </div>
193
+ </div>
194
+ </div>
195
+
196
+ <div class="card overflow-hidden border border-primary-100">
197
+ <div class="bg-primary-50 p-6 border-b border-primary-100">
198
+ <div class="flex items-center">
199
+ <div class="rounded-full w-10 h-10 flex items-center justify-center bg-primary-600 text-white mr-4">
200
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
201
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
202
+ </svg>
203
+ </div>
204
+ <h3 class="text-xl font-semibold">Disease & Condition Information</h3>
205
+ </div>
206
+ </div>
207
+ <div class="p-6">
208
+ <p class="mb-4">Find information about various diseases and medical conditions, including symptoms, treatments, and prevention.</p>
209
+ <div class="bg-gray-50 rounded-lg p-4 font-mono text-sm overflow-auto">
210
+ <pre class="whitespace-pre-wrap">Tool: find-disease-info
211
+ Parameters:
212
+ - condition: string</pre>
213
+ </div>
214
+ </div>
215
+ </div>
216
+
217
+ <div class="card overflow-hidden border border-primary-100">
218
+ <div class="bg-primary-50 p-6 border-b border-primary-100">
219
+ <div class="flex items-center">
220
+ <div class="rounded-full w-10 h-10 flex items-center justify-center bg-primary-600 text-white mr-4">
221
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
222
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3" />
223
+ </svg>
224
+ </div>
225
+ <h3 class="text-xl font-semibold">BMI Calculator</h3>
226
+ </div>
227
+ </div>
228
+ <div class="p-6">
229
+ <p class="mb-4">Calculate Body Mass Index (BMI) and receive health recommendations based on the results.</p>
230
+ <div class="bg-gray-50 rounded-lg p-4 font-mono text-sm overflow-auto">
231
+ <pre class="whitespace-pre-wrap">Tool: calculate-bmi
232
+ Parameters:
233
+ - weight: number (in kg)
234
+ - height: number (in meters)
235
+ - age: number (optional)
236
+ - sex: "male" | "female" (optional)</pre>
237
+ </div>
238
+ </div>
239
+ </div>
240
+
241
+ <div class="card overflow-hidden border border-primary-100">
242
+ <div class="bg-primary-50 p-6 border-b border-primary-100">
243
+ <div class="flex items-center">
244
+ <div class="rounded-full w-10 h-10 flex items-center justify-center bg-primary-600 text-white mr-4">
245
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
246
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
247
+ </svg>
248
+ </div>
249
+ <h3 class="text-xl font-semibold">Symptom Checker</h3>
250
+ </div>
251
+ </div>
252
+ <div class="p-6">
253
+ <p class="mb-4">Check common symptoms and receive preliminary advice on potential conditions and when to seek care.</p>
254
+ <div class="bg-gray-50 rounded-lg p-4 font-mono text-sm overflow-auto">
255
+ <pre class="whitespace-pre-wrap">Tool: symptom-checker
256
+ Parameters:
257
+ - symptoms: string[]
258
+ - duration: "hours" | "days" | "weeks" | "months"
259
+ - severity: "mild" | "moderate" | "severe"
260
+ - age: number
261
+ - sex: "male" | "female"</pre>
262
+ </div>
263
+ </div>
264
+ </div>
265
+ </div>
266
+ </section>
267
+
268
+ <!-- Integration section -->
269
+ <section class="mb-16">
270
+ <h2 class="text-3xl font-bold text-secondary-900 mb-8">Integration Guide</h2>
271
+ <div class="card">
272
+ <p class="mb-6">To integrate the Suncture Healthcare MCP with your AI application:</p>
273
+ <div class="space-y-6">
274
+ <div class="flex">
275
+ <div class="flex-shrink-0">
276
+ <div class="flex items-center justify-center h-8 w-8 rounded-full bg-primary-100 text-primary-700 font-bold text-lg">1</div>
277
+ </div>
278
+ <div class="ml-4">
279
+ <h3 class="text-lg font-semibold mb-2">Connect to the SSE endpoint</h3>
280
+ <div class="bg-gray-50 rounded-lg p-4 font-mono text-sm overflow-auto">
281
+ <code>${req.protocol}://${req.get('host')}/sse</code>
282
+ </div>
283
+ </div>
284
+ </div>
285
+
286
+ <div class="flex">
287
+ <div class="flex-shrink-0">
288
+ <div class="flex items-center justify-center h-8 w-8 rounded-full bg-primary-100 text-primary-700 font-bold text-lg">2</div>
289
+ </div>
290
+ <div class="ml-4">
291
+ <h3 class="text-lg font-semibold mb-2">Send messages to the messages endpoint</h3>
292
+ <div class="bg-gray-50 rounded-lg p-4 font-mono text-sm overflow-auto">
293
+ <code>${req.protocol}://${req.get('host')}/messages?sessionId=[SESSION_ID]</code>
294
+ </div>
295
+ </div>
296
+ </div>
297
+
298
+ <div class="flex">
299
+ <div class="flex-shrink-0">
300
+ <div class="flex items-center justify-center h-8 w-8 rounded-full bg-primary-100 text-primary-700 font-bold text-lg">3</div>
301
+ </div>
302
+ <div class="ml-4">
303
+ <h3 class="text-lg font-semibold mb-2">Use any or the standard MCP client library</h3>
304
+ <p class="text-secondary-700">For simplified integration, use the Model Context Protocol client library in your application.</p>
305
+ <div class="bg-gray-50 rounded-lg p-4 font-mono text-sm mt-2 overflow-auto">
306
+ <code>npm install @modelcontextprotocol/sdk</code>
307
+ </div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+ </div>
312
+ </section>
313
+
314
+ <!-- Server information section -->
315
+ <section>
316
+ <h2 class="text-3xl font-bold text-secondary-900 mb-8">Server Information</h2>
317
+ <div class="bg-white rounded-xl shadow-soft overflow-hidden">
318
+ <div class="border-b border-gray-200">
319
+ <div class="grid grid-cols-2 md:grid-cols-4 divide-x divide-gray-200">
320
+ <div class="p-6">
321
+ <div class="text-sm text-secondary-600 mb-1">Server Name</div>
322
+ <div class="font-semibold">suncture-healthcare</div>
323
+ </div>
324
+ <div class="p-6">
325
+ <div class="text-sm text-secondary-600 mb-1">Version</div>
326
+ <div class="font-semibold">1.0.0</div>
327
+ </div>
328
+ <div class="p-6">
329
+ <div class="text-sm text-secondary-600 mb-1">Transport Type</div>
330
+ <div class="font-semibold">SSE</div>
331
+ </div>
332
+ <div class="p-6">
333
+ <div class="text-sm text-secondary-600 mb-1">Status</div>
334
+ <div class="flex items-center">
335
+ <div class="h-2.5 w-2.5 rounded-full bg-green-500 mr-2"></div>
336
+ <span class="font-semibold">Active</span>
337
+ </div>
338
+ </div>
339
+ </div>
340
+ </div>
341
+ <div class="p-6">
342
+ <div class="mb-4">
343
+ <div class="text-sm text-secondary-600 mb-1">SSE Endpoint</div>
344
+ <div class="font-mono text-sm bg-gray-50 p-2 rounded">
345
+ ${req.protocol}://${req.get('host')}/sse
346
+ </div>
347
+ </div>
348
+ <div>
349
+ <div class="text-sm text-secondary-600 mb-1">Messages Endpoint</div>
350
+ <div class="font-mono text-sm bg-gray-50 p-2 rounded">
351
+ ${req.protocol}://${req.get('host')}/messages
352
+ </div>
353
+ </div>
354
+ </div>
355
+ </div>
356
+ </section>
357
+ </main>
358
+
359
+ <footer class="bg-white border-t border-gray-200 mt-16">
360
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
361
+ <div class="md:flex md:items-center md:justify-between">
362
+ <div class="flex items-center">
363
+ <svg class="h-8 w-8 text-primary-600" viewBox="0 0 40 40" fill="currentColor">
364
+ <path d="M20 3.33331C10.8 3.33331 3.33337 10.8 3.33337 20C3.33337 29.2 10.8 36.6666 20 36.6666C29.2 36.6666 36.6667 29.2 36.6667 20C36.6667 10.8 29.2 3.33331 20 3.33331Z"/>
365
+ </svg>
366
+ <p class="ml-3 text-secondary-600">© ${new Date().getFullYear()} Suncture Corp. All rights reserved.</p>
367
+ </div>
368
+ <div class="mt-8 md:mt-0">
369
+ <p class="text-secondary-600 text-sm">
370
+ This tool provides general health information for educational purposes only and is not a substitute for professional medical advice.
371
+ </p>
372
+ </div>
373
+ </div>
374
+ </div>
375
+ </footer>
376
+ </body>
377
+ </html>
378
+ `;
379
+
380
+ res.setHeader('Content-Type', 'text/html');
381
+ res.send(landingPage);
382
+ });
383
+
384
+ // Health check endpoint
385
+ router.get("/health", (req: Request, res: Response) => {
386
+ res.json({
387
+ status: "ok",
388
+ serverMode: "sse",
389
+ sseEndpoint: `${req.protocol}://${req.get('host')}/sse`,
390
+ messagesEndpoint: `${req.protocol}://${req.get('host')}/messages`,
391
+ serverTime: new Date().toISOString()
392
+ });
393
+ });
394
+
395
+ export default router;
src/tools/healthTools.ts ADDED
@@ -0,0 +1,509 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { z } from "zod";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { makeApiRequest, formatHealthRecommendation } from '../utils/api.js';
4
+ import { diseasesAndSymptoms } from '../utils/diseaseData.js';
5
+ import { HealthGovResponse, FDAResponse } from '../types/index.js';
6
+ import { HEALTHGOV_API_BASE, FDA_API_BASE, NIH_MED_API_BASE } from '../utils/api.js';
7
+
8
+ // Register all healthcare tools on a server instance
9
+ export function registerHealthTools(server: McpServer) {
10
+ registerHealthRecommendationsTool(server);
11
+ registerMedicationLookupTool(server);
12
+ registerDiseaseInfoTool(server);
13
+ registerBmiCalculatorTool(server);
14
+ registerSymptomCheckerTool(server);
15
+ }
16
+
17
+ // Register health recommendations tool
18
+ function registerHealthRecommendationsTool(server: McpServer) {
19
+ server.tool(
20
+ "get-health-recommendations",
21
+ "Get health screening and preventive care recommendations based on age, sex, and pregnancy status",
22
+ {
23
+ age: z.number().min(0).max(120).describe("Age of the person in years"),
24
+ sex: z.enum(["male", "female"]).describe("Biological sex of the person"),
25
+ pregnant: z.boolean().optional().describe("Whether the person is pregnant (only applicable for females)"),
26
+ },
27
+ async ({ age, sex, pregnant }) => {
28
+ // Build the Health.gov API URL
29
+ let apiUrl = `${HEALTHGOV_API_BASE}/myhealthfinder.json?age=${age}&sex=${sex}`;
30
+ if (sex === "female" && pregnant !== undefined) {
31
+ apiUrl += `&pregnant=${pregnant ? "true" : "false"}`;
32
+ }
33
+
34
+ const healthData = await makeApiRequest<HealthGovResponse>(apiUrl);
35
+
36
+ if (!healthData || !healthData.Result || !healthData.Result.Resources || !healthData.Result.Resources.Resource) {
37
+ return {
38
+ content: [
39
+ {
40
+ type: "text",
41
+ text: "Failed to retrieve health recommendations data.",
42
+ },
43
+ ],
44
+ };
45
+ }
46
+
47
+ const recommendations = healthData.Result.Resources.Resource;
48
+ if (recommendations.length === 0) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: "text",
53
+ text: `No health recommendations found for a ${age}-year-old ${sex}.`,
54
+ },
55
+ ],
56
+ };
57
+ }
58
+
59
+ const formattedRecommendations = recommendations.map(formatHealthRecommendation);
60
+ const recommendationsText = `Health recommendations for a ${age}-year-old ${sex}${pregnant ? " (pregnant)" : ""}:\n\n${formattedRecommendations.join("\n")}`;
61
+
62
+ return {
63
+ content: [
64
+ {
65
+ type: "text",
66
+ text: recommendationsText,
67
+ },
68
+ ],
69
+ };
70
+ },
71
+ );
72
+ }
73
+
74
+ // Register medication lookup tool
75
+ function registerMedicationLookupTool(server: McpServer) {
76
+ server.tool(
77
+ "lookup-medication",
78
+ "Look up information about a medication by name",
79
+ {
80
+ medicationName: z.string().describe("Name of the medication to look up (generic or brand name)"),
81
+ },
82
+ async ({ medicationName }) => {
83
+ const encodedName = encodeURIComponent(medicationName);
84
+ const apiUrl = `${FDA_API_BASE}/label.json?search=openfda.generic_name:"${encodedName}"+openfda.brand_name:"${encodedName}"&limit=1`;
85
+
86
+ const medicationData = await makeApiRequest<FDAResponse>(apiUrl);
87
+
88
+ if (!medicationData || !medicationData.results || medicationData.results.length === 0) {
89
+ return {
90
+ content: [
91
+ {
92
+ type: "text",
93
+ text: `No information found for medication: ${medicationName}. Please check the spelling or try a different medication name.`,
94
+ },
95
+ ],
96
+ };
97
+ }
98
+
99
+ const med = medicationData.results[0];
100
+ const genericName = med.openfda?.generic_name?.[0] || "Not available";
101
+ const brandNames = med.openfda?.brand_name?.join(", ") || "Not available";
102
+ const manufacturers = med.openfda?.manufacturer_name?.join(", ") || "Not available";
103
+ const routes = med.openfda?.route?.join(", ") || "Not available";
104
+ const substances = med.openfda?.substance_name?.join(", ") || "Not available";
105
+
106
+ const warnings = med.warnings?.[0] || "No warnings available";
107
+ const dosage = med.dosage_and_administration?.[0] || "No dosage information available";
108
+ const indications = med.indications_and_usage?.[0] || "No usage information available";
109
+ const adverseReactions = med.adverse_reactions?.[0] || "No adverse reactions information available";
110
+ const interactions = med.drug_interactions?.[0] || "No drug interactions information available";
111
+
112
+ const medicationText = [
113
+ `# Medication Information for ${genericName} (${brandNames})`,
114
+ "",
115
+ "## Basic Information",
116
+ `Generic Name: ${genericName}`,
117
+ `Brand Names: ${brandNames}`,
118
+ `Manufacturer(s): ${manufacturers}`,
119
+ `Administration Route(s): ${routes}`,
120
+ `Active Substance(s): ${substances}`,
121
+ "",
122
+ "## Usage Information",
123
+ `Indications and Usage: ${indications}`,
124
+ "",
125
+ "## Dosage Information",
126
+ `${dosage}`,
127
+ "",
128
+ "## Safety Information",
129
+ `Warnings: ${warnings}`,
130
+ "",
131
+ "## Adverse Reactions",
132
+ `${adverseReactions}`,
133
+ "",
134
+ "## Drug Interactions",
135
+ `${interactions}`,
136
+ "",
137
+ "DISCLAIMER: This information is for educational purposes only and is not a substitute for professional medical advice. Always consult with a healthcare provider before taking any medication.",
138
+ ].join("\n");
139
+
140
+ return {
141
+ content: [
142
+ {
143
+ type: "text",
144
+ text: medicationText,
145
+ },
146
+ ],
147
+ };
148
+ },
149
+ );
150
+ }
151
+
152
+ // Register disease info tool
153
+ function registerDiseaseInfoTool(server: McpServer) {
154
+ server.tool(
155
+ "find-disease-info",
156
+ "Find information about a disease or medical condition",
157
+ {
158
+ condition: z.string().describe("Name of the disease or medical condition to look up"),
159
+ },
160
+ async ({ condition }) => {
161
+ // Normalize the condition name for lookup
162
+ const normalizedCondition = condition.toLowerCase().trim();
163
+
164
+ // First, check our local database for common conditions
165
+ for (const [key, diseaseInfo] of Object.entries(diseasesAndSymptoms)) {
166
+ if (key.includes(normalizedCondition) || normalizedCondition.includes(key)) {
167
+ const diseaseText = [
168
+ `# ${diseaseInfo.name}`,
169
+ "",
170
+ "## Overview",
171
+ `${diseaseInfo.overview}`,
172
+ "",
173
+ "## Symptoms",
174
+ `${diseaseInfo.symptoms?.map(s => `- ${s}`).join("\n") || "No symptom information available."}`,
175
+ "",
176
+ "## Treatment",
177
+ `${diseaseInfo.treatment}`,
178
+ "",
179
+ "## Prevention",
180
+ `${diseaseInfo.prevention}`,
181
+ "",
182
+ "DISCLAIMER: This information is for educational purposes only and is not a substitute for professional medical advice.",
183
+ ].join("\n");
184
+
185
+ return {
186
+ content: [
187
+ {
188
+ type: "text",
189
+ text: diseaseText,
190
+ },
191
+ ],
192
+ };
193
+ }
194
+ }
195
+
196
+ // If not found in our database, attempt to query the NIH API
197
+ const encodedCondition = encodeURIComponent(normalizedCondition);
198
+ const apiUrl = `${NIH_MED_API_BASE}?terms=${encodedCondition}&maxList=1`;
199
+
200
+ try {
201
+ const conditionData = await makeApiRequest<[number, string[], any[], string[]]>(apiUrl);
202
+
203
+ if (!conditionData || conditionData[0] === 0) {
204
+ return {
205
+ content: [
206
+ {
207
+ type: "text",
208
+ text: `No information found for the condition: ${condition}. Please check the spelling or try a different medical condition.`,
209
+ },
210
+ ],
211
+ };
212
+ }
213
+
214
+ // The API just gives us names, so we'll provide a general response
215
+ const conditionName = conditionData[3][0] || condition;
216
+
217
+ const conditionText = [
218
+ `# ${conditionName}`,
219
+ "",
220
+ "I found this condition in the medical database, but detailed information is limited.",
221
+ "",
222
+ "## General Advice",
223
+ "For specific information about this condition, including symptoms, diagnosis, treatment options, and prevention strategies, please consult with a healthcare provider.",
224
+ "",
225
+ "## Next Steps",
226
+ "- Consider scheduling an appointment with your primary care physician to discuss this condition",
227
+ "- Before your appointment, write down any symptoms you're experiencing and how long you've had them",
228
+ "- Make a list of all medications, vitamins, and supplements you're taking",
229
+ "- Prepare a list of questions to ask your doctor",
230
+ "",
231
+ "DISCLAIMER: This information is for educational purposes only and is not a substitute for professional medical advice.",
232
+ ].join("\n");
233
+
234
+ return {
235
+ content: [
236
+ {
237
+ type: "text",
238
+ text: conditionText,
239
+ },
240
+ ],
241
+ };
242
+ } catch (error) {
243
+ console.error("Error querying condition API:", error);
244
+ return {
245
+ content: [
246
+ {
247
+ type: "text",
248
+ text: `Unable to retrieve information for: ${condition}. Please try again later or consult with a healthcare provider.`,
249
+ },
250
+ ],
251
+ };
252
+ }
253
+ },
254
+ );
255
+ }
256
+
257
+ // Register BMI calculator tool
258
+ function registerBmiCalculatorTool(server: McpServer) {
259
+ server.tool(
260
+ "calculate-bmi",
261
+ "Calculate Body Mass Index (BMI) and provide health recommendations",
262
+ {
263
+ weight: z.number().min(1).describe("Weight in kilograms"),
264
+ height: z.number().min(0.1).describe("Height in meters"),
265
+ age: z.number().min(0).max(120).optional().describe("Age in years (optional)"),
266
+ sex: z.enum(["male", "female"]).optional().describe("Biological sex (optional)"),
267
+ },
268
+ async ({ weight, height, age, sex }) => {
269
+ // Calculate BMI: weight (kg) / (height (m) * height (m))
270
+ const bmi = weight / (height * height);
271
+ const roundedBmi = Math.round(bmi * 10) / 10;
272
+
273
+ // Determine BMI category
274
+ let category, healthRisk, basicRecommendation;
275
+
276
+ if (bmi < 18.5) {
277
+ category = "Underweight";
278
+ healthRisk = "Malnutrition, vitamin deficiencies, anemia";
279
+ basicRecommendation = "Consider consulting with a healthcare provider about healthy weight gain strategies and nutritional assessment.";
280
+ } else if (bmi >= 18.5 && bmi < 25) {
281
+ category = "Normal weight";
282
+ healthRisk = "Low risk (healthy range)";
283
+ basicRecommendation = "Maintain healthy eating habits and regular physical activity.";
284
+ } else if (bmi >= 25 && bmi < 30) {
285
+ category = "Overweight";
286
+ healthRisk = "Moderate risk of developing heart disease, high blood pressure, stroke, diabetes";
287
+ basicRecommendation = "Consider gradual weight loss through improved diet and increased physical activity.";
288
+ } else if (bmi >= 30 && bmi < 35) {
289
+ category = "Obesity (Class 1)";
290
+ healthRisk = "High risk of developing heart disease, high blood pressure, stroke, diabetes";
291
+ basicRecommendation = "Consult with a healthcare provider about a weight management plan.";
292
+ } else if (bmi >= 35 && bmi < 40) {
293
+ category = "Obesity (Class 2)";
294
+ healthRisk = "Very high risk of developing heart disease, high blood pressure, stroke, diabetes";
295
+ basicRecommendation = "Strongly recommended to consult with a healthcare provider about a weight management plan.";
296
+ } else {
297
+ category = "Obesity (Class 3)";
298
+ healthRisk = "Extremely high risk of developing heart disease, high blood pressure, stroke, diabetes";
299
+ basicRecommendation = "Urgent consultation with a healthcare provider is recommended.";
300
+ }
301
+
302
+ // Additional recommendations based on age and sex
303
+ let additionalRecommendations = "";
304
+ if (age !== undefined && sex !== undefined) {
305
+ if (age >= 45 && sex === "male") {
306
+ additionalRecommendations += "\n\nFor men over 45: Consider regular screening for heart disease and diabetes, especially if your BMI is above the normal range.";
307
+ } else if (age >= 55 && sex === "female") {
308
+ additionalRecommendations += "\n\nFor women over 55: Consider bone density screening, especially if your BMI is in the underweight range, as low body weight can be a risk factor for osteoporosis.";
309
+ }
310
+
311
+ if (age >= 65) {
312
+ additionalRecommendations += "\n\nFor adults over 65: BMI calculations may be less accurate. Maintaining muscle mass becomes increasingly important. Consider consulting with a healthcare provider about appropriate weight and nutrition goals.";
313
+ }
314
+ }
315
+
316
+ const bmiText = [
317
+ `# BMI Calculation Results`,
318
+ "",
319
+ `Your BMI: ${roundedBmi}`,
320
+ `Category: ${category}`,
321
+ `Potential Health Risks: ${healthRisk}`,
322
+ "",
323
+ "## Recommendations",
324
+ basicRecommendation,
325
+ additionalRecommendations,
326
+ "",
327
+ "## BMI Limitations",
328
+ "BMI is a simple screening tool and does not directly measure body fat or account for factors like muscle mass, bone density, overall body composition, or ethnic differences.",
329
+ "Athletes or highly muscular individuals may have a high BMI without excess fat.",
330
+ "",
331
+ "DISCLAIMER: This information is for educational purposes only and is not a substitute for professional medical advice.",
332
+ ].join("\n");
333
+
334
+ return {
335
+ content: [
336
+ {
337
+ type: "text",
338
+ text: bmiText,
339
+ },
340
+ ],
341
+ };
342
+ },
343
+ );
344
+ }
345
+
346
+ // Register symptom checker tool
347
+ function registerSymptomCheckerTool(server: McpServer) {
348
+ server.tool(
349
+ "symptom-checker",
350
+ "Check common symptoms and get preliminary advice",
351
+ {
352
+ symptoms: z.array(z.string()).min(1).describe("List of symptoms the person is experiencing"),
353
+ duration: z.enum(["hours", "days", "weeks", "months"]).describe("How long the symptoms have been present"),
354
+ severity: z.enum(["mild", "moderate", "severe"]).describe("How severe the symptoms are"),
355
+ age: z.number().min(0).max(120).describe("Age of the person in years"),
356
+ sex: z.enum(["male", "female"]).describe("Biological sex of the person"),
357
+ },
358
+ async ({ symptoms, duration, severity, age }) => {
359
+ // Normalize symptoms to lowercase for matching
360
+ const normalizedSymptoms = symptoms.map(s => s.toLowerCase().trim());
361
+
362
+ // Check for emergency symptoms that require immediate medical attention
363
+ const emergencySymptoms = [
364
+ "chest pain", "shortness of breath", "difficulty breathing",
365
+ "sudden numbness", "paralysis", "difficulty speaking",
366
+ "sudden severe headache", "head injury", "uncontrollable bleeding",
367
+ "severe abdominal pain", "coughing up blood", "vomiting blood",
368
+ "suicidal thoughts", "seizure", "unconsciousness", "severe burn"
369
+ ];
370
+
371
+ for (const symptom of normalizedSymptoms) {
372
+ for (const emergencySymptom of emergencySymptoms) {
373
+ if (symptom.includes(emergencySymptom)) {
374
+ return {
375
+ content: [
376
+ {
377
+ type: "text",
378
+ text: "⚠️ EMERGENCY WARNING ⚠️\n\nThe symptoms you've described may indicate a serious medical condition requiring immediate attention. Please call emergency services (911 in the US) or go to the nearest emergency room immediately.\n\nThis tool cannot provide emergency medical advice or replace professional medical care.",
379
+ },
380
+ ],
381
+ };
382
+ }
383
+ }
384
+ }
385
+
386
+ // Map common symptoms to potential conditions
387
+ const symptomToConditionMap: Record<string, string[]> = {
388
+ "fever": ["common cold", "influenza", "covid-19", "infection"],
389
+ "cough": ["common cold", "influenza", "covid-19", "asthma", "allergies"],
390
+ "headache": ["tension headache", "migraine", "dehydration", "stress", "influenza"],
391
+ "fatigue": ["depression", "anemia", "sleep disorder", "influenza", "hypothyroidism"],
392
+ "sore throat": ["common cold", "influenza", "strep throat", "allergies"],
393
+ "runny nose": ["common cold", "allergies", "influenza"],
394
+ "stuffy nose": ["common cold", "allergies", "influenza"],
395
+ "body aches": ["influenza", "fibromyalgia", "common cold"],
396
+ "nausea": ["food poisoning", "migraine", "anxiety", "pregnancy", "motion sickness"],
397
+ "vomiting": ["food poisoning", "gastroenteritis", "migraine", "pregnancy"],
398
+ "diarrhea": ["food poisoning", "gastroenteritis", "irritable bowel syndrome"],
399
+ "rash": ["allergic reaction", "eczema", "psoriasis", "chickenpox", "contact dermatitis"],
400
+ "abdominal pain": ["gastroenteritis", "appendicitis", "irritable bowel syndrome", "menstrual cramps"],
401
+ "joint pain": ["arthritis", "injury", "influenza", "lyme disease", "gout"],
402
+ "dizziness": ["vertigo", "inner ear infection", "anemia", "dehydration", "anxiety"],
403
+ "chest tightness": ["asthma", "anxiety", "pneumonia", "bronchitis"],
404
+ "sneezing": ["common cold", "allergies", "influenza"],
405
+ "wheezing": ["asthma", "bronchitis", "allergic reaction"],
406
+ "itching": ["allergic reaction", "eczema", "psoriasis", "contact dermatitis"],
407
+ "swelling": ["injury", "allergic reaction", "infection", "arthritis"],
408
+ "shortness of breath": ["asthma", "anxiety", "pneumonia", "bronchitis", "covid-19"],
409
+ "back pain": ["muscle strain", "herniated disc", "arthritis", "kidney infection"],
410
+ "high blood pressure": ["hypertension", "anxiety", "pre-eclampsia"],
411
+ "high blood sugar": ["diabetes", "prediabetes"],
412
+ };
413
+
414
+ // Match symptoms to conditions
415
+ const potentialConditions: Record<string, number> = {};
416
+
417
+ for (const symptom of normalizedSymptoms) {
418
+ // Check for exact matches first
419
+ const exactMatches = symptomToConditionMap[symptom];
420
+ if (exactMatches) {
421
+ for (const condition of exactMatches) {
422
+ potentialConditions[condition] = (potentialConditions[condition] || 0) + 2; // Give more weight to exact matches
423
+ }
424
+ continue;
425
+ }
426
+
427
+ // Check for partial matches
428
+ for (const [knownSymptom, conditions] of Object.entries(symptomToConditionMap)) {
429
+ if (symptom.includes(knownSymptom) || knownSymptom.includes(symptom)) {
430
+ for (const condition of conditions) {
431
+ potentialConditions[condition] = (potentialConditions[condition] || 0) + 1;
432
+ }
433
+ }
434
+ }
435
+ }
436
+
437
+ // Sort conditions by number of matching symptoms
438
+ const sortedConditions = Object.entries(potentialConditions)
439
+ .sort((a, b) => b[1] - a[1])
440
+ .slice(0, 3)
441
+ .map(entry => entry[0]);
442
+
443
+ // Generate advice based on symptoms, duration, severity, age, and sex
444
+ let generalAdvice;
445
+ let whenToSeekCare;
446
+
447
+ if (severity === "mild" && (duration === "hours" || duration === "days")) {
448
+ generalAdvice = "Your symptoms appear to be mild and recent. Rest, stay hydrated, and monitor your symptoms. Over-the-counter medications may help relieve discomfort.";
449
+ whenToSeekCare = "If symptoms worsen, persist beyond a week, or if you develop fever above 101°F (38.3°C), difficulty breathing, or severe pain, consult a healthcare provider.";
450
+ } else if (severity === "mild" && (duration === "weeks" || duration === "months")) {
451
+ generalAdvice = "While your symptoms are mild, the extended duration suggests you should consult with a healthcare provider for proper evaluation.";
452
+ whenToSeekCare = "Schedule an appointment with your primary care provider within the next week.";
453
+ } else if (severity === "moderate" && (duration === "hours" || duration === "days")) {
454
+ generalAdvice = "Your symptoms are moderately concerning. Rest, stay hydrated, and consider over-the-counter medications for symptom relief if appropriate.";
455
+ whenToSeekCare = "If symptoms don't improve within 2-3 days or worsen at any time, consult with a healthcare provider promptly.";
456
+ } else if (severity === "moderate" && (duration === "weeks" || duration === "months")) {
457
+ generalAdvice = "The combination of moderate symptoms lasting this long indicates you should seek medical evaluation.";
458
+ whenToSeekCare = "Please schedule an appointment with your healthcare provider within the next few days.";
459
+ } else if (severity === "severe") {
460
+ generalAdvice = "Your symptoms are severe, which is concerning regardless of duration.";
461
+ whenToSeekCare = "Please seek medical attention promptly. Contact your healthcare provider today or visit an urgent care facility if you can't get a same-day appointment.";
462
+ }
463
+
464
+ // Age-specific considerations
465
+ if (age < 2) {
466
+ whenToSeekCare = "For infants under 2 years, even mild symptoms should be evaluated by a pediatrician promptly.";
467
+ } else if (age >= 65) {
468
+ whenToSeekCare = "Adults over 65 should take symptoms more seriously as complications can develop more quickly. Consider consulting with your healthcare provider even for mild symptoms that persist.";
469
+ }
470
+
471
+ // Generate response
472
+ const symptomsText = normalizedSymptoms.join(", ");
473
+ const conditionsText = sortedConditions.length > 0
474
+ ? `Based on the symptoms you've described, possible conditions might include: ${sortedConditions.join(", ")}.`
475
+ : "Based on the limited information provided, I cannot identify specific potential conditions that match your symptoms.";
476
+
477
+ const responseText = [
478
+ `# Symptom Assessment`,
479
+ "",
480
+ `## Summary`,
481
+ `You reported ${normalizedSymptoms.length} symptom(s): ${symptomsText}`,
482
+ `Duration: ${duration}`,
483
+ `Severity: ${severity}`,
484
+ "",
485
+ `## Possible Conditions`,
486
+ conditionsText,
487
+ "",
488
+ `## General Advice`,
489
+ generalAdvice,
490
+ "",
491
+ `## When to Seek Medical Care`,
492
+ whenToSeekCare,
493
+ "",
494
+ "IMPORTANT DISCLAIMER: This tool provides general information only and is not a substitute for professional medical advice, diagnosis, or treatment. Always seek the advice of your physician or other qualified health provider with any questions you may have regarding a medical condition.",
495
+ "",
496
+ "The assessment provided is based on the limited information you've shared and does not constitute a medical diagnosis. Only a healthcare provider can provide an accurate diagnosis after proper examination.",
497
+ ].join("\n");
498
+
499
+ return {
500
+ content: [
501
+ {
502
+ type: "text",
503
+ text: responseText,
504
+ },
505
+ ],
506
+ };
507
+ },
508
+ );
509
+ }
src/types/index.ts ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Interfaces for the healthcare API responses and data types
2
+
3
+ export interface HealthRecommendation {
4
+ Title?: string;
5
+ MyHFDescription?: string;
6
+ MyHFCategoryIDs?: string[];
7
+ PopulationData?: {
8
+ PopulationGroup?: string;
9
+ };
10
+ RecommendationSummary?: string;
11
+ }
12
+
13
+ export interface HealthGovResponse {
14
+ Result?: {
15
+ Resources?: {
16
+ Resource?: HealthRecommendation[];
17
+ };
18
+ };
19
+ }
20
+
21
+ export interface MedicationInfo {
22
+ openfda?: {
23
+ generic_name?: string[];
24
+ brand_name?: string[];
25
+ manufacturer_name?: string[];
26
+ route?: string[];
27
+ substance_name?: string[];
28
+ };
29
+ warnings?: string[];
30
+ dosage_and_administration?: string[];
31
+ indications_and_usage?: string[];
32
+ adverse_reactions?: string[];
33
+ drug_interactions?: string[];
34
+ }
35
+
36
+ export interface FDAResponse {
37
+ results?: MedicationInfo[];
38
+ }
39
+
40
+ export interface DiseaseSymptom {
41
+ name?: string;
42
+ symptoms?: string[];
43
+ overview?: string;
44
+ treatment?: string;
45
+ prevention?: string;
46
+ }
47
+
48
+ // Server configuration options
49
+ export interface ServerOptions {
50
+ mode?: string;
51
+ port?: number;
52
+ endpoint?: string;
53
+ }
src/utils/api.ts ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Constants for API endpoints
2
+ export const HEALTHGOV_API_BASE = "https://health.gov/myhealthfinder/api/v3";
3
+ export const FDA_API_BASE = "https://api.fda.gov/drug";
4
+ export const NIH_MED_API_BASE = "https://clinicaltables.nlm.nih.gov/api/conditions/v3/search";
5
+ export const USER_AGENT = "healthcare-assistant/1.0";
6
+
7
+ // Helper function for making API requests
8
+ export async function makeApiRequest<T>(url: string): Promise<T | null> {
9
+ const headers = {
10
+ "User-Agent": USER_AGENT,
11
+ Accept: "application/json",
12
+ };
13
+
14
+ try {
15
+ const response = await fetch(url, { headers });
16
+ if (!response.ok) {
17
+ throw new Error(`HTTP error! status: ${response.status}`);
18
+ }
19
+ return (await response.json()) as T;
20
+ } catch (error) {
21
+ console.error("Error making API request:", error);
22
+ return null;
23
+ }
24
+ }
25
+
26
+ // Format health recommendation data
27
+ export function formatHealthRecommendation(recommendation: any): string {
28
+ return [
29
+ `Title: ${recommendation.Title || "Unknown"}`,
30
+ `Target Population: ${recommendation.PopulationData?.PopulationGroup || "General population"}`,
31
+ `Summary: ${recommendation.RecommendationSummary || "No summary available"}`,
32
+ `Description: ${recommendation.MyHFDescription || "No description available"}`,
33
+ "---",
34
+ ].join("\n");
35
+ }
src/utils/diseaseData.ts ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { DiseaseSymptom } from '../types/index.js';
2
+
3
+ // Mock database for common diseases and symptoms
4
+ // In a real implementation, this would be connected to a medical API or database
5
+ export const diseasesAndSymptoms: Record<string, DiseaseSymptom> = {
6
+ "common cold": {
7
+ name: "Common Cold",
8
+ symptoms: ["Runny or stuffy nose", "Sore throat", "Cough", "Congestion", "Slight body aches", "Mild headache", "Sneezing", "Low-grade fever", "Generally feeling unwell"],
9
+ overview: "The common cold is a viral infection of your nose and throat. It's usually harmless, although it might not feel that way. Many types of viruses can cause a common cold.",
10
+ treatment: "There's no cure for the common cold. Antibiotics are of no use against cold viruses. Treatment includes rest, fluids, and over-the-counter medicines to relieve symptoms.",
11
+ prevention: "Wash your hands frequently, avoid close contact with sick people, don't touch your face with unwashed hands, and strengthen your immune system with a healthy diet and exercise.",
12
+ },
13
+ "influenza": {
14
+ name: "Influenza (Flu)",
15
+ symptoms: ["Fever over 100.4°F (38°C)", "Aching muscles", "Chills and sweats", "Headache", "Dry, persistent cough", "Shortness of breath", "Tiredness and weakness", "Runny or stuffy nose", "Sore throat", "Eye pain", "Vomiting and diarrhea (more common in children)"],
16
+ overview: "Influenza is a viral infection that attacks your respiratory system — your nose, throat and lungs. Influenza is commonly called the flu.",
17
+ treatment: "Rest and fluids are essential. Antiviral medications may be prescribed to shorten the duration and reduce severity, especially for high-risk individuals.",
18
+ prevention: "Annual flu vaccination, washing hands regularly, avoiding close contact with sick people, and maintaining good health habits.",
19
+ },
20
+ "hypertension": {
21
+ name: "Hypertension (High Blood Pressure)",
22
+ symptoms: ["Most people have no symptoms; a few may experience headaches", "Shortness of breath", "Nosebleeds", "Visual changes"],
23
+ overview: "Hypertension is a common condition in which the long-term force of the blood against your artery walls is high enough that it may eventually cause health problems, such as heart disease.",
24
+ treatment: "Lifestyle changes, including diet, exercise, stress management, and limiting alcohol and tobacco. Medications may be prescribed when lifestyle changes aren't enough.",
25
+ prevention: "Maintain a healthy weight, exercise regularly, eat a diet rich in fruits, vegetables, and low-fat dairy, limit sodium intake, limit alcohol consumption, avoid smoking, and manage stress.",
26
+ },
27
+ "diabetes": {
28
+ name: "Diabetes Mellitus",
29
+ symptoms: ["Increased thirst", "Frequent urination", "Extreme hunger", "Unexplained weight loss", "Fatigue", "Irritability", "Blurred vision", "Slow-healing sores", "Frequent infections"],
30
+ overview: "Diabetes is a disease that occurs when your blood glucose (blood sugar) is too high. Blood glucose is your main source of energy and comes from the food you eat. Insulin helps glucose get into your cells to be used for energy.",
31
+ treatment: "Type 1 diabetes requires insulin therapy. Type 2 diabetes can be managed with lifestyle changes, oral medications, and sometimes insulin. Regular blood sugar monitoring is essential.",
32
+ prevention: "Type 1 diabetes cannot be prevented. Type 2 diabetes can often be prevented or delayed by maintaining a healthy weight, engaging in regular physical activity, and eating a balanced diet.",
33
+ },
34
+ "asthma": {
35
+ name: "Asthma",
36
+ symptoms: ["Shortness of breath", "Chest tightness or pain", "Wheezing when exhaling", "Trouble sleeping caused by shortness of breath", "Coughing or wheezing attacks worsened by respiratory virus"],
37
+ overview: "Asthma is a condition in which your airways narrow and swell and may produce extra mucus. This can make breathing difficult and trigger coughing, a whistling sound (wheezing) when you breathe out and shortness of breath.",
38
+ treatment: "Long-term control and quick-relief medications, breathing exercises, and avoiding triggers. An asthma action plan is important for managing the condition.",
39
+ prevention: "While there's no way to prevent asthma, you can reduce asthma attacks by avoiding triggers, getting vaccinated for influenza and pneumonia, and working with your doctor to identify and treat attacks early.",
40
+ },
41
+ };
tailwind.config.js ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ module.exports = {
3
+ content: [
4
+ "./src/**/*.{html,js,ts,jsx,tsx}",
5
+ ],
6
+ theme: {
7
+ extend: {
8
+ fontFamily: {
9
+ 'outer': ['Outer', 'sans-serif'],
10
+ 'sans': ['Outer Sans', 'system-ui', 'sans-serif'],
11
+ 'heading': ['Outer Sans', 'system-ui', 'sans-serif'],
12
+ },
13
+ colors: {
14
+ primary: {
15
+ DEFAULT: '#3B82F6',
16
+ dark: '#2563EB',
17
+ light: '#60A5FA',
18
+ '50': '#EFF6FF',
19
+ '100': '#DBEAFE',
20
+ '200': '#BFDBFE',
21
+ '300': '#93C5FD',
22
+ '400': '#60A5FA',
23
+ '500': '#3B82F6',
24
+ '600': '#2563EB',
25
+ '700': '#1D4ED8',
26
+ '800': '#1E40AF',
27
+ '900': '#1E3A8A',
28
+ },
29
+ secondary: {
30
+ DEFAULT: '#6366F1',
31
+ dark: '#4F46E5',
32
+ light: '#818CF8',
33
+ '50': '#F5F3FF',
34
+ '100': '#EDE9FE',
35
+ '200': '#DDD6FE',
36
+ '300': '#C4B5FD',
37
+ '400': '#A78BFA',
38
+ '500': '#8B5CF6',
39
+ '600': '#7C3AED',
40
+ '700': '#6D28D9',
41
+ '800': '#5B21B6',
42
+ '900': '#4C1D95',
43
+ },
44
+ dark: {
45
+ DEFAULT: '#111827',
46
+ lighter: '#1F2937',
47
+ },
48
+ light: {
49
+ DEFAULT: '#F9FAFB',
50
+ darker: '#E5E7EB',
51
+ },
52
+ },
53
+ borderRadius: {
54
+ 'xl': '1rem',
55
+ '2xl': '1.5rem',
56
+ },
57
+ boxShadow: {
58
+ 'soft': '0 4px 20px rgba(0, 0, 0, 0.08)',
59
+ 'hover': '0 10px 25px rgba(0, 0, 0, 0.1)',
60
+ },
61
+ },
62
+ },
63
+ plugins: [
64
+ require('@tailwindcss/forms'),
65
+ ],
66
+ }
67
+
tsconfig.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "outDir": "dist",
7
+ "rootDir": "./src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "declaration": true
13
+ },
14
+ "include": ["src/**/*"],
15
+ "exclude": ["node_modules", "dist"]
16
+ }
yarn.lock ADDED
@@ -0,0 +1,2064 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ "@babel/runtime@^7.21.0":
6
+ version "7.27.6"
7
+ resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.6.tgz"
8
+ integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==
9
+
10
+ "@chatmcp/sdk@^1.0.5":
11
+ version "1.0.5"
12
+ resolved "https://registry.npmjs.org/@chatmcp/sdk/-/sdk-1.0.5.tgz"
13
+ integrity sha512-jAOpkol1ZdyXWOS2IW9dDNU3OLv4DLrYj+xLB09cvHPBVkW+CIJ3y8zS1QYdoBfXLwBlYmPSTFsJGx8qeGr1OQ==
14
+ dependencies:
15
+ "@modelcontextprotocol/sdk" "^1.8.0"
16
+ content-type "^1.0.5"
17
+ express "^5.1.0"
18
+ raw-body "^3.0.0"
19
+
20
+ "@cspotcode/source-map-support@^0.8.0":
21
+ version "0.8.1"
22
+ resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz"
23
+ integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
24
+ dependencies:
25
+ "@jridgewell/trace-mapping" "0.3.9"
26
+
27
+ "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
28
+ version "4.6.0"
29
+ resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz"
30
+ integrity sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==
31
+ dependencies:
32
+ eslint-visitor-keys "^3.4.3"
33
+
34
+ "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
35
+ version "4.12.1"
36
+ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz"
37
+ integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
38
+
39
+ "@eslint/eslintrc@^2.1.4":
40
+ version "2.1.4"
41
+ resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz"
42
+ integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
43
+ dependencies:
44
+ ajv "^6.12.4"
45
+ debug "^4.3.2"
46
+ espree "^9.6.0"
47
+ globals "^13.19.0"
48
+ ignore "^5.2.0"
49
+ import-fresh "^3.2.1"
50
+ js-yaml "^4.1.0"
51
+ minimatch "^3.1.2"
52
+ strip-json-comments "^3.1.1"
53
+
54
+ "@eslint/js@8.57.1":
55
+ version "8.57.1"
56
+ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz"
57
+ integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
58
+
59
+ "@humanwhocodes/config-array@^0.13.0":
60
+ version "0.13.0"
61
+ resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz"
62
+ integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==
63
+ dependencies:
64
+ "@humanwhocodes/object-schema" "^2.0.3"
65
+ debug "^4.3.1"
66
+ minimatch "^3.0.5"
67
+
68
+ "@humanwhocodes/module-importer@^1.0.1":
69
+ version "1.0.1"
70
+ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
71
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
72
+
73
+ "@humanwhocodes/object-schema@^2.0.3":
74
+ version "2.0.3"
75
+ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz"
76
+ integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
77
+
78
+ "@jridgewell/resolve-uri@^3.0.3":
79
+ version "3.1.2"
80
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
81
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
82
+
83
+ "@jridgewell/sourcemap-codec@^1.4.10":
84
+ version "1.5.0"
85
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz"
86
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
87
+
88
+ "@jridgewell/trace-mapping@0.3.9":
89
+ version "0.3.9"
90
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz"
91
+ integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
92
+ dependencies:
93
+ "@jridgewell/resolve-uri" "^3.0.3"
94
+ "@jridgewell/sourcemap-codec" "^1.4.10"
95
+
96
+ "@modelcontextprotocol/sdk@^1.8.0", "@modelcontextprotocol/sdk@^1.9.0":
97
+ version "1.9.0"
98
+ resolved "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.9.0.tgz"
99
+ integrity sha512-Jq2EUCQpe0iyO5FGpzVYDNFR6oR53AIrwph9yWl7uSc7IWUMsrmpmSaTGra5hQNunXpM+9oit85p924jWuHzUA==
100
+ dependencies:
101
+ content-type "^1.0.5"
102
+ cors "^2.8.5"
103
+ cross-spawn "^7.0.3"
104
+ eventsource "^3.0.2"
105
+ express "^5.0.1"
106
+ express-rate-limit "^7.5.0"
107
+ pkce-challenge "^5.0.0"
108
+ raw-body "^3.0.0"
109
+ zod "^3.23.8"
110
+ zod-to-json-schema "^3.24.1"
111
+
112
+ "@nodelib/fs.scandir@2.1.5":
113
+ version "2.1.5"
114
+ resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
115
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
116
+ dependencies:
117
+ "@nodelib/fs.stat" "2.0.5"
118
+ run-parallel "^1.1.9"
119
+
120
+ "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
121
+ version "2.0.5"
122
+ resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
123
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
124
+
125
+ "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
126
+ version "1.2.8"
127
+ resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
128
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
129
+ dependencies:
130
+ "@nodelib/fs.scandir" "2.1.5"
131
+ fastq "^1.6.0"
132
+
133
+ "@tailwindcss/forms@^0.5.10":
134
+ version "0.5.10"
135
+ resolved "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz"
136
+ integrity sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==
137
+ dependencies:
138
+ mini-svg-data-uri "^1.2.3"
139
+
140
+ "@tsconfig/node10@^1.0.7":
141
+ version "1.0.11"
142
+ resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz"
143
+ integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
144
+
145
+ "@tsconfig/node12@^1.0.7":
146
+ version "1.0.11"
147
+ resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz"
148
+ integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
149
+
150
+ "@tsconfig/node14@^1.0.0":
151
+ version "1.0.3"
152
+ resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz"
153
+ integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
154
+
155
+ "@tsconfig/node16@^1.0.2":
156
+ version "1.0.4"
157
+ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz"
158
+ integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
159
+
160
+ "@types/body-parser@*":
161
+ version "1.19.5"
162
+ resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz"
163
+ integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==
164
+ dependencies:
165
+ "@types/connect" "*"
166
+ "@types/node" "*"
167
+
168
+ "@types/connect@*":
169
+ version "3.4.38"
170
+ resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz"
171
+ integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==
172
+ dependencies:
173
+ "@types/node" "*"
174
+
175
+ "@types/cors@^2.8.17":
176
+ version "2.8.17"
177
+ resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz"
178
+ integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==
179
+ dependencies:
180
+ "@types/node" "*"
181
+
182
+ "@types/express-serve-static-core@^4.17.33":
183
+ version "4.19.6"
184
+ resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz"
185
+ integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==
186
+ dependencies:
187
+ "@types/node" "*"
188
+ "@types/qs" "*"
189
+ "@types/range-parser" "*"
190
+ "@types/send" "*"
191
+
192
+ "@types/express@^4.17.21":
193
+ version "4.17.21"
194
+ resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz"
195
+ integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==
196
+ dependencies:
197
+ "@types/body-parser" "*"
198
+ "@types/express-serve-static-core" "^4.17.33"
199
+ "@types/qs" "*"
200
+ "@types/serve-static" "*"
201
+
202
+ "@types/http-errors@*":
203
+ version "2.0.4"
204
+ resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz"
205
+ integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==
206
+
207
+ "@types/json-schema@^7.0.12":
208
+ version "7.0.15"
209
+ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
210
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
211
+
212
+ "@types/mime@^1":
213
+ version "1.3.5"
214
+ resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz"
215
+ integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==
216
+
217
+ "@types/node@*", "@types/node@^20.5.0":
218
+ version "20.17.30"
219
+ resolved "https://registry.npmjs.org/@types/node/-/node-20.17.30.tgz"
220
+ integrity sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==
221
+ dependencies:
222
+ undici-types "~6.19.2"
223
+
224
+ "@types/qs@*":
225
+ version "6.9.18"
226
+ resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz"
227
+ integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==
228
+
229
+ "@types/range-parser@*":
230
+ version "1.2.7"
231
+ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz"
232
+ integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==
233
+
234
+ "@types/semver@^7.5.0":
235
+ version "7.7.0"
236
+ resolved "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz"
237
+ integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==
238
+
239
+ "@types/send@*":
240
+ version "0.17.4"
241
+ resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz"
242
+ integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==
243
+ dependencies:
244
+ "@types/mime" "^1"
245
+ "@types/node" "*"
246
+
247
+ "@types/serve-static@*":
248
+ version "1.15.7"
249
+ resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz"
250
+ integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==
251
+ dependencies:
252
+ "@types/http-errors" "*"
253
+ "@types/node" "*"
254
+ "@types/send" "*"
255
+
256
+ "@typescript-eslint/eslint-plugin@^6.4.0":
257
+ version "6.21.0"
258
+ resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz"
259
+ integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==
260
+ dependencies:
261
+ "@eslint-community/regexpp" "^4.5.1"
262
+ "@typescript-eslint/scope-manager" "6.21.0"
263
+ "@typescript-eslint/type-utils" "6.21.0"
264
+ "@typescript-eslint/utils" "6.21.0"
265
+ "@typescript-eslint/visitor-keys" "6.21.0"
266
+ debug "^4.3.4"
267
+ graphemer "^1.4.0"
268
+ ignore "^5.2.4"
269
+ natural-compare "^1.4.0"
270
+ semver "^7.5.4"
271
+ ts-api-utils "^1.0.1"
272
+
273
+ "@typescript-eslint/parser@^6.4.0":
274
+ version "6.21.0"
275
+ resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz"
276
+ integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==
277
+ dependencies:
278
+ "@typescript-eslint/scope-manager" "6.21.0"
279
+ "@typescript-eslint/types" "6.21.0"
280
+ "@typescript-eslint/typescript-estree" "6.21.0"
281
+ "@typescript-eslint/visitor-keys" "6.21.0"
282
+ debug "^4.3.4"
283
+
284
+ "@typescript-eslint/scope-manager@6.21.0":
285
+ version "6.21.0"
286
+ resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz"
287
+ integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==
288
+ dependencies:
289
+ "@typescript-eslint/types" "6.21.0"
290
+ "@typescript-eslint/visitor-keys" "6.21.0"
291
+
292
+ "@typescript-eslint/type-utils@6.21.0":
293
+ version "6.21.0"
294
+ resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz"
295
+ integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==
296
+ dependencies:
297
+ "@typescript-eslint/typescript-estree" "6.21.0"
298
+ "@typescript-eslint/utils" "6.21.0"
299
+ debug "^4.3.4"
300
+ ts-api-utils "^1.0.1"
301
+
302
+ "@typescript-eslint/types@6.21.0":
303
+ version "6.21.0"
304
+ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz"
305
+ integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==
306
+
307
+ "@typescript-eslint/typescript-estree@6.21.0":
308
+ version "6.21.0"
309
+ resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz"
310
+ integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==
311
+ dependencies:
312
+ "@typescript-eslint/types" "6.21.0"
313
+ "@typescript-eslint/visitor-keys" "6.21.0"
314
+ debug "^4.3.4"
315
+ globby "^11.1.0"
316
+ is-glob "^4.0.3"
317
+ minimatch "9.0.3"
318
+ semver "^7.5.4"
319
+ ts-api-utils "^1.0.1"
320
+
321
+ "@typescript-eslint/utils@6.21.0":
322
+ version "6.21.0"
323
+ resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz"
324
+ integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==
325
+ dependencies:
326
+ "@eslint-community/eslint-utils" "^4.4.0"
327
+ "@types/json-schema" "^7.0.12"
328
+ "@types/semver" "^7.5.0"
329
+ "@typescript-eslint/scope-manager" "6.21.0"
330
+ "@typescript-eslint/types" "6.21.0"
331
+ "@typescript-eslint/typescript-estree" "6.21.0"
332
+ semver "^7.5.4"
333
+
334
+ "@typescript-eslint/visitor-keys@6.21.0":
335
+ version "6.21.0"
336
+ resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz"
337
+ integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==
338
+ dependencies:
339
+ "@typescript-eslint/types" "6.21.0"
340
+ eslint-visitor-keys "^3.4.1"
341
+
342
+ "@ungap/structured-clone@^1.2.0":
343
+ version "1.3.0"
344
+ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz"
345
+ integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==
346
+
347
+ accepts@^2.0.0:
348
+ version "2.0.0"
349
+ resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz"
350
+ integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==
351
+ dependencies:
352
+ mime-types "^3.0.0"
353
+ negotiator "^1.0.0"
354
+
355
+ accepts@~1.3.8:
356
+ version "1.3.8"
357
+ resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz"
358
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
359
+ dependencies:
360
+ mime-types "~2.1.34"
361
+ negotiator "0.6.3"
362
+
363
+ acorn-jsx@^5.3.2:
364
+ version "5.3.2"
365
+ resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
366
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
367
+
368
+ acorn-walk@^8.1.1:
369
+ version "8.3.4"
370
+ resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz"
371
+ integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==
372
+ dependencies:
373
+ acorn "^8.11.0"
374
+
375
+ acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0:
376
+ version "8.14.1"
377
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz"
378
+ integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==
379
+
380
+ ajv@^6.12.4:
381
+ version "6.12.6"
382
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
383
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
384
+ dependencies:
385
+ fast-deep-equal "^3.1.1"
386
+ fast-json-stable-stringify "^2.0.0"
387
+ json-schema-traverse "^0.4.1"
388
+ uri-js "^4.2.2"
389
+
390
+ ansi-regex@^5.0.1:
391
+ version "5.0.1"
392
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
393
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
394
+
395
+ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
396
+ version "4.3.0"
397
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
398
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
399
+ dependencies:
400
+ color-convert "^2.0.1"
401
+
402
+ arg@^4.1.0:
403
+ version "4.1.3"
404
+ resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz"
405
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
406
+
407
+ argparse@^2.0.1:
408
+ version "2.0.1"
409
+ resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
410
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
411
+
412
+ array-flatten@1.1.1:
413
+ version "1.1.1"
414
+ resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"
415
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
416
+
417
+ array-union@^2.1.0:
418
+ version "2.1.0"
419
+ resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
420
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
421
+
422
+ balanced-match@^1.0.0:
423
+ version "1.0.2"
424
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
425
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
426
+
427
+ body-parser@^2.2.0:
428
+ version "2.2.0"
429
+ resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz"
430
+ integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==
431
+ dependencies:
432
+ bytes "^3.1.2"
433
+ content-type "^1.0.5"
434
+ debug "^4.4.0"
435
+ http-errors "^2.0.0"
436
+ iconv-lite "^0.6.3"
437
+ on-finished "^2.4.1"
438
+ qs "^6.14.0"
439
+ raw-body "^3.0.0"
440
+ type-is "^2.0.0"
441
+
442
+ body-parser@1.20.3:
443
+ version "1.20.3"
444
+ resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz"
445
+ integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
446
+ dependencies:
447
+ bytes "3.1.2"
448
+ content-type "~1.0.5"
449
+ debug "2.6.9"
450
+ depd "2.0.0"
451
+ destroy "1.2.0"
452
+ http-errors "2.0.0"
453
+ iconv-lite "0.4.24"
454
+ on-finished "2.4.1"
455
+ qs "6.13.0"
456
+ raw-body "2.5.2"
457
+ type-is "~1.6.18"
458
+ unpipe "1.0.0"
459
+
460
+ brace-expansion@^1.1.7:
461
+ version "1.1.11"
462
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
463
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
464
+ dependencies:
465
+ balanced-match "^1.0.0"
466
+ concat-map "0.0.1"
467
+
468
+ brace-expansion@^2.0.1:
469
+ version "2.0.1"
470
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"
471
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
472
+ dependencies:
473
+ balanced-match "^1.0.0"
474
+
475
+ braces@^3.0.3:
476
+ version "3.0.3"
477
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"
478
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
479
+ dependencies:
480
+ fill-range "^7.1.1"
481
+
482
+ bytes@^3.1.2, bytes@3.1.2:
483
+ version "3.1.2"
484
+ resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"
485
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
486
+
487
+ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
488
+ version "1.0.2"
489
+ resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"
490
+ integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
491
+ dependencies:
492
+ es-errors "^1.3.0"
493
+ function-bind "^1.1.2"
494
+
495
+ call-bound@^1.0.2:
496
+ version "1.0.4"
497
+ resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz"
498
+ integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
499
+ dependencies:
500
+ call-bind-apply-helpers "^1.0.2"
501
+ get-intrinsic "^1.3.0"
502
+
503
+ callsites@^3.0.0:
504
+ version "3.1.0"
505
+ resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
506
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
507
+
508
+ chalk@^4.0.0, chalk@^4.1.2:
509
+ version "4.1.2"
510
+ resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
511
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
512
+ dependencies:
513
+ ansi-styles "^4.1.0"
514
+ supports-color "^7.1.0"
515
+
516
+ cliui@^8.0.1:
517
+ version "8.0.1"
518
+ resolved "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz"
519
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
520
+ dependencies:
521
+ string-width "^4.2.0"
522
+ strip-ansi "^6.0.1"
523
+ wrap-ansi "^7.0.0"
524
+
525
+ color-convert@^2.0.1:
526
+ version "2.0.1"
527
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
528
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
529
+ dependencies:
530
+ color-name "~1.1.4"
531
+
532
+ color-name@~1.1.4:
533
+ version "1.1.4"
534
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
535
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
536
+
537
+ concat-map@0.0.1:
538
+ version "0.0.1"
539
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
540
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
541
+
542
+ concurrently@^8.2.2:
543
+ version "8.2.2"
544
+ resolved "https://registry.npmmirror.com/concurrently/-/concurrently-8.2.2.tgz"
545
+ integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==
546
+ dependencies:
547
+ chalk "^4.1.2"
548
+ date-fns "^2.30.0"
549
+ lodash "^4.17.21"
550
+ rxjs "^7.8.1"
551
+ shell-quote "^1.8.1"
552
+ spawn-command "0.0.2"
553
+ supports-color "^8.1.1"
554
+ tree-kill "^1.2.2"
555
+ yargs "^17.7.2"
556
+
557
+ content-disposition@^1.0.0:
558
+ version "1.0.0"
559
+ resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz"
560
+ integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==
561
+ dependencies:
562
+ safe-buffer "5.2.1"
563
+
564
+ content-disposition@0.5.4:
565
+ version "0.5.4"
566
+ resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz"
567
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
568
+ dependencies:
569
+ safe-buffer "5.2.1"
570
+
571
+ content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5:
572
+ version "1.0.5"
573
+ resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"
574
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
575
+
576
+ cookie-signature@^1.2.1:
577
+ version "1.2.2"
578
+ resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz"
579
+ integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==
580
+
581
+ cookie-signature@1.0.6:
582
+ version "1.0.6"
583
+ resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
584
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
585
+
586
+ cookie@^0.7.1, cookie@0.7.1:
587
+ version "0.7.1"
588
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz"
589
+ integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
590
+
591
+ cors@^2.8.5:
592
+ version "2.8.5"
593
+ resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz"
594
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
595
+ dependencies:
596
+ object-assign "^4"
597
+ vary "^1"
598
+
599
+ create-require@^1.1.0:
600
+ version "1.1.1"
601
+ resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz"
602
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
603
+
604
+ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
605
+ version "7.0.6"
606
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz"
607
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
608
+ dependencies:
609
+ path-key "^3.1.0"
610
+ shebang-command "^2.0.0"
611
+ which "^2.0.1"
612
+
613
+ data-uri-to-buffer@^4.0.0:
614
+ version "4.0.1"
615
+ resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz"
616
+ integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==
617
+
618
+ date-fns@^2.30.0:
619
+ version "2.30.0"
620
+ resolved "https://registry.npmmirror.com/date-fns/-/date-fns-2.30.0.tgz"
621
+ integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
622
+ dependencies:
623
+ "@babel/runtime" "^7.21.0"
624
+
625
+ debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0:
626
+ version "4.4.0"
627
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz"
628
+ integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
629
+ dependencies:
630
+ ms "^2.1.3"
631
+
632
+ debug@2.6.9:
633
+ version "2.6.9"
634
+ resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
635
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
636
+ dependencies:
637
+ ms "2.0.0"
638
+
639
+ deep-is@^0.1.3:
640
+ version "0.1.4"
641
+ resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
642
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
643
+
644
+ depd@^2.0.0, depd@2.0.0:
645
+ version "2.0.0"
646
+ resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
647
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
648
+
649
+ destroy@1.2.0:
650
+ version "1.2.0"
651
+ resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"
652
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
653
+
654
+ diff@^4.0.1:
655
+ version "4.0.2"
656
+ resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"
657
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
658
+
659
+ dir-glob@^3.0.1:
660
+ version "3.0.1"
661
+ resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
662
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
663
+ dependencies:
664
+ path-type "^4.0.0"
665
+
666
+ doctrine@^3.0.0:
667
+ version "3.0.0"
668
+ resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
669
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
670
+ dependencies:
671
+ esutils "^2.0.2"
672
+
673
+ dunder-proto@^1.0.1:
674
+ version "1.0.1"
675
+ resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz"
676
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
677
+ dependencies:
678
+ call-bind-apply-helpers "^1.0.1"
679
+ es-errors "^1.3.0"
680
+ gopd "^1.2.0"
681
+
682
+ ee-first@1.1.1:
683
+ version "1.1.1"
684
+ resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
685
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
686
+
687
+ emoji-regex@^8.0.0:
688
+ version "8.0.0"
689
+ resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz"
690
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
691
+
692
+ encodeurl@^2.0.0, encodeurl@~2.0.0:
693
+ version "2.0.0"
694
+ resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz"
695
+ integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
696
+
697
+ encodeurl@~1.0.2:
698
+ version "1.0.2"
699
+ resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
700
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
701
+
702
+ es-define-property@^1.0.1:
703
+ version "1.0.1"
704
+ resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz"
705
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
706
+
707
+ es-errors@^1.3.0:
708
+ version "1.3.0"
709
+ resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz"
710
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
711
+
712
+ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
713
+ version "1.1.1"
714
+ resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz"
715
+ integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
716
+ dependencies:
717
+ es-errors "^1.3.0"
718
+
719
+ escalade@^3.1.1:
720
+ version "3.2.0"
721
+ resolved "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz"
722
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
723
+
724
+ escape-html@^1.0.3, escape-html@~1.0.3:
725
+ version "1.0.3"
726
+ resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
727
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
728
+
729
+ escape-string-regexp@^4.0.0:
730
+ version "4.0.0"
731
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
732
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
733
+
734
+ eslint-scope@^7.2.2:
735
+ version "7.2.2"
736
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz"
737
+ integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
738
+ dependencies:
739
+ esrecurse "^4.3.0"
740
+ estraverse "^5.2.0"
741
+
742
+ eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
743
+ version "3.4.3"
744
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
745
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
746
+
747
+ eslint@^8.47.0:
748
+ version "8.57.1"
749
+ resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
750
+ integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
751
+ dependencies:
752
+ "@eslint-community/eslint-utils" "^4.2.0"
753
+ "@eslint-community/regexpp" "^4.6.1"
754
+ "@eslint/eslintrc" "^2.1.4"
755
+ "@eslint/js" "8.57.1"
756
+ "@humanwhocodes/config-array" "^0.13.0"
757
+ "@humanwhocodes/module-importer" "^1.0.1"
758
+ "@nodelib/fs.walk" "^1.2.8"
759
+ "@ungap/structured-clone" "^1.2.0"
760
+ ajv "^6.12.4"
761
+ chalk "^4.0.0"
762
+ cross-spawn "^7.0.2"
763
+ debug "^4.3.2"
764
+ doctrine "^3.0.0"
765
+ escape-string-regexp "^4.0.0"
766
+ eslint-scope "^7.2.2"
767
+ eslint-visitor-keys "^3.4.3"
768
+ espree "^9.6.1"
769
+ esquery "^1.4.2"
770
+ esutils "^2.0.2"
771
+ fast-deep-equal "^3.1.3"
772
+ file-entry-cache "^6.0.1"
773
+ find-up "^5.0.0"
774
+ glob-parent "^6.0.2"
775
+ globals "^13.19.0"
776
+ graphemer "^1.4.0"
777
+ ignore "^5.2.0"
778
+ imurmurhash "^0.1.4"
779
+ is-glob "^4.0.0"
780
+ is-path-inside "^3.0.3"
781
+ js-yaml "^4.1.0"
782
+ json-stable-stringify-without-jsonify "^1.0.1"
783
+ levn "^0.4.1"
784
+ lodash.merge "^4.6.2"
785
+ minimatch "^3.1.2"
786
+ natural-compare "^1.4.0"
787
+ optionator "^0.9.3"
788
+ strip-ansi "^6.0.1"
789
+ text-table "^0.2.0"
790
+
791
+ espree@^9.6.0, espree@^9.6.1:
792
+ version "9.6.1"
793
+ resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz"
794
+ integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
795
+ dependencies:
796
+ acorn "^8.9.0"
797
+ acorn-jsx "^5.3.2"
798
+ eslint-visitor-keys "^3.4.1"
799
+
800
+ esquery@^1.4.2:
801
+ version "1.6.0"
802
+ resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"
803
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
804
+ dependencies:
805
+ estraverse "^5.1.0"
806
+
807
+ esrecurse@^4.3.0:
808
+ version "4.3.0"
809
+ resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
810
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
811
+ dependencies:
812
+ estraverse "^5.2.0"
813
+
814
+ estraverse@^5.1.0, estraverse@^5.2.0:
815
+ version "5.3.0"
816
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
817
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
818
+
819
+ esutils@^2.0.2:
820
+ version "2.0.3"
821
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
822
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
823
+
824
+ etag@^1.8.1, etag@~1.8.1:
825
+ version "1.8.1"
826
+ resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"
827
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
828
+
829
+ eventsource-parser@^3.0.1:
830
+ version "3.0.1"
831
+ resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz"
832
+ integrity sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==
833
+
834
+ eventsource@^3.0.2:
835
+ version "3.0.6"
836
+ resolved "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz"
837
+ integrity sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==
838
+ dependencies:
839
+ eventsource-parser "^3.0.1"
840
+
841
+ express-rate-limit@^7.5.0:
842
+ version "7.5.0"
843
+ resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz"
844
+ integrity sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==
845
+
846
+ express@^4.18.2:
847
+ version "4.21.2"
848
+ resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz"
849
+ integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==
850
+ dependencies:
851
+ accepts "~1.3.8"
852
+ array-flatten "1.1.1"
853
+ body-parser "1.20.3"
854
+ content-disposition "0.5.4"
855
+ content-type "~1.0.4"
856
+ cookie "0.7.1"
857
+ cookie-signature "1.0.6"
858
+ debug "2.6.9"
859
+ depd "2.0.0"
860
+ encodeurl "~2.0.0"
861
+ escape-html "~1.0.3"
862
+ etag "~1.8.1"
863
+ finalhandler "1.3.1"
864
+ fresh "0.5.2"
865
+ http-errors "2.0.0"
866
+ merge-descriptors "1.0.3"
867
+ methods "~1.1.2"
868
+ on-finished "2.4.1"
869
+ parseurl "~1.3.3"
870
+ path-to-regexp "0.1.12"
871
+ proxy-addr "~2.0.7"
872
+ qs "6.13.0"
873
+ range-parser "~1.2.1"
874
+ safe-buffer "5.2.1"
875
+ send "0.19.0"
876
+ serve-static "1.16.2"
877
+ setprototypeof "1.2.0"
878
+ statuses "2.0.1"
879
+ type-is "~1.6.18"
880
+ utils-merge "1.0.1"
881
+ vary "~1.1.2"
882
+
883
+ express@^5.0.1:
884
+ version "5.1.0"
885
+ resolved "https://registry.npmjs.org/express/-/express-5.1.0.tgz"
886
+ integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==
887
+ dependencies:
888
+ accepts "^2.0.0"
889
+ body-parser "^2.2.0"
890
+ content-disposition "^1.0.0"
891
+ content-type "^1.0.5"
892
+ cookie "^0.7.1"
893
+ cookie-signature "^1.2.1"
894
+ debug "^4.4.0"
895
+ encodeurl "^2.0.0"
896
+ escape-html "^1.0.3"
897
+ etag "^1.8.1"
898
+ finalhandler "^2.1.0"
899
+ fresh "^2.0.0"
900
+ http-errors "^2.0.0"
901
+ merge-descriptors "^2.0.0"
902
+ mime-types "^3.0.0"
903
+ on-finished "^2.4.1"
904
+ once "^1.4.0"
905
+ parseurl "^1.3.3"
906
+ proxy-addr "^2.0.7"
907
+ qs "^6.14.0"
908
+ range-parser "^1.2.1"
909
+ router "^2.2.0"
910
+ send "^1.1.0"
911
+ serve-static "^2.2.0"
912
+ statuses "^2.0.1"
913
+ type-is "^2.0.1"
914
+ vary "^1.1.2"
915
+
916
+ express@^5.1.0:
917
+ version "5.1.0"
918
+ resolved "https://registry.npmjs.org/express/-/express-5.1.0.tgz"
919
+ integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==
920
+ dependencies:
921
+ accepts "^2.0.0"
922
+ body-parser "^2.2.0"
923
+ content-disposition "^1.0.0"
924
+ content-type "^1.0.5"
925
+ cookie "^0.7.1"
926
+ cookie-signature "^1.2.1"
927
+ debug "^4.4.0"
928
+ encodeurl "^2.0.0"
929
+ escape-html "^1.0.3"
930
+ etag "^1.8.1"
931
+ finalhandler "^2.1.0"
932
+ fresh "^2.0.0"
933
+ http-errors "^2.0.0"
934
+ merge-descriptors "^2.0.0"
935
+ mime-types "^3.0.0"
936
+ on-finished "^2.4.1"
937
+ once "^1.4.0"
938
+ parseurl "^1.3.3"
939
+ proxy-addr "^2.0.7"
940
+ qs "^6.14.0"
941
+ range-parser "^1.2.1"
942
+ router "^2.2.0"
943
+ send "^1.1.0"
944
+ serve-static "^2.2.0"
945
+ statuses "^2.0.1"
946
+ type-is "^2.0.1"
947
+ vary "^1.1.2"
948
+
949
+ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
950
+ version "3.1.3"
951
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
952
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
953
+
954
+ fast-glob@^3.2.9:
955
+ version "3.3.3"
956
+ resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz"
957
+ integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
958
+ dependencies:
959
+ "@nodelib/fs.stat" "^2.0.2"
960
+ "@nodelib/fs.walk" "^1.2.3"
961
+ glob-parent "^5.1.2"
962
+ merge2 "^1.3.0"
963
+ micromatch "^4.0.8"
964
+
965
+ fast-json-stable-stringify@^2.0.0:
966
+ version "2.1.0"
967
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
968
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
969
+
970
+ fast-levenshtein@^2.0.6:
971
+ version "2.0.6"
972
+ resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
973
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
974
+
975
+ fastq@^1.6.0:
976
+ version "1.19.1"
977
+ resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz"
978
+ integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==
979
+ dependencies:
980
+ reusify "^1.0.4"
981
+
982
+ fetch-blob@^3.1.2, fetch-blob@^3.1.4:
983
+ version "3.2.0"
984
+ resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz"
985
+ integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==
986
+ dependencies:
987
+ node-domexception "^1.0.0"
988
+ web-streams-polyfill "^3.0.3"
989
+
990
+ file-entry-cache@^6.0.1:
991
+ version "6.0.1"
992
+ resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
993
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
994
+ dependencies:
995
+ flat-cache "^3.0.4"
996
+
997
+ fill-range@^7.1.1:
998
+ version "7.1.1"
999
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz"
1000
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
1001
+ dependencies:
1002
+ to-regex-range "^5.0.1"
1003
+
1004
+ finalhandler@^2.1.0:
1005
+ version "2.1.0"
1006
+ resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz"
1007
+ integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==
1008
+ dependencies:
1009
+ debug "^4.4.0"
1010
+ encodeurl "^2.0.0"
1011
+ escape-html "^1.0.3"
1012
+ on-finished "^2.4.1"
1013
+ parseurl "^1.3.3"
1014
+ statuses "^2.0.1"
1015
+
1016
+ finalhandler@1.3.1:
1017
+ version "1.3.1"
1018
+ resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz"
1019
+ integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
1020
+ dependencies:
1021
+ debug "2.6.9"
1022
+ encodeurl "~2.0.0"
1023
+ escape-html "~1.0.3"
1024
+ on-finished "2.4.1"
1025
+ parseurl "~1.3.3"
1026
+ statuses "2.0.1"
1027
+ unpipe "~1.0.0"
1028
+
1029
+ find-up@^5.0.0:
1030
+ version "5.0.0"
1031
+ resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
1032
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
1033
+ dependencies:
1034
+ locate-path "^6.0.0"
1035
+ path-exists "^4.0.0"
1036
+
1037
+ flat-cache@^3.0.4:
1038
+ version "3.2.0"
1039
+ resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz"
1040
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
1041
+ dependencies:
1042
+ flatted "^3.2.9"
1043
+ keyv "^4.5.3"
1044
+ rimraf "^3.0.2"
1045
+
1046
+ flatted@^3.2.9:
1047
+ version "3.3.3"
1048
+ resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz"
1049
+ integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
1050
+
1051
+ formdata-polyfill@^4.0.10:
1052
+ version "4.0.10"
1053
+ resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz"
1054
+ integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==
1055
+ dependencies:
1056
+ fetch-blob "^3.1.2"
1057
+
1058
+ forwarded@0.2.0:
1059
+ version "0.2.0"
1060
+ resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz"
1061
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
1062
+
1063
+ fresh@^2.0.0:
1064
+ version "2.0.0"
1065
+ resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz"
1066
+ integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==
1067
+
1068
+ fresh@0.5.2:
1069
+ version "0.5.2"
1070
+ resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
1071
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
1072
+
1073
+ fs.realpath@^1.0.0:
1074
+ version "1.0.0"
1075
+ resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
1076
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
1077
+
1078
+ function-bind@^1.1.2:
1079
+ version "1.1.2"
1080
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
1081
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
1082
+
1083
+ get-caller-file@^2.0.5:
1084
+ version "2.0.5"
1085
+ resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz"
1086
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
1087
+
1088
+ get-intrinsic@^1.2.5, get-intrinsic@^1.3.0:
1089
+ version "1.3.0"
1090
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz"
1091
+ integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
1092
+ dependencies:
1093
+ call-bind-apply-helpers "^1.0.2"
1094
+ es-define-property "^1.0.1"
1095
+ es-errors "^1.3.0"
1096
+ es-object-atoms "^1.1.1"
1097
+ function-bind "^1.1.2"
1098
+ get-proto "^1.0.1"
1099
+ gopd "^1.2.0"
1100
+ has-symbols "^1.1.0"
1101
+ hasown "^2.0.2"
1102
+ math-intrinsics "^1.1.0"
1103
+
1104
+ get-proto@^1.0.1:
1105
+ version "1.0.1"
1106
+ resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz"
1107
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
1108
+ dependencies:
1109
+ dunder-proto "^1.0.1"
1110
+ es-object-atoms "^1.0.0"
1111
+
1112
+ glob-parent@^5.1.2:
1113
+ version "5.1.2"
1114
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
1115
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
1116
+ dependencies:
1117
+ is-glob "^4.0.1"
1118
+
1119
+ glob-parent@^6.0.2:
1120
+ version "6.0.2"
1121
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
1122
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
1123
+ dependencies:
1124
+ is-glob "^4.0.3"
1125
+
1126
+ glob@^7.1.3:
1127
+ version "7.2.3"
1128
+ resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
1129
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
1130
+ dependencies:
1131
+ fs.realpath "^1.0.0"
1132
+ inflight "^1.0.4"
1133
+ inherits "2"
1134
+ minimatch "^3.1.1"
1135
+ once "^1.3.0"
1136
+ path-is-absolute "^1.0.0"
1137
+
1138
+ globals@^13.19.0:
1139
+ version "13.24.0"
1140
+ resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz"
1141
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
1142
+ dependencies:
1143
+ type-fest "^0.20.2"
1144
+
1145
+ globby@^11.1.0:
1146
+ version "11.1.0"
1147
+ resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
1148
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
1149
+ dependencies:
1150
+ array-union "^2.1.0"
1151
+ dir-glob "^3.0.1"
1152
+ fast-glob "^3.2.9"
1153
+ ignore "^5.2.0"
1154
+ merge2 "^1.4.1"
1155
+ slash "^3.0.0"
1156
+
1157
+ gopd@^1.2.0:
1158
+ version "1.2.0"
1159
+ resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"
1160
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
1161
+
1162
+ graphemer@^1.4.0:
1163
+ version "1.4.0"
1164
+ resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz"
1165
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
1166
+
1167
+ has-flag@^4.0.0:
1168
+ version "4.0.0"
1169
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
1170
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
1171
+
1172
+ has-symbols@^1.1.0:
1173
+ version "1.1.0"
1174
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz"
1175
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
1176
+
1177
+ hasown@^2.0.2:
1178
+ version "2.0.2"
1179
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
1180
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
1181
+ dependencies:
1182
+ function-bind "^1.1.2"
1183
+
1184
+ http-errors@^2.0.0, http-errors@2.0.0:
1185
+ version "2.0.0"
1186
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"
1187
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
1188
+ dependencies:
1189
+ depd "2.0.0"
1190
+ inherits "2.0.4"
1191
+ setprototypeof "1.2.0"
1192
+ statuses "2.0.1"
1193
+ toidentifier "1.0.1"
1194
+
1195
+ iconv-lite@^0.6.3, iconv-lite@0.6.3:
1196
+ version "0.6.3"
1197
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
1198
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
1199
+ dependencies:
1200
+ safer-buffer ">= 2.1.2 < 3.0.0"
1201
+
1202
+ iconv-lite@0.4.24:
1203
+ version "0.4.24"
1204
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
1205
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
1206
+ dependencies:
1207
+ safer-buffer ">= 2.1.2 < 3"
1208
+
1209
+ ignore@^5.2.0, ignore@^5.2.4:
1210
+ version "5.3.2"
1211
+ resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
1212
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
1213
+
1214
+ import-fresh@^3.2.1:
1215
+ version "3.3.1"
1216
+ resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz"
1217
+ integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==
1218
+ dependencies:
1219
+ parent-module "^1.0.0"
1220
+ resolve-from "^4.0.0"
1221
+
1222
+ imurmurhash@^0.1.4:
1223
+ version "0.1.4"
1224
+ resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
1225
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
1226
+
1227
+ inflight@^1.0.4:
1228
+ version "1.0.6"
1229
+ resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
1230
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
1231
+ dependencies:
1232
+ once "^1.3.0"
1233
+ wrappy "1"
1234
+
1235
+ inherits@2, inherits@2.0.4:
1236
+ version "2.0.4"
1237
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
1238
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
1239
+
1240
+ ipaddr.js@1.9.1:
1241
+ version "1.9.1"
1242
+ resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
1243
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
1244
+
1245
+ is-extglob@^2.1.1:
1246
+ version "2.1.1"
1247
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
1248
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
1249
+
1250
+ is-fullwidth-code-point@^3.0.0:
1251
+ version "3.0.0"
1252
+ resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
1253
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
1254
+
1255
+ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
1256
+ version "4.0.3"
1257
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
1258
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
1259
+ dependencies:
1260
+ is-extglob "^2.1.1"
1261
+
1262
+ is-number@^7.0.0:
1263
+ version "7.0.0"
1264
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
1265
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
1266
+
1267
+ is-path-inside@^3.0.3:
1268
+ version "3.0.3"
1269
+ resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
1270
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
1271
+
1272
+ is-promise@^4.0.0:
1273
+ version "4.0.0"
1274
+ resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz"
1275
+ integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==
1276
+
1277
+ isexe@^2.0.0:
1278
+ version "2.0.0"
1279
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
1280
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
1281
+
1282
+ js-yaml@^4.1.0:
1283
+ version "4.1.0"
1284
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
1285
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
1286
+ dependencies:
1287
+ argparse "^2.0.1"
1288
+
1289
+ json-buffer@3.0.1:
1290
+ version "3.0.1"
1291
+ resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
1292
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
1293
+
1294
+ json-schema-traverse@^0.4.1:
1295
+ version "0.4.1"
1296
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
1297
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
1298
+
1299
+ json-stable-stringify-without-jsonify@^1.0.1:
1300
+ version "1.0.1"
1301
+ resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
1302
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
1303
+
1304
+ keyv@^4.5.3:
1305
+ version "4.5.4"
1306
+ resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
1307
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
1308
+ dependencies:
1309
+ json-buffer "3.0.1"
1310
+
1311
+ levn@^0.4.1:
1312
+ version "0.4.1"
1313
+ resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
1314
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
1315
+ dependencies:
1316
+ prelude-ls "^1.2.1"
1317
+ type-check "~0.4.0"
1318
+
1319
+ locate-path@^6.0.0:
1320
+ version "6.0.0"
1321
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
1322
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
1323
+ dependencies:
1324
+ p-locate "^5.0.0"
1325
+
1326
+ lodash.merge@^4.6.2:
1327
+ version "4.6.2"
1328
+ resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
1329
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
1330
+
1331
+ lodash@^4.17.21:
1332
+ version "4.17.21"
1333
+ resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz"
1334
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
1335
+
1336
+ make-error@^1.1.1:
1337
+ version "1.3.6"
1338
+ resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz"
1339
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
1340
+
1341
+ math-intrinsics@^1.1.0:
1342
+ version "1.1.0"
1343
+ resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
1344
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
1345
+
1346
+ media-typer@^1.1.0:
1347
+ version "1.1.0"
1348
+ resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz"
1349
+ integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==
1350
+
1351
+ media-typer@0.3.0:
1352
+ version "0.3.0"
1353
+ resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
1354
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
1355
+
1356
+ merge-descriptors@^2.0.0:
1357
+ version "2.0.0"
1358
+ resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz"
1359
+ integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==
1360
+
1361
+ merge-descriptors@1.0.3:
1362
+ version "1.0.3"
1363
+ resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz"
1364
+ integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
1365
+
1366
+ merge2@^1.3.0, merge2@^1.4.1:
1367
+ version "1.4.1"
1368
+ resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
1369
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
1370
+
1371
+ methods@~1.1.2:
1372
+ version "1.1.2"
1373
+ resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
1374
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
1375
+
1376
+ micromatch@^4.0.8:
1377
+ version "4.0.8"
1378
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz"
1379
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
1380
+ dependencies:
1381
+ braces "^3.0.3"
1382
+ picomatch "^2.3.1"
1383
+
1384
+ mime-db@^1.54.0:
1385
+ version "1.54.0"
1386
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz"
1387
+ integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
1388
+
1389
+ mime-db@1.52.0:
1390
+ version "1.52.0"
1391
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
1392
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
1393
+
1394
+ mime-types@^3.0.0, mime-types@^3.0.1:
1395
+ version "3.0.1"
1396
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz"
1397
+ integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==
1398
+ dependencies:
1399
+ mime-db "^1.54.0"
1400
+
1401
+ mime-types@~2.1.24, mime-types@~2.1.34:
1402
+ version "2.1.35"
1403
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
1404
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
1405
+ dependencies:
1406
+ mime-db "1.52.0"
1407
+
1408
+ mime@1.6.0:
1409
+ version "1.6.0"
1410
+ resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
1411
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
1412
+
1413
+ mini-svg-data-uri@^1.2.3:
1414
+ version "1.4.4"
1415
+ resolved "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz"
1416
+ integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==
1417
+
1418
+ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
1419
+ version "3.1.2"
1420
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
1421
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
1422
+ dependencies:
1423
+ brace-expansion "^1.1.7"
1424
+
1425
+ minimatch@9.0.3:
1426
+ version "9.0.3"
1427
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz"
1428
+ integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
1429
+ dependencies:
1430
+ brace-expansion "^2.0.1"
1431
+
1432
+ ms@^2.1.3, ms@2.1.3:
1433
+ version "2.1.3"
1434
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
1435
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
1436
+
1437
+ ms@2.0.0:
1438
+ version "2.0.0"
1439
+ resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
1440
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
1441
+
1442
+ natural-compare@^1.4.0:
1443
+ version "1.4.0"
1444
+ resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
1445
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
1446
+
1447
+ negotiator@^1.0.0:
1448
+ version "1.0.0"
1449
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz"
1450
+ integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==
1451
+
1452
+ negotiator@0.6.3:
1453
+ version "0.6.3"
1454
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
1455
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
1456
+
1457
+ node-domexception@^1.0.0:
1458
+ version "1.0.0"
1459
+ resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz"
1460
+ integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
1461
+
1462
+ node-fetch@^3.3.2:
1463
+ version "3.3.2"
1464
+ resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz"
1465
+ integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==
1466
+ dependencies:
1467
+ data-uri-to-buffer "^4.0.0"
1468
+ fetch-blob "^3.1.4"
1469
+ formdata-polyfill "^4.0.10"
1470
+
1471
+ object-assign@^4:
1472
+ version "4.1.1"
1473
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
1474
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
1475
+
1476
+ object-inspect@^1.13.3:
1477
+ version "1.13.4"
1478
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz"
1479
+ integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
1480
+
1481
+ on-finished@^2.4.1, on-finished@2.4.1:
1482
+ version "2.4.1"
1483
+ resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz"
1484
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
1485
+ dependencies:
1486
+ ee-first "1.1.1"
1487
+
1488
+ once@^1.3.0, once@^1.4.0:
1489
+ version "1.4.0"
1490
+ resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
1491
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
1492
+ dependencies:
1493
+ wrappy "1"
1494
+
1495
+ optionator@^0.9.3:
1496
+ version "0.9.4"
1497
+ resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
1498
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
1499
+ dependencies:
1500
+ deep-is "^0.1.3"
1501
+ fast-levenshtein "^2.0.6"
1502
+ levn "^0.4.1"
1503
+ prelude-ls "^1.2.1"
1504
+ type-check "^0.4.0"
1505
+ word-wrap "^1.2.5"
1506
+
1507
+ p-limit@^3.0.2:
1508
+ version "3.1.0"
1509
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
1510
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
1511
+ dependencies:
1512
+ yocto-queue "^0.1.0"
1513
+
1514
+ p-locate@^5.0.0:
1515
+ version "5.0.0"
1516
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
1517
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
1518
+ dependencies:
1519
+ p-limit "^3.0.2"
1520
+
1521
+ parent-module@^1.0.0:
1522
+ version "1.0.1"
1523
+ resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
1524
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
1525
+ dependencies:
1526
+ callsites "^3.0.0"
1527
+
1528
+ parseurl@^1.3.3, parseurl@~1.3.3:
1529
+ version "1.3.3"
1530
+ resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz"
1531
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
1532
+
1533
+ path-exists@^4.0.0:
1534
+ version "4.0.0"
1535
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
1536
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
1537
+
1538
+ path-is-absolute@^1.0.0:
1539
+ version "1.0.1"
1540
+ resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
1541
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
1542
+
1543
+ path-key@^3.1.0:
1544
+ version "3.1.1"
1545
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
1546
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
1547
+
1548
+ path-to-regexp@^8.0.0:
1549
+ version "8.2.0"
1550
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz"
1551
+ integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==
1552
+
1553
+ path-to-regexp@0.1.12:
1554
+ version "0.1.12"
1555
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz"
1556
+ integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==
1557
+
1558
+ path-type@^4.0.0:
1559
+ version "4.0.0"
1560
+ resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
1561
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
1562
+
1563
+ picomatch@^2.3.1:
1564
+ version "2.3.1"
1565
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
1566
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
1567
+
1568
+ pkce-challenge@^5.0.0:
1569
+ version "5.0.0"
1570
+ resolved "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz"
1571
+ integrity sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==
1572
+
1573
+ prelude-ls@^1.2.1:
1574
+ version "1.2.1"
1575
+ resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
1576
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
1577
+
1578
+ proxy-addr@^2.0.7, proxy-addr@~2.0.7:
1579
+ version "2.0.7"
1580
+ resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz"
1581
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
1582
+ dependencies:
1583
+ forwarded "0.2.0"
1584
+ ipaddr.js "1.9.1"
1585
+
1586
+ punycode@^2.1.0:
1587
+ version "2.3.1"
1588
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
1589
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
1590
+
1591
+ qs@^6.14.0:
1592
+ version "6.14.0"
1593
+ resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz"
1594
+ integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==
1595
+ dependencies:
1596
+ side-channel "^1.1.0"
1597
+
1598
+ qs@6.13.0:
1599
+ version "6.13.0"
1600
+ resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz"
1601
+ integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
1602
+ dependencies:
1603
+ side-channel "^1.0.6"
1604
+
1605
+ queue-microtask@^1.2.2:
1606
+ version "1.2.3"
1607
+ resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
1608
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
1609
+
1610
+ range-parser@^1.2.1, range-parser@~1.2.1:
1611
+ version "1.2.1"
1612
+ resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
1613
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
1614
+
1615
+ raw-body@^3.0.0:
1616
+ version "3.0.0"
1617
+ resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz"
1618
+ integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==
1619
+ dependencies:
1620
+ bytes "3.1.2"
1621
+ http-errors "2.0.0"
1622
+ iconv-lite "0.6.3"
1623
+ unpipe "1.0.0"
1624
+
1625
+ raw-body@2.5.2:
1626
+ version "2.5.2"
1627
+ resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz"
1628
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
1629
+ dependencies:
1630
+ bytes "3.1.2"
1631
+ http-errors "2.0.0"
1632
+ iconv-lite "0.4.24"
1633
+ unpipe "1.0.0"
1634
+
1635
+ require-directory@^2.1.1:
1636
+ version "2.1.1"
1637
+ resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz"
1638
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
1639
+
1640
+ resolve-from@^4.0.0:
1641
+ version "4.0.0"
1642
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
1643
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
1644
+
1645
+ reusify@^1.0.4:
1646
+ version "1.1.0"
1647
+ resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz"
1648
+ integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
1649
+
1650
+ rimraf@^3.0.2:
1651
+ version "3.0.2"
1652
+ resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
1653
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
1654
+ dependencies:
1655
+ glob "^7.1.3"
1656
+
1657
+ router@^2.2.0:
1658
+ version "2.2.0"
1659
+ resolved "https://registry.npmjs.org/router/-/router-2.2.0.tgz"
1660
+ integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==
1661
+ dependencies:
1662
+ debug "^4.4.0"
1663
+ depd "^2.0.0"
1664
+ is-promise "^4.0.0"
1665
+ parseurl "^1.3.3"
1666
+ path-to-regexp "^8.0.0"
1667
+
1668
+ run-parallel@^1.1.9:
1669
+ version "1.2.0"
1670
+ resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
1671
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
1672
+ dependencies:
1673
+ queue-microtask "^1.2.2"
1674
+
1675
+ rxjs@^7.8.1:
1676
+ version "7.8.2"
1677
+ resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz"
1678
+ integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==
1679
+ dependencies:
1680
+ tslib "^2.1.0"
1681
+
1682
+ safe-buffer@5.2.1:
1683
+ version "5.2.1"
1684
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
1685
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1686
+
1687
+ "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0":
1688
+ version "2.1.2"
1689
+ resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
1690
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1691
+
1692
+ semver@^7.5.4:
1693
+ version "7.7.1"
1694
+ resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz"
1695
+ integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
1696
+
1697
+ send@^1.1.0, send@^1.2.0:
1698
+ version "1.2.0"
1699
+ resolved "https://registry.npmjs.org/send/-/send-1.2.0.tgz"
1700
+ integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==
1701
+ dependencies:
1702
+ debug "^4.3.5"
1703
+ encodeurl "^2.0.0"
1704
+ escape-html "^1.0.3"
1705
+ etag "^1.8.1"
1706
+ fresh "^2.0.0"
1707
+ http-errors "^2.0.0"
1708
+ mime-types "^3.0.1"
1709
+ ms "^2.1.3"
1710
+ on-finished "^2.4.1"
1711
+ range-parser "^1.2.1"
1712
+ statuses "^2.0.1"
1713
+
1714
+ send@0.19.0:
1715
+ version "0.19.0"
1716
+ resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz"
1717
+ integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
1718
+ dependencies:
1719
+ debug "2.6.9"
1720
+ depd "2.0.0"
1721
+ destroy "1.2.0"
1722
+ encodeurl "~1.0.2"
1723
+ escape-html "~1.0.3"
1724
+ etag "~1.8.1"
1725
+ fresh "0.5.2"
1726
+ http-errors "2.0.0"
1727
+ mime "1.6.0"
1728
+ ms "2.1.3"
1729
+ on-finished "2.4.1"
1730
+ range-parser "~1.2.1"
1731
+ statuses "2.0.1"
1732
+
1733
+ serve-static@^2.2.0:
1734
+ version "2.2.0"
1735
+ resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz"
1736
+ integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==
1737
+ dependencies:
1738
+ encodeurl "^2.0.0"
1739
+ escape-html "^1.0.3"
1740
+ parseurl "^1.3.3"
1741
+ send "^1.2.0"
1742
+
1743
+ serve-static@1.16.2:
1744
+ version "1.16.2"
1745
+ resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz"
1746
+ integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
1747
+ dependencies:
1748
+ encodeurl "~2.0.0"
1749
+ escape-html "~1.0.3"
1750
+ parseurl "~1.3.3"
1751
+ send "0.19.0"
1752
+
1753
+ setprototypeof@1.2.0:
1754
+ version "1.2.0"
1755
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"
1756
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
1757
+
1758
+ shebang-command@^2.0.0:
1759
+ version "2.0.0"
1760
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
1761
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
1762
+ dependencies:
1763
+ shebang-regex "^3.0.0"
1764
+
1765
+ shebang-regex@^3.0.0:
1766
+ version "3.0.0"
1767
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
1768
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
1769
+
1770
+ shell-quote@^1.8.1:
1771
+ version "1.8.3"
1772
+ resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.3.tgz"
1773
+ integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==
1774
+
1775
+ side-channel-list@^1.0.0:
1776
+ version "1.0.0"
1777
+ resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz"
1778
+ integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
1779
+ dependencies:
1780
+ es-errors "^1.3.0"
1781
+ object-inspect "^1.13.3"
1782
+
1783
+ side-channel-map@^1.0.1:
1784
+ version "1.0.1"
1785
+ resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz"
1786
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
1787
+ dependencies:
1788
+ call-bound "^1.0.2"
1789
+ es-errors "^1.3.0"
1790
+ get-intrinsic "^1.2.5"
1791
+ object-inspect "^1.13.3"
1792
+
1793
+ side-channel-weakmap@^1.0.2:
1794
+ version "1.0.2"
1795
+ resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz"
1796
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
1797
+ dependencies:
1798
+ call-bound "^1.0.2"
1799
+ es-errors "^1.3.0"
1800
+ get-intrinsic "^1.2.5"
1801
+ object-inspect "^1.13.3"
1802
+ side-channel-map "^1.0.1"
1803
+
1804
+ side-channel@^1.0.6, side-channel@^1.1.0:
1805
+ version "1.1.0"
1806
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz"
1807
+ integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
1808
+ dependencies:
1809
+ es-errors "^1.3.0"
1810
+ object-inspect "^1.13.3"
1811
+ side-channel-list "^1.0.0"
1812
+ side-channel-map "^1.0.1"
1813
+ side-channel-weakmap "^1.0.2"
1814
+
1815
+ slash@^3.0.0:
1816
+ version "3.0.0"
1817
+ resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
1818
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
1819
+
1820
+ spawn-command@0.0.2:
1821
+ version "0.0.2"
1822
+ resolved "https://registry.npmmirror.com/spawn-command/-/spawn-command-0.0.2.tgz"
1823
+ integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==
1824
+
1825
+ statuses@^2.0.1, statuses@2.0.1:
1826
+ version "2.0.1"
1827
+ resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
1828
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
1829
+
1830
+ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
1831
+ version "4.2.3"
1832
+ resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz"
1833
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
1834
+ dependencies:
1835
+ emoji-regex "^8.0.0"
1836
+ is-fullwidth-code-point "^3.0.0"
1837
+ strip-ansi "^6.0.1"
1838
+
1839
+ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
1840
+ version "6.0.1"
1841
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
1842
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
1843
+ dependencies:
1844
+ ansi-regex "^5.0.1"
1845
+
1846
+ strip-json-comments@^3.1.1:
1847
+ version "3.1.1"
1848
+ resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
1849
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
1850
+
1851
+ supports-color@^7.1.0:
1852
+ version "7.2.0"
1853
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
1854
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
1855
+ dependencies:
1856
+ has-flag "^4.0.0"
1857
+
1858
+ supports-color@^8.1.1:
1859
+ version "8.1.1"
1860
+ resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz"
1861
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
1862
+ dependencies:
1863
+ has-flag "^4.0.0"
1864
+
1865
+ tailwindcss@^4.1.4:
1866
+ version "4.1.4"
1867
+ resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz"
1868
+ integrity sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==
1869
+
1870
+ text-table@^0.2.0:
1871
+ version "0.2.0"
1872
+ resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
1873
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
1874
+
1875
+ to-regex-range@^5.0.1:
1876
+ version "5.0.1"
1877
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
1878
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1879
+ dependencies:
1880
+ is-number "^7.0.0"
1881
+
1882
+ toidentifier@1.0.1:
1883
+ version "1.0.1"
1884
+ resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz"
1885
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
1886
+
1887
+ tree-kill@^1.2.2:
1888
+ version "1.2.2"
1889
+ resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz"
1890
+ integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
1891
+
1892
+ ts-api-utils@^1.0.1:
1893
+ version "1.4.3"
1894
+ resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz"
1895
+ integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==
1896
+
1897
+ ts-node@^10.9.1:
1898
+ version "10.9.2"
1899
+ resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz"
1900
+ integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==
1901
+ dependencies:
1902
+ "@cspotcode/source-map-support" "^0.8.0"
1903
+ "@tsconfig/node10" "^1.0.7"
1904
+ "@tsconfig/node12" "^1.0.7"
1905
+ "@tsconfig/node14" "^1.0.0"
1906
+ "@tsconfig/node16" "^1.0.2"
1907
+ acorn "^8.4.1"
1908
+ acorn-walk "^8.1.1"
1909
+ arg "^4.1.0"
1910
+ create-require "^1.1.0"
1911
+ diff "^4.0.1"
1912
+ make-error "^1.1.1"
1913
+ v8-compile-cache-lib "^3.0.1"
1914
+ yn "3.1.1"
1915
+
1916
+ tslib@^2.1.0:
1917
+ version "2.8.1"
1918
+ resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
1919
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
1920
+
1921
+ type-check@^0.4.0, type-check@~0.4.0:
1922
+ version "0.4.0"
1923
+ resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
1924
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
1925
+ dependencies:
1926
+ prelude-ls "^1.2.1"
1927
+
1928
+ type-fest@^0.20.2:
1929
+ version "0.20.2"
1930
+ resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
1931
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
1932
+
1933
+ type-is@^2.0.0, type-is@^2.0.1:
1934
+ version "2.0.1"
1935
+ resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz"
1936
+ integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==
1937
+ dependencies:
1938
+ content-type "^1.0.5"
1939
+ media-typer "^1.1.0"
1940
+ mime-types "^3.0.0"
1941
+
1942
+ type-is@~1.6.18:
1943
+ version "1.6.18"
1944
+ resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
1945
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
1946
+ dependencies:
1947
+ media-typer "0.3.0"
1948
+ mime-types "~2.1.24"
1949
+
1950
+ typescript@^5.1.6:
1951
+ version "5.8.3"
1952
+ resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz"
1953
+ integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
1954
+
1955
+ undici-types@~6.19.2:
1956
+ version "6.19.8"
1957
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz"
1958
+ integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
1959
+
1960
+ undici-types@~6.21.0:
1961
+ version "6.21.0"
1962
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz"
1963
+ integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
1964
+
1965
+ unpipe@~1.0.0, unpipe@1.0.0:
1966
+ version "1.0.0"
1967
+ resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
1968
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
1969
+
1970
+ uri-js@^4.2.2:
1971
+ version "4.4.1"
1972
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
1973
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
1974
+ dependencies:
1975
+ punycode "^2.1.0"
1976
+
1977
+ utils-merge@1.0.1:
1978
+ version "1.0.1"
1979
+ resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
1980
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
1981
+
1982
+ v8-compile-cache-lib@^3.0.1:
1983
+ version "3.0.1"
1984
+ resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz"
1985
+ integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
1986
+
1987
+ vary@^1, vary@^1.1.2, vary@~1.1.2:
1988
+ version "1.1.2"
1989
+ resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
1990
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
1991
+
1992
+ web-streams-polyfill@^3.0.3:
1993
+ version "3.3.3"
1994
+ resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz"
1995
+ integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==
1996
+
1997
+ which@^2.0.1:
1998
+ version "2.0.2"
1999
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
2000
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
2001
+ dependencies:
2002
+ isexe "^2.0.0"
2003
+
2004
+ word-wrap@^1.2.5:
2005
+ version "1.2.5"
2006
+ resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
2007
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
2008
+
2009
+ wrap-ansi@^7.0.0:
2010
+ version "7.0.0"
2011
+ resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
2012
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
2013
+ dependencies:
2014
+ ansi-styles "^4.0.0"
2015
+ string-width "^4.1.0"
2016
+ strip-ansi "^6.0.0"
2017
+
2018
+ wrappy@1:
2019
+ version "1.0.2"
2020
+ resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
2021
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
2022
+
2023
+ y18n@^5.0.5:
2024
+ version "5.0.8"
2025
+ resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz"
2026
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
2027
+
2028
+ yargs-parser@^21.1.1:
2029
+ version "21.1.1"
2030
+ resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz"
2031
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
2032
+
2033
+ yargs@^17.7.2:
2034
+ version "17.7.2"
2035
+ resolved "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz"
2036
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
2037
+ dependencies:
2038
+ cliui "^8.0.1"
2039
+ escalade "^3.1.1"
2040
+ get-caller-file "^2.0.5"
2041
+ require-directory "^2.1.1"
2042
+ string-width "^4.2.3"
2043
+ y18n "^5.0.5"
2044
+ yargs-parser "^21.1.1"
2045
+
2046
+ yn@3.1.1:
2047
+ version "3.1.1"
2048
+ resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz"
2049
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
2050
+
2051
+ yocto-queue@^0.1.0:
2052
+ version "0.1.0"
2053
+ resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
2054
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
2055
+
2056
+ zod-to-json-schema@^3.24.1:
2057
+ version "3.24.5"
2058
+ resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz"
2059
+ integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==
2060
+
2061
+ zod@^3.22.0, zod@^3.23.8:
2062
+ version "3.24.2"
2063
+ resolved "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz"
2064
+ integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==