Internal Hackathon secret code, How to win in internal hackathon in 1 Hour

 Index

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <!-- Leaflet CSS -->
  <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
  <title>Indian Civic Sense</title>
  <link rel="stylesheet" href="assets/css/style.css"/>
  <script defer src="assets/js/app.js"></script>
  <!-- Leaflet JS -->
  <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
 
</head>
<body>

<nav class="site">
  <div class="container inner">
    <a class="brand" href="index.html">
      <div class="logo">CS</div>
      <div>Indian Civic Sense</div>
    </a>

    <!-- Mobile menu button -->
    <button id="nav-toggle" class="nav-toggle" aria-label="Toggle navigation">
      <span></span>
      <span></span>
      <span></span>
    </button>

    <ul class="nav-links">
      <li><a href="upload.html">Report</a></li>
      <li><a href="gallery.html">Gallery</a></li>
      <li><a href="leaderboard.html">Leaderboard</a></li>
      <li><a href="contact.html">Contact</a></li>
    </ul>

    <div class="auth-buttons">
      <span id="nav-user" class="badge" style="display:none"></span>
      <a class="btn secondary" href="login.html">Login</a>
      <a class="btn" href="register.html">Sign up</a>
    </div>
  </div>
</nav>

<script>
  (function(){
    const u = IP.currentUser();
    const navUser = document.getElementById("nav-user");
    if (u) {
      navUser.style.display = "inline-block";
      navUser.textContent = u.name || u.email;
      const login = document.querySelector('a[href="login.html"]');
      const reg = document.querySelector('a[href="register.html"]');
      if (login) login.outerHTML = '<button class="btn secondary" onclick="IP.logout()">Logout</button>';
      if (reg) reg.remove();
    }
    const here = location.pathname.split('/').pop();
    document.querySelectorAll("nav a").forEach(a=>{
      if (a.getAttribute("href") === here) a.classList.add("active");
    });
  })();
</script>


<header class="hero">
  <div class="container grid hero grid">
    <div class="card">
      <span class="badge">Community</span>
      <h1>Report & track civic issues to make roads safer</h1>
      <p>Upload photos, pin exact locations, and see community reports.</p>
      <div style="display:flex; gap:.6rem; margin-top:1rem">
        <a class="btn" href="upload.html" >Report a Civic Issue</a>
        <a class="btn secondary" href="gallery.html">View Gallery</a>
      </div>
      <div style="margin-top:1rem" class="alert">Tip: Sign up to have your problem show up on the leaderboard.</div>
    </div>
    <div class="card">
      <div id="map" style="height: 320px; border-radius: 12px; overflow:hidden; z-index: 0"></div>
      <small class="muted">Click anywhere to drop a sample marker.</small>
    </div>
  </div>
</header>

<section>
  <div class="container">
    <div class="kpis">
      <div class="kpi"><div class="value" id="k-total">0</div><div class="label">Total reports</div></div>
      <div class="kpi"><div class="value" id="k-open">0</div><div class="label">Open</div></div>
      <div class="kpi"><div class="value" id="k-severe">0</div><div class="label">Severe</div></div>
      <div class="kpi"><div class="value" id="k-users">0</div><div class="label">Contributors</div></div>
    </div>
  </div>
</section>

<section>
  <div class="container grid-3">
    <div class="card">
      <h3>1. Snap & Pin</h3>
      <p class="help">Take a clear photo and pick the exact location on the map.</p>
    </div>
    <div class="card">
      <h3>2. Submit</h3>
      <p class="help">Your report is saved locally for this demo and appears in the gallery instantly.</p>
    </div>
    <div class="card">
      <h3>3. Track</h3>
      <p class="help">Leaderboard tallies reports per contributor. Replace storage with an API later.</p>
    </div>
  </div>
</section>

<!-- <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" -->
  <!-- integrity="sha256-GZC39H8GkS9oM6T2GJrC6S2RY6Yk9gE9rC2xOZbWv8M=" crossorigin=""></script> -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
  integrity="sha256-VGgG3lX6Eusx6Q5Z5QF1T4Q3EoE5z1FMvx6bMpiKFFk=" crossorigin=""/>

<script>
  document.addEventListener("DOMContentLoaded", function(){
    IP.renderKpis();
    IP.initUploadPage = IP.initUploadPage || function(){};
    const map = L.map('map').setView([20.5937, 78.9629], 5);
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
      maxZoom: 19, attribution: '© OpenStreetMap'
    }).addTo(map);
    let marker;
    map.on('click', (e)=>{
      if (marker) marker.remove();
      marker = L.marker(e.latlng).addTo(map);
    });
  });
</script>

<script>
  document.addEventListener("DOMContentLoaded", async function(){
    // Call backend KPI API
    try {
      const res = await fetch("http://localhost:5000/api/reports/kpis");
      const stats = await res.json();

      document.getElementById("k-total").textContent = stats.total;
      document.getElementById("k-open").textContent = stats.open;
      document.getElementById("k-severe").textContent = stats.severe;
      document.getElementById("k-users").textContent = stats.users;
    } catch (err) {
      console.error("Error fetching KPIs:", err);
    }

    // Keep your demo map
    const map = L.map('map').setView([20.5937, 78.9629], 5);
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
      maxZoom: 19, attribution: '© OpenStreetMap'
    }).addTo(map);
    let marker;
    map.on('click', (e)=>{
      if (marker) marker.remove();
      marker = L.marker(e.latlng).addTo(map);
    });
  });
</script>


<footer>
  <div class="container grid">
    <div><strong>Indian Civic Sense</strong><br>
    <small class="muted">You see a issue, click a picture and report it on our website. </small></div>
    <div class="links">
      <a href="terms.html">Terms</a> ·
      <a href="legal.html">Legal</a>
    </div>
  </div>
</footer>

</body>
</html>


Upload

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <title>Report a Civic Issue</title>
  <link rel="stylesheet" href="assets/css/style.css"/>
  <!-- Leaflet CSS -->
  <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
  <!-- Leaflet JS -->
  <script defer src="assets/js/app.js"></script>
  <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
 
</head>
<body>

<nav class="site">
  <div class="container inner">
    <a class="brand" href="index.html">
      <div class="logo">CS</div>
      <div>Indian Civic Sense</div>
    </a>
    <ul class="nav-links">
      <li><a href="upload.html" class="active">Report</a></li>
      <li><a href="gallery.html">Gallery</a></li>
      <li><a href="leaderboard.html">Leaderboard</a></li>
      <li><a href="contact.html">Contact</a></li>
    </ul>
    <div style="display:flex; gap:.5rem; align-items:center">
      <span id="nav-user" class="badge" style="display:none"></span>
      <a class="btn secondary" href="login.html">Login</a>
      <a class="btn" href="register.html">Sign up</a>
    </div>
  </div>
</nav>
<script>
  (function(){
    const u = IP.currentUser();
    const navUser = document.getElementById("nav-user");
    if (u) {
      navUser.style.display = "inline-block";
      navUser.textContent = u.name || u.email;
      const login = document.querySelector('a[href="login.html"]');
      const reg = document.querySelector('a[href="register.html"]');
      if (login) login.outerHTML = '<button class="btn secondary" onclick="IP.logout()">Logout</button>';
      if (reg) reg.remove();
    }
    const here = location.pathname.split('/').pop();
    document.querySelectorAll("nav a").forEach(a=>{
      if (a.getAttribute("href") === here) a.classList.add("active");
    });
  })();
</script>


<section>
  <div class="container">
    <h2>Report a Civic Sense Issue</h2>
    <p class="help">Pick the location on the map, fill the form, and upload a photo. For this fork, everything is stored locally in your browser.</p>
    <div class="grid-2">
      <div class="card">
        <form id="report-form" class="form">
          <div>
            <label>Title</label>
            <input name="title" placeholder="Short title like 'Deep pothole near Sector 18'"/>
          </div>
          <div>
            <label>Description</label>
            <textarea name="description" rows="4" placeholder="Describe the issue, e.g., size, traffic impact, nearby landmarks"></textarea>
          </div>
          <div>
            <label>Reporter Email</label>
            <input name="email" type="email" placeholder="you@example.com" />
            <div class="help">If logged in, this will auto‑attach your email.</div>
          </div>
          <div>
            <label>Severity</label>
            <select name="severity">
              <option>Low</option>
              <option>Medium</option>
              <option>Severe</option>
            </select>
          </div>
          <div>
            <label>Photo</label>
            <input type="file" name="photo" accept="image/*"/>
          </div>
          <div class="grid-2">
            <div>
              <label>Latitude</label>
              <input id="lat" name="lat" placeholder="Click the map" readonly/>
            </div>
            <div>
              <label>Longitude</label>
              <input id="lng" name="lng" placeholder="Click the map" readonly/>
            </div>
          </div>
          <div class="grid-3" style="column-gap:.4rem; margin-bottom:1rem; display: inline;text-align: center;">
            <button type="button" id="auto-locate" class="btn secondary" style="background-color: rgb(38, 255, 0);">📍 Use My Location</button>
            <button type="button" id="clear-map" class="btn secondary" style="background-color: rgb(38, 255, 0);">🗑 Clear Marker</button>
          </div>
          <button class="btn" type="submit">Submit Report</button>
        </form>
      </div>
      <div class="card">
        <div id="map" style="height: 604px; border-radius:12px; overflow:hidden; z-index: 0;"></div>
        <small class="muted">Click anywhere to drop a marker. Geolocation will try to center near you.</small>
      </div>
    </div>
  </div>
</section>

<!-- <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/> -->
<!-- <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script> -->
<script>
  document.addEventListener("DOMContentLoaded", function() {
    if (typeof L !== "undefined" && document.getElementById("map")) {
      var map = L.map('map').setView([20.5937, 78.9629], 5);
      L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
        maxZoom: 19,
        attribution: '© OpenStreetMap'
      }).addTo(map);

      var marker;

      function setMarker(lat, lng) {
        if (marker) marker.remove();
        marker = L.marker([lat, lng]).addTo(map);
        document.getElementById('lat').value = lat.toFixed(6);
        document.getElementById('lng').value = lng.toFixed(6);
      }

      // Manual map click
      map.on('click', function(e) {
        setMarker(e.latlng.lat, e.latlng.lng);
      });

      // 📍 Auto locate button
      document.getElementById("auto-locate").addEventListener("click", function() {
        if (navigator.geolocation) {
          navigator.geolocation.getCurrentPosition(
            (pos) => {
              const { latitude, longitude } = pos.coords;
              map.setView([latitude, longitude], 15);
              setMarker(latitude, longitude);
            },
            (err) => {
              alert("⚠️ Could not get location: " + err.message);
            }
          );
        } else {
          alert("❌ Geolocation is not supported in your browser.");
        }
      });

      // 🗑 Clear marker button
      document.getElementById("clear-map")?.addEventListener("click", function() {
        if (marker) {
          map.removeLayer(marker);
          marker = null;
          document.getElementById('lat').value = "";
          document.getElementById('lng').value = "";
        }
      });
    }
  });
</script>



<footer>
  <div class="container grid">
    <div><strong>Indian Civic Sense</strong><br>
    <small class="muted">You see a issue, click a picture and report it on our website.</small></div>
    <div class="links">
      <a href="terms.html">Terms</a> ·
      <a href="legal.html">Legal</a>
    </div>
  </div>
</footer>

</body>

<script>
  // const API_BASE = "http://localhost:5000/api"; // backend URL

  // Utility: convert file to base64
  function fileToBase64(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = () => resolve(reader.result);
      reader.onerror = reject;
      reader.readAsDataURL(file);
    });
  }

  document.getElementById("report-form").addEventListener("submit", async (e) => {
    e.preventDefault();

    const form = e.target;
    const title = form.title.value.trim();
    const description = form.description.value.trim();
    const email = form.email.value.trim();
    const severity = form.severity.value;
    const file = form.photo.files[0];
    const lat = form.lat.value;
    const lng = form.lng.value;

    if (!title || !description || !email || !file || !lat || !lng) {
      alert("⚠️ Please fill all fields and select a location.");
      return;
    }

    // Convert image to base64
    const img = await fileToBase64(file);

    // Send data to backend
    const response = await fetch(`${API_BASE}/reports`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ title, description, email, severity, img, lat, lng }),
    });

    const data = await response.json();

    if (response.ok) {
      alert("✅ Report submitted!");
      // redirect to gallery after success
      window.location.href = "gallery.html";
    } else {
      alert("❌ Error: " + data.error);
    }
  });
</script>


</html>


Gallery

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <title>Gallery</title>
  <link rel="stylesheet" href="assets/css/style.css"/>
  <script defer src="assets/js/app.js"></script>
</head>
<body>

<nav class="site">
  <div class="container inner">
    <a class="brand" href="index.html">
      <div class="logo">CS</div>
      <div>Indian Civic Sense</div>
    </a>
    <ul class="nav-links">
      <li><a href="upload.html">Report</a></li>
      <li><a href="gallery.html" class="active">Gallery</a></li>
      <li><a href="leaderboard.html">Leaderboard</a></li>
      <li><a href="contact.html">Contact</a></li>
    </ul>
    <div style="display:flex; gap:.5rem; align-items:center">
      <span id="nav-user" class="badge" style="display:none"></span>
      <a class="btn secondary" href="login.html">Login</a>
      <a class="btn" href="register.html">Sign up</a>
    </div>
  </div>
