aki-008 commited on
Commit
eccafb0
·
1 Parent(s): 9fd990f

feat: notes page ui integration

Browse files
Backend/app/api/v1/endpoints/notes.py CHANGED
@@ -1,4 +1,4 @@
1
- from fastapi import APIRouter, Depends, HTTPException, status, File, UploadFile
2
  from sqlalchemy.ext.asyncio import AsyncSession
3
  from app.models import User
4
  from app.models.tables import PDFData
@@ -19,11 +19,11 @@ from sentence_transformers import SentenceTransformer
19
  from .quiz import search_logic
20
  from sqlalchemy import select, desc, asc
21
  from app.models.tables import ChatSession, ChatMessage
22
- from app.schema.models import SessionCreate, SessionResponse, MessageResponse
23
  from app.database import async_session_maker
24
  from typing import List
25
 
26
- router = APIRouter(prefix="/notes")
27
 
28
  UPLOAD_DIRECTORY = "uploaded_pdfs"
29
  os.makedirs(UPLOAD_DIRECTORY, exist_ok=True)
@@ -76,7 +76,8 @@ async def upload_notes(
76
  new_doc = PDFData(
77
  pdf_blob=file.file.read(),
78
  pdf_embedding=doc_embedding,
79
- user_id=current_user.id
 
80
  )
81
 
82
  db.add(new_doc)
@@ -312,4 +313,36 @@ async def ensure_pdf_in_chroma(pdf_id: int, db: AsyncSession, collection: Collec
312
  finally:
313
  # Cleanup temp file
314
  if os.path.exists(tmp_path):
315
- os.remove(tmp_path)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import APIRouter, Depends, HTTPException, status, File, UploadFile, Response
2
  from sqlalchemy.ext.asyncio import AsyncSession
3
  from app.models import User
4
  from app.models.tables import PDFData
 
19
  from .quiz import search_logic
20
  from sqlalchemy import select, desc, asc
21
  from app.models.tables import ChatSession, ChatMessage
22
+ from app.schema.models import SessionCreate, SessionResponse, MessageResponse , NoteInfo
23
  from app.database import async_session_maker
24
  from typing import List
25
 
26
+ router = APIRouter()
27
 
28
  UPLOAD_DIRECTORY = "uploaded_pdfs"
29
  os.makedirs(UPLOAD_DIRECTORY, exist_ok=True)
 
76
  new_doc = PDFData(
77
  pdf_blob=file.file.read(),
78
  pdf_embedding=doc_embedding,
79
+ user_id=current_user.id,
80
+ filename=file.filename
81
  )
82
 
83
  db.add(new_doc)
 
313
  finally:
314
  # Cleanup temp file
315
  if os.path.exists(tmp_path):
316
+ os.remove(tmp_path)
317
+
318
+ @router.get("/", response_model=List[NoteInfo])
319
+ async def get_all_notes(
320
+ db: AsyncSession = Depends(get_db),
321
+ current_user: User = Depends(get_current_user)
322
+ ):
323
+ """Fetch all uploaded PDFs for the sidebar list."""
324
+ result = await db.execute(
325
+ select(PDFData.id, PDFData.filename, PDFData.created_at)
326
+ .where(PDFData.user_id == current_user.id)
327
+ .order_by(desc(PDFData.created_at))
328
+ )
329
+ return result.all()
330
+
331
+
332
+ @router.get("/{pdf_id}/content")
333
+ async def get_pdf_content(
334
+ pdf_id: int,
335
+ db: AsyncSession = Depends(get_db),
336
+ current_user: User = Depends(get_current_user)
337
+ ):
338
+ """Serve the raw PDF binary data for the viewer."""
339
+ result = await db.execute(
340
+ select(PDFData).where(PDFData.id == pdf_id, PDFData.user_id == current_user.id)
341
+ )
342
+ pdf = result.scalar_one_or_none()
343
+
344
+ if not pdf:
345
+ raise HTTPException(status_code=404, detail="Note not found")
346
+
347
+ # Return raw bytes with PDF mime type so browser/frontend can render it
348
+ return Response(content=pdf.pdf_blob, media_type="application/pdf")
Backend/app/models/tables.py CHANGED
@@ -18,6 +18,11 @@ class PDFData(Base):
18
  __tablename__ = "pdf_data"
19
 
20
  id: Mapped[int] = mapped_column(primary_key=True, index=True)
 
 
 
 
 
21
  pdf_blob: Mapped[bytes] = mapped_column(LargeBinary)
22
  pdf_embedding: Mapped[list[float]] = mapped_column(JSON)
23
  user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
 
18
  __tablename__ = "pdf_data"
19
 
20
  id: Mapped[int] = mapped_column(primary_key=True, index=True)
21
+ # 👇 ADD THESE TWO LINES
22
+ filename: Mapped[str] = mapped_column(String(255))
23
+ created_at: Mapped[datetime] = mapped_column(default=datetime.utcnow)
24
+ # 👆
25
+
26
  pdf_blob: Mapped[bytes] = mapped_column(LargeBinary)
27
  pdf_embedding: Mapped[list[float]] = mapped_column(JSON)
28
  user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
Backend/app/schema/models.py CHANGED
@@ -80,4 +80,9 @@ class MessageResponse(BaseModel):
80
  #--------Notes page models--------#
81
 
82
  class pdf_input(BaseModel):
83
- file: UploadFile = File(..., description="The PDF file to be ingested.")
 
 
 
 
 
 
80
  #--------Notes page models--------#
81
 
82
  class pdf_input(BaseModel):
83
+ file: UploadFile = File(..., description="The PDF file to be ingested.")
84
+
85
+ class NoteInfo(BaseModel):
86
+ id: int
87
+ filename: str
88
+ created_at: datetime
Frontend/package-lock.json CHANGED
@@ -17,10 +17,13 @@
17
  "dayjs": "^1.11.19",
18
  "framer-motion": "^12.23.24",
19
  "lucide-react": "^0.553.0",
 
20
  "react": "^19.2.0",
21
  "react-dom": "^19.2.0",
 
22
  "react-router-dom": "^7.9.5",
23
  "recharts": "^3.4.1",
 
24
  "tailwind-merge": "^3.4.0",
25
  "tailwindcss": "^4.1.17"
26
  },
@@ -991,6 +994,191 @@
991
  "@jridgewell/sourcemap-codec": "^1.4.14"
992
  }
993
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
994
  "node_modules/@nodelib/fs.scandir": {
995
  "version": "2.1.5",
996
  "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -1756,12 +1944,39 @@
1756
  "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
1757
  "license": "MIT"
1758
  },
 
 
 
 
 
 
 
 
 
1759
  "node_modules/@types/estree": {
1760
  "version": "1.0.8",
1761
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1762
  "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1763
  "license": "MIT"
1764
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1765
  "node_modules/@types/json-schema": {
1766
  "version": "7.0.15",
1767
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -1769,6 +1984,21 @@
1769
  "dev": true,
1770
  "license": "MIT"
1771
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1772
  "node_modules/@types/node": {
1773
  "version": "24.10.0",
1774
  "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz",
@@ -1783,7 +2013,6 @@
1783
  "version": "19.2.2",
1784
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz",
1785
  "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==",
1786
- "devOptional": true,
1787
  "license": "MIT",
1788
  "dependencies": {
1789
  "csstype": "^3.0.2"
@@ -1799,6 +2028,12 @@
1799
  "@types/react": "^19.2.0"
1800
  }
1801
  },
 
 
 
 
 
 
1802
  "node_modules/@types/use-sync-external-store": {
1803
  "version": "0.0.6",
1804
  "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
@@ -2076,6 +2311,12 @@
2076
  "url": "https://opencollective.com/typescript-eslint"
2077
  }
2078
  },
 
 
 
 
 
 
2079
  "node_modules/@vitejs/plugin-react": {
2080
  "version": "5.1.0",
2081
  "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz",
@@ -2177,6 +2418,16 @@
2177
  "proxy-from-env": "^1.1.0"
2178
  }
2179
  },
 
 
 
 
 
 
 
 
 
 
2180
  "node_modules/balanced-match": {
2181
  "version": "1.0.2",
2182
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2302,6 +2553,16 @@
2302
  ],
2303
  "license": "CC-BY-4.0"
2304
  },
 
 
 
 
 
 
 
 
 
 
2305
  "node_modules/chalk": {
2306
  "version": "4.1.2",
2307
  "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -2319,6 +2580,46 @@
2319
  "url": "https://github.com/chalk/chalk?sponsor=1"
2320
  }
2321
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2322
  "node_modules/clsx": {
2323
  "version": "2.1.1",
2324
  "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -2360,6 +2661,16 @@
2360
  "node": ">= 0.8"
2361
  }
2362
  },
 
 
 
 
 
 
 
 
 
 
2363
  "node_modules/concat-map": {
2364
  "version": "0.0.1",
2365
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2402,7 +2713,6 @@
2402
  "version": "3.1.3",
2403
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
2404
  "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
2405
- "devOptional": true,
2406
  "license": "MIT"
2407
  },
2408
  "node_modules/d3-array": {
@@ -2536,7 +2846,6 @@
2536
  "version": "4.4.3",
2537
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
2538
  "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
2539
- "dev": true,
2540
  "license": "MIT",
2541
  "dependencies": {
2542
  "ms": "^2.1.3"
@@ -2556,6 +2865,19 @@
2556
  "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
2557
  "license": "MIT"
2558
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2559
  "node_modules/deep-is": {
2560
  "version": "0.1.4",
2561
  "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -2572,6 +2894,15 @@
2572
  "node": ">=0.4.0"
2573
  }
2574
  },
 
 
 
 
 
 
 
 
 
2575
  "node_modules/detect-libc": {
2576
  "version": "2.1.2",
2577
  "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
@@ -2581,6 +2912,19 @@
2581
  "node": ">=8"
2582
  }
2583
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2584
  "node_modules/dunder-proto": {
2585
  "version": "1.0.1",
2586
  "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -2901,6 +3245,16 @@
2901
  "node": ">=4.0"
2902
  }
2903
  },
 
 
 
 
 
 
 
 
 
 
2904
  "node_modules/esutils": {
2905
  "version": "2.0.3",
2906
  "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@@ -2917,6 +3271,12 @@
2917
  "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
2918
  "license": "MIT"
2919
  },
 
 
 
 
 
 
2920
  "node_modules/fast-deep-equal": {
2921
  "version": "3.1.3",
2922
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -3275,6 +3635,56 @@
3275
  "node": ">= 0.4"
3276
  }
3277
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3278
  "node_modules/ignore": {
3279
  "version": "5.3.2",
3280
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3322,6 +3732,12 @@
3322
  "node": ">=0.8.19"
3323
  }
3324
  },
 
 
 
 
 
 
3325
  "node_modules/internmap": {
3326
  "version": "2.0.3",
3327
  "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
@@ -3331,11 +3747,45 @@
3331
  "node": ">=12"
3332
  }
3333
  },
3334
- "node_modules/is-extglob": {
3335
- "version": "2.1.1",
3336
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
3337
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
3338
- "dev": true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3339
  "license": "MIT",
3340
  "engines": {
3341
  "node": ">=0.10.0"
@@ -3354,6 +3804,16 @@
3354
  "node": ">=0.10.0"
3355
  }
3356
  },
 
 
 
 
 
 
 
 
 
 
3357
  "node_modules/is-number": {
3358
  "version": "7.0.0",
3359
  "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -3364,6 +3824,18 @@
3364
  "node": ">=0.12.0"
3365
  }
3366
  },
 
 
 
 
 
 
 
 
 
 
 
 
3367
  "node_modules/isexe": {
3368
  "version": "2.0.0",
3369
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -3742,60 +4214,925 @@
3742
  "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
3743
  "license": "MIT"
3744
  },
3745
- "node_modules/lodash.merge": {
3746
- "version": "4.6.2",
3747
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
3748
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
3749
- "dev": true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3750
  "license": "MIT"
3751
  },
3752
- "node_modules/lru-cache": {
3753
- "version": "5.1.1",
3754
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
3755
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
3756
- "dev": true,
3757
- "license": "ISC",
 
 
 
 
 
 
 
 
 
3758
  "dependencies": {
3759
- "yallist": "^3.0.2"
3760
- }
3761
- },
3762
- "node_modules/lucide-react": {
3763
- "version": "0.553.0",
3764
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.553.0.tgz",
3765
- "integrity": "sha512-BRgX5zrWmNy/lkVAe0dXBgd7XQdZ3HTf+Hwe3c9WK6dqgnj9h+hxV+MDncM88xDWlCq27+TKvHGE70ViODNILw==",
3766
- "license": "ISC",
3767
- "peerDependencies": {
3768
- "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3769
  }
3770
  },
3771
- "node_modules/magic-string": {
3772
- "version": "0.30.21",
3773
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
3774
- "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
 
 
 
 
 
 
 
 
 
 
3775
  "license": "MIT",
3776
  "dependencies": {
3777
- "@jridgewell/sourcemap-codec": "^1.5.5"
3778
  }
3779
  },
3780
- "node_modules/math-intrinsics": {
3781
- "version": "1.1.0",
3782
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
3783
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
 
 
 
 
 
 
 
 
 
 
3784
  "license": "MIT",
3785
- "engines": {
3786
- "node": ">= 0.4"
 
 
3787
  }
3788
  },
