realsanjay commited on
Commit
bd094f3
·
verified ·
1 Parent(s): 1bc1c24

Upload 7 files

Browse files
Files changed (7) hide show
  1. .env +1 -0
  2. README.md +60 -12
  3. app.py +280 -0
  4. package-lock.json +1450 -0
  5. package.json +22 -0
  6. requirements.txt +6 -0
  7. server.js +107 -0
.env ADDED
@@ -0,0 +1 @@
 
 
1
+ MISTRAL_API_KEY=DBbX81xMhN1Jcvos30eaP7If8buaZE5i
README.md CHANGED
@@ -1,12 +1,60 @@
1
- ---
2
- title: AI Document Chat Assistant
3
- emoji: 🐠
4
- colorFrom: red
5
- colorTo: yellow
6
- sdk: streamlit
7
- sdk_version: 1.42.2
8
- app_file: app.py
9
- pinned: false
10
- ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Mistral AI Chat Application
2
+
3
+ A Streamlit-based chat application powered by Mistral AI's language models.
4
+
5
+ ## Features
6
+
7
+ - Clean and intuitive chat interface
8
+ - Real-time responses from Mistral AI
9
+ - Message history persistence
10
+ - Easy-to-use sidebar controls
11
+ - Responsive design
12
+
13
+ ## Setup
14
+
15
+ 1. Clone this repository
16
+ 2. Install the required dependencies:
17
+ ```bash
18
+ pip install -r requirements.txt
19
+ ```
20
+ 3. Create a `.env` file and add your Mistral AI API key:
21
+ ```
22
+ MISTRAL_API_KEY=your_api_key_here
23
+ ```
24
+ Get your API key from [Mistral AI Platform](https://console.mistral.ai/)
25
+
26
+ ## Running the Application
27
+
28
+ Run the application using Streamlit:
29
+ ```bash
30
+ streamlit run app.py
31
+ ```
32
+
33
+ The application will open in your default web browser at `http://localhost:8501`.
34
+
35
+ ## Usage
36
+
37
+ 1. Enter your message in the chat input at the bottom of the screen
38
+ 2. Press Enter to send your message
39
+ 3. Wait for the AI's response
40
+ 4. Use the "Clear Chat" button in the sidebar to start a new conversation
41
+
42
+ ## Models Available
43
+
44
+ The application uses the following Mistral AI models:
45
+ - mistral-tiny (default)
46
+ - mistral-small
47
+ - mistral-medium
48
+
49
+ To change the model, modify the `model` parameter in the `client.chat()` function call in `app.py`.
50
+
51
+ ## Requirements
52
+
53
+ - Python 3.7+
54
+ - Streamlit
55
+ - Mistral AI Python SDK
56
+ - python-dotenv
57
+
58
+ ## Note
59
+
60
+ Make sure to keep your API key secure and never commit it to version control.
app.py ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import os
3
+ from dotenv import load_dotenv
4
+ from mistralai.client import MistralClient
5
+ from mistralai.models.chat_completion import ChatMessage
6
+ import PyPDF2
7
+ import tempfile
8
+ import time
9
+ from tenacity import retry, stop_after_attempt, wait_exponential
10
+
11
+ # Load environment variables
12
+ load_dotenv()
13
+
14
+ # Initialize Mistral client with increased timeout
15
+ client = MistralClient(
16
+ api_key=os.environ["MISTRAL_API_KEY"],
17
+ timeout=90 # Increase default timeout to 90 seconds
18
+ )
19
+
20
+ # Set page configuration
21
+ st.set_page_config(
22
+ page_title="Mistral AI Document Chat",
23
+ page_icon="📚",
24
+ layout="wide"
25
+ )
26
+
27
+ # Add custom CSS
28
+ st.markdown("""
29
+ <style>
30
+ .stTextInput > div > div > input {
31
+ background-color: #f0f2f6;
32
+ }
33
+ .stTextArea > div > div > textarea {
34
+ background-color: #f0f2f6;
35
+ }
36
+ .stProgress > div > div {
37
+ background-color: #00ff00;
38
+ }
39
+ </style>
40
+ """, unsafe_allow_html=True)
41
+
42
+ # Initialize session states
43
+ if "messages" not in st.session_state:
44
+ st.session_state.messages = []
45
+ if "document_content" not in st.session_state:
46
+ st.session_state.document_content = None
47
+ if "notes" not in st.session_state:
48
+ st.session_state.notes = None
49
+
50
+ def extract_text_from_pdf(uploaded_file, progress_bar=None):
51
+ pdf_reader = PyPDF2.PdfReader(uploaded_file)
52
+ total_pages = len(pdf_reader.pages)
53
+ text = ""
54
+
55
+ for i, page in enumerate(pdf_reader.pages):
56
+ text += page.extract_text() + "\n"
57
+ if progress_bar:
58
+ progress = (i + 1) / total_pages
59
+ progress_bar.progress(progress, f"Extracting page {i + 1}/{total_pages}")
60
+
61
+ return text
62
+
63
+ def chunk_text(text, max_chunk_size=4000): # Reduced chunk size for better reliability
64
+ """Split text into smaller chunks with overlap."""
65
+ words = text.split()
66
+ chunks = []
67
+ current_chunk = []
68
+ current_size = 0
69
+ overlap_size = 200 # Number of words to overlap between chunks
70
+
71
+ for word in words:
72
+ word_size = len(word) + 1
73
+ if current_size + word_size > max_chunk_size and current_chunk:
74
+ chunk_text = ' '.join(current_chunk)
75
+ chunks.append(chunk_text)
76
+ # Keep last few words for overlap
77
+ current_chunk = current_chunk[-overlap_size:] if len(current_chunk) > overlap_size else current_chunk
78
+ current_size = sum(len(word) + 1 for word in current_chunk)
79
+ current_chunk.append(word)
80
+ current_size += word_size
81
+
82
+ if current_chunk:
83
+ chunks.append(' '.join(current_chunk))
84
+
85
+ return chunks
86
+
87
+ @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
88
+ def call_mistral_with_retry(messages):
89
+ """Call Mistral API with retry logic"""
90
+ try:
91
+ return client.chat(
92
+ model="mistral-medium",
93
+ messages=messages
94
+ )
95
+ except Exception as e:
96
+ st.warning(f"API call failed, retrying... ({str(e)})")
97
+ raise
98
+
99
+ def generate_notes(text):
100
+ try:
101
+ # Split text into chunks if it's too long
102
+ chunks = chunk_text(text)
103
+ all_notes = []
104
+
105
+ # Create progress tracking
106
+ progress_bar = st.progress(0)
107
+ status_text = st.empty()
108
+
109
+ total_chunks = len(chunks)
110
+ for i, chunk in enumerate(chunks):
111
+ status_text.text(f"Processing part {i + 1} of {total_chunks}")
112
+
113
+ try:
114
+ chunk_prompt = f"Part {i+1}/{total_chunks}: Create concise but comprehensive notes from this text section:\n\n{chunk}"
115
+
116
+ response = call_mistral_with_retry([
117
+ ChatMessage(
118
+ role="system",
119
+ content="You are an expert at creating clear, concise notes. Focus on key points and main ideas. Use bullet points and clear formatting."
120
+ ),
121
+ ChatMessage(
122
+ role="user",
123
+ content=chunk_prompt
124
+ )
125
+ ])
126
+
127
+ all_notes.append(response.choices[0].message.content)
128
+ progress_bar.progress((i + 1) / total_chunks)
129
+
130
+ except Exception as e:
131
+ st.error(f"Error processing chunk {i + 1}: {str(e)}")
132
+ if i > 0: # If we have some notes, continue with what we have
133
+ st.warning("Continuing with partial notes...")
134
+ break
135
+ else:
136
+ raise e
137
+
138
+ # Combine notes with progress tracking
139
+ if len(all_notes) > 1:
140
+ status_text.text("Combining all notes...")
141
+ try:
142
+ # Split combined notes if too large
143
+ combined_notes = "\n\n".join(all_notes)
144
+ summary_chunks = chunk_text(combined_notes, max_chunk_size=6000)
145
+ final_notes = []
146
+
147
+ for i, summary_chunk in enumerate(summary_chunks):
148
+ status_text.text(f"Summarizing part {i + 1} of {len(summary_chunks)}")
149
+
150
+ response = call_mistral_with_retry([
151
+ ChatMessage(
152
+ role="system",
153
+ content="You are an expert at summarizing and organizing notes. Create a clear, well-structured summary that maintains key information while eliminating redundancy."
154
+ ),
155
+ ChatMessage(
156
+ role="user",
157
+ content=f"Summarize this section of notes:\n\n{summary_chunk}"
158
+ )
159
+ ])
160
+ final_notes.append(response.choices[0].message.content)
161
+
162
+ result = "\n\n".join(final_notes)
163
+ except Exception as e:
164
+ st.warning("Error during final summarization. Using concatenated notes instead.")
165
+ result = combined_notes
166
+ else:
167
+ result = all_notes[0] if all_notes else None
168
+
169
+ # Clean up progress indicators
170
+ progress_bar.empty()
171
+ status_text.empty()
172
+
173
+ return result
174
+
175
+ except Exception as e:
176
+ st.error(f"Error generating notes: {str(e)}")
177
+ return None
178
+
179
+ # Title
180
+ st.title("📚 Mistral AI Document Chat Assistant")
181
+ st.markdown("---")
182
+
183
+ # File upload section
184
+ uploaded_file = st.file_uploader("Upload a PDF file", type=["pdf"])
185
+
186
+ if uploaded_file is not None:
187
+ try:
188
+ # Extract text from PDF
189
+ text = extract_text_from_pdf(uploaded_file)
190
+
191
+ # Store the extracted text
192
+ st.session_state.document_content = text
193
+
194
+ # Generate and store notes
195
+ if st.button("Generate Notes"):
196
+ with st.spinner("Generating notes... This may take a moment for large documents."):
197
+ notes = generate_notes(text)
198
+ if notes:
199
+ st.session_state.notes = notes
200
+ st.success("Notes generated successfully!")
201
+
202
+ except Exception as e:
203
+ st.error(f"Error processing file: {str(e)}")
204
+
205
+ # Display notes if available
206
+ if st.session_state.notes:
207
+ st.markdown("### Generated Notes")
208
+ st.markdown(st.session_state.notes)
209
+ st.markdown("---")
210
+
211
+ # Chat interface
212
+ st.markdown("### Chat with your Document")
213
+
214
+ # Display chat messages
215
+ for message in st.session_state.messages:
216
+ with st.chat_message(message["role"]):
217
+ st.markdown(message["content"])
218
+
219
+ # Chat input
220
+ if prompt := st.chat_input("Ask questions about your document..."):
221
+ if st.session_state.document_content is None:
222
+ st.warning("Please upload a document first!")
223
+ else:
224
+ st.session_state.messages.append({"role": "user", "content": prompt})
225
+ with st.chat_message("user"):
226
+ st.markdown(prompt)
227
+
228
+ with st.chat_message("assistant"):
229
+ message_placeholder = st.empty()
230
+
231
+ try:
232
+ doc_excerpt = st.session_state.document_content[:4000] # Reduced context size
233
+ context = f"""Document excerpt: {doc_excerpt}...
234
+
235
+ Generated notes: {st.session_state.notes if st.session_state.notes else 'No notes generated yet'}
236
+
237
+ Please answer the following question about the document: {prompt}"""
238
+
239
+ response = call_mistral_with_retry([
240
+ ChatMessage(
241
+ role="system",
242
+ content="You are an expert at analyzing documents and answering questions about their content. Provide detailed, accurate answers based on the document content and notes provided."
243
+ ),
244
+ ChatMessage(role="user", content=context)
245
+ ])
246
+
247
+ assistant_response = response.choices[0].message.content
248
+ message_placeholder.markdown(assistant_response)
249
+ st.session_state.messages.append(
250
+ {"role": "assistant", "content": assistant_response}
251
+ )
252
+
253
+ except Exception as e:
254
+ message_placeholder.error(f"Error: {str(e)}")
255
+
256
+ # Sidebar
257
+ with st.sidebar:
258
+ st.title("About")
259
+ st.markdown("""
260
+ This is a document analysis and chat interface powered by Mistral AI.
261
+
262
+ ### Features:
263
+ - Upload PDF files
264
+ - Generate comprehensive notes
265
+ - Chat about document content
266
+ - Real-time AI responses
267
+
268
+ ### How to use:
269
+ 1. Upload your PDF document
270
+ 2. Generate notes (optional)
271
+ 3. Ask questions about the content
272
+ 4. Get AI-powered responses
273
+ """)
274
+
275
+ # Clear chat and document button
276
+ if st.button("Clear All"):
277
+ st.session_state.messages = []
278
+ st.session_state.document_content = None
279
+ st.session_state.notes = None
280
+ st.rerun()
package-lock.json ADDED
@@ -0,0 +1,1450 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ai-notes-maker",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "ai-notes-maker",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "@google/generative-ai": "^0.1.3",
12
+ "cors": "^2.8.5",
13
+ "dotenv": "^16.3.1",
14
+ "express": "^4.18.2",
15
+ "multer": "^1.4.5-lts.1",
16
+ "pdf-parse": "^1.1.1"
17
+ },
18
+ "devDependencies": {
19
+ "nodemon": "^3.0.2"
20
+ }
21
+ },
22
+ "node_modules/@google/generative-ai": {
23
+ "version": "0.1.3",
24
+ "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.1.3.tgz",
25
+ "integrity": "sha512-Cm4uJX1sKarpm1mje/MiOIinM7zdUUrQp/5/qGPAgznbdd/B9zup5ehT6c1qGqycFcSopTA1J1HpqHS5kJR8hQ==",
26
+ "license": "Apache-2.0",
27
+ "engines": {
28
+ "node": ">=18.0.0"
29
+ }
30
+ },
31
+ "node_modules/accepts": {
32
+ "version": "1.3.8",
33
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
34
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
35
+ "license": "MIT",
36
+ "dependencies": {
37
+ "mime-types": "~2.1.34",
38
+ "negotiator": "0.6.3"
39
+ },
40
+ "engines": {
41
+ "node": ">= 0.6"
42
+ }
43
+ },
44
+ "node_modules/anymatch": {
45
+ "version": "3.1.3",
46
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
47
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
48
+ "dev": true,
49
+ "license": "ISC",
50
+ "dependencies": {
51
+ "normalize-path": "^3.0.0",
52
+ "picomatch": "^2.0.4"
53
+ },
54
+ "engines": {
55
+ "node": ">= 8"
56
+ }
57
+ },
58
+ "node_modules/append-field": {
59
+ "version": "1.0.0",
60
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
61
+ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==",
62
+ "license": "MIT"
63
+ },
64
+ "node_modules/array-flatten": {
65
+ "version": "1.1.1",
66
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
67
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
68
+ "license": "MIT"
69
+ },
70
+ "node_modules/balanced-match": {
71
+ "version": "1.0.2",
72
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
73
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
74
+ "dev": true,
75
+ "license": "MIT"
76
+ },
77
+ "node_modules/binary-extensions": {
78
+ "version": "2.3.0",
79
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
80
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
81
+ "dev": true,
82
+ "license": "MIT",
83
+ "engines": {
84
+ "node": ">=8"
85
+ },
86
+ "funding": {
87
+ "url": "https://github.com/sponsors/sindresorhus"
88
+ }
89
+ },
90
+ "node_modules/body-parser": {
91
+ "version": "1.20.3",
92
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
93
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
94
+ "license": "MIT",
95
+ "dependencies": {
96
+ "bytes": "3.1.2",
97
+ "content-type": "~1.0.5",
98
+ "debug": "2.6.9",
99
+ "depd": "2.0.0",
100
+ "destroy": "1.2.0",
101
+ "http-errors": "2.0.0",
102
+ "iconv-lite": "0.4.24",
103
+ "on-finished": "2.4.1",
104
+ "qs": "6.13.0",
105
+ "raw-body": "2.5.2",
106
+ "type-is": "~1.6.18",
107
+ "unpipe": "1.0.0"
108
+ },
109
+ "engines": {
110
+ "node": ">= 0.8",
111
+ "npm": "1.2.8000 || >= 1.4.16"
112
+ }
113
+ },
114
+ "node_modules/brace-expansion": {
115
+ "version": "1.1.11",
116
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
117
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
118
+ "dev": true,
119
+ "license": "MIT",
120
+ "dependencies": {
121
+ "balanced-match": "^1.0.0",
122
+ "concat-map": "0.0.1"
123
+ }
124
+ },
125
+ "node_modules/braces": {
126
+ "version": "3.0.3",
127
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
128
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
129
+ "dev": true,
130
+ "license": "MIT",
131
+ "dependencies": {
132
+ "fill-range": "^7.1.1"
133
+ },
134
+ "engines": {
135
+ "node": ">=8"
136
+ }
137
+ },
138
+ "node_modules/buffer-from": {
139
+ "version": "1.1.2",
140
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
141
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
142
+ "license": "MIT"
143
+ },
144
+ "node_modules/busboy": {
145
+ "version": "1.6.0",
146
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
147
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
148
+ "dependencies": {
149
+ "streamsearch": "^1.1.0"
150
+ },
151
+ "engines": {
152
+ "node": ">=10.16.0"
153
+ }
154
+ },
155
+ "node_modules/bytes": {
156
+ "version": "3.1.2",
157
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
158
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
159
+ "license": "MIT",
160
+ "engines": {
161
+ "node": ">= 0.8"
162
+ }
163
+ },
164
+ "node_modules/call-bind-apply-helpers": {
165
+ "version": "1.0.2",
166
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
167
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
168
+ "license": "MIT",
169
+ "dependencies": {
170
+ "es-errors": "^1.3.0",
171
+ "function-bind": "^1.1.2"
172
+ },
173
+ "engines": {
174
+ "node": ">= 0.4"
175
+ }
176
+ },
177
+ "node_modules/call-bound": {
178
+ "version": "1.0.3",
179
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
180
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
181
+ "license": "MIT",
182
+ "dependencies": {
183
+ "call-bind-apply-helpers": "^1.0.1",
184
+ "get-intrinsic": "^1.2.6"
185
+ },
186
+ "engines": {
187
+ "node": ">= 0.4"
188
+ },
189
+ "funding": {
190
+ "url": "https://github.com/sponsors/ljharb"
191
+ }
192
+ },
193
+ "node_modules/chokidar": {
194
+ "version": "3.6.0",
195
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
196
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
197
+ "dev": true,
198
+ "license": "MIT",
199
+ "dependencies": {
200
+ "anymatch": "~3.1.2",
201
+ "braces": "~3.0.2",
202
+ "glob-parent": "~5.1.2",
203
+ "is-binary-path": "~2.1.0",
204
+ "is-glob": "~4.0.1",
205
+ "normalize-path": "~3.0.0",
206
+ "readdirp": "~3.6.0"
207
+ },
208
+ "engines": {
209
+ "node": ">= 8.10.0"
210
+ },
211
+ "funding": {
212
+ "url": "https://paulmillr.com/funding/"
213
+ },
214
+ "optionalDependencies": {
215
+ "fsevents": "~2.3.2"
216
+ }
217
+ },
218
+ "node_modules/concat-map": {
219
+ "version": "0.0.1",
220
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
221
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
222
+ "dev": true,
223
+ "license": "MIT"
224
+ },
225
+ "node_modules/concat-stream": {
226
+ "version": "1.6.2",
227
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
228
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
229
+ "engines": [
230
+ "node >= 0.8"
231
+ ],
232
+ "license": "MIT",
233
+ "dependencies": {
234
+ "buffer-from": "^1.0.0",
235
+ "inherits": "^2.0.3",
236
+ "readable-stream": "^2.2.2",
237
+ "typedarray": "^0.0.6"
238
+ }
239
+ },
240
+ "node_modules/content-disposition": {
241
+ "version": "0.5.4",
242
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
243
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
244
+ "license": "MIT",
245
+ "dependencies": {
246
+ "safe-buffer": "5.2.1"
247
+ },
248
+ "engines": {
249
+ "node": ">= 0.6"
250
+ }
251
+ },
252
+ "node_modules/content-type": {
253
+ "version": "1.0.5",
254
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
255
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
256
+ "license": "MIT",
257
+ "engines": {
258
+ "node": ">= 0.6"
259
+ }
260
+ },
261
+ "node_modules/cookie": {
262
+ "version": "0.7.1",
263
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
264
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
265
+ "license": "MIT",
266
+ "engines": {
267
+ "node": ">= 0.6"
268
+ }
269
+ },
270
+ "node_modules/cookie-signature": {
271
+ "version": "1.0.6",
272
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
273
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
274
+ "license": "MIT"
275
+ },
276
+ "node_modules/core-util-is": {
277
+ "version": "1.0.3",
278
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
279
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
280
+ "license": "MIT"
281
+ },
282
+ "node_modules/cors": {
283
+ "version": "2.8.5",
284
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
285
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
286
+ "license": "MIT",
287
+ "dependencies": {
288
+ "object-assign": "^4",
289
+ "vary": "^1"
290
+ },
291
+ "engines": {
292
+ "node": ">= 0.10"
293
+ }
294
+ },
295
+ "node_modules/debug": {
296
+ "version": "2.6.9",
297
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
298
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
299
+ "license": "MIT",
300
+ "dependencies": {
301
+ "ms": "2.0.0"
302
+ }
303
+ },
304
+ "node_modules/depd": {
305
+ "version": "2.0.0",
306
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
307
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
308
+ "license": "MIT",
309
+ "engines": {
310
+ "node": ">= 0.8"
311
+ }
312
+ },
313
+ "node_modules/destroy": {
314
+ "version": "1.2.0",
315
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
316
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
317
+ "license": "MIT",
318
+ "engines": {
319
+ "node": ">= 0.8",
320
+ "npm": "1.2.8000 || >= 1.4.16"
321
+ }
322
+ },
323
+ "node_modules/dotenv": {
324
+ "version": "16.4.7",
325
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
326
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
327
+ "license": "BSD-2-Clause",
328
+ "engines": {
329
+ "node": ">=12"
330
+ },
331
+ "funding": {
332
+ "url": "https://dotenvx.com"
333
+ }
334
+ },
335
+ "node_modules/dunder-proto": {
336
+ "version": "1.0.1",
337
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
338
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
339
+ "license": "MIT",
340
+ "dependencies": {
341
+ "call-bind-apply-helpers": "^1.0.1",
342
+ "es-errors": "^1.3.0",
343
+ "gopd": "^1.2.0"
344
+ },
345
+ "engines": {
346
+ "node": ">= 0.4"
347
+ }
348
+ },
349
+ "node_modules/ee-first": {
350
+ "version": "1.1.1",
351
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
352
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
353
+ "license": "MIT"
354
+ },
355
+ "node_modules/encodeurl": {
356
+ "version": "2.0.0",
357
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
358
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
359
+ "license": "MIT",
360
+ "engines": {
361
+ "node": ">= 0.8"
362
+ }
363
+ },
364
+ "node_modules/es-define-property": {
365
+ "version": "1.0.1",
366
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
367
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
368
+ "license": "MIT",
369
+ "engines": {
370
+ "node": ">= 0.4"
371
+ }
372
+ },
373
+ "node_modules/es-errors": {
374
+ "version": "1.3.0",
375
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
376
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
377
+ "license": "MIT",
378
+ "engines": {
379
+ "node": ">= 0.4"
380
+ }
381
+ },
382
+ "node_modules/es-object-atoms": {
383
+ "version": "1.1.1",
384
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
385
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
386
+ "license": "MIT",
387
+ "dependencies": {
388
+ "es-errors": "^1.3.0"
389
+ },
390
+ "engines": {
391
+ "node": ">= 0.4"
392
+ }
393
+ },
394
+ "node_modules/escape-html": {
395
+ "version": "1.0.3",
396
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
397
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
398
+ "license": "MIT"
399
+ },
400
+ "node_modules/etag": {
401
+ "version": "1.8.1",
402
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
403
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
404
+ "license": "MIT",
405
+ "engines": {
406
+ "node": ">= 0.6"
407
+ }
408
+ },
409
+ "node_modules/express": {
410
+ "version": "4.21.2",
411
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
412
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
413
+ "license": "MIT",
414
+ "dependencies": {
415
+ "accepts": "~1.3.8",
416
+ "array-flatten": "1.1.1",
417
+ "body-parser": "1.20.3",
418
+ "content-disposition": "0.5.4",
419
+ "content-type": "~1.0.4",
420
+ "cookie": "0.7.1",
421
+ "cookie-signature": "1.0.6",
422
+ "debug": "2.6.9",
423
+ "depd": "2.0.0",
424
+ "encodeurl": "~2.0.0",
425
+ "escape-html": "~1.0.3",
426
+ "etag": "~1.8.1",
427
+ "finalhandler": "1.3.1",
428
+ "fresh": "0.5.2",
429
+ "http-errors": "2.0.0",
430
+ "merge-descriptors": "1.0.3",
431
+ "methods": "~1.1.2",
432
+ "on-finished": "2.4.1",
433
+ "parseurl": "~1.3.3",
434
+ "path-to-regexp": "0.1.12",
435
+ "proxy-addr": "~2.0.7",
436
+ "qs": "6.13.0",
437
+ "range-parser": "~1.2.1",
438
+ "safe-buffer": "5.2.1",
439
+ "send": "0.19.0",
440
+ "serve-static": "1.16.2",
441
+ "setprototypeof": "1.2.0",
442
+ "statuses": "2.0.1",
443
+ "type-is": "~1.6.18",
444
+ "utils-merge": "1.0.1",
445
+ "vary": "~1.1.2"
446
+ },
447
+ "engines": {
448
+ "node": ">= 0.10.0"
449
+ },
450
+ "funding": {
451
+ "type": "opencollective",
452
+ "url": "https://opencollective.com/express"
453
+ }
454
+ },
455
+ "node_modules/fill-range": {
456
+ "version": "7.1.1",
457
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
458
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
459
+ "dev": true,
460
+ "license": "MIT",
461
+ "dependencies": {
462
+ "to-regex-range": "^5.0.1"
463
+ },
464
+ "engines": {
465
+ "node": ">=8"
466
+ }
467
+ },
468
+ "node_modules/finalhandler": {
469
+ "version": "1.3.1",
470
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
471
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
472
+ "license": "MIT",
473
+ "dependencies": {
474
+ "debug": "2.6.9",
475
+ "encodeurl": "~2.0.0",
476
+ "escape-html": "~1.0.3",
477
+ "on-finished": "2.4.1",
478
+ "parseurl": "~1.3.3",
479
+ "statuses": "2.0.1",
480
+ "unpipe": "~1.0.0"
481
+ },
482
+ "engines": {
483
+ "node": ">= 0.8"
484
+ }
485
+ },
486
+ "node_modules/forwarded": {
487
+ "version": "0.2.0",
488
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
489
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
490
+ "license": "MIT",
491
+ "engines": {
492
+ "node": ">= 0.6"
493
+ }
494
+ },
495
+ "node_modules/fresh": {
496
+ "version": "0.5.2",
497
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
498
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
499
+ "license": "MIT",
500
+ "engines": {
501
+ "node": ">= 0.6"
502
+ }
503
+ },
504
+ "node_modules/fsevents": {
505
+ "version": "2.3.3",
506
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
507
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
508
+ "dev": true,
509
+ "hasInstallScript": true,
510
+ "license": "MIT",
511
+ "optional": true,
512
+ "os": [
513
+ "darwin"
514
+ ],
515
+ "engines": {
516
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
517
+ }
518
+ },
519
+ "node_modules/function-bind": {
520
+ "version": "1.1.2",
521
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
522
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
523
+ "license": "MIT",
524
+ "funding": {
525
+ "url": "https://github.com/sponsors/ljharb"
526
+ }
527
+ },
528
+ "node_modules/get-intrinsic": {
529
+ "version": "1.3.0",
530
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
531
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
532
+ "license": "MIT",
533
+ "dependencies": {
534
+ "call-bind-apply-helpers": "^1.0.2",
535
+ "es-define-property": "^1.0.1",
536
+ "es-errors": "^1.3.0",
537
+ "es-object-atoms": "^1.1.1",
538
+ "function-bind": "^1.1.2",
539
+ "get-proto": "^1.0.1",
540
+ "gopd": "^1.2.0",
541
+ "has-symbols": "^1.1.0",
542
+ "hasown": "^2.0.2",
543
+ "math-intrinsics": "^1.1.0"
544
+ },
545
+ "engines": {
546
+ "node": ">= 0.4"
547
+ },
548
+ "funding": {
549
+ "url": "https://github.com/sponsors/ljharb"
550
+ }
551
+ },
552
+ "node_modules/get-proto": {
553
+ "version": "1.0.1",
554
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
555
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
556
+ "license": "MIT",
557
+ "dependencies": {
558
+ "dunder-proto": "^1.0.1",
559
+ "es-object-atoms": "^1.0.0"
560
+ },
561
+ "engines": {
562
+ "node": ">= 0.4"
563
+ }
564
+ },
565
+ "node_modules/glob-parent": {
566
+ "version": "5.1.2",
567
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
568
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
569
+ "dev": true,
570
+ "license": "ISC",
571
+ "dependencies": {
572
+ "is-glob": "^4.0.1"
573
+ },
574
+ "engines": {
575
+ "node": ">= 6"
576
+ }
577
+ },
578
+ "node_modules/gopd": {
579
+ "version": "1.2.0",
580
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
581
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
582
+ "license": "MIT",
583
+ "engines": {
584
+ "node": ">= 0.4"
585
+ },
586
+ "funding": {
587
+ "url": "https://github.com/sponsors/ljharb"
588
+ }
589
+ },
590
+ "node_modules/has-flag": {
591
+ "version": "3.0.0",
592
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
593
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
594
+ "dev": true,
595
+ "license": "MIT",
596
+ "engines": {
597
+ "node": ">=4"
598
+ }
599
+ },
600
+ "node_modules/has-symbols": {
601
+ "version": "1.1.0",
602
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
603
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
604
+ "license": "MIT",
605
+ "engines": {
606
+ "node": ">= 0.4"
607
+ },
608
+ "funding": {
609
+ "url": "https://github.com/sponsors/ljharb"
610
+ }
611
+ },
612
+ "node_modules/hasown": {
613
+ "version": "2.0.2",
614
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
615
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
616
+ "license": "MIT",
617
+ "dependencies": {
618
+ "function-bind": "^1.1.2"
619
+ },
620
+ "engines": {
621
+ "node": ">= 0.4"
622
+ }
623
+ },
624
+ "node_modules/http-errors": {
625
+ "version": "2.0.0",
626
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
627
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
628
+ "license": "MIT",
629
+ "dependencies": {
630
+ "depd": "2.0.0",
631
+ "inherits": "2.0.4",
632
+ "setprototypeof": "1.2.0",
633
+ "statuses": "2.0.1",
634
+ "toidentifier": "1.0.1"
635
+ },
636
+ "engines": {
637
+ "node": ">= 0.8"
638
+ }
639
+ },
640
+ "node_modules/iconv-lite": {
641
+ "version": "0.4.24",
642
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
643
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
644
+ "license": "MIT",
645
+ "dependencies": {
646
+ "safer-buffer": ">= 2.1.2 < 3"
647
+ },
648
+ "engines": {
649
+ "node": ">=0.10.0"
650
+ }
651
+ },
652
+ "node_modules/ignore-by-default": {
653
+ "version": "1.0.1",
654
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
655
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
656
+ "dev": true,
657
+ "license": "ISC"
658
+ },
659
+ "node_modules/inherits": {
660
+ "version": "2.0.4",
661
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
662
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
663
+ "license": "ISC"
664
+ },
665
+ "node_modules/ipaddr.js": {
666
+ "version": "1.9.1",
667
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
668
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
669
+ "license": "MIT",
670
+ "engines": {
671
+ "node": ">= 0.10"
672
+ }
673
+ },
674
+ "node_modules/is-binary-path": {
675
+ "version": "2.1.0",
676
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
677
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
678
+ "dev": true,
679
+ "license": "MIT",
680
+ "dependencies": {
681
+ "binary-extensions": "^2.0.0"
682
+ },
683
+ "engines": {
684
+ "node": ">=8"
685
+ }
686
+ },
687
+ "node_modules/is-extglob": {
688
+ "version": "2.1.1",
689
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
690
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
691
+ "dev": true,
692
+ "license": "MIT",
693
+ "engines": {
694
+ "node": ">=0.10.0"
695
+ }
696
+ },
697
+ "node_modules/is-glob": {
698
+ "version": "4.0.3",
699
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
700
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
701
+ "dev": true,
702
+ "license": "MIT",
703
+ "dependencies": {
704
+ "is-extglob": "^2.1.1"
705
+ },
706
+ "engines": {
707
+ "node": ">=0.10.0"
708
+ }
709
+ },
710
+ "node_modules/is-number": {
711
+ "version": "7.0.0",
712
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
713
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
714
+ "dev": true,
715
+ "license": "MIT",
716
+ "engines": {
717
+ "node": ">=0.12.0"
718
+ }
719
+ },
720
+ "node_modules/isarray": {
721
+ "version": "1.0.0",
722
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
723
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
724
+ "license": "MIT"
725
+ },
726
+ "node_modules/math-intrinsics": {
727
+ "version": "1.1.0",
728
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
729
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
730
+ "license": "MIT",
731
+ "engines": {
732
+ "node": ">= 0.4"
733
+ }
734
+ },
735
+ "node_modules/media-typer": {
736
+ "version": "0.3.0",
737
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
738
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
739
+ "license": "MIT",
740
+ "engines": {
741
+ "node": ">= 0.6"
742
+ }
743
+ },
744
+ "node_modules/merge-descriptors": {
745
+ "version": "1.0.3",
746
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
747
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
748
+ "license": "MIT",
749
+ "funding": {
750
+ "url": "https://github.com/sponsors/sindresorhus"
751
+ }
752
+ },
753
+ "node_modules/methods": {
754
+ "version": "1.1.2",
755
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
756
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
757
+ "license": "MIT",
758
+ "engines": {
759
+ "node": ">= 0.6"
760
+ }
761
+ },
762
+ "node_modules/mime": {
763
+ "version": "1.6.0",
764
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
765
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
766
+ "license": "MIT",
767
+ "bin": {
768
+ "mime": "cli.js"
769
+ },
770
+ "engines": {
771
+ "node": ">=4"
772
+ }
773
+ },
774
+ "node_modules/mime-db": {
775
+ "version": "1.52.0",
776
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
777
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
778
+ "license": "MIT",
779
+ "engines": {
780
+ "node": ">= 0.6"
781
+ }
782
+ },
783
+ "node_modules/mime-types": {
784
+ "version": "2.1.35",
785
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
786
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
787
+ "license": "MIT",
788
+ "dependencies": {
789
+ "mime-db": "1.52.0"
790
+ },
791
+ "engines": {
792
+ "node": ">= 0.6"
793
+ }
794
+ },
795
+ "node_modules/minimatch": {
796
+ "version": "3.1.2",
797
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
798
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
799
+ "dev": true,
800
+ "license": "ISC",
801
+ "dependencies": {
802
+ "brace-expansion": "^1.1.7"
803
+ },
804
+ "engines": {
805
+ "node": "*"
806
+ }
807
+ },
808
+ "node_modules/minimist": {
809
+ "version": "1.2.8",
810
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
811
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
812
+ "license": "MIT",
813
+ "funding": {
814
+ "url": "https://github.com/sponsors/ljharb"
815
+ }
816
+ },
817
+ "node_modules/mkdirp": {
818
+ "version": "0.5.6",
819
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
820
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
821
+ "license": "MIT",
822
+ "dependencies": {
823
+ "minimist": "^1.2.6"
824
+ },
825
+ "bin": {
826
+ "mkdirp": "bin/cmd.js"
827
+ }
828
+ },
829
+ "node_modules/ms": {
830
+ "version": "2.0.0",
831
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
832
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
833
+ "license": "MIT"
834
+ },
835
+ "node_modules/multer": {
836
+ "version": "1.4.5-lts.1",
837
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
838
+ "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
839
+ "license": "MIT",
840
+ "dependencies": {
841
+ "append-field": "^1.0.0",
842
+ "busboy": "^1.0.0",
843
+ "concat-stream": "^1.5.2",
844
+ "mkdirp": "^0.5.4",
845
+ "object-assign": "^4.1.1",
846
+ "type-is": "^1.6.4",
847
+ "xtend": "^4.0.0"
848
+ },
849
+ "engines": {
850
+ "node": ">= 6.0.0"
851
+ }
852
+ },
853
+ "node_modules/negotiator": {
854
+ "version": "0.6.3",
855
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
856
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
857
+ "license": "MIT",
858
+ "engines": {
859
+ "node": ">= 0.6"
860
+ }
861
+ },
862
+ "node_modules/node-ensure": {
863
+ "version": "0.0.0",
864
+ "resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz",
865
+ "integrity": "sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==",
866
+ "license": "MIT"
867
+ },
868
+ "node_modules/nodemon": {
869
+ "version": "3.1.9",
870
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz",
871
+ "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==",
872
+ "dev": true,
873
+ "license": "MIT",
874
+ "dependencies": {
875
+ "chokidar": "^3.5.2",
876
+ "debug": "^4",
877
+ "ignore-by-default": "^1.0.1",
878
+ "minimatch": "^3.1.2",
879
+ "pstree.remy": "^1.1.8",
880
+ "semver": "^7.5.3",
881
+ "simple-update-notifier": "^2.0.0",
882
+ "supports-color": "^5.5.0",
883
+ "touch": "^3.1.0",
884
+ "undefsafe": "^2.0.5"
885
+ },
886
+ "bin": {
887
+ "nodemon": "bin/nodemon.js"
888
+ },
889
+ "engines": {
890
+ "node": ">=10"
891
+ },
892
+ "funding": {
893
+ "type": "opencollective",
894
+ "url": "https://opencollective.com/nodemon"
895
+ }
896
+ },
897
+ "node_modules/nodemon/node_modules/debug": {
898
+ "version": "4.4.0",
899
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
900
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
901
+ "dev": true,
902
+ "license": "MIT",
903
+ "dependencies": {
904
+ "ms": "^2.1.3"
905
+ },
906
+ "engines": {
907
+ "node": ">=6.0"
908
+ },
909
+ "peerDependenciesMeta": {
910
+ "supports-color": {
911
+ "optional": true
912
+ }
913
+ }
914
+ },
915
+ "node_modules/nodemon/node_modules/ms": {
916
+ "version": "2.1.3",
917
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
918
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
919
+ "dev": true,
920
+ "license": "MIT"
921
+ },
922
+ "node_modules/normalize-path": {
923
+ "version": "3.0.0",
924
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
925
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
926
+ "dev": true,
927
+ "license": "MIT",
928
+ "engines": {
929
+ "node": ">=0.10.0"
930
+ }
931
+ },
932
+ "node_modules/object-assign": {
933
+ "version": "4.1.1",
934
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
935
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
936
+ "license": "MIT",
937
+ "engines": {
938
+ "node": ">=0.10.0"
939
+ }
940
+ },
941
+ "node_modules/object-inspect": {
942
+ "version": "1.13.4",
943
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
944
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
945
+ "license": "MIT",
946
+ "engines": {
947
+ "node": ">= 0.4"
948
+ },
949
+ "funding": {
950
+ "url": "https://github.com/sponsors/ljharb"
951
+ }
952
+ },
953
+ "node_modules/on-finished": {
954
+ "version": "2.4.1",
955
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
956
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
957
+ "license": "MIT",
958
+ "dependencies": {
959
+ "ee-first": "1.1.1"
960
+ },
961
+ "engines": {
962
+ "node": ">= 0.8"
963
+ }
964
+ },
965
+ "node_modules/parseurl": {
966
+ "version": "1.3.3",
967
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
968
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
969
+ "license": "MIT",
970
+ "engines": {
971
+ "node": ">= 0.8"
972
+ }
973
+ },
974
+ "node_modules/path-to-regexp": {
975
+ "version": "0.1.12",
976
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
977
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
978
+ "license": "MIT"
979
+ },
980
+ "node_modules/pdf-parse": {
981
+ "version": "1.1.1",
982
+ "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.1.tgz",
983
+ "integrity": "sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A==",
984
+ "license": "MIT",
985
+ "dependencies": {
986
+ "debug": "^3.1.0",
987
+ "node-ensure": "^0.0.0"
988
+ },
989
+ "engines": {
990
+ "node": ">=6.8.1"
991
+ }
992
+ },
993
+ "node_modules/pdf-parse/node_modules/debug": {
994
+ "version": "3.2.7",
995
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
996
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
997
+ "license": "MIT",
998
+ "dependencies": {
999
+ "ms": "^2.1.1"
1000
+ }
1001
+ },
1002
+ "node_modules/pdf-parse/node_modules/ms": {
1003
+ "version": "2.1.3",
1004
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1005
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1006
+ "license": "MIT"
1007
+ },
1008
+ "node_modules/picomatch": {
1009
+ "version": "2.3.1",
1010
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1011
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1012
+ "dev": true,
1013
+ "license": "MIT",
1014
+ "engines": {
1015
+ "node": ">=8.6"
1016
+ },
1017
+ "funding": {
1018
+ "url": "https://github.com/sponsors/jonschlinkert"
1019
+ }
1020
+ },
1021
+ "node_modules/process-nextick-args": {
1022
+ "version": "2.0.1",
1023
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1024
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1025
+ "license": "MIT"
1026
+ },
1027
+ "node_modules/proxy-addr": {
1028
+ "version": "2.0.7",
1029
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1030
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1031
+ "license": "MIT",
1032
+ "dependencies": {
1033
+ "forwarded": "0.2.0",
1034
+ "ipaddr.js": "1.9.1"
1035
+ },
1036
+ "engines": {
1037
+ "node": ">= 0.10"
1038
+ }
1039
+ },
1040
+ "node_modules/pstree.remy": {
1041
+ "version": "1.1.8",
1042
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1043
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1044
+ "dev": true,
1045
+ "license": "MIT"
1046
+ },
1047
+ "node_modules/qs": {
1048
+ "version": "6.13.0",
1049
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
1050
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
1051
+ "license": "BSD-3-Clause",
1052
+ "dependencies": {
1053
+ "side-channel": "^1.0.6"
1054
+ },
1055
+ "engines": {
1056
+ "node": ">=0.6"
1057
+ },
1058
+ "funding": {
1059
+ "url": "https://github.com/sponsors/ljharb"
1060
+ }
1061
+ },
1062
+ "node_modules/range-parser": {
1063
+ "version": "1.2.1",
1064
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1065
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1066
+ "license": "MIT",
1067
+ "engines": {
1068
+ "node": ">= 0.6"
1069
+ }
1070
+ },
1071
+ "node_modules/raw-body": {
1072
+ "version": "2.5.2",
1073
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1074
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1075
+ "license": "MIT",
1076
+ "dependencies": {
1077
+ "bytes": "3.1.2",
1078
+ "http-errors": "2.0.0",
1079
+ "iconv-lite": "0.4.24",
1080
+ "unpipe": "1.0.0"
1081
+ },
1082
+ "engines": {
1083
+ "node": ">= 0.8"
1084
+ }
1085
+ },
1086
+ "node_modules/readable-stream": {
1087
+ "version": "2.3.8",
1088
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
1089
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1090
+ "license": "MIT",
1091
+ "dependencies": {
1092
+ "core-util-is": "~1.0.0",
1093
+ "inherits": "~2.0.3",
1094
+ "isarray": "~1.0.0",
1095
+ "process-nextick-args": "~2.0.0",
1096
+ "safe-buffer": "~5.1.1",
1097
+ "string_decoder": "~1.1.1",
1098
+ "util-deprecate": "~1.0.1"
1099
+ }
1100
+ },
1101
+ "node_modules/readable-stream/node_modules/safe-buffer": {
1102
+ "version": "5.1.2",
1103
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1104
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1105
+ "license": "MIT"
1106
+ },
1107
+ "node_modules/readdirp": {
1108
+ "version": "3.6.0",
1109
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1110
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1111
+ "dev": true,
1112
+ "license": "MIT",
1113
+ "dependencies": {
1114
+ "picomatch": "^2.2.1"
1115
+ },
1116
+ "engines": {
1117
+ "node": ">=8.10.0"
1118
+ }
1119
+ },
1120
+ "node_modules/safe-buffer": {
1121
+ "version": "5.2.1",
1122
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1123
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1124
+ "funding": [
1125
+ {
1126
+ "type": "github",
1127
+ "url": "https://github.com/sponsors/feross"
1128
+ },
1129
+ {
1130
+ "type": "patreon",
1131
+ "url": "https://www.patreon.com/feross"
1132
+ },
1133
+ {
1134
+ "type": "consulting",
1135
+ "url": "https://feross.org/support"
1136
+ }
1137
+ ],
1138
+ "license": "MIT"
1139
+ },
1140
+ "node_modules/safer-buffer": {
1141
+ "version": "2.1.2",
1142
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1143
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1144
+ "license": "MIT"
1145
+ },
1146
+ "node_modules/semver": {
1147
+ "version": "7.7.1",
1148
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
1149
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
1150
+ "dev": true,
1151
+ "license": "ISC",
1152
+ "bin": {
1153
+ "semver": "bin/semver.js"
1154
+ },
1155
+ "engines": {
1156
+ "node": ">=10"
1157
+ }
1158
+ },
1159
+ "node_modules/send": {
1160
+ "version": "0.19.0",
1161
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
1162
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
1163
+ "license": "MIT",
1164
+ "dependencies": {
1165
+ "debug": "2.6.9",
1166
+ "depd": "2.0.0",
1167
+ "destroy": "1.2.0",
1168
+ "encodeurl": "~1.0.2",
1169
+ "escape-html": "~1.0.3",
1170
+ "etag": "~1.8.1",
1171
+ "fresh": "0.5.2",
1172
+ "http-errors": "2.0.0",
1173
+ "mime": "1.6.0",
1174
+ "ms": "2.1.3",
1175
+ "on-finished": "2.4.1",
1176
+ "range-parser": "~1.2.1",
1177
+ "statuses": "2.0.1"
1178
+ },
1179
+ "engines": {
1180
+ "node": ">= 0.8.0"
1181
+ }
1182
+ },
1183
+ "node_modules/send/node_modules/encodeurl": {
1184
+ "version": "1.0.2",
1185
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1186
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
1187
+ "license": "MIT",
1188
+ "engines": {
1189
+ "node": ">= 0.8"
1190
+ }
1191
+ },
1192
+ "node_modules/send/node_modules/ms": {
1193
+ "version": "2.1.3",
1194
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1195
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1196
+ "license": "MIT"
1197
+ },
1198
+ "node_modules/serve-static": {
1199
+ "version": "1.16.2",
1200
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
1201
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
1202
+ "license": "MIT",
1203
+ "dependencies": {
1204
+ "encodeurl": "~2.0.0",
1205
+ "escape-html": "~1.0.3",
1206
+ "parseurl": "~1.3.3",
1207
+ "send": "0.19.0"
1208
+ },
1209
+ "engines": {
1210
+ "node": ">= 0.8.0"
1211
+ }
1212
+ },
1213
+ "node_modules/setprototypeof": {
1214
+ "version": "1.2.0",
1215
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1216
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1217
+ "license": "ISC"
1218
+ },
1219
+ "node_modules/side-channel": {
1220
+ "version": "1.1.0",
1221
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1222
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1223
+ "license": "MIT",
1224
+ "dependencies": {
1225
+ "es-errors": "^1.3.0",
1226
+ "object-inspect": "^1.13.3",
1227
+ "side-channel-list": "^1.0.0",
1228
+ "side-channel-map": "^1.0.1",
1229
+ "side-channel-weakmap": "^1.0.2"
1230
+ },
1231
+ "engines": {
1232
+ "node": ">= 0.4"
1233
+ },
1234
+ "funding": {
1235
+ "url": "https://github.com/sponsors/ljharb"
1236
+ }
1237
+ },
1238
+ "node_modules/side-channel-list": {
1239
+ "version": "1.0.0",
1240
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1241
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1242
+ "license": "MIT",
1243
+ "dependencies": {
1244
+ "es-errors": "^1.3.0",
1245
+ "object-inspect": "^1.13.3"
1246
+ },
1247
+ "engines": {
1248
+ "node": ">= 0.4"
1249
+ },
1250
+ "funding": {
1251
+ "url": "https://github.com/sponsors/ljharb"
1252
+ }
1253
+ },
1254
+ "node_modules/side-channel-map": {
1255
+ "version": "1.0.1",
1256
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1257
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1258
+ "license": "MIT",
1259
+ "dependencies": {
1260
+ "call-bound": "^1.0.2",
1261
+ "es-errors": "^1.3.0",
1262
+ "get-intrinsic": "^1.2.5",
1263
+ "object-inspect": "^1.13.3"
1264
+ },
1265
+ "engines": {
1266
+ "node": ">= 0.4"
1267
+ },
1268
+ "funding": {
1269
+ "url": "https://github.com/sponsors/ljharb"
1270
+ }
1271
+ },
1272
+ "node_modules/side-channel-weakmap": {
1273
+ "version": "1.0.2",
1274
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1275
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1276
+ "license": "MIT",
1277
+ "dependencies": {
1278
+ "call-bound": "^1.0.2",
1279
+ "es-errors": "^1.3.0",
1280
+ "get-intrinsic": "^1.2.5",
1281
+ "object-inspect": "^1.13.3",
1282
+ "side-channel-map": "^1.0.1"
1283
+ },
1284
+ "engines": {
1285
+ "node": ">= 0.4"
1286
+ },
1287
+ "funding": {
1288
+ "url": "https://github.com/sponsors/ljharb"
1289
+ }
1290
+ },
1291
+ "node_modules/simple-update-notifier": {
1292
+ "version": "2.0.0",
1293
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
1294
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
1295
+ "dev": true,
1296
+ "license": "MIT",
1297
+ "dependencies": {
1298
+ "semver": "^7.5.3"
1299
+ },
1300
+ "engines": {
1301
+ "node": ">=10"
1302
+ }
1303
+ },
1304
+ "node_modules/statuses": {
1305
+ "version": "2.0.1",
1306
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1307
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1308
+ "license": "MIT",
1309
+ "engines": {
1310
+ "node": ">= 0.8"
1311
+ }
1312
+ },
1313
+ "node_modules/streamsearch": {
1314
+ "version": "1.1.0",
1315
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1316
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1317
+ "engines": {
1318
+ "node": ">=10.0.0"
1319
+ }
1320
+ },
1321
+ "node_modules/string_decoder": {
1322
+ "version": "1.1.1",
1323
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1324
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1325
+ "license": "MIT",
1326
+ "dependencies": {
1327
+ "safe-buffer": "~5.1.0"
1328
+ }
1329
+ },
1330
+ "node_modules/string_decoder/node_modules/safe-buffer": {
1331
+ "version": "5.1.2",
1332
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1333
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1334
+ "license": "MIT"
1335
+ },
1336
+ "node_modules/supports-color": {
1337
+ "version": "5.5.0",
1338
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1339
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1340
+ "dev": true,
1341
+ "license": "MIT",
1342
+ "dependencies": {
1343
+ "has-flag": "^3.0.0"
1344
+ },
1345
+ "engines": {
1346
+ "node": ">=4"
1347
+ }
1348
+ },
1349
+ "node_modules/to-regex-range": {
1350
+ "version": "5.0.1",
1351
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1352
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1353
+ "dev": true,
1354
+ "license": "MIT",
1355
+ "dependencies": {
1356
+ "is-number": "^7.0.0"
1357
+ },
1358
+ "engines": {
1359
+ "node": ">=8.0"
1360
+ }
1361
+ },
1362
+ "node_modules/toidentifier": {
1363
+ "version": "1.0.1",
1364
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1365
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1366
+ "license": "MIT",
1367
+ "engines": {
1368
+ "node": ">=0.6"
1369
+ }
1370
+ },
1371
+ "node_modules/touch": {
1372
+ "version": "3.1.1",
1373
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
1374
+ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
1375
+ "dev": true,
1376
+ "license": "ISC",
1377
+ "bin": {
1378
+ "nodetouch": "bin/nodetouch.js"
1379
+ }
1380
+ },
1381
+ "node_modules/type-is": {
1382
+ "version": "1.6.18",
1383
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1384
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1385
+ "license": "MIT",
1386
+ "dependencies": {
1387
+ "media-typer": "0.3.0",
1388
+ "mime-types": "~2.1.24"
1389
+ },
1390
+ "engines": {
1391
+ "node": ">= 0.6"
1392
+ }
1393
+ },
1394
+ "node_modules/typedarray": {
1395
+ "version": "0.0.6",
1396
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1397
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
1398
+ "license": "MIT"
1399
+ },
1400
+ "node_modules/undefsafe": {
1401
+ "version": "2.0.5",
1402
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1403
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
1404
+ "dev": true,
1405
+ "license": "MIT"
1406
+ },
1407
+ "node_modules/unpipe": {
1408
+ "version": "1.0.0",
1409
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1410
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1411
+ "license": "MIT",
1412
+ "engines": {
1413
+ "node": ">= 0.8"
1414
+ }
1415
+ },
1416
+ "node_modules/util-deprecate": {
1417
+ "version": "1.0.2",
1418
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1419
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1420
+ "license": "MIT"
1421
+ },
1422
+ "node_modules/utils-merge": {
1423
+ "version": "1.0.1",
1424
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1425
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1426
+ "license": "MIT",
1427
+ "engines": {
1428
+ "node": ">= 0.4.0"
1429
+ }
1430
+ },
1431
+ "node_modules/vary": {
1432
+ "version": "1.1.2",
1433
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1434
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1435
+ "license": "MIT",
1436
+ "engines": {
1437
+ "node": ">= 0.8"
1438
+ }
1439
+ },
1440
+ "node_modules/xtend": {
1441
+ "version": "4.0.2",
1442
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1443
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1444
+ "license": "MIT",
1445
+ "engines": {
1446
+ "node": ">=0.4"
1447
+ }
1448
+ }
1449
+ }
1450
+ }
package.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ai-notes-maker",
3
+ "version": "1.0.0",
4
+ "description": "AI Notes Maker using Gemini API for PDF and PPT files",
5
+ "main": "server.js",
6
+ "scripts": {
7
+ "start": "node server.js",
8
+ "dev": "nodemon server.js"
9
+ },
10
+ "dependencies": {
11
+ "@google/generative-ai": "^0.1.3",
12
+ "cors": "^2.8.5",
13
+ "dotenv": "^16.3.1",
14
+ "express": "^4.18.2",
15
+ "multer": "^1.4.5-lts.1",
16
+ "pdf-parse": "^1.1.1"
17
+ },
18
+ "devDependencies": {
19
+ "nodemon": "^3.0.2"
20
+ },
21
+ "terminal": "cmd.exe"
22
+ }
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ streamlit==1.31.1
2
+ mistralai==0.0.12
3
+ python-dotenv==1.0.1
4
+ PyPDF2==3.0.1
5
+ python-pptx==0.6.21
6
+ langchain==0.1.9
server.js ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ require('dotenv').config();
2
+ const express = require('express');
3
+ const multer = require('multer');
4
+ const cors = require('cors');
5
+ const path = require('path');
6
+ const fs = require('fs');
7
+ const pdfParse = require('pdf-parse');
8
+ const pptxParser = require('pptx-parser');
9
+ const { GoogleGenerativeAI } = require('@google/generative-ai');
10
+
11
+ const app = express();
12
+ const port = process.env.PORT || 3000;
13
+
14
+ // Middleware
15
+ app.use(cors());
16
+ app.use(express.json());
17
+ app.use(express.static('public'));
18
+
19
+ // Configure multer for file upload
20
+ const storage = multer.diskStorage({
21
+ destination: function (req, file, cb) {
22
+ const uploadDir = 'uploads';
23
+ if (!fs.existsSync(uploadDir)) {
24
+ fs.mkdirSync(uploadDir);
25
+ }
26
+ cb(null, uploadDir);
27
+ },
28
+ filename: function (req, file, cb) {
29
+ cb(null, Date.now() + path.extname(file.originalname));
30
+ }
31
+ });
32
+
33
+ const upload = multer({
34
+ storage: storage,
35
+ fileFilter: function (req, file, cb) {
36
+ const allowedTypes = ['.pdf', '.pptx'];
37
+ const ext = path.extname(file.originalname).toLowerCase();
38
+ if (allowedTypes.includes(ext)) {
39
+ cb(null, true);
40
+ } else {
41
+ cb(new Error('Only PDF and PPTX files are allowed'));
42
+ }
43
+ }
44
+ });
45
+
46
+ // Initialize Gemini AI
47
+ const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
48
+
49
+ // Extract text from PDF
50
+ async function extractTextFromPDF(filePath) {
51
+ const dataBuffer = fs.readFileSync(filePath);
52
+ const data = await pdfParse(dataBuffer);
53
+ return data.text;
54
+ }
55
+
56
+ // Extract text from PPTX
57
+ async function extractTextFromPPTX(filePath) {
58
+ const result = await pptxParser.parseFile(filePath);
59
+ let text = '';
60
+ result.slides.forEach(slide => {
61
+ text += slide.text + '\n';
62
+ });
63
+ return text;
64
+ }
65
+
66
+ // Generate notes using Gemini AI
67
+ async function generateNotes(text) {
68
+ const model = genAI.getGenerativeModel({ model: 'gemini-pro' });
69
+ const prompt = `Please create well-structured, comprehensive notes from the following content. Include main points, key concepts, and important details:\n\n${text}`;
70
+
71
+ const result = await model.generateContent(prompt);
72
+ const response = await result.response;
73
+ return response.text();
74
+ }
75
+
76
+ // File upload and processing endpoint
77
+ app.post('/upload', upload.single('file'), async (req, res) => {
78
+ try {
79
+ if (!req.file) {
80
+ return res.status(400).json({ error: 'No file uploaded' });
81
+ }
82
+
83
+ const filePath = req.file.path;
84
+ const fileExt = path.extname(req.file.originalname).toLowerCase();
85
+
86
+ let extractedText = '';
87
+ if (fileExt === '.pdf') {
88
+ extractedText = await extractTextFromPDF(filePath);
89
+ } else if (fileExt === '.pptx') {
90
+ extractedText = await extractTextFromPPTX(filePath);
91
+ }
92
+
93
+ const notes = await generateNotes(extractedText);
94
+
95
+ // Clean up uploaded file
96
+ fs.unlinkSync(filePath);
97
+
98
+ res.json({ notes });
99
+ } catch (error) {
100
+ console.error('Error processing file:', error);
101
+ res.status(500).json({ error: 'Error processing file' });
102
+ }
103
+ });
104
+
105
+ app.listen(port, () => {
106
+ console.log(`Server is running on port ${port}`);
107
+ });