</nav>
<script>
  (function(){
    // Placeholder (no login system yet)
    const u = null;
    const navUser = document.getElementById("nav-user");
    if (u) {
      navUser.style.display = "inline-block";
      navUser.textContent = u.name || u.email;
      const login = document.querySelector('a[href="login.html"]');
      const reg = document.querySelector('a[href="register.html"]');
      if (login) login.outerHTML = '<button class="btn secondary">Logout</button>';
      if (reg) reg.remove();
    }
    const here = location.pathname.split('/').pop();
    document.querySelectorAll("nav a").forEach(a=>{
      if (a.getAttribute("href") === here) a.classList.add("active");
    });
  })();
</script>

<section>
  <div class="container">
    <h2>Reports Gallery</h2>
    <div id="gallery-grid" class="gallery grid"></div>
  </div>
</section>

<script>
  // Load reports dynamically from backend
  document.addEventListener("DOMContentLoaded", async () => {
    try {
      const res = await fetch("http://localhost:5000/api/reports");
      const reports = await res.json();
      const grid = document.getElementById("gallery-grid");

      grid.innerHTML = "";

      reports.forEach(r => {
        const item = document.createElement("div");
        item.className = "gallery-item card";

        item.innerHTML = `
          <div style="aspect-ratio: 4/3; width: 100%; overflow: hidden; border-radius:8px; background:#eee;">
            <img src="${r.img}" alt="${r.description}" style="width:100%; height:100%; object-fit:cover; border-radius:8px;">
          </div>
          <div class="info" style="padding:.5rem 0">
            <strong>${r.title}</strong>
            <p>${r.description}</p>
            <small>📍 ${r.lat}, ${r.lng}</small><br>
            <small>📝 Status: <span class="${r.status.toLowerCase()}">${r.status}</span></small>
          </div>
        `;
        grid.appendChild(item);
      });
    } catch (err) {
      console.error("Error loading reports:", err);
    }
  });
</script>

<footer>
  <div class="container grid">
    <div><strong>Indian Civic Sense</strong><br>
    <small class="muted">You see a issue, click a picture and report it on our website.</small></div>
    <div class="links">
      <a href="terms.html">Terms</a> ·
      <a href="legal.html">Legal</a>
    </div>
  </div>
</footer>