3789
- "node_modules/merge2": {
3790
- "version": "1.4.1",
3791
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
3792
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
3793
- "dev": true,
 
 
 
 
 
 
 
 
 
3794
  "license": "MIT",
3795
- "engines": {
3796
- "node": ">= 8"
 
 
 
3797
  }
3798
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3799
  "node_modules/micromatch": {
3800
  "version": "4.0.8",
3801
  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
@@ -3863,7 +5200,6 @@
3863
  "version": "2.1.3",
3864
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
3865
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
3866
- "dev": true,
3867
  "license": "MIT"
3868
  },
3869
  "node_modules/nanoid": {
@@ -3973,6 +5309,31 @@
3973
  "node": ">=6"
3974
  }
3975
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3976
  "node_modules/path-exists": {
3977
  "version": "4.0.0",
3978
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -3993,6 +5354,18 @@
3993
  "node": ">=8"
3994
  }
3995
  },
 
 
 
 
 
 
 
 
 
 
 
 
3996
  "node_modules/picocolors": {
3997
  "version": "1.1.1",
3998
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -4050,6 +5423,16 @@
4050
  "node": ">= 0.8.0"
4051
  }
4052
  },
 
 
 
 
 
 
 
 
 
 
4053
  "node_modules/proxy-from-env": {
4054
  "version": "1.1.0",
4055
  "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -4115,6 +5498,33 @@
4115
  "license": "MIT",
4116
  "peer": true
4117
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4118
  "node_modules/react-merge-refs": {
4119
  "version": "2.1.1",
4120
  "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-2.1.1.tgz",
@@ -4241,6 +5651,72 @@
4241
  "redux": "^5.0.0"
4242
  }
4243
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4244
  "node_modules/reselect": {
4245
  "version": "5.1.1",
4246
  "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
@@ -4393,6 +5869,30 @@
4393
  "node": ">=0.10.0"
4394
  }
4395
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4396
  "node_modules/strip-json-comments": {
4397
  "version": "3.1.1",
4398
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -4406,6 +5906,24 @@
4406
  "url": "https://github.com/sponsors/sindresorhus"
4407
  }
4408
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4409
  "node_modules/supports-color": {
4410
  "version": "7.2.0",
4411
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -4518,6 +6036,26 @@
4518
  "node": ">=8.0"
4519
  }
4520
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4521
  "node_modules/ts-api-utils": {
4522
  "version": "2.1.0",
4523
  "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
@@ -4595,6 +6133,93 @@
4595
  "devOptional": true,
4596
  "license": "MIT"
4597
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4598
  "node_modules/update-browserslist-db": {
4599
  "version": "1.1.4",
4600
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
@@ -4645,6 +6270,34 @@
4645
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
4646
  }
4647
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4648
  "node_modules/victory-vendor": {
4649
  "version": "37.3.6",
4650
  "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz",
@@ -4815,6 +6468,16 @@
4815
  "funding": {
4816
  "url": "https://github.com/sponsors/sindresorhus"
4817
  }
 
 
 
 
 
 
 
 
 
 
4818
  }
4819
  }
4820
  }
 
17
  "dayjs": "^1.11.19",
18
  "framer-motion": "^12.23.24",
19
  "lucide-react": "^0.553.0",
20
+ "pdfjs-dist": "^5.4.449",
21
  "react": "^19.2.0",
22
  "react-dom": "^19.2.0",
23
+ "react-markdown": "^10.1.0",
24
  "react-router-dom": "^7.9.5",
25
  "recharts": "^3.4.1",
26
+ "remark-gfm": "^4.0.1",
27
  "tailwind-merge": "^3.4.0",
28
  "tailwindcss": "^4.1.17"
29
  },
 
994
  "@jridgewell/sourcemap-codec": "^1.4.14"
995
  }
996
  },
997
+ "node_modules/@napi-rs/canvas": {
998
+ "version": "0.1.83",
999
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.83.tgz",
1000
+ "integrity": "sha512-f9GVB9VNc9vn/nroc9epXRNkVpvNPZh69+qzLJIm9DfruxFqX0/jsXG46OGWAJgkO4mN0HvFHjRROMXKVmPszg==",
1001
+ "license": "MIT",
1002
+ "optional": true,
1003
+ "workspaces": [
1004
+ "e2e/*"
1005
+ ],
1006
+ "engines": {
1007
+ "node": ">= 10"
1008
+ },
1009
+ "optionalDependencies": {
1010
+ "@napi-rs/canvas-android-arm64": "0.1.83",
1011
+ "@napi-rs/canvas-darwin-arm64": "0.1.83",
1012
+ "@napi-rs/canvas-darwin-x64": "0.1.83",
1013
+ "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.83",
1014
+ "@napi-rs/canvas-linux-arm64-gnu": "0.1.83",
1015
+ "@napi-rs/canvas-linux-arm64-musl": "0.1.83",
1016
+ "@napi-rs/canvas-linux-riscv64-gnu": "0.1.83",
1017
+ "@napi-rs/canvas-linux-x64-gnu": "0.1.83",
1018
+ "@napi-rs/canvas-linux-x64-musl": "0.1.83",
1019
+ "@napi-rs/canvas-win32-x64-msvc": "0.1.83"
1020
+ }
1021
+ },
1022
+ "node_modules/@napi-rs/canvas-android-arm64": {
1023
+ "version": "0.1.83",
1024
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.83.tgz",
1025
+ "integrity": "sha512-TbKM2fh9zXjqFIU8bgMfzG7rkrIYdLKMafgPhFoPwKrpWk1glGbWP7LEu8Y/WrMDqTGFdRqUmuX89yQEzZbkiw==",
1026
+ "cpu": [
1027
+ "arm64"
1028
+ ],
1029
+ "license": "MIT",
1030
+ "optional": true,
1031
+ "os": [
1032
+ "android"
1033
+ ],
1034
+ "engines": {
1035
+ "node": ">= 10"
1036
+ }
1037
+ },
1038
+ "node_modules/@napi-rs/canvas-darwin-arm64": {
1039
+ "version": "0.1.83",
1040
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.83.tgz",
1041
+ "integrity": "sha512-gp8IDVUloPUmkepHly4xRUOfUJSFNvA4jR7ZRF5nk3YcGzegSFGeICiT4PnYyPgSKEhYAFe1Y2XNy0Mp6Tu8mQ==",
1042
+ "cpu": [
1043
+ "arm64"
1044
+ ],
1045
+ "license": "MIT",
1046
+ "optional": true,
1047
+ "os": [
1048
+ "darwin"
1049
+ ],
1050
+ "engines": {
1051
+ "node": ">= 10"
1052
+ }
1053
+ },
1054
+ "node_modules/@napi-rs/canvas-darwin-x64": {
1055
+ "version": "0.1.83",
1056
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.83.tgz",
1057
+ "integrity": "sha512-r4ZJxiP9OgUbdGZhPDEXD3hQ0aIPcVaywtcTXvamYxTU/SWKAbKVhFNTtpRe1J30oQ25gWyxTkUKSBgUkNzdnw==",
1058
+ "cpu": [
1059
+ "x64"
1060
+ ],
1061
+ "license": "MIT",
1062
+ "optional": true,
1063
+ "os": [
1064
+ "darwin"
1065
+ ],
1066
+ "engines": {
1067
+ "node": ">= 10"
1068
+ }
1069
+ },
1070
+ "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": {
1071
+ "version": "0.1.83",
1072
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.83.tgz",
1073
+ "integrity": "sha512-Uc6aSB05qH1r+9GUDxIE6F5ZF7L0nTFyyzq8ublWUZhw8fEGK8iy931ff1ByGFT04+xHJad1kBcL4R1ZEV8z7Q==",
1074
+ "cpu": [
1075
+ "arm"
1076
+ ],
1077
+ "license": "MIT",
1078
+ "optional": true,
1079
+ "os": [
1080
+ "linux"
1081
+ ],
1082
+ "engines": {
1083
+ "node": ">= 10"
1084
+ }
1085
+ },
1086
+ "node_modules/@napi-rs/canvas-linux-arm64-gnu": {
1087
+ "version": "0.1.83",
1088
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.83.tgz",
1089
+ "integrity": "sha512-eEeaJA7V5KOFq7W0GtoRVbd3ak8UZpK+XLkCgUiFGtlunNw+ZZW9Cr/92MXflGe7o3SqqMUg+f975LPxO/vsOQ==",
1090
+ "cpu": [
1091
+ "arm64"
1092
+ ],
1093
+ "license": "MIT",
1094
+ "optional": true,
1095
+ "os": [
1096
+ "linux"
1097
+ ],
1098
+ "engines": {
1099
+ "node": ">= 10"
1100
+ }
1101
+ },
1102
+ "node_modules/@napi-rs/canvas-linux-arm64-musl": {
1103
+ "version": "0.1.83",
1104
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.83.tgz",
1105
+ "integrity": "sha512-cAvonp5XpbatVGegF9lMQNchs3z5RH6EtamRVnQvtoRtwbzOMcdzwuLBqDBQxQF79MFbuZNkWj3YRJjZCjHVzw==",
1106
+ "cpu": [
1107
+ "arm64"
1108
+ ],
1109
+ "license": "MIT",
1110
+ "optional": true,
1111
+ "os": [
1112
+ "linux"
1113
+ ],
1114
+ "engines": {
1115
+ "node": ">= 10"
1116
+ }
1117
+ },
1118
+ "node_modules/@napi-rs/canvas-linux-riscv64-gnu": {
1119
+ "version": "0.1.83",
1120
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.83.tgz",
1121
+ "integrity": "sha512-WFUPQ9qZy31vmLxIJ3MfmHw+R2g/mLCgk8zmh7maJW8snV3vLPA7pZfIS65Dc61EVDp1vaBskwQ2RqPPzwkaew==",
1122
+ "cpu": [
1123
+ "riscv64"
1124
+ ],
1125
+ "license": "MIT",
1126
+ "optional": true,
1127
+ "os": [
1128
+ "linux"
1129
+ ],
1130
+ "engines": {
1131
+ "node": ">= 10"
1132
+ }
1133
+ },
1134
+ "node_modules/@napi-rs/canvas-linux-x64-gnu": {
1135
+ "version": "0.1.83",
1136
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.83.tgz",
1137
+ "integrity": "sha512-X9YwIjsuy50WwOyYeNhEHjKHO8rrfH9M4U8vNqLuGmqsZdKua/GrUhdQGdjq7lTgdY3g4+Ta5jF8MzAa7UAs/g==",
1138
+ "cpu": [
1139
+ "x64"
1140
+ ],
1141
+ "license": "MIT",
1142
+ "optional": true,
1143
+ "os": [
1144
+ "linux"
1145
+ ],
1146
+ "engines": {
1147
+ "node": ">= 10"
1148
+ }
1149
+ },
1150
+ "node_modules/@napi-rs/canvas-linux-x64-musl": {
1151
+ "version": "0.1.83",
1152
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.83.tgz",
1153
+ "integrity": "sha512-Vv2pLWQS8EnlSM1bstJ7vVhKA+mL4+my4sKUIn/bgIxB5O90dqiDhQjUDLP+5xn9ZMestRWDt3tdQEkGAmzq/A==",
1154
+ "cpu": [
1155
+ "x64"
1156
+ ],
1157
+ "license": "MIT",
1158
+ "optional": true,
1159
+ "os": [
1160
+ "linux"
1161
+ ],
1162
+ "engines": {
1163
+ "node": ">= 10"
1164
+ }
1165
+ },
1166
+ "node_modules/@napi-rs/canvas-win32-x64-msvc": {
1167
+ "version": "0.1.83",
1168
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.83.tgz",
1169
+ "integrity": "sha512-K1TtjbScfRNYhq8dengLLufXGbtEtWdUXPV505uLFPovyGHzDUGXLFP/zUJzj6xWXwgUjHNLgEPIt7mye0zr6Q==",
1170
+ "cpu": [
1171
+ "x64"
1172
+ ],
1173
+ "license": "MIT",
1174
+ "optional": true,
1175
+ "os": [
1176
+ "win32"
1177
+ ],
1178
+ "engines": {
1179
+ "node": ">= 10"
1180
+ }
1181
+ },
1182
  "node_modules/@nodelib/fs.scandir": {
1183
  "version": "2.1.5",
1184
  "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
 
1944
  "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
1945
  "license": "MIT"
1946
  },
1947
+ "node_modules/@types/debug": {
1948
+ "version": "4.1.12",
1949
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
1950
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
1951
+ "license": "MIT",
1952
+ "dependencies": {
1953
+ "@types/ms": "*"
1954
+ }
1955
+ },
1956
  "node_modules/@types/estree": {
1957
  "version": "1.0.8",
1958
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1959
  "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1960
  "license": "MIT"
1961
  },
1962
+ "node_modules/@types/estree-jsx": {
1963
+ "version": "1.0.5",
1964
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
1965
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
1966
+ "license": "MIT",
1967
+ "dependencies": {
1968
+ "@types/estree": "*"
1969
+ }
1970
+ },
1971
+ "node_modules/@types/hast": {
1972
+ "version": "3.0.4",
1973
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
1974
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
1975
+ "license": "MIT",
1976
+ "dependencies": {
1977
+ "@types/unist": "*"
1978
+ }
1979
+ },
1980
  "node_modules/@types/json-schema": {
1981
  "version": "7.0.15",
1982
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
 
1984
  "dev": true,
1985
  "license": "MIT"
1986
  },