<style>
  .gallery img {
    position: relative;
    overflow: hidden;
    cursor: pointer;
    border-radius: 12px;
    display: block;
    transition: transform 0.3s ease, box-shadow 0.3s ease, border 0.3s ease;
  }

  /* Highlighted state */
  .gallery img.temp-active {
    transform: scale(1.2); /* zoom in */
    box-shadow: 0 20px 45px rgba(0, 123, 255, 0.8); /* heavy blue glow */
    border: 4px solid #1e90ff;
  }

  /* Ripple circle */
  .ripple {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%) scale(0);
    border-radius: 50%;
    background: rgba(30, 144, 255, 0.5);
    box-shadow: 0 0 40px rgba(30, 144, 255, 1);
    animation: rippleEffect 0.9s ease-out forwards;
    pointer-events: none;
  }

  @keyframes rippleEffect {
    to {
      transform: translate(-50%, -50%) scale(5);
      opacity: 0;
    }
  }

  /* Gallery grid */
  .gallery {
    display:grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap:1rem;
  }
  .gallery-item {
    background:#fff;
    border-radius:8px;
    box-shadow:0 2px 8px rgba(0,0,0,0.1);
    overflow:hidden;
    transition:transform .2s;
  }
  .gallery-item:hover {transform:scale(1.02);}
  .gallery-item img {width:100%; height:200px; object-fit:cover;}
  .info {padding:10px;}
  .status {font-size:13px; font-weight:bold; margin-top:5px;}
  .status.reported {color:#f39c12;}
  .status.inprocess {color:#3498db;}
  .status.success {color:#27ae60;}
</style>

<script>
  // Image click effect
  document.addEventListener("DOMContentLoaded", () => {
    const images = document.querySelectorAll(".gallery img");

    images.forEach(img => {
      img.addEventListener("click", function () {
        img.classList.add("temp-active");

        const circle = document.createElement("span");
        circle.classList.add("ripple");

        const rect = img.getBoundingClientRect();
        const size = Math.max(rect.width, rect.height) * 2.5;
        circle.style.width = circle.style.height = `${size}px`;

        img.parentElement.style.position = "relative";
        img.parentElement.appendChild(circle);

        setTimeout(() => circle.remove(), 900);
        setTimeout(() => img.classList.remove("temp-active"), 800);
      });
    });
  });
</script>

<script>
  // Filters setup (safe check)
  document.addEventListener("DOMContentLoaded", () => {
    const searchBox = document.getElementById("searchBox");
    const statusFilter = document.getElementById("statusFilter");
    const dateFilter = document.getElementById("dateFilter");

    if (!searchBox || !statusFilter || !dateFilter) {
      console.warn("⚠️ Filters not found, skipping filter setup");
      return;
    }

    const galleryItems = document.querySelectorAll(".gallery-item");
    const totalCount = document.getElementById("totalCount");
    const reportedCount = document.getElementById("reportedCount");
    const inprocessCount = document.getElementById("inprocessCount");
    const successCount = document.getElementById("successCount");

    function updateCounters() {
      const visibleItems = document.querySelectorAll(".gallery-item:not([style*='display: none'])");
      totalCount.textContent = visibleItems.length;
      reportedCount.textContent = [...visibleItems].filter(i=>i.dataset.status==="Reported").length;
      inprocessCount.textContent = [...visibleItems].filter(i=>i.dataset.status==="In Process").length;
      successCount.textContent = [...visibleItems].filter(i=>i.dataset.status==="Success").length;
    }

    function applyFilters() {
      const searchVal = searchBox.value.toLowerCase();
      const statusVal = statusFilter.value;
      const dateVal = dateFilter.value;

      galleryItems.forEach(item => {
        const location = item.dataset.location?.toLowerCase() || "";
        const status = item.dataset.status;
        const date = item.dataset.date;

        let match = true;
        if (searchVal && !location.includes(searchVal)) match = false;
        if (statusVal !== "all" && status !== statusVal) match = false;
        if (dateVal && date !== dateVal) match = false;

        item.style.display = match ? "block" : "none";
      });

      updateCounters();
    }

    searchBox.addEventListener("input", applyFilters);
    statusFilter.addEventListener("change", applyFilters);
    dateFilter.addEventListener("change", applyFilters);

    updateCounters();
  });
</script>

</body>
</html>


Leaderboard

  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>Leaderboard</title>
    <link rel="stylesheet" href="assets/css/style.css"/>
    <script defer src="assets/js/app.js"></script>
   
  </head>
  <body>

  <nav class="site">
  <div class="container inner">
    <a class="brand" href="index.html">
      <div class="logo">CS</div>
      <div>Indian Civic Sense</div>
    </a>
    <ul class="nav-links">
      <li><a href="upload.html">Report</a></li>
      <li><a href="gallery.html">Gallery</a></li>
      <li><a href="leaderboard.html" class="active">Leaderboard</a></li>
      <li><a href="contact.html">Contact</a></li>
    </ul>
    <div style="display:flex; gap:.5rem; align-items:center">
      <span id="nav-user" class="badge" style="display:none"></span>
      <a class="btn secondary" href="login.html">Login</a>
      <a class="btn" href="register.html">Sign up</a>
    </div>
  </div>
</nav>
  <script>
    (function(){
      const u = IP.currentUser();
      const navUser = document.getElementById("nav-user");
      if (u) {
        navUser.style.display = "inline-block";
        navUser.textContent = u.name || u.email;
        const login = document.querySelector('a[href="login.html"]');
        const reg = document.querySelector('a[href="register.html"]');
        if (login) login.outerHTML = '<button class="btn secondary" onclick="IP.logout()">Logout</button>';
        if (reg) reg.remove();
      }
      const here = location.pathname.split('/').pop();
      document.querySelectorAll("nav a").forEach(a=>{
        if (a.getAttribute("href") === here) a.classList.add("active");
      });
    })();
  </script>


  <section style="padding:60px 0">
    <div class="container">
      <h2>Top Contributors</h2>
      <table class="table" style="margin-top:1rem">
        <thead><tr><th>Rank</th><th>City</th><th>Total</th><th>Pending</th><th>Resolved</th></tr></thead>
        <tbody id="lb-body">
          <tr><td>1</td><td>Meerut</td><td>12</td><td>12</td><td>0</td></tr>
          <tr><td>2</td><td>Bokaro</td><td>9</td><td>6</td><td>3</td></tr>
          <tr><td>3</td><td>Noida</td><td>7</td><td>7</td><td>0</td></tr>
          <tr><td>4</td><td>Gurugram</td><td>5</td><td>2</td><td>3</td></tr>
          <tr><td>5</td><td>Delhi</td><td>3</td><td>2</td><td>1</td></tr>
        </tbody>
      </table>
    </div>
  </section>
  <script>document.addEventListener("DOMContentLoaded", IP.initLeaderboardPage);</script>


  <footer>
    <div class="container grid">
      <div><strong>Indian Civic Sense</strong><br>
      <small class="muted">You see a issue, click a picture and report it on our website.</small></div>
      <div class="links">
        <a href="terms.html">Terms</a> ·
        <a href="legal.html">Legal</a>
      </div>
    </div>
  </footer>

  </body>
  </html>


Contact

  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>Contact</title>
    <link rel="stylesheet" href="assets/css/style.css"/>
    <script defer src="assets/js/app.js"></script>
   
  </head>
  <body>

  <nav class="site">
    <div class="container inner">
      <a class="brand" href="index.html">
        <div class="logo">CS</div>
        <div>Indian Civic Sense</div>
      </a>
      <ul class="nav-links">
        <li><a href="upload.html">Report</a></li>
        <li><a href="gallery.html">Gallery</a></li>
        <li><a href="leaderboard.html">Leaderboard</a></li>
        <li><a href="contact.html" class="active">Contact </a></li>
      </ul>
      <div style="display:flex; gap:.5rem; align-items:center">
        <span id="nav-user" class="badge" style="display:none"></span>
        <a class="btn secondary" href="login.html">Login</a>
        <a class="btn" href="register.html">Sign up</a>
      </div>
    </div>
  </nav>
  <script>
    (function(){
      const u = IP.currentUser();
      const navUser = document.getElementById("nav-user");
      if (u) {
        navUser.style.display = "inline-block";
        navUser.textContent = u.name || u.email;
        const login = document.querySelector('a[href="login.html"]');
        const reg = document.querySelector('a[href="register.html"]');
        if (login) login.outerHTML = '<button class="btn secondary" onclick="IP.logout()">Logout</button>';
        if (reg) reg.remove();
      }
      const here = location.pathname.split('/').pop();
      document.querySelectorAll("nav a").forEach(a=>{
        if (a.getAttribute("href") === here) a.classList.add("active");
      });
    })();
  </script>


  <section>
    <div class="container">
      <h2>Contact</h2>
      <p class="help">If you find any bugs on our website, please help us by reporting here.</p>
      <div class="grid-2">
        <div class="card">
         
          <form class="form" id="contact-form">
            <div>
              <label for="name">Name</label>
              <input id="name" name="name" placeholder="Your name" required />
            </div>
            <div>
              <label for="email">Email</label>
              <input id="email" type="email" name="email" placeholder="you@example.com" required />
            </div>
            <div>
              <label for="message">Message</label>
              <textarea id="message" name="message" rows="4" placeholder="What's up?" required></textarea>
            </div>
            <button class="btn" type="submit">Send</button>
          </form>

        </div>
        <div class="card">
          <h3>Other links</h3>
          <ul>
            <li><a href="/index.html" target="_blank" rel="noopener">Home Page</a></li>
            <li><a href="https://www.openstreetmap.org/" target="_blank" rel="noopener">OpenStreetMap</a></li>
          </ul>
        </div>
      </div>
    </div>
  </section>


  <footer>
    <div class="container grid">
      <div><strong>Indian Civic Sense</strong><br>
      <small class="muted">You see a issue, click a picture and report it on our website.</small></div>
      <div class="links">
        <a href="terms.html">Terms</a> ·
        <a href="legal.html">Legal</a>
      </div>
    </div>
  </footer>

  </body>
  </html>


Login

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <title>Login</title>
  <link rel="stylesheet" href="assets/css/style.css"/>
  <script defer src="assets/js/app.js"></script>
 
</head>
<body>

<nav class="site">
  <div class="container inner">
    <a class="brand" href="index.html">
      <div class="logo">CS</div>
      <div>Indian Civic Sense</div>
    </a>
    <ul class="nav-links">
      <li><a href="upload.html">Report</a></li>
      <li><a href="gallery.html">Gallery</a></li>
      <li><a href="leaderboard.html">Leaderboard</a></li>
      <li><a href="contact.html">Contact</a></li>
    </ul>
    <div style="display:flex; gap:.5rem; align-items:center">
      <span id="nav-user" class="badge" style="display:none"></span>
      <a class="btn secondary" href="login.html">Login</a>
      <a class="btn" href="register.html">Sign up</a>
    </div>
  </div>
</nav>
<script>
  (function(){
    const u = IP.currentUser();
    const navUser = document.getElementById("nav-user");
    if (u) {
      navUser.style.display = "inline-block";
      navUser.textContent = u.name || u.email;
      const login = document.querySelector('a[href="login.html"]');
      const reg = document.querySelector('a[href="register.html"]');
      if (login) login.outerHTML = '<button class="btn secondary" onclick="IP.logout()">Logout</button>';
      if (reg) reg.remove();
    }
    const here = location.pathname.split('/').pop();
    document.querySelectorAll("nav a").forEach(a=>{
      if (a.getAttribute("href") === here) a.classList.add("active");
    });
  })();
</script>


<section style="padding:60px 0">
  <div class="container">
    <h2>Login</h2>
    <div class="card" style="max-width:520px">
      <form id="login-form" class="form">
        <div><label>Email</label><input type="email" name="email" placeholder="you@example.com"/></div>
        <div><label>Password</label><input type="password" name="password" placeholder="••••••••"/></div>
        <div id="auth-error" class="help" style="color:var(--danger)"></div>
        <button class="btn" type="submit">Login</button>
        <div class="help">No account? <a href="register.html">Register</a></div>
      </form>
    </div>
  </div>
</section>
<script>document.addEventListener("DOMContentLoaded", ()=>IP.initAuthPage("login"));</script>


<footer>
  <div class="container grid">
    <div><strong>Indian Civic Sense</strong><br>
    <small class="muted">This is an independent, front‑end‑only code for demo/testing.</small></div>
    <div class="links">
      <a href="terms.html">Terms</a> ·
      <a href="legal.html">Legal</a>
    </div>
  </div>
</footer>

</body>
</html>


Register

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <title>Register</title>
  <link rel="stylesheet" href="assets/css/style.css"/>
  <script defer src="assets/js/app.js"></script>
 
</head>
<body>

<nav class="site">
  <div class="container inner">
    <a class="brand" href="index.html">
      <div class="logo">CS</div>
      <div>Indian Civic Sense</div>
    </a>
    <ul class="nav-links">
      <li><a href="upload.html">Report</a></li>
      <li><a href="gallery.html">Gallery</a></li>
      <li><a href="leaderboard.html">Leaderboard</a></li>
      <li><a href="contact.html">Contact</a></li>
    </ul>
    <div style="display:flex; gap:.5rem; align-items:center">
      <span id="nav-user" class="badge" style="display:none"></span>
      <a class="btn secondary" href="login.html">Login</a>
      <a class="btn" href="register.html">Sign up</a>
    </div>
  </div>
</nav>
<script>
  (function(){
    const u = IP.currentUser();
    const navUser = document.getElementById("nav-user");
    if (u) {
      navUser.style.display = "inline-block";
      navUser.textContent = u.name || u.email;
      const login = document.querySelector('a[href="login.html"]');
      const reg = document.querySelector('a[href="register.html"]');
      if (login) login.outerHTML = '<button class="btn secondary" onclick="IP.logout()">Logout</button>';
      if (reg) reg.remove();
    }
    const here = location.pathname.split('/').pop();
    document.querySelectorAll("nav a").forEach(a=>{
      if (a.getAttribute("href") === here) a.classList.add("active");
    });
  })();
</script>


<section>
  <div class="container">
    <h2>Create Account</h2>
    <div class="card" style="max-width:520px">
      <form id="register-form" class="form">
        <div><label>Name</label><input name="name" placeholder="Your name"/></div>
        <div><label>Email</label><input type="email" name="email" placeholder="you@example.com"/></div>
        <div><label>Password</label><input type="password" name="password" placeholder="••••••••"/></div>
        <div id="auth-error" class="help" style="color:var(--danger)"></div>
        <button class="btn" type="submit">Create account</button>
        <div class="help">Already have an account? <a href="login.html">Login</a></div>
      </form>
    </div>
  </div>
</section>
<script>document.addEventListener("DOMContentLoaded", ()=>IP.initAuthPage("register"));</script>


<footer>
  <div class="container grid">
    <div><strong>Indian Civic Sense</strong><br>
    <small class="muted">This is an independent, front‑end‑only code for demo/testing.</small></div>
    <div class="links">
      <a href="terms.html">Terms</a> ·
      <a href="legal.html">Legal</a>
    </div>
  </div>
</footer>

</body>
</html>


Legal

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <title>Legal</title>
  <link rel="stylesheet" href="assets/css/style.css"/>
  <script defer src="assets/js/app.js"></script>
 
</head>
<body>

<nav class="site">
  <div class="container inner">
    <a class="brand" href="index.html">
      <div class="logo">CS</div>
      <div>Indian Civic Sense</div>
    </a>
    <ul class="nav-links">
      <li><a href="upload.html">Report</a></li>
      <li><a href="gallery.html">Gallery</a></li>
      <li><a href="leaderboard.html">Leaderboard</a></li>
      <li><a href="contact.html">Contact</a></li>
    </ul>
    <div style="display:flex; gap:.5rem; align-items:center">
      <span id="nav-user" class="badge" style="display:none"></span>
      <a class="btn secondary" href="login.html">Login</a>
      <a class="btn" href="register.html">Sign up</a>
    </div>
  </div>
</nav>
<script>
  (function(){
    const u = IP.currentUser();
    const navUser = document.getElementById("nav-user");
    if (u) {
      navUser.style.display = "inline-block";
      navUser.textContent = u.name || u.email;
      const login = document.querySelector('a[href="login.html"]');
      const reg = document.querySelector('a[href="register.html"]');
      if (login) login.outerHTML = '<button class="btn secondary" onclick="IP.logout()">Logout</button>';
      if (reg) reg.remove();
    }
    const here = location.pathname.split('/').pop();
    document.querySelectorAll("nav a").forEach(a=>{
      if (a.getAttribute("href") === here) a.classList.add("active");
    });
  })();
</script>


<section>
  <div class="container">
    <h2>Legal (Demo)</h2>
    <p class="help">Use responsibly. Do not upload unlawful content. Map tiles © OpenStreetMap contributors.</p>
  </div>
</section>


<footer>
  <div class="container grid">
    <div><strong>Indian Civic Sense</strong><br>
    <small class="muted">This is an independent, front‑end‑only code for demo/testing.</small></div>
    <div class="links">
      <a href="terms.html">Terms</a> ·
      <a href="legal.html">Legal</a>
    </div>
  </div>
</footer>

</body>
</html>


Contact

  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>Contact</title>
    <link rel="stylesheet" href="assets/css/style.css"/>
    <script defer src="assets/js/app.js"></script>
   
  </head>
  <body>

  <nav class="site">
    <div class="container inner">
      <a class="brand" href="index.html">
        <div class="logo">CS</div>
        <div>Indian Civic Sense</div>
      </a>
      <ul class="nav-links">
        <li><a href="upload.html">Report</a></li>
        <li><a href="gallery.html">Gallery</a></li>
        <li><a href="leaderboard.html">Leaderboard</a></li>
        <li><a href="contact.html" class="active">Contact </a></li>
      </ul>
      <div style="display:flex; gap:.5rem; align-items:center">
        <span id="nav-user" class="badge" style="display:none"></span>
        <a class="btn secondary" href="login.html">Login</a>
        <a class="btn" href="register.html">Sign up</a>
      </div>
    </div>
  </nav>
  <script>
    (function(){
      const u = IP.currentUser();
      const navUser = document.getElementById("nav-user");
      if (u) {
        navUser.style.display = "inline-block";
        navUser.textContent = u.name || u.email;
        const login = document.querySelector('a[href="login.html"]');
        const reg = document.querySelector('a[href="register.html"]');
        if (login) login.outerHTML = '<button class="btn secondary" onclick="IP.logout()">Logout</button>';
        if (reg) reg.remove();
      }
      const here = location.pathname.split('/').pop();
      document.querySelectorAll("nav a").forEach(a=>{
        if (a.getAttribute("href") === here) a.classList.add("active");
      });
    })();
  </script>


  <section>
    <div class="container">
      <h2>Contact</h2>
      <p class="help">If you find any bugs on our website, please help us by reporting here.</p>
      <div class="grid-2">
        <div class="card">
         
          <form class="form" id="contact-form">
            <div>
              <label for="name">Name</label>
              <input id="name" name="name" placeholder="Your name" required />
            </div>
            <div>
              <label for="email">Email</label>
              <input id="email" type="email" name="email" placeholder="you@example.com" required />
            </div>
            <div>
              <label for="message">Message</label>
              <textarea id="message" name="message" rows="4" placeholder="What's up?" required></textarea>
            </div>
            <button class="btn" type="submit">Send</button>
          </form>

        </div>
        <div class="card">
          <h3>Other links</h3>
          <ul>
            <li><a href="/index.html" target="_blank" rel="noopener">Home Page</a></li>
            <li><a href="https://www.openstreetmap.org/" target="_blank" rel="noopener">OpenStreetMap</a></li>
          </ul>
        </div>
      </div>
    </div>
  </section>


  <footer>
    <div class="container grid">
      <div><strong>Indian Civic Sense</strong><br>
      <small class="muted">You see a issue, click a picture and report it on our website.</small></div>
      <div class="links">
        <a href="terms.html">Terms</a> ·
        <a href="legal.html">Legal</a>
      </div>
    </div>
  </footer>

  </body>
  </html>


style

/* Minimal reset */
* {
  box-sizing: border-box;
}

html,
body {
  margin: 0;
  padding: 0;
  font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
  color: #0f172a;
  background: #f8fafc;
}

a {
  color: inherit;
  text-decoration: none;
}

img {
  max-width: 100%;
  display: block;
}

:root {
  --brand: #0ea5e9;
  --brand-700: #0369a1;
  --bg: #f8fafc;
  --card: #ffffff;
  --muted: #64748b;
  --success: #16a34a;
  --danger: #dc2626;
  --warning: #f59e0b;
  --radius: 16px;
  --shadow: 0 10px 25px rgba(2, 6, 23, 0.08);
}
.nav-links {
  padding-left: 234px;
}
.nav-links a {
  position: relative;
  display: inline-block;
 
}

.nav-links a::after {
  content: "";
  position: absolute;
  bottom: -3px;
  right: 0;
  width: 0%;
  height: 2px;
  background: #0a3d62;
  transition: width 0.3s ease, left 0.3s ease;
}

.nav-links a:hover::after,
.nav-links a.active::after {
  width: 100%;
  left: 0;

}


.container {
  width: min(1100px, 92%);
  margin: 0 auto;
}

.btn {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  padding: .78rem 1.1rem;
  border-radius: 14px;
  border: 1px solid #e2e8f0;
  background: var(--brand);
  color: #fff;
  font-weight: 600;
  box-shadow: var(--shadow);
}
.btn:hover {
  background: #0c87b8;
  transform: translateY(-1px);
  transition: 0.3s;
  box-shadow: 0 12px 30px #0f172a3f;
}

.btn.secondary {
  background: #fff;
  color: #0f172a;
}

.btn.ghost {
  background: transparent;
  border-color: transparent;
  color: var(--brand);
}

.badge {
  display: inline-block;
  padding: .25rem .6rem;
  border-radius: 999px;
  background: #e0f2fe;
  color: #0369a1;
  font-weight: 600;
}

.nav-links a.active {
  color: #16a34a
}

nav.site {
  position: sticky;
  top: 0;
  z-index: 50;
  backdrop-filter: blur(8px);
  background: rgba(248, 250, 252, .7);
  border-bottom: 1px solid #e2e8f0;
}

nav .inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: .8rem 0;
}


.brand {
  display: flex;
  align-items: center;
  gap: .6rem;
  font-weight: 900;
  letter-spacing: .4px;
}

.brand .logo {
  width: 34px;
  height: 34px;
  border-radius: 9px;
  background: linear-gradient(135deg, var(--brand), #22d3ee);
  display: grid;
  place-items: center;
  color: #fff;
  font-weight: 900;
}

nav ul {
  display: flex;
  gap: 1rem;
  list-style: none;
  align-items: center;
}

nav a {
  display: inline-block;
  padding: .6rem .8rem;
  border-radius: 12px;
}

.brand:hover {
  transform: scale(1.05);
  transition: 0.3s;
  background-color: #0b6b9f;
}


.hero {
  padding: 76px 0;
  background-color: #18242c;
}

.hero .grid {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: 2rem;
}

.hero h1 {
  font-size: clamp(2rem, 3.5vw, 3rem);
  line-height: 1.1;
  margin: .5rem 0 1rem;
}

.hero p {
  color: var(--muted);
  font-size: 1.05rem;
}

.card {
  background: var(--card);
  border: 1px solid #e2f0e6;
  border-radius: var(--radius);
  padding: 1.1rem;
  box-shadow: var(--shadow);
}

/* Filters (Search + Status + Date in one line) */
.filters {
  display: flex;
  flex-wrap: nowrap;
  gap: 1rem;
  align-items: center;
  margin-bottom: 1rem;
  background: #fff;
  padding: 1rem;
  border-radius: 12px;
  box-shadow: 0 2px 6px rgba(0,0,0,0.1);
}

.filters input,
.filters select {
  padding: 0.7rem 1rem;
  border: 1px solid #cbd5e1;
  border-radius: 10px;
  font-size: 14px;
  flex: 1;
  min-width: 150px;
}

/* Make search wider */
#searchBox {
  flex: 2;
}

/* Counters align to the right */
.counters {
  display: flex;
  gap: 1rem;
  margin-left: auto;
  font-size: 14px;
}

/* Responsive: stack on smaller screens */
@media (max-width: 768px) {
  .filters {
    flex-wrap: wrap;
  }

  #searchBox,
  #statusFilter,
  #dateFilter {
    flex: 1 1 100%; /* take full width */
  }
}


.grid-3 {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}

.grid-2 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1rem;
}