1987
+ "node_modules/@types/mdast": {
1988
+ "version": "4.0.4",
1989
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
1990
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
1991
+ "license": "MIT",
1992
+ "dependencies": {
1993
+ "@types/unist": "*"
1994
+ }
1995
+ },
1996
+ "node_modules/@types/ms": {
1997
+ "version": "2.1.0",
1998
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
1999
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
2000
+ "license": "MIT"
2001
+ },
2002
  "node_modules/@types/node": {
2003
  "version": "24.10.0",
2004
  "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz",
 
2013
  "version": "19.2.2",
2014
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz",
2015
  "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==",
 
2016
  "license": "MIT",
2017
  "dependencies": {
2018
  "csstype": "^3.0.2"
 
2028
  "@types/react": "^19.2.0"
2029
  }
2030
  },
2031
+ "node_modules/@types/unist": {
2032
+ "version": "3.0.3",
2033
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
2034
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
2035
+ "license": "MIT"
2036
+ },
2037
  "node_modules/@types/use-sync-external-store": {
2038
  "version": "0.0.6",
2039
  "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
 
2311
  "url": "https://opencollective.com/typescript-eslint"
2312
  }
2313
  },
2314
+ "node_modules/@ungap/structured-clone": {
2315
+ "version": "1.3.0",
2316
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
2317
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
2318
+ "license": "ISC"
2319
+ },
2320
  "node_modules/@vitejs/plugin-react": {
2321
  "version": "5.1.0",
2322
  "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz",
 
2418
  "proxy-from-env": "^1.1.0"
2419
  }
2420
  },
2421
+ "node_modules/bail": {
2422
+ "version": "2.0.2",
2423
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
2424
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
2425
+ "license": "MIT",
2426
+ "funding": {
2427
+ "type": "github",
2428
+ "url": "https://github.com/sponsors/wooorm"
2429
+ }
2430
+ },
2431
  "node_modules/balanced-match": {
2432
  "version": "1.0.2",
2433
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
 
2553
  ],
2554
  "license": "CC-BY-4.0"
2555
  },
2556
+ "node_modules/ccount": {
2557
+ "version": "2.0.1",
2558
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
2559
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
2560
+ "license": "MIT",
2561
+ "funding": {
2562
+ "type": "github",
2563
+ "url": "https://github.com/sponsors/wooorm"
2564
+ }
2565
+ },
2566
  "node_modules/chalk": {
2567
  "version": "4.1.2",
2568
  "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
 
2580
  "url": "https://github.com/chalk/chalk?sponsor=1"
2581
  }
2582
  },
2583
+ "node_modules/character-entities": {
2584
+ "version": "2.0.2",
2585
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
2586
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
2587
+ "license": "MIT",
2588
+ "funding": {
2589
+ "type": "github",
2590
+ "url": "https://github.com/sponsors/wooorm"
2591
+ }
2592
+ },
2593
+ "node_modules/character-entities-html4": {
2594
+ "version": "2.1.0",
2595
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
2596
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
2597
+ "license": "MIT",
2598
+ "funding": {
2599
+ "type": "github",
2600
+ "url": "https://github.com/sponsors/wooorm"
2601
+ }
2602
+ },
2603
+ "node_modules/character-entities-legacy": {
2604
+ "version": "3.0.0",
2605
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
2606
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
2607
+ "license": "MIT",
2608
+ "funding": {
2609
+ "type": "github",
2610
+ "url": "https://github.com/sponsors/wooorm"
2611
+ }
2612
+ },
2613
+ "node_modules/character-reference-invalid": {
2614
+ "version": "2.0.1",
2615
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
2616
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
2617
+ "license": "MIT",
2618
+ "funding": {
2619
+ "type": "github",
2620
+ "url": "https://github.com/sponsors/wooorm"
2621
+ }
2622
+ },
2623
  "node_modules/clsx": {
2624
  "version": "2.1.1",
2625
  "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
 
2661
  "node": ">= 0.8"
2662
  }
2663
  },
2664
+ "node_modules/comma-separated-tokens": {
2665
+ "version": "2.0.3",
2666
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
2667
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
2668
+ "license": "MIT",
2669
+ "funding": {
2670
+ "type": "github",
2671
+ "url": "https://github.com/sponsors/wooorm"
2672
+ }
2673
+ },
2674
  "node_modules/concat-map": {
2675
  "version": "0.0.1",
2676
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 
2713
  "version": "3.1.3",
2714
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
2715
  "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
 
2716
  "license": "MIT"
2717
  },
2718
  "node_modules/d3-array": {
 
2846
  "version": "4.4.3",
2847
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
2848
  "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
 
2849
  "license": "MIT",
2850
  "dependencies": {
2851
  "ms": "^2.1.3"
 
2865
  "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
2866
  "license": "MIT"
2867
  },
2868
+ "node_modules/decode-named-character-reference": {
2869
+ "version": "1.2.0",
2870
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz",
2871
+ "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==",
2872
+ "license": "MIT",
2873
+ "dependencies": {
2874
+ "character-entities": "^2.0.0"
2875
+ },
2876
+ "funding": {
2877
+ "type": "github",
2878
+ "url": "https://github.com/sponsors/wooorm"
2879
+ }
2880
+ },
2881
  "node_modules/deep-is": {
2882
  "version": "0.1.4",
2883
  "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
 
2894
  "node": ">=0.4.0"
2895
  }
2896
  },
2897
+ "node_modules/dequal": {
2898
+ "version": "2.0.3",
2899
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
2900
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
2901
+ "license": "MIT",
2902
+ "engines": {
2903
+ "node": ">=6"
2904
+ }
2905
+ },
2906
  "node_modules/detect-libc": {
2907
  "version": "2.1.2",
2908
  "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
 
2912
  "node": ">=8"
2913
  }
2914
  },
2915
+ "node_modules/devlop": {
2916
+ "version": "1.1.0",
2917
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
2918
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
2919
+ "license": "MIT",
2920
+ "dependencies": {
2921
+ "dequal": "^2.0.0"
2922
+ },
2923
+ "funding": {
2924
+ "type": "github",
2925
+ "url": "https://github.com/sponsors/wooorm"
2926
+ }
2927
+ },
2928
  "node_modules/dunder-proto": {
2929
  "version": "1.0.1",
2930
  "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
 
3245
  "node": ">=4.0"
3246
  }
3247
  },
3248
+ "node_modules/estree-util-is-identifier-name": {
3249
+ "version": "3.0.0",
3250
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
3251
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
3252
+ "license": "MIT",
3253
+ "funding": {
3254
+ "type": "opencollective",
3255
+ "url": "https://opencollective.com/unified"
3256
+ }
3257
+ },
3258
  "node_modules/esutils": {
3259
  "version": "2.0.3",
3260
  "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
 
3271
  "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
3272
  "license": "MIT"
3273
  },
3274
+ "node_modules/extend": {
3275
+ "version": "3.0.2",
3276
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
3277
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
3278
+ "license": "MIT"
3279
+ },
3280
  "node_modules/fast-deep-equal": {
3281
  "version": "3.1.3",
3282
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
 
3635
  "node": ">= 0.4"
3636
  }
3637
  },
3638
+ "node_modules/hast-util-to-jsx-runtime": {
3639
+ "version": "2.3.6",
3640
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
3641
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
3642
+ "license": "MIT",
3643
+ "dependencies": {
3644
+ "@types/estree": "^1.0.0",
3645
+ "@types/hast": "^3.0.0",
3646
+ "@types/unist": "^3.0.0",
3647
+ "comma-separated-tokens": "^2.0.0",
3648
+ "devlop": "^1.0.0",
3649
+ "estree-util-is-identifier-name": "^3.0.0",
3650
+ "hast-util-whitespace": "^3.0.0",
3651
+ "mdast-util-mdx-expression": "^2.0.0",
3652
+ "mdast-util-mdx-jsx": "^3.0.0",
3653
+ "mdast-util-mdxjs-esm": "^2.0.0",
3654
+ "property-information": "^7.0.0",
3655
+ "space-separated-tokens": "^2.0.0",
3656
+ "style-to-js": "^1.0.0",
3657
+ "unist-util-position": "^5.0.0",
3658
+ "vfile-message": "^4.0.0"
3659
+ },
3660
+ "funding": {
3661
+ "type": "opencollective",
3662
+ "url": "https://opencollective.com/unified"
3663
+ }
3664
+ },
3665
+ "node_modules/hast-util-whitespace": {
3666
+ "version": "3.0.0",
3667
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
3668
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
3669
+ "license": "MIT",
3670
+ "dependencies": {
3671
+ "@types/hast": "^3.0.0"
3672
+ },
3673
+ "funding": {
3674
+ "type": "opencollective",
3675
+ "url": "https://opencollective.com/unified"
3676
+ }
3677
+ },
3678
+ "node_modules/html-url-attributes": {
3679
+ "version": "3.0.1",
3680
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
3681
+ "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
3682
+ "license": "MIT",
3683
+ "funding": {
3684
+ "type": "opencollective",
3685
+ "url": "https://opencollective.com/unified"
3686
+ }
3687
+ },
3688
  "node_modules/ignore": {
3689
  "version": "5.3.2",
3690
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
 
3732
  "node": ">=0.8.19"
3733
  }
3734
  },
3735
+ "node_modules/inline-style-parser": {
3736
+ "version": "0.2.7",
3737
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
3738
+ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
3739
+ "license": "MIT"
3740
+ },
3741
  "node_modules/internmap": {
3742
  "version": "2.0.3",
3743
  "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
 
3747
  "node": ">=12"
3748
  }
3749
  },
3750
+ "node_modules/is-alphabetical": {
3751
+ "version": "2.0.1",
3752
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
3753
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
3754
+ "license": "MIT",
3755
+ "funding": {
3756
+ "type": "github",
3757
+ "url": "https://github.com/sponsors/wooorm"
3758
+ }
3759
+ },
3760
+ "node_modules/is-alphanumerical": {
3761
+ "version": "2.0.1",
3762
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
3763
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
3764
+ "license": "MIT",
3765
+ "dependencies": {
3766
+ "is-alphabetical": "^2.0.0",
3767
+ "is-decimal": "^2.0.0"
3768
+ },
3769
+ "funding": {
3770
+ "type": "github",
3771
+ "url": "https://github.com/sponsors/wooorm"
3772
+ }
3773
+ },
3774
+ "node_modules/is-decimal": {
3775
+ "version": "2.0.1",
3776
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
3777
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
3778
+ "license": "MIT",
3779
+ "funding": {
3780
+ "type": "github",
3781
+ "url": "https://github.com/sponsors/wooorm"
3782
+ }
3783
+ },
3784
+ "node_modules/is-extglob": {
3785
+ "version": "2.1.1",
3786
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
3787
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
3788
+ "dev": true,
3789
  "license": "MIT",
3790
  "engines": {
3791
  "node": ">=0.10.0"
 
3804
  "node": ">=0.10.0"
3805
  }
3806
  },
3807
+ "node_modules/is-hexadecimal": {
3808
+ "version": "2.0.1",
3809
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
3810
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
3811
+ "license": "MIT",
3812
+ "funding": {
3813
+ "type": "github",
3814
+ "url": "https://github.com/sponsors/wooorm"
3815
+ }
3816
+ },
3817
  "node_modules/is-number": {
3818
  "version": "7.0.0",
3819
  "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
 
3824
  "node": ">=0.12.0"
3825
  }
3826
  },
3827
+ "node_modules/is-plain-obj": {
3828
+ "version": "4.1.0",
3829
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
3830
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
3831
+ "license": "MIT",
3832
+ "engines": {
3833
+ "node": ">=12"
3834
+ },
3835
+ "funding": {
3836
+ "url": "https://github.com/sponsors/sindresorhus"
3837
+ }
3838
+ },
3839
  "node_modules/isexe": {
3840
  "version": "2.0.0",
3841
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
 
4214
  "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
4215
  "license": "MIT"
4216
  },
4217
+ "node_modules/lodash.merge": {
4218
+ "version": "4.6.2",
4219
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
4220
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
4221
+ "dev": true,
4222
+ "license": "MIT"
4223
+ },
4224
+ "node_modules/longest-streak": {
4225
+ "version": "3.1.0",
4226
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
4227
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
4228
+ "license": "MIT",
4229
+ "funding": {
4230
+ "type": "github",
4231
+ "url": "https://github.com/sponsors/wooorm"
4232
+ }
4233
+ },
4234
+ "node_modules/lru-cache": {
4235
+ "version": "5.1.1",
4236
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
4237
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
4238
+ "dev": true,
4239
+ "license": "ISC",
4240
+ "dependencies": {
4241
+ "yallist": "^3.0.2"
4242
+ }
4243
+ },
4244
+ "node_modules/lucide-react": {
4245
+ "version": "0.553.0",
4246
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.553.0.tgz",
4247
+ "integrity": "sha512-BRgX5zrWmNy/lkVAe0dXBgd7XQdZ3HTf+Hwe3c9WK6dqgnj9h+hxV+MDncM88xDWlCq27+TKvHGE70ViODNILw==",
4248
+ "license": "ISC",
4249
+ "peerDependencies": {
4250
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
4251
+ }
4252
+ },
4253
+ "node_modules/magic-string": {
4254
+ "version": "0.30.21",
4255
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
4256
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
4257
+ "license": "MIT",
4258
+ "dependencies": {
4259
+ "@jridgewell/sourcemap-codec": "^1.5.5"
4260
+ }
4261
+ },
4262
+ "node_modules/markdown-table": {
4263
+ "version": "3.0.4",
4264
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
4265
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
4266
+ "license": "MIT",
4267
+ "funding": {
4268
+ "type": "github",
4269
+ "url": "https://github.com/sponsors/wooorm"
4270
+ }
4271
+ },
4272
+ "node_modules/math-intrinsics": {
4273
+ "version": "1.1.0",
4274
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
4275
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
4276
+ "license": "MIT",
4277
+ "engines": {
4278
+ "node": ">= 0.4"
4279
+ }
4280
+ },
4281
+ "node_modules/mdast-util-find-and-replace": {
4282
+ "version": "3.0.2",
4283
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
4284
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
4285
+ "license": "MIT",
4286
+ "dependencies": {
4287
+ "@types/mdast": "^4.0.0",
4288
+ "escape-string-regexp": "^5.0.0",
4289
+ "unist-util-is": "^6.0.0",
4290
+ "unist-util-visit-parents": "^6.0.0"
4291
+ },
4292
+ "funding": {
4293
+ "type": "opencollective",
4294
+ "url": "https://opencollective.com/unified"
4295
+ }
4296
+ },
4297
+ "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
4298
+ "version": "5.0.0",
4299
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
4300
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
4301
+ "license": "MIT",
4302
+ "engines": {
4303
+ "node": ">=12"
4304
+ },
4305
+ "funding": {
4306
+ "url": "https://github.com/sponsors/sindresorhus"
4307
+ }
4308
+ },
4309
+ "node_modules/mdast-util-from-markdown": {
4310
+ "version": "2.0.2",
4311
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
4312
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
4313
+ "license": "MIT",
4314
+ "dependencies": {
4315
+ "@types/mdast": "^4.0.0",
4316
+ "@types/unist": "^3.0.0",
4317
+ "decode-named-character-reference": "^1.0.0",
4318
+ "devlop": "^1.0.0",
4319
+ "mdast-util-to-string": "^4.0.0",
4320
+ "micromark": "^4.0.0",
4321
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
4322
+ "micromark-util-decode-string": "^2.0.0",
4323
+ "micromark-util-normalize-identifier": "^2.0.0",
4324
+ "micromark-util-symbol": "^2.0.0",
4325
+ "micromark-util-types": "^2.0.0",
4326
+ "unist-util-stringify-position": "^4.0.0"
4327
+ },
4328
+ "funding": {
4329
+ "type": "opencollective",
4330
+ "url": "https://opencollective.com/unified"
4331
+ }
4332
+ },
4333
+ "node_modules/mdast-util-gfm": {
4334
+ "version": "3.1.0",
4335
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
4336
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
4337
+ "license": "MIT",
4338
+ "dependencies": {
4339
+ "mdast-util-from-markdown": "^2.0.0",
4340
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
4341
+ "mdast-util-gfm-footnote": "^2.0.0",
4342
+ "mdast-util-gfm-strikethrough": "^2.0.0",
4343
+ "mdast-util-gfm-table": "^2.0.0",
4344
+ "mdast-util-gfm-task-list-item": "^2.0.0",
4345
+ "mdast-util-to-markdown": "^2.0.0"
4346
+ },
4347
+ "funding": {
4348
+ "type": "opencollective",
4349
+ "url": "https://opencollective.com/unified"
4350
+ }
4351
+ },
4352
+ "node_modules/mdast-util-gfm-autolink-literal": {
4353
+ "version": "2.0.1",
4354
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
4355
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
4356
+ "license": "MIT",
4357
+ "dependencies": {
4358
+ "@types/mdast": "^4.0.0",
4359
+ "ccount": "^2.0.0",
4360
+ "devlop": "^1.0.0",
4361
+ "mdast-util-find-and-replace": "^3.0.0",
4362
+ "micromark-util-character": "^2.0.0"
4363
+ },
4364
+ "funding": {
4365
+ "type": "opencollective",
4366
+ "url": "https://opencollective.com/unified"
4367
+ }
4368
+ },
4369
+ "node_modules/mdast-util-gfm-footnote": {
4370
+ "version": "2.1.0",
4371
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
4372
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
4373
+ "license": "MIT",
4374
+ "dependencies": {
4375
+ "@types/mdast": "^4.0.0",
4376
+ "devlop": "^1.1.0",
4377
+ "mdast-util-from-markdown": "^2.0.0",
4378
+ "mdast-util-to-markdown": "^2.0.0",
4379
+ "micromark-util-normalize-identifier": "^2.0.0"
4380
+ },
4381
+ "funding": {
4382
+ "type": "opencollective",
4383
+ "url": "https://opencollective.com/unified"
4384
+ }
4385
+ },
4386
+ "node_modules/mdast-util-gfm-strikethrough": {
4387
+ "version": "2.0.0",
4388
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
4389
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
4390
+ "license": "MIT",
4391
+ "dependencies": {
4392
+ "@types/mdast": "^4.0.0",
4393
+ "mdast-util-from-markdown": "^2.0.0",
4394
+ "mdast-util-to-markdown": "^2.0.0"
4395
+ },
4396
+ "funding": {
4397
+ "type": "opencollective",
4398
+ "url": "https://opencollective.com/unified"
4399
+ }
4400
+ },
4401
+ "node_modules/mdast-util-gfm-table": {
4402
+ "version": "2.0.0",
4403
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
4404
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
4405
+ "license": "MIT",
4406
+ "dependencies": {
4407
+ "@types/mdast": "^4.0.0",
4408
+ "devlop": "^1.0.0",
4409
+ "markdown-table": "^3.0.0",
4410
+ "mdast-util-from-markdown": "^2.0.0",
4411
+ "mdast-util-to-markdown": "^2.0.0"
4412
+ },
4413
+ "funding": {
4414
+ "type": "opencollective",
4415
+ "url": "https://opencollective.com/unified"
4416
+ }
4417
+ },
4418
+ "node_modules/mdast-util-gfm-task-list-item": {
4419
+ "version": "2.0.0",
4420
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
4421
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
4422
+ "license": "MIT",
4423
+ "dependencies": {
4424
+ "@types/mdast": "^4.0.0",
4425
+ "devlop": "^1.0.0",
4426
+ "mdast-util-from-markdown": "^2.0.0",
4427
+ "mdast-util-to-markdown": "^2.0.0"
4428
+ },
4429
+ "funding": {
4430
+ "type": "opencollective",
4431
+ "url": "https://opencollective.com/unified"
4432
+ }
4433
+ },
4434
+ "node_modules/mdast-util-mdx-expression": {
4435
+ "version": "2.0.1",
4436
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
4437
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
4438
+ "license": "MIT",
4439
+ "dependencies": {
4440
+ "@types/estree-jsx": "^1.0.0",
4441
+ "@types/hast": "^3.0.0",
4442
+ "@types/mdast": "^4.0.0",
4443
+ "devlop": "^1.0.0",
4444
+ "mdast-util-from-markdown": "^2.0.0",
4445
+ "mdast-util-to-markdown": "^2.0.0"
4446
+ },
4447
+ "funding": {
4448
+ "type": "opencollective",
4449
+ "url": "https://opencollective.com/unified"
4450
+ }
4451
+ },
4452
+ "node_modules/mdast-util-mdx-jsx": {
4453
+ "version": "3.2.0",
4454
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
4455
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
4456
+ "license": "MIT",
4457
+ "dependencies": {
4458
+ "@types/estree-jsx": "^1.0.0",
4459
+ "@types/hast": "^3.0.0",
4460
+ "@types/mdast": "^4.0.0",
4461
+ "@types/unist": "^3.0.0",
4462
+ "ccount": "^2.0.0",
4463
+ "devlop": "^1.1.0",
4464
+ "mdast-util-from-markdown": "^2.0.0",
4465
+ "mdast-util-to-markdown": "^2.0.0",
4466
+ "parse-entities": "^4.0.0",
4467
+ "stringify-entities": "^4.0.0",
4468
+ "unist-util-stringify-position": "^4.0.0",
4469
+ "vfile-message": "^4.0.0"
4470
+ },
4471
+ "funding": {
4472
+ "type": "opencollective",
4473
+ "url": "https://opencollective.com/unified"
4474
+ }
4475
+ },
4476
+ "node_modules/mdast-util-mdxjs-esm": {
4477
+ "version": "2.0.1",
4478
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
4479
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
4480
+ "license": "MIT",
4481
+ "dependencies": {
4482
+ "@types/estree-jsx": "^1.0.0",
4483
+ "@types/hast": "^3.0.0",
4484
+ "@types/mdast": "^4.0.0",
4485
+ "devlop": "^1.0.0",
4486
+ "mdast-util-from-markdown": "^2.0.0",
4487
+ "mdast-util-to-markdown": "^2.0.0"
4488
+ },
4489
+ "funding": {
4490
+ "type": "opencollective",
4491
+ "url": "https://opencollective.com/unified"
4492
+ }
4493
+ },
4494
+ "node_modules/mdast-util-phrasing": {
4495
+ "version": "4.1.0",
4496
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
4497
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
4498
+ "license": "MIT",
4499
+ "dependencies": {
4500
+ "@types/mdast": "^4.0.0",
4501
+ "unist-util-is": "^6.0.0"
4502
+ },
4503
+ "funding": {
4504
+ "type": "opencollective",
4505
+ "url": "https://opencollective.com/unified"
4506
+ }
4507
+ },
4508
+ "node_modules/mdast-util-to-hast": {
4509
+ "version": "13.2.1",
4510
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
4511
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
4512
+ "license": "MIT",
4513
+ "dependencies": {
4514
+ "@types/hast": "^3.0.0",
4515
+ "@types/mdast": "^4.0.0",
4516
+ "@ungap/structured-clone": "^1.0.0",
4517
+ "devlop": "^1.0.0",
4518
+ "micromark-util-sanitize-uri": "^2.0.0",
4519
+ "trim-lines": "^3.0.0",
4520
+ "unist-util-position": "^5.0.0",
4521
+ "unist-util-visit": "^5.0.0",
4522
+ "vfile": "^6.0.0"
4523
+ },
4524
+ "funding": {
4525
+ "type": "opencollective",
4526
+ "url": "https://opencollective.com/unified"
4527
+ }
4528
+ },
4529
+ "node_modules/mdast-util-to-markdown": {
4530
+ "version": "2.1.2",
4531
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
4532
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
4533
+ "license": "MIT",
4534
+ "dependencies": {
4535
+ "@types/mdast": "^4.0.0",
4536
+ "@types/unist": "^3.0.0",
4537
+ "longest-streak": "^3.0.0",
4538
+ "mdast-util-phrasing": "^4.0.0",
4539
+ "mdast-util-to-string": "^4.0.0",
4540
+ "micromark-util-classify-character": "^2.0.0",
4541
+ "micromark-util-decode-string": "^2.0.0",
4542
+ "unist-util-visit": "^5.0.0",
4543
+ "zwitch": "^2.0.0"
4544
+ },
4545
+ "funding": {
4546
+ "type": "opencollective",
4547
+ "url": "https://opencollective.com/unified"
4548
+ }
4549
+ },
4550
+ "node_modules/mdast-util-to-string": {
4551
+ "version": "4.0.0",
4552
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
4553
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
4554
+ "license": "MIT",
4555
+ "dependencies": {
4556
+ "@types/mdast": "^4.0.0"
4557
+ },
4558
+ "funding": {
4559
+ "type": "opencollective",
4560
+ "url": "https://opencollective.com/unified"
4561
+ }
4562
+ },
4563
+ "node_modules/merge2": {
4564
+ "version": "1.4.1",
4565
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
4566
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
4567
+ "dev": true,
4568
+ "license": "MIT",
4569
+ "engines": {
4570
+ "node": ">= 8"
4571
+ }
4572
+ },
4573
+ "node_modules/micromark": {
4574
+ "version": "4.0.2",
4575
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
4576
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
4577
+ "funding": [
4578
+ {
4579
+ "type": "GitHub Sponsors",
4580
+ "url": "https://github.com/sponsors/unifiedjs"
4581
+ },
4582
+ {
4583
+ "type": "OpenCollective",
4584
+ "url": "https://opencollective.com/unified"
4585
+ }
4586
+ ],
4587
+ "license": "MIT",
4588
+ "dependencies": {
4589
+ "@types/debug": "^4.0.0",
4590
+ "debug": "^4.0.0",
4591
+ "decode-named-character-reference": "^1.0.0",
4592
+ "devlop": "^1.0.0",
4593
+ "micromark-core-commonmark": "^2.0.0",
4594
+ "micromark-factory-space": "^2.0.0",
4595
+ "micromark-util-character": "^2.0.0",
4596
+ "micromark-util-chunked": "^2.0.0",
4597
+ "micromark-util-combine-extensions": "^2.0.0",
4598
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
4599
+ "micromark-util-encode": "^2.0.0",
4600
+ "micromark-util-normalize-identifier": "^2.0.0",
4601
+ "micromark-util-resolve-all": "^2.0.0",
4602
+ "micromark-util-sanitize-uri": "^2.0.0",
4603
+ "micromark-util-subtokenize": "^2.0.0",
4604
+ "micromark-util-symbol": "^2.0.0",
4605
+ "micromark-util-types": "^2.0.0"
4606
+ }
4607
+ },
4608
+ "node_modules/micromark-core-commonmark": {
4609
+ "version": "2.0.3",
4610
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
4611
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
4612
+ "funding": [
4613
+ {
4614
+ "type": "GitHub Sponsors",
4615
+ "url": "https://github.com/sponsors/unifiedjs"
4616
+ },
4617
+ {
4618
+ "type": "OpenCollective",
4619
+ "url": "https://opencollective.com/unified"
4620
+ }
4621
+ ],
4622
+ "license": "MIT",
4623
+ "dependencies": {
4624
+ "decode-named-character-reference": "^1.0.0",
4625
+ "devlop": "^1.0.0",
4626
+ "micromark-factory-destination": "^2.0.0",
4627
+ "micromark-factory-label": "^2.0.0",
4628
+ "micromark-factory-space": "^2.0.0",
4629
+ "micromark-factory-title": "^2.0.0",
4630
+ "micromark-factory-whitespace": "^2.0.0",
4631
+ "micromark-util-character": "^2.0.0",
4632
+ "micromark-util-chunked": "^2.0.0",
4633
+ "micromark-util-classify-character": "^2.0.0",
4634
+ "micromark-util-html-tag-name": "^2.0.0",
4635
+ "micromark-util-normalize-identifier": "^2.0.0",
4636
+ "micromark-util-resolve-all": "^2.0.0",
4637
+ "micromark-util-subtokenize": "^2.0.0",
4638
+ "micromark-util-symbol": "^2.0.0",
4639
+ "micromark-util-types": "^2.0.0"
4640
+ }
4641
+ },
4642
+ "node_modules/micromark-extension-gfm": {
4643
+ "version": "3.0.0",
4644
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
4645
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
4646
+ "license": "MIT",
4647
+ "dependencies": {
4648
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
4649
+ "micromark-extension-gfm-footnote": "^2.0.0",
4650
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
4651
+ "micromark-extension-gfm-table": "^2.0.0",
4652
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
4653
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
4654
+ "micromark-util-combine-extensions": "^2.0.0",
4655
+ "micromark-util-types": "^2.0.0"
4656
+ },
4657
+ "funding": {
4658
+ "type": "opencollective",
4659
+ "url": "https://opencollective.com/unified"
4660
+ }
4661
+ },
4662
+ "node_modules/micromark-extension-gfm-autolink-literal": {
4663
+ "version": "2.1.0",
4664
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
4665
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
4666
+ "license": "MIT",
4667
+ "dependencies": {
4668
+ "micromark-util-character": "^2.0.0",
4669
+ "micromark-util-sanitize-uri": "^2.0.0",
4670
+ "micromark-util-symbol": "^2.0.0",
4671
+ "micromark-util-types": "^2.0.0"
4672
+ },
4673
+ "funding": {
4674
+ "type": "opencollective",
4675
+ "url": "https://opencollective.com/unified"
4676
+ }
4677
+ },
4678
+ "node_modules/micromark-extension-gfm-footnote": {
4679
+ "version": "2.1.0",
4680
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
4681
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
4682
+ "license": "MIT",
4683
+ "dependencies": {
4684
+ "devlop": "^1.0.0",
4685
+ "micromark-core-commonmark": "^2.0.0",
4686
+ "micromark-factory-space": "^2.0.0",
4687
+ "micromark-util-character": "^2.0.0",
4688
+ "micromark-util-normalize-identifier": "^2.0.0",
4689
+ "micromark-util-sanitize-uri": "^2.0.0",
4690
+ "micromark-util-symbol": "^2.0.0",
4691
+ "micromark-util-types": "^2.0.0"
4692
+ },
4693
+ "funding": {
4694
+ "type": "opencollective",
4695
+ "url": "https://opencollective.com/unified"
4696
+ }
4697
+ },
4698
+ "node_modules/micromark-extension-gfm-strikethrough": {
4699
+ "version": "2.1.0",
4700
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
4701
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
4702
+ "license": "MIT",
4703
+ "dependencies": {
4704
+ "devlop": "^1.0.0",
4705
+ "micromark-util-chunked": "^2.0.0",
4706
+ "micromark-util-classify-character": "^2.0.0",
4707
+ "micromark-util-resolve-all": "^2.0.0",
4708
+ "micromark-util-symbol": "^2.0.0",
4709
+ "micromark-util-types": "^2.0.0"
4710
+ },
4711
+ "funding": {
4712
+ "type": "opencollective",
4713
+ "url": "https://opencollective.com/unified"
4714
+ }
4715
+ },
4716
+ "node_modules/micromark-extension-gfm-table": {
4717
+ "version": "2.1.1",
4718
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
4719
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
4720
+ "license": "MIT",
4721
+ "dependencies": {
4722
+ "devlop": "^1.0.0",
4723
+ "micromark-factory-space": "^2.0.0",
4724
+ "micromark-util-character": "^2.0.0",
4725
+ "micromark-util-symbol": "^2.0.0",
4726
+ "micromark-util-types": "^2.0.0"
4727
+ },
4728
+ "funding": {
4729
+ "type": "opencollective",
4730
+ "url": "https://opencollective.com/unified"
4731
+ }
4732
+ },
4733
+ "node_modules/micromark-extension-gfm-tagfilter": {
4734
+ "version": "2.0.0",
4735
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
4736
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
4737
+ "license": "MIT",
4738
+ "dependencies": {
4739
+ "micromark-util-types": "^2.0.0"
4740
+ },
4741
+ "funding": {
4742
+ "type": "opencollective",
4743
+ "url": "https://opencollective.com/unified"
4744
+ }
4745
+ },
4746
+ "node_modules/micromark-extension-gfm-task-list-item": {
4747
+ "version": "2.1.0",
4748
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
4749
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
4750
+ "license": "MIT",
4751
+ "dependencies": {
4752
+ "devlop": "^1.0.0",
4753
+ "micromark-factory-space": "^2.0.0",
4754
+ "micromark-util-character": "^2.0.0",
4755
+ "micromark-util-symbol": "^2.0.0",
4756
+ "micromark-util-types": "^2.0.0"
4757
+ },
4758
+ "funding": {
4759
+ "type": "opencollective",
4760
+ "url": "https://opencollective.com/unified"
4761
+ }
4762
+ },
4763
+ "node_modules/micromark-factory-destination": {
4764
+ "version": "2.0.1",
4765
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
4766
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
4767
+ "funding": [
4768
+ {
4769
+ "type": "GitHub Sponsors",
4770
+ "url": "https://github.com/sponsors/unifiedjs"
4771
+ },
4772
+ {
4773
+ "type": "OpenCollective",
4774
+ "url": "https://opencollective.com/unified"
4775
+ }
4776
+ ],
4777
+ "license": "MIT",
4778
+ "dependencies": {
4779
+ "micromark-util-character": "^2.0.0",
4780
+ "micromark-util-symbol": "^2.0.0",
4781
+ "micromark-util-types": "^2.0.0"
4782
+ }
4783
+ },
4784
+ "node_modules/micromark-factory-label": {
4785
+ "version": "2.0.1",
4786
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
4787
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
4788
+ "funding": [
4789
+ {
4790
+ "type": "GitHub Sponsors",
4791
+ "url": "https://github.com/sponsors/unifiedjs"
4792
+ },
4793
+ {
4794
+ "type": "OpenCollective",
4795
+ "url": "https://opencollective.com/unified"
4796
+ }
4797
+ ],
4798
+ "license": "MIT",
4799
+ "dependencies": {
4800
+ "devlop": "^1.0.0",
4801
+ "micromark-util-character": "^2.0.0",
4802
+ "micromark-util-symbol": "^2.0.0",
4803
+ "micromark-util-types": "^2.0.0"
4804
+ }
4805
+ },
4806
+ "node_modules/micromark-factory-space": {
4807
+ "version": "2.0.1",
4808
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
4809
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
4810
+ "funding": [
4811
+ {
4812
+ "type": "GitHub Sponsors",
4813
+ "url": "https://github.com/sponsors/unifiedjs"
4814
+ },
4815
+ {
4816
+ "type": "OpenCollective",
4817
+ "url": "https://opencollective.com/unified"
4818
+ }
4819
+ ],
4820
+ "license": "MIT",
4821
+ "dependencies": {
4822
+ "micromark-util-character": "^2.0.0",
4823
+ "micromark-util-types": "^2.0.0"
4824
+ }
4825
+ },
4826
+ "node_modules/micromark-factory-title": {
4827
+ "version": "2.0.1",
4828
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
4829
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
4830
+ "funding": [
4831
+ {
4832
+ "type": "GitHub Sponsors",
4833
+ "url": "https://github.com/sponsors/unifiedjs"
4834
+ },
4835
+ {
4836
+ "type": "OpenCollective",
4837
+ "url": "https://opencollective.com/unified"
4838
+ }
4839
+ ],
4840
+ "license": "MIT",
4841
+ "dependencies": {
4842
+ "micromark-factory-space": "^2.0.0",
4843
+ "micromark-util-character": "^2.0.0",
4844
+ "micromark-util-symbol": "^2.0.0",
4845
+ "micromark-util-types": "^2.0.0"
4846
+ }
4847
+ },
4848
+ "node_modules/micromark-factory-whitespace": {
4849
+ "version": "2.0.1",
4850
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
4851
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
4852
+ "funding": [
4853
+ {
4854
+ "type": "GitHub Sponsors",
4855
+ "url": "https://github.com/sponsors/unifiedjs"
4856
+ },
4857
+ {
4858
+ "type": "OpenCollective",
4859
+ "url": "https://opencollective.com/unified"
4860
+ }
4861
+ ],
4862
+ "license": "MIT",
4863
+ "dependencies": {
4864
+ "micromark-factory-space": "^2.0.0",
4865
+ "micromark-util-character": "^2.0.0",
4866
+ "micromark-util-symbol": "^2.0.0",
4867
+ "micromark-util-types": "^2.0.0"
4868
+ }
4869
+ },
4870
+ "node_modules/micromark-util-character": {
4871
+ "version": "2.1.1",
4872
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
4873
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
4874
+ "funding": [
4875
+ {
4876
+ "type": "GitHub Sponsors",
4877
+ "url": "https://github.com/sponsors/unifiedjs"
4878
+ },
4879
+ {
4880
+ "type": "OpenCollective",
4881
+ "url": "https://opencollective.com/unified"
4882
+ }
4883
+ ],
4884
+ "license": "MIT",
4885
+ "dependencies": {
4886
+ "micromark-util-symbol": "^2.0.0",
4887
+ "micromark-util-types": "^2.0.0"
4888
+ }
4889
+ },
4890
+ "node_modules/micromark-util-chunked": {
4891
+ "version": "2.0.1",
4892
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
4893
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
4894
+ "funding": [
4895
+ {
4896
+ "type": "GitHub Sponsors",
4897
+ "url": "https://github.com/sponsors/unifiedjs"
4898
+ },
4899
+ {
4900
+ "type": "OpenCollective",
4901
+ "url": "https://opencollective.com/unified"
4902
+ }
4903
+ ],
4904
+ "license": "MIT",
4905
+ "dependencies": {
4906
+ "micromark-util-symbol": "^2.0.0"
4907
+ }
4908
+ },
4909
+ "node_modules/micromark-util-classify-character": {
4910
+ "version": "2.0.1",
4911
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
4912
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
4913
+ "funding": [
4914
+ {
4915
+ "type": "GitHub Sponsors",
4916
+ "url": "https://github.com/sponsors/unifiedjs"
4917
+ },
4918
+ {
4919
+ "type": "OpenCollective",
4920
+ "url": "https://opencollective.com/unified"
4921
+ }
4922
+ ],
4923
+ "license": "MIT",
4924
+ "dependencies": {
4925
+ "micromark-util-character": "^2.0.0",
4926
+ "micromark-util-symbol": "^2.0.0",
4927
+ "micromark-util-types": "^2.0.0"
4928
+ }
4929
+ },
4930
+ "node_modules/micromark-util-combine-extensions": {
4931
+ "version": "2.0.1",
4932
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
4933
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
4934
+ "funding": [
4935
+ {
4936
+ "type": "GitHub Sponsors",
4937
+ "url": "https://github.com/sponsors/unifiedjs"
4938
+ },
4939
+ {
4940
+ "type": "OpenCollective",
4941
+ "url": "https://opencollective.com/unified"
4942
+ }
4943
+ ],
4944
+ "license": "MIT",
4945
+ "dependencies": {
4946
+ "micromark-util-chunked": "^2.0.0",
4947
+ "micromark-util-types": "^2.0.0"
4948
+ }
4949
+ },
4950
+ "node_modules/micromark-util-decode-numeric-character-reference": {
4951
+ "version": "2.0.2",
4952
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
4953
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
4954
+ "funding": [
4955
+ {
4956
+ "type": "GitHub Sponsors",
4957
+ "url": "https://github.com/sponsors/unifiedjs"
4958
+ },
4959
+ {
4960
+ "type": "OpenCollective",
4961
+ "url": "https://opencollective.com/unified"
4962
+ }
4963
+ ],
4964
+ "license": "MIT",
4965
+ "dependencies": {
4966
+ "micromark-util-symbol": "^2.0.0"
4967
+ }
4968
+ },
4969
+ "node_modules/micromark-util-decode-string": {
4970
+ "version": "2.0.1",
4971
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
4972
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
4973
+ "funding": [
4974
+ {
4975
+ "type": "GitHub Sponsors",
4976
+ "url": "https://github.com/sponsors/unifiedjs"
4977
+ },
4978
+ {
4979
+ "type": "OpenCollective",
4980
+ "url": "https://opencollective.com/unified"
4981
+ }
4982
+ ],
4983
+ "license": "MIT",
4984
+ "dependencies": {
4985
+ "decode-named-character-reference": "^1.0.0",
4986
+ "micromark-util-character": "^2.0.0",
4987
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
4988
+ "micromark-util-symbol": "^2.0.0"
4989
+ }
4990
+ },
4991
+ "node_modules/micromark-util-encode": {
4992
+ "version": "2.0.1",
4993
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
4994
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
4995
+ "funding": [
4996
+ {
4997
+ "type": "GitHub Sponsors",
4998
+ "url": "https://github.com/sponsors/unifiedjs"
4999
+ },
5000
+ {
5001
+ "type": "OpenCollective",
5002
+ "url": "https://opencollective.com/unified"
5003
+ }
5004
+ ],
5005
+ "license": "MIT"
5006
+ },
5007
+ "node_modules/micromark-util-html-tag-name": {
5008
+ "version": "2.0.1",
5009
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
5010
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
5011
+ "funding": [
5012
+ {
5013
+ "type": "GitHub Sponsors",
5014
+ "url": "https://github.com/sponsors/unifiedjs"
5015
+ },
5016
+ {
5017
+ "type": "OpenCollective",
5018
+ "url": "https://opencollective.com/unified"
5019
+ }
5020
+ ],
5021
  "license": "MIT"
5022
  },