.grid-4 {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1rem;
}

@media (max-width: 900px) {
  .hero .grid {
    grid-template-columns: 1fr;
  }

  .grid-3 {
    grid-template-columns: 1fr;
  }

  .grid-2 {
    grid-template-columns: 1fr;
  }

  .grid-4 {
    grid-template-columns: 1fr 1fr;
  }
}

section {
  padding: 2rem 0;
  background-color: #9a9ea13d;
}

section h2 {
  font-size: 1.5rem;
  margin: 0 0 .75rem;
}

.kpis {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1rem;
}

.kpi {
  background: var(--card);
  border: 1px solid #e2e8f0;
  border-radius: 16px;
  padding: 1rem;
  box-shadow: var(--shadow);
}

.kpi .value {
  font-size: 1.8rem;
  font-weight: 800;
}

.kpi .label {
  color: var(--muted);
}

footer {
  padding: 2rem 0;
  border-top: 1px solid #e2e8f0;
  color: #475569;
}

footer .grid {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 1rem;
  align-items: center;
}

footer .links {
  display: flex;
  gap: .75rem;
  flex-wrap: wrap;
}

footer a {
  color: #334155;
}

footer a:hover {
  color: var(--brand-700);
}

/* Forms */
.form {
  display: grid;
  gap: 1rem;
}

label {
  font-weight: 600;
  color: #0f172a;
}

input,
textarea,
select {
  width: 100%;
  padding: .9rem 1rem;
  border-radius: 14px;
  border: 1px solid #cbd5e1;
  background: #fff;
  outline: none;
}

input:focus,
textarea:focus,
select:focus {
  border-color: var(--brand);
  box-shadow: 0 0 0 4px rgba(14, 165, 233, .15);
}

.help {
  color: var(--muted);
  font-size: .9rem;
}

/* Gallery */
.gallery {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}

.gallery .item {
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 14px;
  overflow: hidden;
  box-shadow: var(--shadow);
}

.gallery .meta {
  padding: .8rem 1rem;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: .5rem;
}

.tag {
  padding: .25rem .5rem;
  border-radius: 999px;
  background: #f1f5f9;
  color: #0f172a;
  font-weight: 600;
  font-size: .8rem;
}

/* Table */
.table {
  width: 100%;
  border-collapse: collapse;
  background: #fff;
  border-radius: 16px;
  overflow: hidden;
  border: 1px solid #e2e8f0;
  box-shadow: var(--shadow);
}

.table th,
.table td {
  padding: .9rem 1rem;
  border-bottom: 1px solid #e2e8f0;
  text-align: left;
}

.table th {
  background: #f1f5f9;
  color: #0f172a;
}

.table tr:last-child td {
  border-bottom: none;
}

.alert {
  padding: .8rem 1rem;
  border-radius: 12px;
  background: #ecfeff;
  border: 1px solid #bae6fd;
  color: #075985;
}

small.muted {
  color: var(--muted);
}

@media (max-width: 900px) {
  #nav-toggle {
    display: block;
    z-index: 101;
  }
  .nav-links {
    position: fixed;
    top: 0;
    left: -260px;
    width: 220px;
    height: 100vh;
    background: #fff;
    box-shadow: 2px 0 16px #0002;
    padding: 2rem 1rem;
    display: block;
    flex-direction: column;
    gap: 1.5rem;
    transition: left 0.3s cubic-bezier(.4,2,.3,1);
    z-index: 100;
  }
  .nav-links.open {
    left: 0;
  }
  nav.site .container.inner {
    position: relative;
  }
  .nav-links li {
    margin-bottom: 1rem;
  }
  .nav-links a {
    font-size: 1.1rem;
    padding: .7rem 1rem;
    border-radius: 8px;
    display: block;
  }
  /* Optional: dark overlay when menu is open */
  body.menu-open::before {
    content: "";
    position: fixed;
    inset: 0;
    background: #0005;
    z-index: 99;
  }
}
/* Mobile nav toggle button */
#nav-toggle {
  display: none;
  flex-direction: column;
  justify-content: space-between;
  width: 28px;
  height: 20px;
  background: none;
  border: none;
  cursor: pointer;
  z-index: 101;
}

#nav-toggle span {
  display: block;
  height: 3px;
  width: 100%;
  background: #0f172a;
  border-radius: 3px;
  transition: 0.3s ease;
}

/* Animate into X */
#nav-toggle.open span:nth-child(1) {
  transform: rotate(45deg) translate(5px, 5px);
}
#nav-toggle.open span:nth-child(2) {
  opacity: 0;
}
#nav-toggle.open span:nth-child(3) {
  transform: rotate(-45deg) translate(6px, -6px);
}

@media (max-width: 900px) {
  #nav-toggle {
    display: flex;
    margin-left: auto;
  }
}
/* Reset */
body {
  margin: 0;
  font-family: Arial, sans-serif;
}

.site {
  background: #f8fafc;
  padding: 1rem;
  box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  position: relative;
}

.container.inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

/* Toggle button */
#nav-toggle {
  display: none;
  flex-direction: column;
  justify-content: space-between;
  width: 28px;
  height: 20px;
  background: none;
  border: none;
  cursor: pointer;
  z-index: 101;
}

#nav-toggle span {
  display: block;
  height: 3px;
  width: 100%;
  background: #0f172a;
  border-radius: 3px;
  transition: 0.3s ease;
}

#nav-toggle.open span:nth-child(1) {
  transform: rotate(45deg) translate(5px, 5px);
}
#nav-toggle.open span:nth-child(2) {
  opacity: 0;
}
#nav-toggle.open span:nth-child(3) {
  transform: rotate(-45deg) translate(6px, -6px);
}

/* Desktop menu */
.nav-links {
  display: flex;
  gap: 1rem;
  list-style: none;
  margin: 0;
}

/* Mobile menu */
@media (max-width: 900px) {
  #nav-toggle {
    display: flex;
  }

  .nav-links {
    display: none;
    position: absolute;
    top: 70px;
    right: 1rem;
    width: 200px;
    background: #fff;
    border-radius: 10px;
    box-shadow: 0 5px 10px rgba(0,0,0,0.1);
    flex-direction: column;
    padding: 1rem;
    gap: 1rem;
  }

  .nav-links.open {
    display: flex;
  }
}
@media (max-width: 900px) {
  #nav-toggle {
    display: flex;
  }

  .nav-links {
    display: none; /* hidden by default */
    position: absolute;
    top: 70px;
    right: 1rem;
    width: 200px;
    background: #fff;
    border-radius: 10px;
    box-shadow: 0 5px 10px rgba(0,0,0,0.1);
    flex-direction: column;
    padding: 1rem;
    gap: 1rem;
    z-index: 100;
  }

  .nav-links.open {
    display: flex; /* show when "open" class added */
  }
}


app

/* ---------- BACKEND API BASE URL ---------- */
const API_BASE = "http://localhost:5000/api";

/* ---------- HELPER FUNCTION ---------- */
async function apiRequest(url, options = {}) {
  try {
    const res = await fetch(url, {
      headers: { "Content-Type": "application/json" },
      ...options,
    });
    if (!res.ok) throw new Error(await res.text());
    return res.json();
  } catch (err) {
    console.error("API error:", err);
    alert("❌ " + err.message);
  }
}

/* ---------- FILE TO BASE64 ---------- */
function fileToDataURL(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.onerror = reject;
    reader.readAsDataURL(file);
  });
}

/* ---------- MAP INITIALIZER (Leaflet) ---------- */
function initPickerMap(containerId, onPick) {
  if (typeof L === "undefined") return;

  const map = L.map(containerId).setView([20.5937, 78.9629], 5);
  L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
    maxZoom: 19,
    attribution: "© OpenStreetMap",
  }).addTo(map);

  let marker;
  const setMarker = (latlng) => {
    if (marker) marker.remove();
    marker = L.marker(latlng).addTo(map);
    onPick(latlng);
  };

  map.on("click", (e) => setMarker(e.latlng));

  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
      ({ coords }) => {
        const { latitude, longitude } = coords;
        map.setView([latitude, longitude], 13);
        setMarker({ lat: latitude, lng: longitude });
      },
      () => {}
    );
  }

  return map;
}

/* ---------- UPLOAD PAGE ---------- */
function initUploadPage() {
  const form = document.getElementById("report-form");
  const latInput = document.getElementById("lat");
  const lngInput = document.getElementById("lng");

  initPickerMap("map", (ll) => {
    latInput.value = ll.lat.toFixed(6);
    lngInput.value = ll.lng.toFixed(6);
  });

  form.addEventListener("submit", async (e) => {
    e.preventDefault();

    const title = form.title.value.trim();
    const description = form.description.value.trim();
    const email = form.email.value.trim();
    const severity = form.severity.value;
    const file = form.photo.files[0];
    const lat = parseFloat(latInput.value);
    const lng = parseFloat(lngInput.value);

    if (!title || !description || !email || !file || isNaN(lat) || isNaN(lng)) {
      alert("⚠️ Please fill all fields and pick a map location.");
      return;
    }

    const img = await fileToDataURL(file);

    const data = await apiRequest(`${API_BASE}/reports`, {
      method: "POST",
      body: JSON.stringify({ title, description, email, severity, img, lat, lng }),
    });

    if (data?.message) {
      alert("✅ Report submitted!");
      window.location.href = "gallery.html";
    }
  });
}

/* ---------- GALLERY PAGE ---------- */
async function initGalleryPage() {
  const grid = document.getElementById("gallery-grid");
  grid.innerHTML = "Loading...";

  const reports = await apiRequest(`${API_BASE}/reports`);
  grid.innerHTML = "";

  if (!reports?.length) {
    grid.innerHTML = `<div class="alert">No reports yet. <a href="upload.html">Upload one</a>!</div>`;
    return;
  }

  reports.forEach((r) => {
    const item = document.createElement("div");
    item.className = "item";
    item.innerHTML = `
      <img src="${r.img}" alt="${r.title}"/>
      <div class="meta">
        <div>
          <div style="font-weight:700">${r.title}</div>
          <small class="muted">${new Date(r.createdAt).toLocaleString()}</small>
        </div>
        <span class="tag">${r.severity}</span>
      </div>
    `;
    grid.appendChild(item);
  });
}

/* ---------- LEADERBOARD PAGE ---------- */
async function initLeaderboardPage() {
  const tbody = document.getElementById("lb-body");
  tbody.innerHTML = "Loading...";

  const rows = await apiRequest(`${API_BASE}/reports/leaderboard`);
  tbody.innerHTML = "";

  if (!rows?.length) {
    tbody.innerHTML = `<tr><td colspan="3">No data yet.</td></tr>`;
    return;
  }

  let rank = 1;
  tbody.innerHTML = rows
    .map(
      (r) => `<tr>
        <td>#${rank++}</td>
        <td>${r.email}</td>
        <td>${r.count}</td>
      </tr>`
    )
    .join("");
}

/* ---------- KPIs (Dashboard) ---------- */
async function renderKpis() {
  const stats = await apiRequest(`${API_BASE}/reports/kpis`);
  if (!stats) return;

  const setText = (id, value) => (document.getElementById(id).textContent = value);
  setText("k-total", stats.total);
  setText("k-open", stats.open);
  setText("k-severe", stats.severe);
  setText("k-users", stats.users);
}

/* ---------- NAVBAR TOGGLE ---------- */
document.addEventListener("DOMContentLoaded", () => {
  const navToggle = document.getElementById("nav-toggle");
  const navLinks = document.querySelector(".nav-links");

  navToggle?.addEventListener("click", () => {
    navLinks.classList.toggle("open");
    document.body.classList.toggle("menu-open", navLinks.classList.contains("open"));
  });

  document.addEventListener("click", (e) => {
    if (navLinks?.classList.contains("open") && !navLinks.contains(e.target) && e.target !== navToggle) {
      navLinks.classList.remove("open");
      document.body.classList.remove("menu-open");
    }
  });
});