5023
+ "node_modules/micromark-util-normalize-identifier": {
5024
+ "version": "2.0.1",
5025
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
5026
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
5027
+ "funding": [
5028
+ {
5029
+ "type": "GitHub Sponsors",
5030
+ "url": "https://github.com/sponsors/unifiedjs"
5031
+ },
5032
+ {
5033
+ "type": "OpenCollective",
5034
+ "url": "https://opencollective.com/unified"
5035
+ }
5036
+ ],
5037
+ "license": "MIT",
5038
  "dependencies": {
5039
+ "micromark-util-symbol": "^2.0.0"
 
 
 
 
 
 
 
 
 
5040
  }
5041
  },
5042
+ "node_modules/micromark-util-resolve-all": {
5043
+ "version": "2.0.1",
5044
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
5045
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
5046
+ "funding": [
5047
+ {
5048
+ "type": "GitHub Sponsors",
5049
+ "url": "https://github.com/sponsors/unifiedjs"
5050
+ },
5051
+ {
5052
+ "type": "OpenCollective",
5053
+ "url": "https://opencollective.com/unified"
5054
+ }
5055
+ ],
5056
  "license": "MIT",
5057
  "dependencies": {
5058
+ "micromark-util-types": "^2.0.0"
5059
  }
5060
  },
5061
+ "node_modules/micromark-util-sanitize-uri": {
5062
+ "version": "2.0.1",
5063
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
5064
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
5065
+ "funding": [
5066
+ {
5067
+ "type": "GitHub Sponsors",
5068
+ "url": "https://github.com/sponsors/unifiedjs"
5069
+ },
5070
+ {
5071
+ "type": "OpenCollective",
5072
+ "url": "https://opencollective.com/unified"
5073
+ }
5074
+ ],
5075
  "license": "MIT",
5076
+ "dependencies": {
5077
+ "micromark-util-character": "^2.0.0",
5078
+ "micromark-util-encode": "^2.0.0",
5079
+ "micromark-util-symbol": "^2.0.0"
5080
  }
5081
  },
5082
+ "node_modules/micromark-util-subtokenize": {
5083
+ "version": "2.1.0",
5084
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
5085
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
5086
+ "funding": [
5087
+ {
5088
+ "type": "GitHub Sponsors",
5089
+ "url": "https://github.com/sponsors/unifiedjs"
5090
+ },
5091
+ {
5092
+ "type": "OpenCollective",
5093
+ "url": "https://opencollective.com/unified"
5094
+ }
5095
+ ],
5096
  "license": "MIT",
5097
+ "dependencies": {
5098
+ "devlop": "^1.0.0",
5099
+ "micromark-util-chunked": "^2.0.0",
5100
+ "micromark-util-symbol": "^2.0.0",
5101
+ "micromark-util-types": "^2.0.0"
5102
  }
5103
  },
5104
+ "node_modules/micromark-util-symbol": {
5105
+ "version": "2.0.1",
5106
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
5107
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
5108
+ "funding": [
5109
+ {
5110
+ "type": "GitHub Sponsors",
5111
+ "url": "https://github.com/sponsors/unifiedjs"
5112
+ },
5113
+ {
5114
+ "type": "OpenCollective",
5115
+ "url": "https://opencollective.com/unified"
5116
+ }
5117
+ ],
5118
+ "license": "MIT"
5119
+ },
5120
+ "node_modules/micromark-util-types": {
5121
+ "version": "2.0.2",
5122
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
5123
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
5124
+ "funding": [
5125
+ {
5126
+ "type": "GitHub Sponsors",
5127
+ "url": "https://github.com/sponsors/unifiedjs"
5128
+ },
5129
+ {
5130
+ "type": "OpenCollective",
5131
+ "url": "https://opencollective.com/unified"
5132
+ }
5133
+ ],
5134
+ "license": "MIT"
5135
+ },
5136
  "node_modules/micromatch": {
5137
  "version": "4.0.8",
5138
  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
 
5200
  "version": "2.1.3",
5201
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
5202
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
 
5203
  "license": "MIT"
5204
  },
5205
  "node_modules/nanoid": {
 
5309
  "node": ">=6"
5310
  }
5311
  },
5312
+ "node_modules/parse-entities": {
5313
+ "version": "4.0.2",
5314
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
5315
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
5316
+ "license": "MIT",
5317
+ "dependencies": {
5318
+ "@types/unist": "^2.0.0",
5319
+ "character-entities-legacy": "^3.0.0",
5320
+ "character-reference-invalid": "^2.0.0",
5321
+ "decode-named-character-reference": "^1.0.0",
5322
+ "is-alphanumerical": "^2.0.0",
5323
+ "is-decimal": "^2.0.0",
5324
+ "is-hexadecimal": "^2.0.0"
5325
+ },
5326
+ "funding": {
5327
+ "type": "github",
5328
+ "url": "https://github.com/sponsors/wooorm"
5329
+ }
5330
+ },
5331
+ "node_modules/parse-entities/node_modules/@types/unist": {
5332
+ "version": "2.0.11",
5333
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
5334
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
5335
+ "license": "MIT"
5336
+ },
5337
  "node_modules/path-exists": {
5338
  "version": "4.0.0",
5339
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
 
5354
  "node": ">=8"
5355
  }
5356
  },
5357
+ "node_modules/pdfjs-dist": {
5358
+ "version": "5.4.449",
5359
+ "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.449.tgz",
5360
+ "integrity": "sha512-CegnUaT0QwAyQMS+7o2POr4wWUNNe8VaKKlcuoRHeYo98cVnqPpwOXNSx6Trl6szH02JrRcsPgletV6GmF3LtQ==",
5361
+ "license": "Apache-2.0",
5362
+ "engines": {
5363
+ "node": ">=20.16.0 || >=22.3.0"
5364
+ },
5365
+ "optionalDependencies": {
5366
+ "@napi-rs/canvas": "^0.1.81"
5367
+ }
5368
+ },
5369
  "node_modules/picocolors": {
5370
  "version": "1.1.1",
5371
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
 
5423
  "node": ">= 0.8.0"
5424
  }
5425
  },
5426
+ "node_modules/property-information": {
5427
+ "version": "7.1.0",
5428
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
5429
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
5430
+ "license": "MIT",
5431
+ "funding": {
5432
+ "type": "github",
5433
+ "url": "https://github.com/sponsors/wooorm"
5434
+ }
5435
+ },
5436
  "node_modules/proxy-from-env": {
5437
  "version": "1.1.0",
5438
  "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
 
5498
  "license": "MIT",
5499
  "peer": true
5500
  },
5501
+ "node_modules/react-markdown": {
5502
+ "version": "10.1.0",
5503
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz",
5504
+ "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==",
5505
+ "license": "MIT",
5506
+ "dependencies": {
5507
+ "@types/hast": "^3.0.0",
5508
+ "@types/mdast": "^4.0.0",
5509
+ "devlop": "^1.0.0",
5510
+ "hast-util-to-jsx-runtime": "^2.0.0",
5511
+ "html-url-attributes": "^3.0.0",
5512
+ "mdast-util-to-hast": "^13.0.0",
5513
+ "remark-parse": "^11.0.0",
5514
+ "remark-rehype": "^11.0.0",
5515
+ "unified": "^11.0.0",
5516
+ "unist-util-visit": "^5.0.0",
5517
+ "vfile": "^6.0.0"
5518
+ },
5519
+ "funding": {
5520
+ "type": "opencollective",
5521
+ "url": "https://opencollective.com/unified"
5522
+ },
5523
+ "peerDependencies": {
5524
+ "@types/react": ">=18",
5525
+ "react": ">=18"
5526
+ }
5527
+ },
5528
  "node_modules/react-merge-refs": {
5529
  "version": "2.1.1",
5530
  "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-2.1.1.tgz",
 
5651
  "redux": "^5.0.0"
5652
  }
5653
  },
5654
+ "node_modules/remark-gfm": {
5655
+ "version": "4.0.1",
5656
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
5657
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
5658
+ "license": "MIT",
5659
+ "dependencies": {
5660
+ "@types/mdast": "^4.0.0",
5661
+ "mdast-util-gfm": "^3.0.0",
5662
+ "micromark-extension-gfm": "^3.0.0",
5663
+ "remark-parse": "^11.0.0",
5664
+ "remark-stringify": "^11.0.0",
5665
+ "unified": "^11.0.0"
5666
+ },
5667
+ "funding": {
5668
+ "type": "opencollective",
5669
+ "url": "https://opencollective.com/unified"
5670
+ }
5671
+ },
5672
+ "node_modules/remark-parse": {
5673
+ "version": "11.0.0",
5674
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
5675
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
5676
+ "license": "MIT",
5677
+ "dependencies": {
5678
+ "@types/mdast": "^4.0.0",
5679
+ "mdast-util-from-markdown": "^2.0.0",
5680
+ "micromark-util-types": "^2.0.0",
5681
+ "unified": "^11.0.0"
5682
+ },
5683
+ "funding": {
5684
+ "type": "opencollective",
5685
+ "url": "https://opencollective.com/unified"
5686
+ }
5687
+ },
5688
+ "node_modules/remark-rehype": {
5689
+ "version": "11.1.2",
5690
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
5691
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
5692
+ "license": "MIT",
5693
+ "dependencies": {
5694
+ "@types/hast": "^3.0.0",
5695
+ "@types/mdast": "^4.0.0",
5696
+ "mdast-util-to-hast": "^13.0.0",
5697
+ "unified": "^11.0.0",
5698
+ "vfile": "^6.0.0"
5699
+ },
5700
+ "funding": {
5701
+ "type": "opencollective",
5702
+ "url": "https://opencollective.com/unified"
5703
+ }
5704
+ },
5705
+ "node_modules/remark-stringify": {
5706
+ "version": "11.0.0",
5707
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
5708
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
5709
+ "license": "MIT",
5710
+ "dependencies": {
5711
+ "@types/mdast": "^4.0.0",
5712
+ "mdast-util-to-markdown": "^2.0.0",
5713
+ "unified": "^11.0.0"
5714
+ },
5715
+ "funding": {
5716
+ "type": "opencollective",
5717
+ "url": "https://opencollective.com/unified"
5718
+ }
5719
+ },
5720
  "node_modules/reselect": {
5721
  "version": "5.1.1",
5722
  "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
 
5869
  "node": ">=0.10.0"
5870
  }
5871
  },
5872
+ "node_modules/space-separated-tokens": {
5873
+ "version": "2.0.2",
5874
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
5875
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
5876
+ "license": "MIT",
5877
+ "funding": {
5878
+ "type": "github",
5879
+ "url": "https://github.com/sponsors/wooorm"
5880
+ }
5881
+ },
5882
+ "node_modules/stringify-entities": {
5883
+ "version": "4.0.4",
5884
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
5885
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
5886
+ "license": "MIT",
5887
+ "dependencies": {
5888
+ "character-entities-html4": "^2.0.0",
5889
+ "character-entities-legacy": "^3.0.0"
5890
+ },
5891
+ "funding": {
5892
+ "type": "github",
5893
+ "url": "https://github.com/sponsors/wooorm"
5894
+ }
5895
+ },
5896
  "node_modules/strip-json-comments": {
5897
  "version": "3.1.1",
5898
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
 
5906
  "url": "https://github.com/sponsors/sindresorhus"
5907
  }
5908
  },
5909
+ "node_modules/style-to-js": {
5910
+ "version": "1.1.21",
5911
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
5912
+ "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
5913
+ "license": "MIT",
5914
+ "dependencies": {
5915
+ "style-to-object": "1.0.14"
5916
+ }
5917
+ },
5918
+ "node_modules/style-to-object": {
5919
+ "version": "1.0.14",
5920
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
5921
+ "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
5922
+ "license": "MIT",
5923
+ "dependencies": {
5924
+ "inline-style-parser": "0.2.7"
5925
+ }
5926
+ },
5927
  "node_modules/supports-color": {
5928
  "version": "7.2.0",
5929
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
 
6036
  "node": ">=8.0"
6037
  }
6038
  },