/* ---------- EXPORT GLOBAL ---------- */
window.IP = {
  initUploadPage,
  initGalleryPage,
  initLeaderboardPage,
  renderKpis,
};

/* ---------- HELPER FUNCTION ---------- */
async function apiRequest(url, options = {}) {
  try {
    const res = await fetch(url, {
      headers: { "Content-Type": "application/json" },
      ...options,
    });
    if (!res.ok) throw new Error(await res.text());
    return res.json();
  } catch (err) {
    console.error("API error:", err);
    alert("❌ " + err.message);
  }
}

/* ---------- FILE TO BASE64 ---------- */
function fileToDataURL(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.onerror = reject;
    reader.readAsDataURL(file);
  });
}

/* ---------- MAP INITIALIZER (Leaflet) ---------- */
function initPickerMap(containerId, onPick) {
  if (typeof L === "undefined") return;

  const map = L.map(containerId).setView([20.5937, 78.9629], 5);
  L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
    maxZoom: 19,
    attribution: "© OpenStreetMap",
  }).addTo(map);

  let marker;
  const setMarker = (latlng) => {
    if (marker) marker.remove();
    marker = L.marker(latlng).addTo(map);
    onPick(latlng);
  };

  map.on("click", (e) => setMarker(e.latlng));

  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
      ({ coords }) => {
        const { latitude, longitude } = coords;
        map.setView([latitude, longitude], 13);
        setMarker({ lat: latitude, lng: longitude });
      },
      () => {}
    );
  }

  return map;
}

/* ---------- UPLOAD PAGE ---------- */
function initUploadPage() {
  const form = document.getElementById("report-form");
  const latInput = document.getElementById("lat");
  const lngInput = document.getElementById("lng");

  initPickerMap("map", (ll) => {
    latInput.value = ll.lat.toFixed(6);
    lngInput.value = ll.lng.toFixed(6);
  });

  form.addEventListener("submit", async (e) => {
    e.preventDefault();

    const title = form.title.value.trim();
    const description = form.description.value.trim();
    const email = form.email.value.trim();
    const severity = form.severity.value;
    const file = form.photo.files[0];
    const lat = parseFloat(latInput.value);
    const lng = parseFloat(lngInput.value);

    if (!title || !description || !email || !file || isNaN(lat) || isNaN(lng)) {
      alert("⚠️ Please fill all fields and pick a map location.");
      return;
    }

    const img = await fileToDataURL(file);

    const data = await apiRequest(`${API_BASE}/reports`, {
      method: "POST",
      body: JSON.stringify({ title, description, email, severity, img, lat, lng }),
    });

    if (data?.message) {
      alert("✅ Report submitted!");
      window.location.href = "gallery.html";
    }
  });
}

/* ---------- GALLERY PAGE ---------- */
async function initGalleryPage() {
  const grid = document.getElementById("gallery-grid");
  grid.innerHTML = "Loading...";

  const reports = await apiRequest(`${API_BASE}/reports`);
  grid.innerHTML = "";

  if (!reports?.length) {
    grid.innerHTML = `<div class="alert">No reports yet. <a href="upload.html">Upload one</a>!</div>`;
    return;
  }

  reports.forEach((r) => {
    const item = document.createElement("div");
    item.className = "item";
    item.innerHTML = `
      <img src="${r.img}" alt="${r.title}"/>
      <div class="meta">
        <div>
          <div style="font-weight:700">${r.title}</div>
          <small class="muted">${new Date(r.createdAt).toLocaleString()}</small>
        </div>
        <span class="tag">${r.severity}</span>
      </div>
    `;
    grid.appendChild(item);
  });
}

/* ---------- LEADERBOARD PAGE ---------- */
async function initLeaderboardPage() {
  const tbody = document.getElementById("lb-body");
  tbody.innerHTML = "Loading...";

  const rows = await apiRequest(`${API_BASE}/reports/leaderboard`);
  tbody.innerHTML = "";

  if (!rows?.length) {
    tbody.innerHTML = `<tr><td colspan="3">No data yet.</td></tr>`;
    return;
  }

  let rank = 1;
  tbody.innerHTML = rows
    .map(
      (r) => `<tr>
        <td>#${rank++}</td>
        <td>${r.email}</td>
        <td>${r.count}</td>
      </tr>`
    )
    .join("");
}

/* ---------- KPIs (Dashboard) ---------- */
async function renderKpis() {
  const stats = await apiRequest(`${API_BASE}/reports/kpis`);
  if (!stats) return;

  const setText = (id, value) => (document.getElementById(id).textContent = value);
  setText("k-total", stats.total);
  setText("k-open", stats.open);
  setText("k-severe", stats.severe);
  setText("k-users", stats.users);
}

/* ---------- NAVBAR TOGGLE ---------- */
document.addEventListener("DOMContentLoaded", () => {
  const navToggle = document.getElementById("nav-toggle");
  const navLinks = document.querySelector(".nav-links");

  navToggle?.addEventListener("click", () => {
    navLinks.classList.toggle("open");
    document.body.classList.toggle("menu-open", navLinks.classList.contains("open"));
  });

  document.addEventListener("click", (e) => {
    if (navLinks?.classList.contains("open") && !navLinks.contains(e.target) && e.target !== navToggle) {
      navLinks.classList.remove("open");
      document.body.classList.remove("menu-open");
    }
  });
});

/* ---------- EXPORT GLOBAL ---------- */
window.IP = {
  initUploadPage,
  initGalleryPage,
  initLeaderboardPage,
  renderKpis,
};


server

const express = require("express");
const cors = require("cors");
const mysql = require("mysql2/promise");
const http = require("http");
const { Server } = require("socket.io");
require("dotenv").config();

const app = express();

// Middleware
app.use(cors());
app.use(express.json({ limit: "40mb" }));  // increase JSON body size
app.use(express.urlencoded({ limit: "40mb", extended: true })); // if using forms

// MySQL connection pool
const pool = mysql.createPool({
  host: process.env.DB_HOST || "localhost",
  user: process.env.DB_USER || "root",
  password: process.env.DB_PASS || "1234",
  database: process.env.DB_NAME || "civic_db",
});

// Create HTTP server for both Express & Socket.IO
const server = http.createServer(app);

// Setup Socket.IO
const io = new Server(server, {
  cors: { origin: "*" } // allow frontend
});

io.on("connection", (socket) => {
  console.log("✅ New client connected:", socket.id);
  socket.on("disconnect", () => {
    console.log("❌ Client disconnected:", socket.id);
  });
});

// Test route
app.get("/", (req, res) => {
  res.send("Backend is running with MySQL 🚀");
});

// Simple /api test route
app.get("/api", (req, res) => {
  res.json({ message: "API is working 🚀" });
});

// API to insert a report
app.post("/api/reports", async (req, res) => {
  try {
    const { title, description, email, severity, img, lat, lng } = req.body;

    if (!title || !description || !email || !severity || !lat || !lng) {
      return res.status(400).json({ error: "Missing required fields" });
    }

    const sql = `
      INSERT INTO reports
      (title, description, email, severity, img, lat, lng)
      VALUES (?, ?, ?, ?, ?, ?, ?)
    `;

    const [result] = await pool.execute(sql, [
      title,
      description,
      email,
      severity,
      img,
      lat,
      lng,
    ]);

    // Prepare new report object
    const newReport = {
      id: result.insertId,
      title,
      description,
      email,
      severity,
      img,
      lat,
      lng,
      status: "Open",
      votes: 0,
      createdAt: new Date()
    };

    // Emit real-time update
    io.emit("newReport", newReport);

    res.status(201).json({ message: "Report created", reportId: result.insertId });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: "Database error" });
  }
});

// API to fetch all reports
app.get("/api/reports", async (req, res) => {
  try {
    const [rows] = await pool.execute("SELECT * FROM reports ORDER BY createdAt DESC");
    res.json(rows);
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: "Database error" });
  }
});

// API: KPIs
app.get("/api/reports/kpis", async (req, res) => {
  try {
    const [rows] = await pool.execute("SELECT * FROM reports");

    const total = rows.length;
    const open = rows.filter(r => r.status === "Open").length;
    const severe = rows.filter(r =>
      r.severity === "Severe" || r.severity === "Critical"
    ).length;

    // unique contributors (by email)
    const users = new Set(rows.map(r => r.email)).size;

    res.json({ total, open, severe, users });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: "Database error" });
  }
});

// Error handler
app.use((err, req, res, next) => {
  if (err.type === "entity.too.large") {
    return res.status(413).json({ error: "Payload too large" });
  }
  console.error(err);
  res.status(500).json({ error: "Something went wrong" });
});

// Start server
const PORT = process.env.PORT || 5000;
server.listen(PORT, () => console.log(`🚀 Server running on port ${PORT}`));


package-lock.json