6039
+ "node_modules/trim-lines": {
6040
+ "version": "3.0.1",
6041
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
6042
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
6043
+ "license": "MIT",
6044
+ "funding": {
6045
+ "type": "github",
6046
+ "url": "https://github.com/sponsors/wooorm"
6047
+ }
6048
+ },
6049
+ "node_modules/trough": {
6050
+ "version": "2.2.0",
6051
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
6052
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
6053
+ "license": "MIT",
6054
+ "funding": {
6055
+ "type": "github",
6056
+ "url": "https://github.com/sponsors/wooorm"
6057
+ }
6058
+ },
6059
  "node_modules/ts-api-utils": {
6060
  "version": "2.1.0",
6061
  "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
 
6133
  "devOptional": true,
6134
  "license": "MIT"
6135
  },
6136
+ "node_modules/unified": {
6137
+ "version": "11.0.5",
6138
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
6139
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
6140
+ "license": "MIT",
6141
+ "dependencies": {
6142
+ "@types/unist": "^3.0.0",
6143
+ "bail": "^2.0.0",
6144
+ "devlop": "^1.0.0",
6145
+ "extend": "^3.0.0",
6146
+ "is-plain-obj": "^4.0.0",
6147
+ "trough": "^2.0.0",
6148
+ "vfile": "^6.0.0"
6149
+ },
6150
+ "funding": {
6151
+ "type": "opencollective",
6152
+ "url": "https://opencollective.com/unified"
6153
+ }
6154
+ },
6155
+ "node_modules/unist-util-is": {
6156
+ "version": "6.0.1",
6157
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
6158
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
6159
+ "license": "MIT",
6160
+ "dependencies": {
6161
+ "@types/unist": "^3.0.0"
6162
+ },
6163
+ "funding": {
6164
+ "type": "opencollective",
6165
+ "url": "https://opencollective.com/unified"
6166
+ }
6167
+ },
6168
+ "node_modules/unist-util-position": {
6169
+ "version": "5.0.0",
6170
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
6171
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
6172
+ "license": "MIT",
6173
+ "dependencies": {
6174
+ "@types/unist": "^3.0.0"
6175
+ },
6176
+ "funding": {
6177
+ "type": "opencollective",
6178
+ "url": "https://opencollective.com/unified"
6179
+ }
6180
+ },
6181
+ "node_modules/unist-util-stringify-position": {
6182
+ "version": "4.0.0",
6183
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
6184
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
6185
+ "license": "MIT",
6186
+ "dependencies": {
6187
+ "@types/unist": "^3.0.0"
6188
+ },
6189
+ "funding": {
6190
+ "type": "opencollective",
6191
+ "url": "https://opencollective.com/unified"
6192
+ }
6193
+ },
6194
+ "node_modules/unist-util-visit": {
6195
+ "version": "5.0.0",
6196
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
6197
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
6198
+ "license": "MIT",
6199
+ "dependencies": {
6200
+ "@types/unist": "^3.0.0",
6201
+ "unist-util-is": "^6.0.0",
6202
+ "unist-util-visit-parents": "^6.0.0"
6203
+ },
6204
+ "funding": {
6205
+ "type": "opencollective",
6206
+ "url": "https://opencollective.com/unified"
6207
+ }
6208
+ },
6209
+ "node_modules/unist-util-visit-parents": {
6210
+ "version": "6.0.2",
6211
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
6212
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
6213
+ "license": "MIT",
6214
+ "dependencies": {
6215
+ "@types/unist": "^3.0.0",
6216
+ "unist-util-is": "^6.0.0"
6217
+ },
6218
+ "funding": {
6219
+ "type": "opencollective",
6220
+ "url": "https://opencollective.com/unified"
6221
+ }
6222
+ },
6223
  "node_modules/update-browserslist-db": {
6224
  "version": "1.1.4",
6225
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
 
6270
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
6271
  }
6272
  },
6273
+ "node_modules/vfile": {
6274
+ "version": "6.0.3",
6275
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
6276
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
6277
+ "license": "MIT",
6278
+ "dependencies": {
6279
+ "@types/unist": "^3.0.0",
6280
+ "vfile-message": "^4.0.0"
6281
+ },
6282
+ "funding": {
6283
+ "type": "opencollective",
6284
+ "url": "https://opencollective.com/unified"
6285
+ }
6286
+ },
6287
+ "node_modules/vfile-message": {
6288
+ "version": "4.0.3",
6289
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
6290
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
6291
+ "license": "MIT",
6292
+ "dependencies": {
6293
+ "@types/unist": "^3.0.0",
6294
+ "unist-util-stringify-position": "^4.0.0"
6295
+ },
6296
+ "funding": {
6297
+ "type": "opencollective",
6298
+ "url": "https://opencollective.com/unified"
6299
+ }
6300
+ },
6301
  "node_modules/victory-vendor": {
6302
  "version": "37.3.6",
6303
  "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz",
 
6468
  "funding": {
6469
  "url": "https://github.com/sponsors/sindresorhus"
6470
  }
6471
+ },
6472
+ "node_modules/zwitch": {
6473
+ "version": "2.0.4",
6474
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
6475
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
6476
+ "license": "MIT",
6477
+ "funding": {
6478
+ "type": "github",
6479
+ "url": "https://github.com/sponsors/wooorm"
6480
+ }
6481
  }
6482
  }
6483
  }
Frontend/package.json CHANGED
@@ -18,10 +18,13 @@
18
  "dayjs": "^1.11.19",
19
  "framer-motion": "^12.23.24",
20
  "lucide-react": "^0.553.0",
 
21
  "react": "^19.2.0",
22
  "react-dom": "^19.2.0",
 
23
  "react-router-dom": "^7.9.5",
24
  "recharts": "^3.4.1",
 
25
  "tailwind-merge": "^3.4.0",
26
  "tailwindcss": "^4.1.17"
27
  },
 
18
  "dayjs": "^1.11.19",
19
  "framer-motion": "^12.23.24",
20
  "lucide-react": "^0.553.0",
21
+ "pdfjs-dist": "^5.4.449",
22
  "react": "^19.2.0",
23
  "react-dom": "^19.2.0",
24
+ "react-markdown": "^10.1.0",
25
  "react-router-dom": "^7.9.5",
26
  "recharts": "^3.4.1",
27
+ "remark-gfm": "^4.0.1",
28
  "tailwind-merge": "^3.4.0",
29
  "tailwindcss": "^4.1.17"
30
  },