{

  "name": "backend",

  "version": "1.0.0",

  "lockfileVersion": 3,

  "requires": true,

  "packages": {

    "": {

      "name": "backend",

      "version": "1.0.0",

      "license": "ISC",

      "dependencies": {

        "bcryptjs": "^3.0.2",

        "cors": "^2.8.5",

        "dotenv": "^17.2.2",

        "express": "^5.1.0",

        "jsonwebtoken": "^9.0.2",

        "mongoose": "^8.18.1",

        "mysql2": "^3.14.5",

        "sequelize": "^6.37.7",

        "socket.io": "^4.8.1"

      },

      "devDependencies": {

        "nodemon": "^3.1.10"

      }

    },

    "node_modules/@mongodb-js/saslprep": {

      "version": "1.3.0",

      "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.0.tgz",

      "integrity": "sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==",

      "license": "MIT",

      "dependencies": {

        "sparse-bitfield": "^3.0.3"

      }

    },

    "node_modules/@socket.io/component-emitter": {

      "version": "3.1.2",

      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",

      "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",

      "license": "MIT"

    },

    "node_modules/@types/cors": {

      "version": "2.8.19",

      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",

      "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==",

      "license": "MIT",

      "dependencies": {

        "@types/node": "*"

      }

    },

    "node_modules/@types/debug": {

      "version": "4.1.12",

      "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",

      "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",

      "license": "MIT",

      "dependencies": {

        "@types/ms": "*"

      }

    },

    "node_modules/@types/ms": {

      "version": "2.1.0",

      "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",

      "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",

      "license": "MIT"

    },

    "node_modules/@types/node": {

      "version": "24.4.0",

      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.4.0.tgz",

      "integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==",

      "license": "MIT",

      "dependencies": {

        "undici-types": "~7.11.0"

      }

    },

    "node_modules/@types/validator": {

      "version": "13.15.3",

      "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.3.tgz",

      "integrity": "sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==",

      "license": "MIT"

    },

    "node_modules/@types/webidl-conversions": {

      "version": "7.0.3",

      "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",

      "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",

      "license": "MIT"

    },

    "node_modules/@types/whatwg-url": {

      "version": "11.0.5",

      "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",

      "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",

      "license": "MIT",

      "dependencies": {

        "@types/webidl-conversions": "*"

      }

    },

    "node_modules/accepts": {

      "version": "2.0.0",

      "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",

      "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",

      "license": "MIT",

      "dependencies": {

        "mime-types": "^3.0.0",

        "negotiator": "^1.0.0"

      },

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/anymatch": {

      "version": "3.1.3",

      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",

      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",

      "dev": true,

      "license": "ISC",

      "dependencies": {

        "normalize-path": "^3.0.0",

        "picomatch": "^2.0.4"

      },

      "engines": {

        "node": ">= 8"

      }

    },

    "node_modules/aws-ssl-profiles": {

      "version": "1.1.2",

      "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",

      "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",

      "license": "MIT",

      "engines": {

        "node": ">= 6.0.0"

      }

    },

    "node_modules/balanced-match": {

      "version": "1.0.2",

      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",

      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",

      "dev": true,

      "license": "MIT"

    },

    "node_modules/base64id": {

      "version": "2.0.0",

      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",

      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",

      "license": "MIT",

      "engines": {

        "node": "^4.5.0 || >= 5.9"

      }

    },

    "node_modules/bcryptjs": {

      "version": "3.0.2",

      "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz",

      "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==",

      "license": "BSD-3-Clause",

      "bin": {

        "bcrypt": "bin/bcrypt"

      }

    },

    "node_modules/binary-extensions": {

      "version": "2.3.0",

      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",

      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",

      "dev": true,

      "license": "MIT",

      "engines": {

        "node": ">=8"

      },

      "funding": {

        "url": "https://github.com/sponsors/sindresorhus"

      }

    },

    "node_modules/body-parser": {

      "version": "2.2.0",

      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",

      "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",

      "license": "MIT",

      "dependencies": {

        "bytes": "^3.1.2",

        "content-type": "^1.0.5",

        "debug": "^4.4.0",

        "http-errors": "^2.0.0",

        "iconv-lite": "^0.6.3",

        "on-finished": "^2.4.1",

        "qs": "^6.14.0",

        "raw-body": "^3.0.0",

        "type-is": "^2.0.0"

      },

      "engines": {

        "node": ">=18"

      }

    },

    "node_modules/brace-expansion": {

      "version": "1.1.12",

      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",

      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "balanced-match": "^1.0.0",

        "concat-map": "0.0.1"

      }

    },

    "node_modules/braces": {

      "version": "3.0.3",

      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",

      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "fill-range": "^7.1.1"

      },

      "engines": {

        "node": ">=8"

      }

    },

    "node_modules/bson": {

      "version": "6.10.4",

      "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz",

      "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==",

      "license": "Apache-2.0",

      "engines": {

        "node": ">=16.20.1"

      }

    },

    "node_modules/buffer-equal-constant-time": {

      "version": "1.0.1",

      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",

      "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",

      "license": "BSD-3-Clause"

    },

    "node_modules/bytes": {

      "version": "3.1.2",

      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",

      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/call-bind-apply-helpers": {

      "version": "1.0.2",

      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",

      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",

      "license": "MIT",

      "dependencies": {

        "es-errors": "^1.3.0",

        "function-bind": "^1.1.2"

      },

      "engines": {

        "node": ">= 0.4"

      }

    },

    "node_modules/call-bound": {

      "version": "1.0.4",

      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",

      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",

      "license": "MIT",

      "dependencies": {

        "call-bind-apply-helpers": "^1.0.2",

        "get-intrinsic": "^1.3.0"

      },

      "engines": {

        "node": ">= 0.4"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/chokidar": {

      "version": "3.6.0",

      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",

      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "anymatch": "~3.1.2",

        "braces": "~3.0.2",

        "glob-parent": "~5.1.2",

        "is-binary-path": "~2.1.0",

        "is-glob": "~4.0.1",

        "normalize-path": "~3.0.0",

        "readdirp": "~3.6.0"

      },

      "engines": {

        "node": ">= 8.10.0"

      },

      "funding": {

        "url": "https://paulmillr.com/funding/"

      },

      "optionalDependencies": {

        "fsevents": "~2.3.2"

      }

    },

    "node_modules/concat-map": {

      "version": "0.0.1",

      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",

      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",

      "dev": true,

      "license": "MIT"

    },

    "node_modules/content-disposition": {

      "version": "1.0.0",

      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",

      "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",

      "license": "MIT",

      "dependencies": {

        "safe-buffer": "5.2.1"

      },

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/content-type": {

      "version": "1.0.5",

      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",

      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/cookie": {

      "version": "0.7.2",

      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",

      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/cookie-signature": {

      "version": "1.2.2",

      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",

      "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",

      "license": "MIT",

      "engines": {

        "node": ">=6.6.0"

      }

    },

    "node_modules/cors": {

      "version": "2.8.5",

      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",

      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",

      "license": "MIT",

      "dependencies": {

        "object-assign": "^4",

        "vary": "^1"

      },

      "engines": {

        "node": ">= 0.10"

      }

    },

    "node_modules/debug": {

      "version": "4.4.3",

      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",

      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",

      "license": "MIT",

      "dependencies": {

        "ms": "^2.1.3"

      },

      "engines": {

        "node": ">=6.0"

      },

      "peerDependenciesMeta": {

        "supports-color": {

          "optional": true

        }

      }

    },

    "node_modules/denque": {

      "version": "2.1.0",

      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",

      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",

      "license": "Apache-2.0",

      "engines": {

        "node": ">=0.10"

      }

    },

    "node_modules/depd": {

      "version": "2.0.0",

      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",

      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/dotenv": {

      "version": "17.2.2",

      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz",

      "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==",

      "license": "BSD-2-Clause",

      "engines": {

        "node": ">=12"

      },

      "funding": {

        "url": "https://dotenvx.com"

      }

    },

    "node_modules/dottie": {

      "version": "2.0.6",

      "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",

      "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==",

      "license": "MIT"

    },

    "node_modules/dunder-proto": {

      "version": "1.0.1",

      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",

      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",

      "license": "MIT",

      "dependencies": {

        "call-bind-apply-helpers": "^1.0.1",

        "es-errors": "^1.3.0",

        "gopd": "^1.2.0"

      },

      "engines": {

        "node": ">= 0.4"

      }

    },

    "node_modules/ecdsa-sig-formatter": {

      "version": "1.0.11",

      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",

      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",

      "license": "Apache-2.0",

      "dependencies": {

        "safe-buffer": "^5.0.1"

      }

    },

    "node_modules/ee-first": {

      "version": "1.1.1",

      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",

      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",

      "license": "MIT"

    },

    "node_modules/encodeurl": {

      "version": "2.0.0",

      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",

      "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/engine.io": {

      "version": "6.6.4",

      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz",

      "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==",

      "license": "MIT",

      "dependencies": {

        "@types/cors": "^2.8.12",

        "@types/node": ">=10.0.0",

        "accepts": "~1.3.4",

        "base64id": "2.0.0",

        "cookie": "~0.7.2",

        "cors": "~2.8.5",

        "debug": "~4.3.1",

        "engine.io-parser": "~5.2.1",

        "ws": "~8.17.1"

      },

      "engines": {

        "node": ">=10.2.0"

      }

    },

    "node_modules/engine.io-parser": {

      "version": "5.2.3",

      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",

      "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",

      "license": "MIT",

      "engines": {

        "node": ">=10.0.0"

      }

    },

    "node_modules/engine.io/node_modules/accepts": {

      "version": "1.3.8",

      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",

      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",

      "license": "MIT",

      "dependencies": {

        "mime-types": "~2.1.34",

        "negotiator": "0.6.3"

      },

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/engine.io/node_modules/debug": {

      "version": "4.3.7",

      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",

      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",

      "license": "MIT",

      "dependencies": {

        "ms": "^2.1.3"

      },

      "engines": {

        "node": ">=6.0"

      },

      "peerDependenciesMeta": {

        "supports-color": {

          "optional": true

        }

      }

    },

    "node_modules/engine.io/node_modules/mime-db": {

      "version": "1.52.0",

      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",

      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/engine.io/node_modules/mime-types": {

      "version": "2.1.35",

      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",

      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",

      "license": "MIT",

      "dependencies": {

        "mime-db": "1.52.0"

      },

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/engine.io/node_modules/negotiator": {

      "version": "0.6.3",

      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",

      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/es-define-property": {

      "version": "1.0.1",

      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",

      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.4"

      }

    },

    "node_modules/es-errors": {

      "version": "1.3.0",

      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",

      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.4"

      }

    },

    "node_modules/es-object-atoms": {

      "version": "1.1.1",

      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",

      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",

      "license": "MIT",

      "dependencies": {

        "es-errors": "^1.3.0"

      },

      "engines": {

        "node": ">= 0.4"

      }

    },

    "node_modules/escape-html": {

      "version": "1.0.3",

      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",

      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",

      "license": "MIT"

    },

    "node_modules/etag": {

      "version": "1.8.1",

      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",

      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/express": {

      "version": "5.1.0",

      "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",

      "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",

      "license": "MIT",

      "dependencies": {

        "accepts": "^2.0.0",

        "body-parser": "^2.2.0",

        "content-disposition": "^1.0.0",

        "content-type": "^1.0.5",

        "cookie": "^0.7.1",

        "cookie-signature": "^1.2.1",

        "debug": "^4.4.0",

        "encodeurl": "^2.0.0",

        "escape-html": "^1.0.3",

        "etag": "^1.8.1",

        "finalhandler": "^2.1.0",

        "fresh": "^2.0.0",

        "http-errors": "^2.0.0",

        "merge-descriptors": "^2.0.0",

        "mime-types": "^3.0.0",

        "on-finished": "^2.4.1",

        "once": "^1.4.0",

        "parseurl": "^1.3.3",

        "proxy-addr": "^2.0.7",

        "qs": "^6.14.0",

        "range-parser": "^1.2.1",

        "router": "^2.2.0",

        "send": "^1.1.0",

        "serve-static": "^2.2.0",

        "statuses": "^2.0.1",

        "type-is": "^2.0.1",

        "vary": "^1.1.2"

      },

      "engines": {

        "node": ">= 18"

      },

      "funding": {

        "type": "opencollective",

        "url": "https://opencollective.com/express"

      }

    },

    "node_modules/fill-range": {

      "version": "7.1.1",

      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",

      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "to-regex-range": "^5.0.1"

      },

      "engines": {

        "node": ">=8"

      }

    },

    "node_modules/finalhandler": {

      "version": "2.1.0",

      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",

      "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",

      "license": "MIT",

      "dependencies": {

        "debug": "^4.4.0",

        "encodeurl": "^2.0.0",

        "escape-html": "^1.0.3",

        "on-finished": "^2.4.1",

        "parseurl": "^1.3.3",

        "statuses": "^2.0.1"

      },

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/forwarded": {

      "version": "0.2.0",

      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",

      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/fresh": {

      "version": "2.0.0",

      "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",

      "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/fsevents": {

      "version": "2.3.3",

      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",

      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",

      "dev": true,

      "hasInstallScript": true,

      "license": "MIT",

      "optional": true,

      "os": [

        "darwin"

      ],

      "engines": {

        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"

      }

    },

    "node_modules/function-bind": {

      "version": "1.1.2",

      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",

      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",

      "license": "MIT",

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/generate-function": {

      "version": "2.3.1",

      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",

      "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",

      "license": "MIT",

      "dependencies": {

        "is-property": "^1.0.2"

      }

    },

    "node_modules/get-intrinsic": {

      "version": "1.3.0",

      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",

      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",

      "license": "MIT",

      "dependencies": {

        "call-bind-apply-helpers": "^1.0.2",

        "es-define-property": "^1.0.1",

        "es-errors": "^1.3.0",

        "es-object-atoms": "^1.1.1",

        "function-bind": "^1.1.2",

        "get-proto": "^1.0.1",

        "gopd": "^1.2.0",

        "has-symbols": "^1.1.0",

        "hasown": "^2.0.2",

        "math-intrinsics": "^1.1.0"

      },

      "engines": {

        "node": ">= 0.4"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/get-proto": {

      "version": "1.0.1",

      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",

      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",

      "license": "MIT",

      "dependencies": {

        "dunder-proto": "^1.0.1",

        "es-object-atoms": "^1.0.0"

      },

      "engines": {

        "node": ">= 0.4"

      }

    },

    "node_modules/glob-parent": {

      "version": "5.1.2",

      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",

      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",

      "dev": true,

      "license": "ISC",

      "dependencies": {

        "is-glob": "^4.0.1"

      },

      "engines": {

        "node": ">= 6"

      }

    },

    "node_modules/gopd": {

      "version": "1.2.0",

      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",

      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.4"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/has-flag": {

      "version": "3.0.0",

      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",

      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",

      "dev": true,

      "license": "MIT",

      "engines": {

        "node": ">=4"

      }

    },

    "node_modules/has-symbols": {

      "version": "1.1.0",

      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",

      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.4"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/hasown": {

      "version": "2.0.2",

      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",

      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",

      "license": "MIT",

      "dependencies": {

        "function-bind": "^1.1.2"

      },

      "engines": {

        "node": ">= 0.4"

      }

    },

    "node_modules/http-errors": {

      "version": "2.0.0",

      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",

      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",

      "license": "MIT",

      "dependencies": {

        "depd": "2.0.0",

        "inherits": "2.0.4",

        "setprototypeof": "1.2.0",

        "statuses": "2.0.1",

        "toidentifier": "1.0.1"

      },

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/http-errors/node_modules/statuses": {

      "version": "2.0.1",

      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",

      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/iconv-lite": {

      "version": "0.6.3",

      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",

      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",

      "license": "MIT",

      "dependencies": {

        "safer-buffer": ">= 2.1.2 < 3.0.0"

      },

      "engines": {

        "node": ">=0.10.0"

      }

    },

    "node_modules/ignore-by-default": {

      "version": "1.0.1",

      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",

      "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",

      "dev": true,

      "license": "ISC"

    },

    "node_modules/inflection": {

      "version": "1.13.4",

      "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",

      "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==",

      "engines": [

        "node >= 0.4.0"

      ],

      "license": "MIT"

    },

    "node_modules/inherits": {

      "version": "2.0.4",

      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",

      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",

      "license": "ISC"

    },

    "node_modules/ipaddr.js": {

      "version": "1.9.1",

      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",

      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.10"

      }

    },

    "node_modules/is-binary-path": {

      "version": "2.1.0",

      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",

      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "binary-extensions": "^2.0.0"

      },

      "engines": {

        "node": ">=8"

      }

    },

    "node_modules/is-extglob": {

      "version": "2.1.1",

      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",

      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",

      "dev": true,

      "license": "MIT",

      "engines": {

        "node": ">=0.10.0"

      }

    },

    "node_modules/is-glob": {

      "version": "4.0.3",

      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",

      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "is-extglob": "^2.1.1"

      },

      "engines": {

        "node": ">=0.10.0"

      }

    },

    "node_modules/is-number": {

      "version": "7.0.0",

      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",

      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",

      "dev": true,

      "license": "MIT",

      "engines": {

        "node": ">=0.12.0"

      }

    },

    "node_modules/is-promise": {

      "version": "4.0.0",

      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",

      "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",

      "license": "MIT"

    },

    "node_modules/is-property": {

      "version": "1.0.2",

      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",

      "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",

      "license": "MIT"

    },

    "node_modules/jsonwebtoken": {

      "version": "9.0.2",

      "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",

      "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",

      "license": "MIT",

      "dependencies": {

        "jws": "^3.2.2",

        "lodash.includes": "^4.3.0",

        "lodash.isboolean": "^3.0.3",

        "lodash.isinteger": "^4.0.4",

        "lodash.isnumber": "^3.0.3",

        "lodash.isplainobject": "^4.0.6",

        "lodash.isstring": "^4.0.1",

        "lodash.once": "^4.0.0",

        "ms": "^2.1.1",

        "semver": "^7.5.4"

      },

      "engines": {

        "node": ">=12",

        "npm": ">=6"

      }

    },

    "node_modules/jwa": {

      "version": "1.4.2",

      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",

      "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",

      "license": "MIT",

      "dependencies": {

        "buffer-equal-constant-time": "^1.0.1",

        "ecdsa-sig-formatter": "1.0.11",

        "safe-buffer": "^5.0.1"

      }

    },

    "node_modules/jws": {

      "version": "3.2.2",

      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",

      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",

      "license": "MIT",

      "dependencies": {

        "jwa": "^1.4.1",

        "safe-buffer": "^5.0.1"

      }

    },

    "node_modules/kareem": {

      "version": "2.6.3",

      "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",

      "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==",

      "license": "Apache-2.0",

      "engines": {

        "node": ">=12.0.0"

      }

    },

    "node_modules/lodash": {

      "version": "4.17.21",

      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",

      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",

      "license": "MIT"

    },

    "node_modules/lodash.includes": {

      "version": "4.3.0",

      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",

      "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",

      "license": "MIT"

    },

    "node_modules/lodash.isboolean": {

      "version": "3.0.3",

      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",

      "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",

      "license": "MIT"

    },

    "node_modules/lodash.isinteger": {

      "version": "4.0.4",

      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",

      "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",

      "license": "MIT"

    },

    "node_modules/lodash.isnumber": {

      "version": "3.0.3",

      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",

      "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",

      "license": "MIT"

    },

    "node_modules/lodash.isplainobject": {

      "version": "4.0.6",

      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",

      "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",

      "license": "MIT"

    },

    "node_modules/lodash.isstring": {

      "version": "4.0.1",

      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",

      "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",

      "license": "MIT"

    },

    "node_modules/lodash.once": {

      "version": "4.1.1",

      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",

      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",

      "license": "MIT"

    },

    "node_modules/long": {

      "version": "5.3.2",

      "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",

      "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",

      "license": "Apache-2.0"

    },

    "node_modules/lru-cache": {

      "version": "7.18.3",

      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",

      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",

      "license": "ISC",

      "engines": {

        "node": ">=12"

      }

    },

    "node_modules/lru.min": {

      "version": "1.1.2",

      "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",

      "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",

      "license": "MIT",

      "engines": {

        "bun": ">=1.0.0",

        "deno": ">=1.30.0",

        "node": ">=8.0.0"

      },

      "funding": {

        "type": "github",

        "url": "https://github.com/sponsors/wellwelwel"

      }

    },

    "node_modules/math-intrinsics": {

      "version": "1.1.0",

      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",

      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.4"

      }

    },

    "node_modules/media-typer": {

      "version": "1.1.0",

      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",

      "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/memory-pager": {

      "version": "1.5.0",

      "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",

      "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",

      "license": "MIT"

    },

    "node_modules/merge-descriptors": {

      "version": "2.0.0",

      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",

      "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",

      "license": "MIT",

      "engines": {

        "node": ">=18"

      },

      "funding": {

        "url": "https://github.com/sponsors/sindresorhus"

      }

    },

    "node_modules/mime-db": {

      "version": "1.54.0",

      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",

      "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/mime-types": {

      "version": "3.0.1",

      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",

      "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",

      "license": "MIT",

      "dependencies": {

        "mime-db": "^1.54.0"

      },

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/minimatch": {

      "version": "3.1.2",

      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",

      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",

      "dev": true,

      "license": "ISC",

      "dependencies": {

        "brace-expansion": "^1.1.7"

      },

      "engines": {

        "node": "*"

      }

    },

    "node_modules/moment": {

      "version": "2.30.1",

      "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",

      "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",

      "license": "MIT",

      "engines": {

        "node": "*"

      }

    },

    "node_modules/moment-timezone": {

      "version": "0.5.48",

      "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz",

      "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==",

      "license": "MIT",

      "dependencies": {

        "moment": "^2.29.4"

      },

      "engines": {

        "node": "*"

      }

    },

    "node_modules/mongodb": {

      "version": "6.18.0",

      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz",

      "integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==",

      "license": "Apache-2.0",

      "dependencies": {

        "@mongodb-js/saslprep": "^1.1.9",

        "bson": "^6.10.4",

        "mongodb-connection-string-url": "^3.0.0"

      },

      "engines": {

        "node": ">=16.20.1"

      },

      "peerDependencies": {

        "@aws-sdk/credential-providers": "^3.188.0",

        "@mongodb-js/zstd": "^1.1.0 || ^2.0.0",

        "gcp-metadata": "^5.2.0",

        "kerberos": "^2.0.1",

        "mongodb-client-encryption": ">=6.0.0 <7",

        "snappy": "^7.2.2",

        "socks": "^2.7.1"

      },

      "peerDependenciesMeta": {

        "@aws-sdk/credential-providers": {

          "optional": true

        },

        "@mongodb-js/zstd": {

          "optional": true

        },

        "gcp-metadata": {

          "optional": true

        },

        "kerberos": {

          "optional": true

        },

        "mongodb-client-encryption": {

          "optional": true

        },

        "snappy": {

          "optional": true

        },

        "socks": {

          "optional": true

        }

      }

    },

    "node_modules/mongodb-connection-string-url": {

      "version": "3.0.2",

      "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz",

      "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==",

      "license": "Apache-2.0",

      "dependencies": {

        "@types/whatwg-url": "^11.0.2",

        "whatwg-url": "^14.1.0 || ^13.0.0"

      }

    },

    "node_modules/mongoose": {

      "version": "8.18.1",

      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.18.1.tgz",

      "integrity": "sha512-K0RfrUXXufqNRZZjvAGdyjydB91SnbWxlwFYi5t7zN2DxVWFD3c6puia0/7xfBwZm6RCpYOVdYFlRFpoDWiC+w==",

      "license": "MIT",

      "dependencies": {

        "bson": "^6.10.4",

        "kareem": "2.6.3",

        "mongodb": "~6.18.0",

        "mpath": "0.9.0",

        "mquery": "5.0.0",

        "ms": "2.1.3",

        "sift": "17.1.3"

      },

      "engines": {

        "node": ">=16.20.1"

      },

      "funding": {

        "type": "opencollective",

        "url": "https://opencollective.com/mongoose"

      }

    },

    "node_modules/mpath": {

      "version": "0.9.0",

      "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",

      "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",

      "license": "MIT",

      "engines": {

        "node": ">=4.0.0"

      }

    },

    "node_modules/mquery": {

      "version": "5.0.0",

      "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",

      "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",

      "license": "MIT",

      "dependencies": {

        "debug": "4.x"

      },

      "engines": {

        "node": ">=14.0.0"

      }

    },

    "node_modules/ms": {

      "version": "2.1.3",

      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",

      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",

      "license": "MIT"

    },

    "node_modules/mysql2": {

      "version": "3.14.5",

      "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.5.tgz",

      "integrity": "sha512-40hDf8LPUsuuJ2hFq+UgOuPwt2IFLIRDvMv6ez9hKbXeYuZPxDDwiJW7KdknvOsQqKznaKczOT1kELgFkhDvFg==",

      "license": "MIT",

      "dependencies": {

        "aws-ssl-profiles": "^1.1.1",

        "denque": "^2.1.0",

        "generate-function": "^2.3.1",

        "iconv-lite": "^0.7.0",

        "long": "^5.2.1",

        "lru.min": "^1.0.0",

        "named-placeholders": "^1.1.3",

        "seq-queue": "^0.0.5",

        "sqlstring": "^2.3.2"

      },

      "engines": {

        "node": ">= 8.0"

      }

    },

    "node_modules/mysql2/node_modules/iconv-lite": {

      "version": "0.7.0",

      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",

      "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",

      "license": "MIT",

      "dependencies": {

        "safer-buffer": ">= 2.1.2 < 3.0.0"

      },

      "engines": {

        "node": ">=0.10.0"

      },

      "funding": {

        "type": "opencollective",

        "url": "https://opencollective.com/express"

      }

    },

    "node_modules/named-placeholders": {

      "version": "1.1.3",

      "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",

      "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",

      "license": "MIT",

      "dependencies": {

        "lru-cache": "^7.14.1"

      },

      "engines": {

        "node": ">=12.0.0"

      }

    },

    "node_modules/negotiator": {

      "version": "1.0.0",

      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",

      "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/nodemon": {

      "version": "3.1.10",

      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz",

      "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "chokidar": "^3.5.2",

        "debug": "^4",

        "ignore-by-default": "^1.0.1",

        "minimatch": "^3.1.2",

        "pstree.remy": "^1.1.8",

        "semver": "^7.5.3",

        "simple-update-notifier": "^2.0.0",

        "supports-color": "^5.5.0",

        "touch": "^3.1.0",

        "undefsafe": "^2.0.5"

      },

      "bin": {

        "nodemon": "bin/nodemon.js"

      },

      "engines": {

        "node": ">=10"

      },

      "funding": {

        "type": "opencollective",

        "url": "https://opencollective.com/nodemon"

      }

    },

    "node_modules/normalize-path": {

      "version": "3.0.0",

      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",

      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",

      "dev": true,

      "license": "MIT",

      "engines": {

        "node": ">=0.10.0"

      }

    },

    "node_modules/object-assign": {

      "version": "4.1.1",

      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",

      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",

      "license": "MIT",

      "engines": {

        "node": ">=0.10.0"

      }

    },

    "node_modules/object-inspect": {

      "version": "1.13.4",

      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",

      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.4"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/on-finished": {

      "version": "2.4.1",

      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",

      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",

      "license": "MIT",

      "dependencies": {

        "ee-first": "1.1.1"

      },

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/once": {

      "version": "1.4.0",

      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",

      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",

      "license": "ISC",

      "dependencies": {

        "wrappy": "1"

      }

    },

    "node_modules/parseurl": {

      "version": "1.3.3",

      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",

      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/path-to-regexp": {

      "version": "8.3.0",

      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",

      "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",

      "license": "MIT",

      "funding": {

        "type": "opencollective",

        "url": "https://opencollective.com/express"

      }

    },

    "node_modules/pg-connection-string": {

      "version": "2.9.1",

      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz",

      "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==",

      "license": "MIT"

    },

    "node_modules/picomatch": {

      "version": "2.3.1",

      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",

      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",

      "dev": true,

      "license": "MIT",

      "engines": {

        "node": ">=8.6"

      },

      "funding": {

        "url": "https://github.com/sponsors/jonschlinkert"

      }

    },

    "node_modules/proxy-addr": {

      "version": "2.0.7",

      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",

      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",

      "license": "MIT",

      "dependencies": {

        "forwarded": "0.2.0",

        "ipaddr.js": "1.9.1"

      },

      "engines": {

        "node": ">= 0.10"

      }

    },

    "node_modules/pstree.remy": {

      "version": "1.1.8",

      "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",

      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",

      "dev": true,

      "license": "MIT"

    },

    "node_modules/punycode": {

      "version": "2.3.1",

      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",

      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",

      "license": "MIT",

      "engines": {

        "node": ">=6"

      }

    },

    "node_modules/qs": {

      "version": "6.14.0",

      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",

      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",

      "license": "BSD-3-Clause",

      "dependencies": {

        "side-channel": "^1.1.0"

      },

      "engines": {

        "node": ">=0.6"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/range-parser": {

      "version": "1.2.1",

      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",

      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/raw-body": {

      "version": "3.0.1",

      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz",

      "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==",

      "license": "MIT",

      "dependencies": {

        "bytes": "3.1.2",

        "http-errors": "2.0.0",

        "iconv-lite": "0.7.0",

        "unpipe": "1.0.0"

      },

      "engines": {

        "node": ">= 0.10"

      }

    },

    "node_modules/raw-body/node_modules/iconv-lite": {

      "version": "0.7.0",

      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",

      "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",

      "license": "MIT",

      "dependencies": {

        "safer-buffer": ">= 2.1.2 < 3.0.0"

      },

      "engines": {

        "node": ">=0.10.0"

      },

      "funding": {

        "type": "opencollective",

        "url": "https://opencollective.com/express"

      }

    },

    "node_modules/readdirp": {

      "version": "3.6.0",

      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",

      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "picomatch": "^2.2.1"

      },

      "engines": {

        "node": ">=8.10.0"

      }

    },

    "node_modules/retry-as-promised": {

      "version": "7.1.1",

      "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.1.1.tgz",

      "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==",

      "license": "MIT"

    },

    "node_modules/router": {

      "version": "2.2.0",

      "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",

      "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",

      "license": "MIT",

      "dependencies": {

        "debug": "^4.4.0",

        "depd": "^2.0.0",

        "is-promise": "^4.0.0",

        "parseurl": "^1.3.3",

        "path-to-regexp": "^8.0.0"

      },

      "engines": {

        "node": ">= 18"

      }

    },

    "node_modules/safe-buffer": {

      "version": "5.2.1",

      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",

      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",

      "funding": [

        {

          "type": "github",

          "url": "https://github.com/sponsors/feross"

        },

        {

          "type": "patreon",

          "url": "https://www.patreon.com/feross"

        },

        {

          "type": "consulting",

          "url": "https://feross.org/support"

        }

      ],

      "license": "MIT"

    },

    "node_modules/safer-buffer": {

      "version": "2.1.2",

      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",

      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",

      "license": "MIT"

    },

    "node_modules/semver": {

      "version": "7.7.2",

      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",

      "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",

      "license": "ISC",

      "bin": {

        "semver": "bin/semver.js"

      },

      "engines": {

        "node": ">=10"

      }

    },

    "node_modules/send": {

      "version": "1.2.0",

      "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",

      "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",

      "license": "MIT",

      "dependencies": {

        "debug": "^4.3.5",

        "encodeurl": "^2.0.0",

        "escape-html": "^1.0.3",

        "etag": "^1.8.1",

        "fresh": "^2.0.0",

        "http-errors": "^2.0.0",

        "mime-types": "^3.0.1",

        "ms": "^2.1.3",

        "on-finished": "^2.4.1",

        "range-parser": "^1.2.1",

        "statuses": "^2.0.1"

      },

      "engines": {

        "node": ">= 18"

      }

    },

    "node_modules/seq-queue": {

      "version": "0.0.5",

      "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",

      "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="

    },

    "node_modules/sequelize": {

      "version": "6.37.7",

      "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.7.tgz",

      "integrity": "sha512-mCnh83zuz7kQxxJirtFD7q6Huy6liPanI67BSlbzSYgVNl5eXVdE2CN1FuAeZwG1SNpGsNRCV+bJAVVnykZAFA==",

      "funding": [

        {

          "type": "opencollective",

          "url": "https://opencollective.com/sequelize"

        }

      ],

      "license": "MIT",

      "dependencies": {

        "@types/debug": "^4.1.8",

        "@types/validator": "^13.7.17",

        "debug": "^4.3.4",

        "dottie": "^2.0.6",

        "inflection": "^1.13.4",

        "lodash": "^4.17.21",

        "moment": "^2.29.4",

        "moment-timezone": "^0.5.43",

        "pg-connection-string": "^2.6.1",

        "retry-as-promised": "^7.0.4",

        "semver": "^7.5.4",

        "sequelize-pool": "^7.1.0",

        "toposort-class": "^1.0.1",

        "uuid": "^8.3.2",

        "validator": "^13.9.0",

        "wkx": "^0.5.0"

      },

      "engines": {

        "node": ">=10.0.0"

      },

      "peerDependenciesMeta": {

        "ibm_db": {

          "optional": true

        },

        "mariadb": {

          "optional": true

        },

        "mysql2": {

          "optional": true

        },

        "oracledb": {

          "optional": true

        },

        "pg": {

          "optional": true

        },

        "pg-hstore": {

          "optional": true

        },

        "snowflake-sdk": {

          "optional": true

        },

        "sqlite3": {

          "optional": true

        },

        "tedious": {

          "optional": true

        }

      }

    },

    "node_modules/sequelize-pool": {

      "version": "7.1.0",

      "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",

      "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==",

      "license": "MIT",

      "engines": {

        "node": ">= 10.0.0"

      }

    },

    "node_modules/serve-static": {

      "version": "2.2.0",

      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",

      "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",

      "license": "MIT",

      "dependencies": {

        "encodeurl": "^2.0.0",

        "escape-html": "^1.0.3",

        "parseurl": "^1.3.3",

        "send": "^1.2.0"

      },

      "engines": {

        "node": ">= 18"

      }

    },

    "node_modules/setprototypeof": {

      "version": "1.2.0",

      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",

      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",

      "license": "ISC"

    },

    "node_modules/side-channel": {

      "version": "1.1.0",

      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",

      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",

      "license": "MIT",

      "dependencies": {

        "es-errors": "^1.3.0",

        "object-inspect": "^1.13.3",

        "side-channel-list": "^1.0.0",

        "side-channel-map": "^1.0.1",

        "side-channel-weakmap": "^1.0.2"

      },

      "engines": {

        "node": ">= 0.4"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/side-channel-list": {

      "version": "1.0.0",

      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",

      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",

      "license": "MIT",

      "dependencies": {

        "es-errors": "^1.3.0",

        "object-inspect": "^1.13.3"

      },

      "engines": {

        "node": ">= 0.4"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/side-channel-map": {

      "version": "1.0.1",

      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",

      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",

      "license": "MIT",

      "dependencies": {

        "call-bound": "^1.0.2",

        "es-errors": "^1.3.0",

        "get-intrinsic": "^1.2.5",

        "object-inspect": "^1.13.3"

      },

      "engines": {

        "node": ">= 0.4"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/side-channel-weakmap": {

      "version": "1.0.2",

      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",

      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",

      "license": "MIT",

      "dependencies": {

        "call-bound": "^1.0.2",

        "es-errors": "^1.3.0",

        "get-intrinsic": "^1.2.5",

        "object-inspect": "^1.13.3",

        "side-channel-map": "^1.0.1"

      },

      "engines": {

        "node": ">= 0.4"

      },

      "funding": {

        "url": "https://github.com/sponsors/ljharb"

      }

    },

    "node_modules/sift": {

      "version": "17.1.3",

      "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",

      "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",

      "license": "MIT"

    },

    "node_modules/simple-update-notifier": {

      "version": "2.0.0",

      "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",

      "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "semver": "^7.5.3"

      },

      "engines": {

        "node": ">=10"

      }

    },

    "node_modules/socket.io": {

      "version": "4.8.1",

      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",

      "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",

      "license": "MIT",

      "dependencies": {

        "accepts": "~1.3.4",

        "base64id": "~2.0.0",

        "cors": "~2.8.5",

        "debug": "~4.3.2",

        "engine.io": "~6.6.0",

        "socket.io-adapter": "~2.5.2",

        "socket.io-parser": "~4.2.4"

      },

      "engines": {

        "node": ">=10.2.0"

      }

    },

    "node_modules/socket.io-adapter": {

      "version": "2.5.5",

      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",

      "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",

      "license": "MIT",

      "dependencies": {

        "debug": "~4.3.4",

        "ws": "~8.17.1"

      }

    },

    "node_modules/socket.io-adapter/node_modules/debug": {

      "version": "4.3.7",

      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",

      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",

      "license": "MIT",

      "dependencies": {

        "ms": "^2.1.3"

      },

      "engines": {

        "node": ">=6.0"

      },

      "peerDependenciesMeta": {

        "supports-color": {

          "optional": true

        }

      }

    },

    "node_modules/socket.io-parser": {

      "version": "4.2.4",

      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",

      "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",

      "license": "MIT",

      "dependencies": {

        "@socket.io/component-emitter": "~3.1.0",

        "debug": "~4.3.1"

      },

      "engines": {

        "node": ">=10.0.0"

      }

    },

    "node_modules/socket.io-parser/node_modules/debug": {

      "version": "4.3.7",

      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",

      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",

      "license": "MIT",

      "dependencies": {

        "ms": "^2.1.3"

      },

      "engines": {

        "node": ">=6.0"

      },

      "peerDependenciesMeta": {

        "supports-color": {

          "optional": true

        }

      }

    },

    "node_modules/socket.io/node_modules/accepts": {

      "version": "1.3.8",

      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",

      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",

      "license": "MIT",

      "dependencies": {

        "mime-types": "~2.1.34",

        "negotiator": "0.6.3"

      },

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/socket.io/node_modules/debug": {

      "version": "4.3.7",

      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",

      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",

      "license": "MIT",

      "dependencies": {

        "ms": "^2.1.3"

      },

      "engines": {

        "node": ">=6.0"

      },

      "peerDependenciesMeta": {

        "supports-color": {

          "optional": true

        }

      }

    },

    "node_modules/socket.io/node_modules/mime-db": {

      "version": "1.52.0",

      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",

      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/socket.io/node_modules/mime-types": {

      "version": "2.1.35",

      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",

      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",

      "license": "MIT",

      "dependencies": {

        "mime-db": "1.52.0"

      },

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/socket.io/node_modules/negotiator": {

      "version": "0.6.3",

      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",

      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/sparse-bitfield": {

      "version": "3.0.3",

      "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",

      "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",

      "license": "MIT",

      "dependencies": {

        "memory-pager": "^1.0.2"

      }

    },

    "node_modules/sqlstring": {

      "version": "2.3.3",

      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",

      "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/statuses": {

      "version": "2.0.2",

      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",

      "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/supports-color": {

      "version": "5.5.0",

      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",

      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "has-flag": "^3.0.0"

      },

      "engines": {

        "node": ">=4"

      }

    },

    "node_modules/to-regex-range": {

      "version": "5.0.1",

      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",

      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",

      "dev": true,

      "license": "MIT",

      "dependencies": {

        "is-number": "^7.0.0"

      },

      "engines": {

        "node": ">=8.0"

      }

    },

    "node_modules/toidentifier": {

      "version": "1.0.1",

      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",

      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",

      "license": "MIT",

      "engines": {

        "node": ">=0.6"

      }

    },

    "node_modules/toposort-class": {

      "version": "1.0.1",

      "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",

      "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==",

      "license": "MIT"

    },

    "node_modules/touch": {

      "version": "3.1.1",

      "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",

      "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",

      "dev": true,

      "license": "ISC",

      "bin": {

        "nodetouch": "bin/nodetouch.js"

      }

    },

    "node_modules/tr46": {

      "version": "5.1.1",

      "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",

      "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",

      "license": "MIT",

      "dependencies": {

        "punycode": "^2.3.1"

      },

      "engines": {

        "node": ">=18"

      }

    },

    "node_modules/type-is": {

      "version": "2.0.1",

      "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",

      "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",

      "license": "MIT",

      "dependencies": {

        "content-type": "^1.0.5",

        "media-typer": "^1.1.0",

        "mime-types": "^3.0.0"

      },

      "engines": {

        "node": ">= 0.6"

      }

    },

    "node_modules/undefsafe": {

      "version": "2.0.5",

      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",

      "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",

      "dev": true,

      "license": "MIT"

    },

    "node_modules/undici-types": {

      "version": "7.11.0",

      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.11.0.tgz",

      "integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==",

      "license": "MIT"

    },

    "node_modules/unpipe": {

      "version": "1.0.0",

      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",

      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/uuid": {

      "version": "8.3.2",

      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",

      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",

      "license": "MIT",

      "bin": {

        "uuid": "dist/bin/uuid"

      }

    },

    "node_modules/validator": {

      "version": "13.15.15",

      "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz",

      "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.10"

      }

    },

    "node_modules/vary": {

      "version": "1.1.2",

      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",

      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",

      "license": "MIT",

      "engines": {

        "node": ">= 0.8"

      }

    },

    "node_modules/webidl-conversions": {

      "version": "7.0.0",

      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",

      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",

      "license": "BSD-2-Clause",

      "engines": {

        "node": ">=12"

      }

    },

    "node_modules/whatwg-url": {

      "version": "14.2.0",

      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",

      "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",

      "license": "MIT",

      "dependencies": {

        "tr46": "^5.1.0",

        "webidl-conversions": "^7.0.0"

      },

      "engines": {

        "node": ">=18"

      }

    },

    "node_modules/wkx": {

      "version": "0.5.0",

      "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",

      "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",

      "license": "MIT",

      "dependencies": {

        "@types/node": "*"

      }

    },

    "node_modules/wrappy": {

      "version": "1.0.2",

      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",

      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",

      "license": "ISC"

    },

    "node_modules/ws": {

      "version": "8.17.1",

      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",

      "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",

      "license": "MIT",

      "engines": {

        "node": ">=10.0.0"

      },

      "peerDependencies": {

        "bufferutil": "^4.0.1",

        "utf-8-validate": ">=5.0.2"

      },

      "peerDependenciesMeta": {

        "bufferutil": {

          "optional": true

        },

        "utf-8-validate": {

          "optional": true

        }

      }

    }

  }

}



package.json

{
  "name": "backend",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bcryptjs": "^3.0.2",
    "cors": "^2.8.5",
    "dotenv": "^17.2.2",
    "express": "^5.1.0",
    "jsonwebtoken": "^9.0.2",
    "mongoose": "^8.18.1",
    "mysql2": "^3.14.5",
    "sequelize": "^6.37.7",
    "socket.io": "^4.8.1"
  },
  "devDependencies": {
    "nodemon": "^3.1.10"
  }
}


.env

DB_HOST=localhost
DB_USER=root
DB_PASS=1234
DB_NAME=civic_db
PORT=5000




Comments

Popular Posts