Frontend/src/pages/note.tsx CHANGED
@@ -1,37 +1,159 @@
1
- import React from "react";
2
- import { History, RefreshCw, Plus, Upload, Menu, X, Send, MessageSquare } from "lucide-react";
3
-
4
- // Placeholder data for the long text at the bottom (PDF Highlighting)
5
- const samplePDFHighlight = `So far, we've applied log() to the softmax output, but have neither explained what "log" is nor why we use it. We do this for one key reason. In deep learning and optimization, where derivatives, gradients, and optimizations suffice it to say that the log function has some desirable properties. Log is short for logarithm and is defined as the solution to: "The integer a must be taken of the base b so that the equation b^x = a can be solved with a log function which evaluates log_b(a)." This property of the log function is especially beneficial where e (Euler's number or ≈ 2.71828) is used in the base (where 10 is in the example). The logarithm with e as the base is referred to as the natural logarithm and doesn't use the 'log_e' - you may also see this written as ln(x) or log(x)`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
  const Notes: React.FC = () => {
8
- // State to manage the left sidebar's open/close status
9
- const [isSidebarOpen, setIsSidebarOpen] = React.useState(true);
10
-
11
- // NEW STATE: State to manage the right chat panel's open/close status
12
- const [isChatOpen, setIsChatOpen] = React.useState(true);
13
-
14
- // Toggle function for the left sidebar
15
- const toggleSidebar = () => {
16
- setIsSidebarOpen(!isSidebarOpen);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  };
18
-
19
- // Toggle function for the right chat panel
20
- const toggleChat = () => {
21
- setIsChatOpen(!isChatOpen);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  };
23
 
24
  return (
25
- // Outer container: Black background, full height, flex layout
26
  <div className="flex bg-black h-screen overflow-hidden">
27
-
28
- {/* 1. Left Sidebar: My Notes (Toggleable) */}
29
  <div
30
- className={`
31
- h-screen flex-shrink-0 transition-all duration-300 ease-in-out
32
- bg-gray-900 border-r border-gray-700 flex flex-col gap-4 shadow-2xl
33
- ${isSidebarOpen ? 'w-64 p-4' : 'w-0 p-0 overflow-hidden'}
34
- `}
35
  >
36
  {isSidebarOpen && (
37
  <>
@@ -39,139 +161,177 @@ const Notes: React.FC = () => {
39
  My Notes
40
  </h3>
41
 
42
- {/* Navigation/Action Buttons */}
43
- <button
44
- className="flex items-center gap-3 w-full bg-blue-600 text-white px-4 py-3 rounded-lg hover:bg-blue-700 transition duration-150 font-semibold whitespace-nowrap"
45
- aria-label="Create New Note"
46
- >
47
- <Plus size={20} />
48
- New Notes
49
- </button>
50
 
51
  <button
52
- className="flex items-center gap-3 w-full text-gray-300 px-4 py-3 rounded-lg hover:bg-gray-700 hover:text-white transition duration-150 whitespace-nowrap"
53
- aria-label="Upload Notes"
 
54
  >
55
- <Upload size={20} />
56
- Upload
 
 
 
 
57
  </button>
58
-
59
- <div className="mt-4 pt-4 border-t border-gray-700 space-y-2">
60
- <p className="text-sm text-gray-400">History</p>
61
- <div className="text-gray-200 bg-gray-700 p-2 rounded-md cursor-pointer hover:bg-gray-600">notes.pdf</div>
62
- <div className="text-gray-200 p-2 rounded-md cursor-pointer hover:bg-gray-600">notes2.pdf</div>
63
- <div className="text-gray-200 p-2 rounded-md cursor-pointer hover:bg-gray-600">notes3.pdf</div>
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  </div>
65
  </>
66
  )}
67
  </div>
68
-
69
- {/* 2. Middle & Right Columns Container */}
70
- <div className="flex flex-1 overflow-hidden">
71
-
72
- {/* Main Content (PDF Viewer & Highlighting) */}
73
- <div className="flex flex-col flex-1 p-6 overflow-y-auto">
74
-
75
- {/* Top Header/Toggle */}
76
- <header className="flex justify-between items-center mb-6">
77
- <div className="flex items-center gap-4">
78
- {/* Left Sidebar Toggle Button */}
79
- <button
80
- onClick={toggleSidebar}
81
- className="p-2 rounded-full bg-gray-700 hover:bg-gray-600 text-white transition-colors duration-200"
82
- aria-label={isSidebarOpen ? "Close Left Sidebar" : "Open Left Sidebar"}
83
- >
84
- {isSidebarOpen ? <X size={24} /> : <Menu size={24} />}
85
- </button>
86
- <h2 className="text-2xl font-extrabold text-white">Notes Page / PDF Viewer</h2>
87
- </div>
88
-
89
- <div className="flex items-center gap-4">
90
- {/* Right Chat Toggle Button (Visible only when chat is CLOSED) */}
91
- {!isChatOpen && (
92
- <button
93
- onClick={toggleChat}
94
- className="flex items-center gap-2 bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition duration-150 font-medium shadow-md"
95
- aria-label="Open AI Chat"
96
- >
97
- <MessageSquare size={18} />
98
- AI Chat
99
- </button>
100
- )}
101
- </div>
102
- </header>
103
 
104
- {/* PDF Viewer Area */}
105
- <div className="flex-1 bg-gray-700 rounded-xl shadow-inner border-2 border-gray-600 mb-6 p-4 flex-col items-center justify-center">
106
- <p className="text-white text-xl font-medium">PDF View</p>
107
- <p className="text-white text-xl font-medium">{samplePDFHighlight}</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  </div>
 
 
 
109
 
110
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
- </div>
113
-
114
- {/* 3. Right Chat Panel (Toggleable) */}
115
- <div
116
- className={`
117
- flex flex-col bg-gray-900 border-l border-gray-700 p-4 flex-shrink-0 transition-all duration-300 ease-in-out
118
- ${isChatOpen ? 'w-80' : 'w-0 p-0 overflow-hidden'}
119
- `}
120
- >
121
- {isChatOpen && (
122
- <>
123
- <header className="flex justify-between items-center mb-4 border-b border-gray-700 pb-2">
124
- <h3 className="text-xl font-bold text-white">
125
- Chat
126
- </h3>
127
- {/* Close button for the chat panel */}
128
- <button
129
- onClick={toggleChat}
130
- className="p-1 rounded-full text-gray-400 hover:bg-gray-700 hover:text-white transition duration-150"
131
- aria-label="Close Chat Panel"
132
- >
133
- <X size={20} />
134
- </button>
135
- </header>
136
-
137
- {/* Chat Messages Area */}
138
- <div className="flex-1 overflow-y-auto space-y-3 mb-4">
139
- <p className="text-gray-400 text-sm">AI to chat with notes</p>
140
- {/* Mock Chat Messages */}
141
- <div className="flex justify-end">
142
- <div className="bg-blue-600 text-white p-3 rounded-lg max-w-[80%]">
143
- What are the key concepts on this page?
144
- </div>
145
- </div>
146
- <div className="flex justify-start">
147
- <div className="bg-gray-700 text-white p-3 rounded-lg max-w-[80%]">
148
- The key concepts are the definition of the $\\log$ function and why it is used in deep learning and optimization due to its desirable properties for derivatives and gradients.
149
- </div>
150
- </div>
151
  </div>
152
-
153
- {/* Chat Input Area */}
154
- <div className="flex items-center gap-2 flex-shrink-0">
155
- <input
156
- type="text"
157
- placeholder="Type here..."
158
- className="flex-1 p-3 rounded-lg bg-gray-800 text-white border border-gray-700 focus:outline-none focus:ring-1 focus:ring-blue-500"
159
- />
160
- <button
161
- className="bg-blue-600 text-white p-3 rounded-full hover:bg-blue-700 transition duration-150"
162
- aria-label="Send Message"
163
- >
164
- <Send size={20} />
165
- </button>
166
  </div>
167
- </>
168
- )}
169
- </div>
170
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  </div>
172
-
173
  </div>
174
  );
175
  };
176
 
177
- export default Notes;
 
1
+ import ReactMarkdown from "react-markdown";
2
+ import remarkGfm from "remark-gfm";
3
+ import React, { useEffect, useState, useRef } from "react";
4
+ import {
5
+ History,
6
+ RefreshCw,
7
+ Plus,
8
+ Upload,
9
+ Menu,
10
+ X,
11
+ Send,
12
+ MessageSquare,
13
+ Loader2,
14
+ FileText,
15
+ } from "lucide-react";
16
+ import {
17
+ fetchNotes,
18
+ uploadNote,
19
+ fetchNoteBlob,
20
+ createChatSession,
21
+ streamChatRequest,
22
+ fetchChatHistory,
23
+ type Note,
24
+ type ChatMessage,
25
+ } from "../api/notesService";
26
 
27
  const Notes: React.FC = () => {
28
+ // --- UI State ---
29
+ const [isSidebarOpen, setIsSidebarOpen] = useState(true);
30
+ const [isChatOpen, setIsChatOpen] = useState(true);
31
+ const [isUploading, setIsUploading] = useState(false);
32
+ const fileInputRef = useRef<HTMLInputElement>(null);
33
+
34
+ // --- Data State ---
35
+ const [notes, setNotes] = useState<Note[]>([]);
36
+ const [currentNote, setCurrentNote] = useState<Note | null>(null);
37
+ const [pdfUrl, setPdfUrl] = useState<string | null>(null);
38
+
39
+ // --- Chat State ---
40
+ const [messages, setMessages] = useState<ChatMessage[]>([]);
41
+ const [inputMessage, setInputMessage] = useState("");
42
+ const [sessionId, setSessionId] = useState<string | null>(null);
43
+ const [isChatLoading, setIsChatLoading] = useState(false);
44
+
45
+ // 1. Load Notes on Mount
46
+ useEffect(() => {
47
+ loadNotes();
48
+ }, []);
49
+
50
+ const loadNotes = async () => {
51
+ try {
52
+ const data = await fetchNotes();
53
+ setNotes(data);
54
+ } catch (error) {
55
+ console.error("Failed to load notes", error);
56
+ }
57
+ };
58
+
59
+ // 2. Handle File Upload
60
+ const handleUploadClick = () => fileInputRef.current?.click();
61
+
62
+ const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
63
+ const file = e.target.files?.[0];
64
+ if (!file) return;
65
+
66
+ setIsUploading(true);
67
+ try {
68
+ const newNote = await uploadNote(file);
69
+ setNotes([newNote, ...notes]); // Add new note to top of list
70
+ handleNoteSelect(newNote); // Auto-select the uploaded note
71
+ } catch (error) {
72
+ console.error("Upload failed", error);
73
+ alert("Failed to upload PDF");
74
+ } finally {
75
+ setIsUploading(false);
76
+ }
77
+ };
78
+
79
+ // 3. Handle Note Selection (Viewer & Chat Init)
80
+ const handleNoteSelect = async (note: Note) => {
81
+ setCurrentNote(note);
82
+ setPdfUrl(null); // Clear previous PDF to show loading state
83
+ setMessages([]); // Clear previous chat
84
+ setSessionId(null);
85
+
86
+ // A. Fetch PDF Blob for Viewer
87
+ try {
88
+ const blob = await fetchNoteBlob(note.id);
89
+ const url = URL.createObjectURL(blob);
90
+ setPdfUrl(url);
91
+ } catch (error) {
92
+ console.error("Failed to load PDF content", error);
93
+ }
94
+
95
+ // B. Initialize Chat Session
96
+ try {
97
+ // Create a new session for this file
98
+ // (In a real app, you might check for existing sessions first)
99
+ const session = await createChatSession(
100
+ note.id,
101
+ `Chat - ${note.filename}`
102
+ );
103
+ setSessionId(session.id);
104
+
105
+ // Add a system welcome message
106
+ setMessages([
107
+ { role: "assistant", content: `Ready to chat about ${note.filename}!` },
108
+ ]);
109
+ } catch (error) {
110
+ console.error("Failed to init chat session", error);
111
+ }
112
  };
113
+
114
+ // 4. Handle Chat Streaming
115
+ const handleSendMessage = async () => {
116
+ if (!inputMessage.trim() || !sessionId) return;
117
+
118
+ const userMsg = inputMessage;
119
+ setInputMessage(""); // Clear input
120
+
121
+ // Add User Message Optimistically
122
+ setMessages((prev) => [...prev, { role: "user", content: userMsg }]);
123
+ setIsChatLoading(true);
124
+
125
+ // Placeholder for AI response
126
+ setMessages((prev) => [...prev, { role: "assistant", content: "" }]);
127
+
128
+ await streamChatRequest(
129
+ sessionId,
130
+ userMsg,
131
+ (chunk) => {
132
+ setMessages((prev) => {
133
+ const newArr = [...prev];
134
+ const lastIndex = newArr.length - 1;
135
+ newArr[lastIndex] = {
136
+ ...newArr[lastIndex],
137
+ content: newArr[lastIndex].content + chunk,
138
+ };
139
+
140
+ return newArr;
141
+ });
142
+ },
143
+ (err) => {
144
+ console.error("Stream error", err);
145
+ setIsChatLoading(false);
146
+ }
147
+ );
148
  };
149
 
150
  return (
 
151
  <div className="flex bg-black h-screen overflow-hidden">
152
+ {/* --- Left Sidebar: My Notes --- */}
 
153
  <div
154
+ className={`h-screen shrink-0 transition-all duration-300 bg-gray-900 border-r border-gray-700 flex flex-col gap-4 ${
155
+ isSidebarOpen ? "w-64 p-4" : "w-0 p-0 overflow-hidden"
156
+ }`}
 
 
157
  >
158
  {isSidebarOpen && (
159
  <>
 
161
  My Notes
162
  </h3>
163
 
164
+ {/* Hidden Input for Upload */}
165
+ <input
166
+ type="file"
167
+ ref={fileInputRef}
168
+ className="hidden"
169
+ accept="application/pdf"
170
+ onChange={handleFileChange}
171
+ />
172
 
173
  <button
174
+ onClick={handleUploadClick}
175
+ disabled={isUploading}
176
+ className="flex items-center gap-3 w-full bg-blue-600 text-white px-4 py-3 rounded-lg hover:bg-blue-700 transition font-semibold"
177
  >
178
+ {isUploading ? (
179
+ <Loader2 className="animate-spin" size={20} />
180
+ ) : (
181
+ <Upload size={20} />
182
+ )}
183
+ {isUploading ? "Uploading..." : "Upload New PDF"}
184
  </button>
185
+
186
+ <div className="mt-4 pt-4 border-t border-gray-700 space-y-2 overflow-y-auto">
187
+ <p className="text-sm text-gray-400 uppercase tracking-wider">
188
+ History
189
+ </p>
190
+ {notes.map((note) => (
191
+ <div
192
+ key={note.id}
193
+ onClick={() => handleNoteSelect(note)}
194
+ className={`text-gray-200 p-3 rounded-md cursor-pointer flex items-center gap-2 hover:bg-gray-700 transition ${
195
+ currentNote?.id === note.id
196
+ ? "bg-gray-800 border border-blue-500"
197
+ : ""
198
+ }`}
199
+ >
200
+ <FileText size={16} className="text-blue-400" />
201
+ <span className="truncate text-sm">{note.filename}</span>
202
+ </div>
203
+ ))}
204
  </div>
205
  </>
206
  )}
207
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
 
209
+ {/* --- Center: PDF Viewer --- */}
210
+ <div className="flex flex-1 overflow-hidden relative">
211
+ <div className="flex flex-col flex-1 p-0 bg-gray-800">
212
+ <header className="flex justify-between items-center p-4 bg-black/40 backdrop-blur-sm absolute top-0 w-full z-10">
213
+ <button
214
+ onClick={() => setIsSidebarOpen(!isSidebarOpen)}
215
+ className="p-2 rounded-full bg-gray-700 hover:bg-gray-600 text-white"
216
+ >
217
+ {isSidebarOpen ? <X size={20} /> : <Menu size={20} />}
218
+ </button>
219
+ <h2 className="text-lg font-semibold text-white truncate max-w-md">
220
+ {currentNote ? currentNote.filename : "Select a Note"}
221
+ </h2>
222
+ {!isChatOpen && (
223
+ <button
224
+ onClick={() => setIsChatOpen(true)}
225
+ className="flex items-center gap-2 bg-blue-600 text-white px-3 py-2 rounded-lg text-sm"
226
+ >
227
+ <MessageSquare size={16} /> Chat
228
+ </button>
229
+ )}
230
+ </header>
231
+
232
+ {/* PDF Frame */}
233
+ <div className="flex-1 w-full h-full pt-16">
234
+ {pdfUrl ? (
235
+ <iframe
236
+ src={pdfUrl}
237
+ className="w-full h-full border-none"
238
+ title="PDF Viewer"
239
+ />
240
+ ) : (
241
+ <div className="flex flex-col items-center justify-center h-full text-gray-400">
242
+ <FileText size={64} className="mb-4 opacity-50" />
243
+ <p>Select a PDF from the sidebar to view</p>
244
  </div>
245
+ )}
246
+ </div>
247
+ </div>
248
 
249
+ {/* --- Right: Chat Panel --- */}
250
+ <div
251
+ className={`flex flex-col bg-gray-900 border-l border-gray-700 flex-shrink-0 transition-all duration-300 ${
252
+ isChatOpen ? "w-96" : "w-0"
253
+ }`}
254
+ >
255
+ {isChatOpen && (
256
+ <>
257
+ <header className="flex justify-between items-center p-4 border-b border-gray-700">
258
+ <h3 className="text-lg font-bold text-white">AI Chat</h3>
259
+ <button
260
+ onClick={() => setIsChatOpen(false)}
261
+ className="text-gray-400 hover:text-white"
262
+ >
263
+ <X size={20} />
264
+ </button>
265
+ </header>
266
 
267
+ {/* Messages */}
268
+ <div className="flex-1 overflow-y-auto p-4 space-y-4">
269
+ {messages.length === 0 && (
270
+ <p className="text-gray-500 text-center text-sm mt-10">
271
+ Ask a question about this document...
272
+ </p>
273
+ )}
274
+ {messages.map((msg, i) => (
275
+ <div
276
+ key={i}
277
+ className={`flex ${
278
+ msg.role === "user" ? "justify-end" : "justify-start"
279
+ }`}
280
+ >
281
+ <div
282
+ className={`max-w-[85%] p-3 rounded-lg text-sm ${
283
+ msg.role === "user"
284
+ ? "bg-blue-600 text-white"
285
+ : "bg-gray-700 text-gray-200 prose prose-invert max-w-none"
286
+ }`}
287
+ >
288
+ {/* --- MARKDOWN RENDERING CHANGE IS HERE --- */}
289
+ {msg.role === "assistant" ? (
290
+ <ReactMarkdown remarkPlugins={[remarkGfm]}>
291
+ {msg.content}
292
+ </ReactMarkdown>
293
+ ) : (
294
+ msg.content
295
+ )}
 
 
 
 
 
 
 
 
 
 
296
  </div>
297
+ </div>
298
+ ))}
299
+ {isChatLoading && (
300
+ <div className="flex justify-start">
301
+ <div className="bg-gray-700 p-3 rounded-lg">
302
+ <Loader2 className="animate-spin w-4 h-4 text-blue-400" />
 
 
 
 
 
 
 
 
303
  </div>
304
+ </div>
305
+ )}
306
+ </div>
307
+
308
+ {/* Input */}
309
+ <div className="p-4 border-t border-gray-700">
310
+ <div className="flex gap-2">
311
+ <input
312
+ type="text"
313
+ value={inputMessage}
314
+ onChange={(e) => setInputMessage(e.target.value)}
315
+ onKeyDown={(e) => e.key === "Enter" && handleSendMessage()}
316
+ placeholder="Type your question..."
317
+ className="flex-1 bg-gray-800 text-white rounded-lg px-4 py-2 border border-gray-700 focus:outline-none focus:border-blue-500"
318
+ disabled={!sessionId}
319
+ />
320
+ <button
321
+ onClick={handleSendMessage}
322
+ disabled={!sessionId || isChatLoading}
323
+ className="bg-blue-600 p-2 rounded-lg text-white hover:bg-blue-700 disabled:opacity-50"
324
+ >
325
+ <Send size={20} />
326
+ </button>
327
+ </div>
328
+ </div>
329
+ </>
330
+ )}
331
+ </div>
332
  </div>
 
333
  </div>
334
  );
335
  };
336
 
337
+ export default Notes;